@sidekick-coder/zenith-kit 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.d.mts +17 -2
- package/dist/client/index.mjs +2 -2
- package/dist/components/index.es.js +78 -71
- package/dist/server/index.d.mts +43 -6
- package/dist/server/index.mjs +4 -4
- package/dist/shared/index.d.mts +1 -1
- package/package.json +1 -1
- package/tsdown.config.ts +7 -1
package/dist/server/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Command as e}from"commander";import t from"chalk";import n from"cli-table3";import r,{dirname as i,join as a,relative as o}from"path";import s from"fs";import{pathToFileURL as c}from"url";import l from"fast-glob";import{debounce as ee,get as te,has as ne,join as re,omit as ie,orderBy as ae,set as u,unset as oe}from"lodash-es";import*as d from"valibot";import{format as f}from"date-fns";import se from"qs";import{defineAbility as ce,subject as le}from"@casl/ability";import*as ue from"@inquirer/prompts";import de,{spawn as fe}from"child_process";import p from"js-yaml";import{Readable as pe}from"stream";import m from"ms";import{DeleteObjectCommand as me,DeleteObjectsCommand as he,GetObjectCommand as ge,HeadObjectCommand as _e,ListObjectsV2Command as ve,PutObjectCommand as ye,S3Client as be}from"@aws-sdk/client-s3";import{getSignedUrl as xe}from"@aws-sdk/s3-request-presigner";import{Upload as Se}from"@aws-sdk/lib-storage";import Ce from"mime";import{ProxyAgent as we,fetch as Te}from"undici";import h,{randomBytes as Ee}from"crypto";import De from"dotenv";import Oe from"bcrypt";import ke from"express";import Ae from"cors";import je from"cookie-parser";import{CreateTableBuilder as g,Kysely as Me,sql as Ne}from"kysely";import Pe from"supertest";import Fe from"node-schedule";import{writeFile as Ie}from"node:fs/promises";import{randomUUID as Le}from"node:crypto";import{join as Re}from"node:path";import{pathToFileURL as ze}from"node:url";import Be from"node:fs";var Ve=Object.defineProperty,He=(e,t)=>{let n={};for(var r in e)Ve(n,r,{get:e[r],enumerable:!0});return t||Ve(n,Symbol.toStringTag,{value:`Module`}),n};function Ue(e={},t={}){let r=process.stdout.columns||80,i=new n({wordWrap:!0,wrapOnWordBoundary:!1,colWidths:[t.keyWidth||Math.floor(r*.2),Math.floor(r*.7)]});for(let t of Object.keys(e))i.push([t,String(e[t])]);console.log(i.toString())}function We(e,t){let r=(process.stdout.columns||80)-6,i=[],a=[];t&&a.push(...t),t||e.map(e=>Object.keys(e)).flat().filter((e,t,n)=>n.indexOf(e)===t).forEach(e=>{a.push({label:e,value:e})}),e.forEach(e=>{let t=[];a.forEach(n=>{let r=``;typeof n.value==`function`&&(r=n.value(e)),typeof n.value==`string`&&(r=e[n.value]),r??=``,(typeof r==`object`||Array.isArray(r))&&(r=JSON.stringify(r)),t.push(r)}),i.push(t)}),a.forEach(e=>{e.width&&=Number(e.width),e.label||=String(e.value)});let o=100-a.filter(e=>!!e.width).reduce((e,t)=>e+t.width,0),s=a.filter(e=>!e.width).length;a.forEach(e=>{e.width||=Math.floor(o/s)}),a.forEach(e=>{e.width&&(e.realWidth=Math.floor(r*(e.width/100)))});let c=new n({head:a.map(e=>e.label),style:{head:[],border:[]},wordWrap:!0,wrapOnWordBoundary:!1,colWidths:a.map(e=>e.realWidth)});c.push(...i),console.log(c.toString())}async function _(e){try{return[null,await e()]}catch(e){return[e,null]}}_.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var v=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},y=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)}},Ge=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 y(`Entry with key "${String(t)}" not found in container.`);return this.entries.get(t)}unset(e){let t=this.getKey(e);this.entries.delete(t)}singleton(e){let t=e.name,n=this.entries.get(t);if(n)return n;let r=new e;return this.entries.set(t,r),r}load(e){Object.entries(e).forEach(([e,t])=>{this.set(e,t)})}proxy(e){return new Proxy({},{get:(t,n)=>{let r=this.get(e),i=r[n];return typeof i==`function`?i.bind(r):r[n]},set:(t,n,r)=>{let i=this.get(e);return i[n]=r,!0}})}keys(){return Array.from(this.entries.keys())}};const b=globalThis.serverContainer||new Ge;globalThis.serverContainer=b;const x=b.proxy(v);async function Ke(e,t={}){let n={},i=e=>{Object.assign(e.error,{filename:e.filename}),x.error(`Failed to import ${e.filename}`,e.error)};t.onError&&(i=t.onError);for(let a of e){if(t.exclude&&t.exclude.some(e=>a.includes(e)))continue;let e={filename:a};t.onBeforeImport&&await t.onBeforeImport(e);let o=e.filename.split(`?`)[0];if(/\.(mts|ts|js)$/.test(o)){let o=c(r.resolve(e.filename));t.cache===!1&&o.searchParams.set(`t`,Date.now().toString());let[s,l]=await _(()=>import(o.toString()));if(s){Object.assign(s,{filename:e.filename,url:o}),i({filename:e.filename,error:s});continue}n[a]=l}if(/\.json$/.test(o)){let[t,r]=await _(async()=>{let t=await s.promises.readFile(e.filename,`utf8`);return JSON.parse(t)});if(t){i({filename:e.filename,error:t});continue}n[a]=r}t.onAfterImport&&await t.onAfterImport({...e,module:n[a]})}return n}async function qe(e,t={}){return Ke(await l(e),t)}async function Je(e,t={}){return Ke((await s.promises.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()).map(t=>r.join(e,t.name)),t)}function S(...e){return e.reduce((e,t)=>t(e),class{})}function C(e,...t){return t.reduce((e,t)=>t(e),e)}function Ye(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 w(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`){w(i,e,n);continue}n[e]=i}return n}function Xe(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function T(e=``){return e+Xe()}var E=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:ne(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],i=this.entries.get(r);if(!i){let n=this.entries.get(e);return n?n.value:t}let a=i.value;return typeof a!=`object`||Array.isArray(a)?t:te(a,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),u(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)||(oe(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return w(this.toRecord())}},D=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new v,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||T();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let r=ee(t,n?.debounce||300),i=this.on(e,r,n);return i&&(i.originalListener=t),i}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)_.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}},Ze=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Qe=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 v,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=ae(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 _(()=>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 Ze;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const O=()=>d.pipe(d.union([d.string(),d.number()]),d.transform(Number),d.integer()),$e=()=>d.pipe(d.union([d.string(),d.boolean()]),d.transform(e=>e===!0||e===`true`)),et=()=>d.pipe(d.union([d.string(),d.date()]),d.transform(e=>e instanceof Date?e:new Date(e)),d.transform(e=>e&&f(e,`yyyy-MM-dd`))),tt=()=>d.pipe(d.union([d.string(),d.date()]),d.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),f(e,`yyyy-MM-dd HH:mm`))))),k=(e=d.any())=>d.pipe(d.union([d.string(),d.array(d.string())]),d.transform(e=>Array.isArray(e)?e:e.split(`,`)),d.array(e)),nt=()=>d.pipe(k(),d.transform(e=>e.map(Number))),rt=()=>d.pipe(d.union([d.string(),d.record(d.string(),d.any())]),d.transform(e=>typeof e==`string`?se.parse(e):e),d.transform(e=>{let t={};for(let n in e)u(t,n,te(e,n));return t}));function A(){return rt()}A.number=O,A.boolean=$e,A.date=et,A.datetime=tt,A.array=k,A.arrayNumber=nt,A.object=rt;const it=()=>d.pipe(d.string(),d.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`),u(r,e,n)}return r})),at=(e={})=>d.object({page:d.optional(O(),1),limit:d.optional(O(),e.maxLimit||100),orderBy:d.nullish(e.orderFields?k(d.picklist(e.orderFields)):k(d.string()),[]),orderDirection:d.nullish(k(d.union([d.literal(`asc`),d.literal(`desc`)])),[])});function ot(e={}){return at(e)}ot.base=at;var st=He({array:()=>k,arrayNumber:()=>nt,base:()=>at,boolean:()=>$e,date:()=>et,datetime:()=>tt,keyValue:()=>it,number:()=>O,object:()=>rt,pagination:()=>ot,url:()=>A}),ct=class{static __container_entry_key=`ValidatorService`;v={...d,extras:st};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=d.safeParse(n,e);if(!a){let e=d.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 y(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 d.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=d.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}=d.safeParse(n,e);return r}};function lt(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)}const j=new ct;function ut(){return j.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}ut.create=j.create(e=>e.pick(ut(),[`dashboard_id`,`name`,`value`])),ut.update=j.create(e=>e.partial(ut.create));function dt(){return j.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()))}))}dt.create=j.create(e=>e.pick(dt(),[`name`,`description`])),dt.update=j.create(e=>e.partial(dt.create)),d.object({id:d.number(),permission_id:d.number(),assignable_type:d.string(),assignable_id:d.string(),created_at:d.string(),updated_at:d.string()}),d.object({id:d.number(),name:d.nullable(d.string()),description:d.nullable(d.string()),action:d.string(),subject:d.string(),conditions:d.nullable(d.string()),created_at:d.string(),updated_at:d.string(),expires_at:d.string()}),d.object({id:d.number(),name:d.nullable(d.string()),type:d.string(),user_id:d.number(),token:d.string(),created_at:d.string(),updated_at:d.string(),expires_at:d.string()});function ft(){return d.object({id:d.number(),name:d.optional(d.string()),email:d.pipe(d.string(),d.email()),password:d.pipe(d.string(),d.minLength(6)),username:d.pipe(d.string(),d.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:d.nullable(d.string()),created_at:d.string(),updated_at:d.string(),deleted_at:d.nullable(d.string())})}ft.create=()=>d.omit(ft(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),ft.update=()=>d.partial(ft.create());var pt=class extends y{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};function M(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 N(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function mt(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 P(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 mt(this,e,t)}static async emit(e,...t){return N(this,e,...t)}}}function ht(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)}}}P.emit=N,P.on=mt;function F(e){return class extends e{deleted_at=null}}function I(e){return class extends e{created_at;updated_at}}var gt=class extends S(M){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=_.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},_t=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>gt.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new v().child({label:`acl`}),this.ability=ce(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=le(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=le(t,n);return this.ability.cannot(e,r)}subject(e,t){return le(e,t)}},vt=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 yt=()=>[{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 bt=class e{static get TYPES(){return yt()}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:{}}},xt=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},St=class extends S(M,I,F){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},Ct=class extends S(M,I,F){id;file_id;name;value};S(M,I,F);var wt=class{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},Tt=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},Et=class extends S(M,Ye(Ze)){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}`}};S(M);var Dt=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},Ot=class extends S(M){id;name;version;enabled;aliases;version_channel;version_available_channels};S(M,I,F);var kt=class extends S(M,I,F){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()}},At=class n extends e{__is_cli_command=!0;table=We;object=Ue;colors=t;inquirer=ue;needs=new Set;need(...e){return e.forEach(e=>this.needs.add(e)),this}createCommand(e){return new n(e)}},jt=class e extends At{static __container_entry_key=`CliService`;dirs=new Set;logger=new v;emmitter=new D;debug=!1;static create(t=`cli`){return new e(t)}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}setEmmitter(e){return this.emmitter=e,this}createCommand(t){return new e(t)}addDir(e){return this.dirs.add(e),this}async loadDir(e){let t=await Je(e,{exclude:[`.test.ts`,`.spec.ts`,`.test.js`,`.spec.js`],onError:({error:e,filename:t})=>{Object.assign(e,{filename:t}),this.logger.error(e.message,e)}});for(let[n,r]of Object.entries(t)){if(this.debug&&this.logger.debug(`imported file ${n} from ${e}`),!r.default||Object.keys(r.default).length===0)continue;if(!r.default.__is_cli_command){this.logger.warn(`default export of file ${r.filename} is not a CliCommand, skipping`);continue}let[t]=_.sync(()=>this.addCommand(r.default));if(t){Object.assign(t,{filename:r.filename}),this.logger.error(t.message,t);continue}this.debug&&this.logger.debug(`added command from file ${n} to cli`)}}async load(){for(let e of this.dirs)await this.loadDir(e);return this}},Mt=class extends jt{constructor(){super(),this.exitOverride(),this.configureOutput({writeOut:()=>{},writeErr:()=>{}}),b.set(jt,this)}async add(e){await import(e)}async execute(e){await this.parseAsync([`node`,`arte`,...e])}},Nt=class e{process=null;appBasePath;env=new Map;args=[];configArguments=new Map;configFiles=[];debug=!1;logger=new v;static create(){return new e}setBasePath(e){return this.appBasePath=e,this}setDebug(e){return this.debug=e,this}setLogger(e){return this.logger=e,this}addConfigArgument(e,t){return this.configArguments.set(e,t),this}addConfigFile(...e){return this.configFiles.push(...e),this}addEnv(e,t){return this.env.set(e,t),this}loadConfigArguments(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config:`));for(let t of e){let[e,n]=t.slice(8).split(`=`).map(e=>e.trim());this.configArguments.set(e,n)}}loadConfigFiles(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config-file:`)).map(e=>e.slice(13));if(this.addConfigFile(...e),process.env.CONFIG_FILES){let e=process.env.CONFIG_FILES.split(`,`).map(e=>e.trim()).filter(Boolean);this.addConfigFile(...e)}}loadEnvironment(){let e=Array.from(this.configArguments.entries()).map(([e,t])=>`${e}=${t}`).join(`;`);this.addEnv(`ZENITH_CONFIG_ARGUMENTS`,e),this.addEnv(`ZENITH_CONFIG_FILES`,this.configFiles.join(`,`))}loadArguments(e=[]){let t=[`@config:`,`@config-file:`],n=e.filter(e=>!t.some(t=>e.startsWith(t)));this.args=[`--no-warnings`,`--experimental-strip-types`,`--enable-source-maps`,r.join(this.appBasePath,`server`,`cli.ts`),...n]}kill(e=0){this.process&&!this.process.killed&&this.process.kill(`SIGTERM`),process.exit(e)}async run(e){if(!this.appBasePath)throw Error(`Base path not set. Please call setBasePath() before run().`);this.loadConfigArguments(),this.loadConfigFiles(),this.loadArguments(e||process.argv.slice(2)),this.loadEnvironment(),this.debug&&this.logger.debug(`run`,{args:this.args,env:this.env}),this.process=de.spawn(`node`,this.args,{stdio:`inherit`,env:{...process.env,...Object.fromEntries(this.env.entries())}}),process.on(`SIGINT`,()=>this.kill()),process.on(`SIGTERM`,()=>this.kill()),process.on(`exit`,()=>this.kill())}};function L(...e){let t=process.env.ZENITH_BASE_PATH;if(!t)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.resolve(t,...e)}function Pt(...e){let t=process.env.ZENITH_BASE_PATH,n=process.env.ZENITH_STORAGE_PATH||r.join(t||``,`storage`);return r.resolve(n,...e)}function Ft(...e){let t=process.env.ZENITH_BASE_PATH;if(!t)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.relative(process.cwd(),r.resolve(t,...e))}function It(...e){return L(`tmp`,...e)}var Lt=class extends E{logger;debug=!1;format=`json`;formatOptions={};directory;constructor(e={}){super(),this.debug=e.debug??!1,this.directory=e.directory??L(`config`),this.logger=e.logger??x.child({label:`config`}),this.format=e.format??`json`,this.formatOptions=e.formatOptions??{},this.debug&&this.logger.debug(`service initialized in debug mode`)}async write(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=JSON.stringify(t,null,this.formatOptions.indent||4);this.format===`yml`&&(a=p.dump(t,this.formatOptions)),await s.promises.writeFile(i,a,`utf-8`)}writeSync(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=JSON.stringify(t,null,4);this.format===`yml`&&(a=p.dump(t,this.formatOptions)),s.writeFileSync(i,a,`utf-8`)}async load(){this.clear(),s.existsSync(this.directory)||(this.debug&&this.logger.debug(`config directory does not exist, creating: ${this.directory}`),s.mkdirSync(this.directory,{recursive:!0}));let e=await s.promises.readdir(this.directory);for(let t of e){let e=r.extname(t);if(this.format===`json`&&e!==`.json`||this.format===`yml`&&e!==`.yml`)continue;let n=r.join(this.directory,t),[i,a]=await _(async()=>{let e=await s.promises.readFile(n,`utf-8`);return r.extname(t)===`.yml`?p.load(e):JSON.parse(e)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=r.basename(t,r.extname(t));super.set(o,a,`filesystem`),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{entry:t,key:n.join(`.`)}}set(e,t,n=`filesystem`){if(super.set(e,t,n),n!==`filesystem`)return;let{entry:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&u(a,i,t),this.writeSync(r,a)}unset(e){let{entry:t,key:n}=this.parseKey(e);if(!n){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${t}.${n}`);s.unlinkSync(i),super.unset(e);return}let i=this.get(t);u(i,n,void 0),this.writeSync(t,i),super.unset(e)}},Rt=class{id;name;description;config={};constructor(e){this.id=e.id,this.name=e.name,this.description=e.description,this.config=e.config}list(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{folder:e}),t}find(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}exists(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}read(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}readStream(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}write(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,data:t}),n}writeStream(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,stream:t}),n}delete(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}url(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}uploadUrl(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}};const zt=j.create(e=>e.object({bucket:e.pipe(e.string(),e.minLength(1)),region:e.optional(e.string()),accessKeyId:e.pipe(e.string(),e.minLength(1)),secretAccessKey:e.pipe(e.string(),e.minLength(1)),sessionToken:e.optional(e.string()),endpoint:e.optional(e.string()),prefix:e.optional(e.string())}));function Bt(e){return!e||typeof e!=`object`||typeof e.on!=`function`?Promise.resolve(new Uint8Array):new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(Buffer.from(e))),e.on(`end`,()=>t(new Uint8Array(Buffer.concat(r)))),e.on(`error`,n)})}var Vt=class extends Rt{schema=zt;_client;constructor(e){super(e)}get valid(){return j.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new y($t(`Invalid drive configuration`))}get bucket(){return this.config.bucket}get prefix(){return this.config?.prefix?this.config?.prefix.endsWith(`/`)?this.config.prefix:this.config.prefix+`/`:``}getKey(e){let t=e.startsWith(`/`)?e.slice(1):e;return this.prefix?`${this.prefix.endsWith(`/`)?this.prefix:`${this.prefix}/`}${t}`:t}get client(){if(this._client)return this._client;let e=this.config;return this._client=new be({region:e.region,endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken}}),this._client}exists=async e=>{this.checkValid();let t=this.getKey(e);return this.client.send(new _e({Bucket:this.bucket,Key:t})).then(()=>!0).catch(()=>!1)};list=async e=>{this.checkValid();let t=e?this.getKey(e):this.prefix||void 0;t&&!t.endsWith(`/`)&&(t+=`/`);let n=new ve({Bucket:this.bucket,Prefix:t,Delimiter:`/`}),r=await this.client.send(n),i=[],a=r.CommonPrefixes||[];for(let e of a){let t=e.Prefix||``;t=t.replace(this.prefix,``),t.endsWith(`/`)&&(t=t.slice(0,-1));let n=new xt({name:t.split(`/`).pop()||t,path:`/`+t,type:`directory`,metas:{size:0,mimetype:`application/x-directory`}});i.push(n)}let o=r.Contents||[];for(let e of o){let t=e.Key||``;if(t=t.replace(this.prefix,``),t.endsWith(`/`))continue;let n=new xt({name:t.split(`/`).pop()||t,path:`/`+t,type:`file`,metas:{size:e.Size,mimetype:Ce.getType(t)||`application/octet-stream`}});i.push(n)}return i};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=i(t),r=(await this.list(n)).find(e=>e.path===t);if(!r)throw Error(`File "${t}" not found`);return r};async mkdir(e){return this.checkValid(),Promise.resolve()}read=async e=>{this.checkValid();let t=this.getKey(e),n=(await this.client.send(new ge({Bucket:this.bucket,Key:t}))).Body;return Bt(n)};async readStream(e){this.checkValid();let t=this.getKey(e),n=new ge({Bucket:this.bucket,Key:t}),r=(await this.client.send(n)).Body;return Promise.resolve(r)}write=async(e,t)=>{this.checkValid();let n=this.getKey(e);await this.client.send(new ye({Bucket:this.bucket,Key:n,Body:Buffer.from(t)}))};async writeStream(e,t){this.checkValid();let n=this.getKey(e);await new Se({client:this.client,params:{Bucket:this.bucket,Key:n,Body:pe.from(t)}}).done()}delete=async e=>{this.checkValid();let t=this.getKey(e);if((await this.find(e)).type===`file`){let e=new me({Bucket:this.bucket,Key:t});await this.client.send(e);return}let n=await this.client.send(new ve({Bucket:this.bucket,Prefix:t})),r=(n.Contents||[]).map(e=>({Key:e.Key}));r.length!==0&&(await this.client.send(new he({Bucket:this.bucket,Delete:{Objects:r}})),n.IsTruncated&&this.delete(e))};url=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=m(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3));return xe(this.client,new ge({Bucket:this.bucket,Key:n}),{expiresIn:i})};uploadUrl=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=m(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3)),a=new ye({Bucket:this.bucket,Key:n});return xe(this.client,a,{expiresIn:i})}},Ht=class extends E{prefix=``;logger;debug=!1;drive;bucket;region;endpoint;constructor(e){super(),this.debug=e.debug??!1,this.prefix=e.prefix??``,this.bucket=e.bucket,this.region=e.region||``,this.endpoint=e.endpoint,this.logger=e.logger??new v,this.drive=new Vt({id:`config-s3`,name:`config-s3`,config:{bucket:e.bucket,region:e.region,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken,endpoint:e.endpoint}}),this.debug&&this.logger.debug(`service initialized in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{filename:t,key:n.join(`.`)}}async load(){this.clear();let e=this.prefix.replace(/^\/|\/$/g,``),t=await this.drive.list(e||void 0);for(let n of t){if(!n.name.endsWith(`.json`))continue;let t=n.name,r=e?`${e}/${t}`:t,[i,a]=await _(async()=>{let e=await this.drive.read(r),t=Buffer.from(e).toString(`utf-8`);return JSON.parse(t)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=t.replace(/\.json$/,``);super.set(o,a),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}set(e,t,n=`s3`){if(super.set(e,t,n),n!==`s3`)return;let{filename:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&u(a,i,t);let o=this.prefix.replace(/^\/|\/$/g,``),s=o?`${o}/${r}.json`:`${r}.json`,c=Buffer.from(JSON.stringify(a,null,4));this.drive.write(s,c).catch(e=>{this.logger.error(`failed to write config to s3`,e)})}unset(e){let t=this.prefix.replace(/^\/|\/$/g,``);if(!e.includes(`.`)){let n=t?`${t}/${e}.json`:`${e}.json`;this.drive.delete(n).catch(e=>{this.logger.error(`failed to delete config from s3`,e)});return}let{filename:n,key:r}=this.parseKey(e),i=this.get(n);u(i,r,void 0);let a=t?`${t}/${n}.json`:`${n}.json`;this.drive.write(a,Buffer.from(JSON.stringify(i,null,4))).catch(e=>{this.logger.error(`failed to write config to s3`,e)}),super.unset(e)}},Ut=class e{env;logger;silent;constructor(e){this.env=e.env,this.logger=e.logger,this.silent=e.silent??!1}static create(t){return new e(t)}async loadS3Config(){let e=new Ht({bucket:this.env.get(`ZENITH_CONFIG_S3_BUCKET`),region:this.env.get(`ZENITH_CONFIG_S3_REGION`),accessKeyId:this.env.get(`ZENITH_CONFIG_S3_ACCESS_KEY_ID`),secretAccessKey:this.env.get(`ZENITH_CONFIG_S3_SECRET_ACCESS_KEY`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),endpoint:this.env.get(`ZENITH_CONFIG_S3_ENDPOINT`),prefix:this.env.get(`ZENITH_CONFIG_S3_PREFIX`),sessionToken:this.env.get(`ZENITH_CONFIG_S3_SESSION_TOKEN`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using S3 configuration service`,{bucket:e.bucket,region:e.region,prefix:e.prefix}),e}async loadFSConfig(){let e=new Lt({directory:this.env.get(`ZENITH_CONFIG_FS_PATH`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),format:this.env.get(`ZENITH_CONFIG_FS_FORMAT`),formatOptions:this.env.get(`ZENITH_CONFIG_FS_FORMAT_OPTIONS`)||{},logger:this.logger});return await e.load(),this.silent||this.logger.info(`using filesystem configuration service`,{path:e.directory}),e}loadConfigFromEnv(e){for(let[t,n]of Object.entries(w(this.env.get(`ZENITH_CONFIG`)||{})))e.set(t,n,`env`);for(let[t,n]of Object.entries(w(this.env.get(`ZENITH_CONFIG_ARGUMENTS`)||{})))e.set(t,n,`argument`)}loadConfigFromFile(e,t){if(!s.existsSync(t)){this.logger.warn(`configuration file not found: ${t}`);return}let n=s.readFileSync(t,`utf-8`),r=null;if((t.endsWith(`.yml`)||t.endsWith(`.yaml`))&&(r=p.load(n)),!r)throw new y(`unsupported configuration file format: ${t}`);for(let[n,i]of Object.entries(w(r)))e.set(n,i,t)}loadConfigFromFiles(e,t){for(let n of t)this.loadConfigFromFile(e,n)}async load(){let e=null;if(this.env.get(`ZENITH_CONFIG_DRIVER`)===`s3`&&(e=await this.loadS3Config()),(!e||this.env.get(`ZENITH_CONFIG_DRIVER`)===`fs`)&&(e=await this.loadFSConfig()),!e)throw new y(`Failed to initialize configuration service: No valid driver found`);if(!e)throw new y(`Failed to initialize configuration service`);return this.loadConfigFromFiles(e,this.env.get(`ZENITH_CONFIG_FILES`)),this.loadConfigFromEnv(e),e}},Wt=class{async fetch(e,t){let n=t||{};return t?.proxy&&(n.dispatcher=new we(t.proxy)),console.log(`Downloading from URL:`,e,`with options:`,n),await Te(e,n)}async stream(e,t){let n=await this.fetch(e,t);if(!n.ok){let e=new y(`Failed to download`,400);throw Object.assign(e,{status:n.status,statusText:n.statusText}),e}if(!n.body)throw new y(`No body`,400);let r=n.headers.get(`content-type`)||`application/octet-stream`;return{stream:n.body,contentType:r}}};const R=b.proxy(E);function Gt(e,t={}){return function(n){return class extends n{static __isConfigModel=!0;static serialize(e){let t=new this;return Object.assign(t,e),t}static async list(){let t=this,n=R.get(e)||{},r=[];for(let[e,i]of Object.entries(n)){let n=t.serialize(JSON.parse(JSON.stringify({...i,id:e})));r.push(n)}return await P.emit(this,`afterList`,r),r}static async find(e){let t=(await this.list()).find(t=>t.id===e);if(!t)return null;let n=JSON.parse(JSON.stringify(t));return await P.emit(this,`afterFind`,n),n||null}static async findOrFail(e){let t=await this.find(e);if(!t)throw Error(`Entity item not found`);return t}static async create(n){if(t.readonly)throw new y(`Readonly config model`);if(!n.id)throw Error(`Entity item requires an id`);let r=this,i=R.get(e)||{};if(i[n.id])throw Error(`Entity item already exists`);return await P.emit(this,`beforeCreate`,n),i[n.id]={...n},delete i[n.id].id,await R.set(e,i),r.findOrFail(n.id)}static async update(n,r){if(t.readonly)throw new y(`Readonly config model`);let i=this,a=R.get(e)||{};if(!a[n])throw Error(`Entity item not found`);return await P.emit(this,`beforeUpdate`,r),Object.assign(a[n],r),await R.set(e,a),i.findOrFail(n)}static async updateOrCreate(e,t){let n=this;return await n.find(e)?n.update(e,t):n.create({...t,id:e})}static async destroy(n){if(t.readonly)throw new y(`Readonly config model`);let r=R.get(e)||{};if(!r[n])throw Error(`Entity item not found`);delete r[n],await R.set(e,r)}}}}var Kt=class extends C(bt,Gt(`drive.disks`)){static serialize(e){let t=new this;return t.id=e.id,t.name=e.name||e.id,t.type=e.type,t.config=e.config||{},t.is_default=R.get(`drive.default`)===e.id,t}};const qt=d.pipe(d.union([d.literal(`true`),d.literal(`false`),d.literal(`1`),d.literal(`0`)]),d.transform(e=>e===`true`||e===`1`),d.boolean()),z=d.pipe(d.string(),d.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`),u(r,e,n)}return r})),Jt=d.pipe(d.string(),d.transform(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean))),Yt=d.looseObject({NODE_ENV:d.optional(d.union([d.literal(`development`),d.literal(`production`),d.literal(`test`)]),`development`),ZENITH_BASE_PATH:d.string(),ZENITH_STORAGE_PATH:d.optional(d.string()),ZENITH_APP_URL:d.optional(d.string(),`http://localhost:3000`),ZENITH_PORT:d.optional(d.pipe(d.string(),d.transform(e=>parseInt(e))),`3000`),ZENITH_HOST:d.optional(d.string(),`0.0.0.0`),ZENITH_LOG_LEVEL:d.optional(d.picklist([`error`,`warn`,`info`,`debug`]),`info`),ZENITH_LIFECYCLE_DEBUG:d.optional(qt,`false`),ZENITH_CLIENT_CONFIG:d.optional(z,``),ZENITH_CONFIG:d.optional(z,``),ZENITH_CONFIG_ARGUMENTS:d.optional(z,``),ZENITH_CONFIG_FILES:d.optional(Jt,``),ZENITH_CONFIG_DEBUG:d.optional(qt,`false`),ZENITH_CONFIG_DRIVER:d.optional(d.picklist([`fs`,`s3`]),`fs`),ZENITH_CONFIG_FS_PATH:d.optional(d.string()),ZENITH_CONFIG_FS_FORMAT:d.optional(d.picklist([`json`,`yml`]),`json`),ZENITH_CONFIG_FS_FORMAT_OPTIONS:d.optional(z,``),ZENITH_CONFIG_S3_BUCKET:d.optional(d.string()),ZENITH_CONFIG_S3_REGION:d.optional(d.string()),ZENITH_CONFIG_S3_ACCESS_KEY_ID:d.optional(d.string()),ZENITH_CONFIG_S3_SECRET_ACCESS_KEY:d.optional(d.string()),ZENITH_CONFIG_S3_SESSION_TOKEN:d.optional(d.string()),ZENITH_CONFIG_S3_ENDPOINT:d.optional(d.string()),ZENITH_CONFIG_S3_PREFIX:d.optional(d.string(),``),ZENITH_PLUGINS_DIRS:d.optional(Jt,``)});var B=class e{static __container_entry_key=`EnvService`;env=null;files=[];static create(){return new e}static dotEnvConfig(e){return De.config(e)}setFiles(e){return this.files=e,this}addFile(e){return this.files.push(e),this}load(){return e.dotEnvConfig({path:this.files,override:!0,quiet:!0}),this.env=d.parse(Yt,process.env),this}get production(){return this.get(`NODE_ENV`)===`production`}get development(){return this.get(`NODE_ENV`)===`development`}get test(){return this.get(`NODE_ENV`)===`test`}has(e){if(!this.env)throw new y(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]!==void 0}get(e,t){if(!this.env)throw new y(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]===void 0?t:this.env[e]}set(e,t){if(!this.env)throw new y(`Environment variables not loaded. Call load() before accessing environment variables.`);this.env[e]=t}},Xt=class e{static __container_entry_key=`EncryptService`;debug=!1;env;logger;algorithm=`aes-256-cbc`;key=null;constructor(e){this.env=e.env||new B,this.logger=e.logger||new v,this.debug=e.debug||!1,e.key&&(this.key=h.scryptSync(e.key,`salt`,32))}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}setEnv(e){this.env=e}setKey(e){this.key=h.scryptSync(e,`salt`,32)}encrypt(e){if(!this.key)throw Error(`Encryption key not set`);let t=h.randomBytes(16),n=h.createCipheriv(this.algorithm,this.key,t),r=n.update(e,`utf8`,`hex`);return r+=n.final(`hex`),`${t.toString(`hex`)}:${r}`}decrypt(e){if(!this.key)throw Error(`Encryption key not set`);let[t,n]=e.split(`:`),r=Buffer.from(t,`hex`),i=h.createDecipheriv(this.algorithm,this.key,r),a=i.update(n,`hex`,`utf8`);return a+=i.final(`utf8`),a}encryptObject(e){let t=JSON.stringify(e);return this.encrypt(t)}decryptObject(e){let t=this.decrypt(e);return JSON.parse(t)}url(e,t){let n=t?.expireAt;if(t?.expires){let e=m(t.expires);n=Date.now()+e}n||=Date.now()+m(`15 minutes`),n instanceof Date&&(n=n.getTime());let r={data:t?.data||{},expireAt:n,expireAtReadable:f(new Date(n),`yyyy-MM-dd HH:mm:ss`)},i=this.encrypt(JSON.stringify(r)),a=this.env.get(`ZENITH_APP_URL`);if(!a)throw new y(`APP_URL not set in environment variables`);let o=new URL(e,a);return o.searchParams.append(`key`,encodeURIComponent(i)),o.toString()}verifyUrl(e){let t=this.decrypt(decodeURIComponent(e)),n=JSON.parse(t);if(n.expireAt&&Date.now()>n.expireAt){let e=new y(`URL has expired`,403);throw Object.assign(e,{expireAt:n.expireAt,expireAtReadable:n.expireAtReadable}),e}return n.data}};const Zt=b.proxy(Xt);var Qt=class extends Rt{schema=j.create(e=>e.object({directory:e.pipe(e.string(),e.minLength(1))}));constructor(e){super(e)}get valid(){return j.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new y($t(`Invalid drive configuration`));if(!s.existsSync(this.rootPath))throw new y($t(`Drive root path does not exist`))}get rootPath(){return L(this.config.directory)}exists=async e=>(this.checkValid(),s.promises.access(a(this.rootPath,e)).then(()=>!0).catch(()=>!1));list=async e=>{this.checkValid();let t=e?a(this.rootPath,e):this.rootPath;if(!await this.exists(o(this.rootPath,t)))return[];let n=await s.promises.readdir(t),r=[];for(let e of n){let n=a(t,e),i=await s.promises.stat(n),c={};i.isFile()&&(c.size=i.size,c.mimetype=Ce.getType(e)||`application/octet-stream`);let l=new xt({name:e,path:`/`+o(this.rootPath,n),type:i.isDirectory()?`directory`:`file`,metas:c});r.push(l)}return r};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=(await this.list(r.dirname(t))).find(e=>e.path===t);if(!n)throw Error(`File "${t}" not found`);return n};async mkdir(e){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let t=a(this.rootPath,e);await s.promises.mkdir(t,{recursive:!0})}read=async e=>{this.checkValid();let t=a(this.rootPath,e),n=await s.promises.readFile(t);return new Uint8Array(n)};async readStream(e){this.checkValid();let t=a(this.rootPath,e),n=s.createReadStream(t);return Promise.resolve(n)}write=async(e,t)=>{this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);await s.promises.writeFile(n,t)};async writeStream(e,t){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);return new Promise((e,r)=>{let i=s.createWriteStream(n);t.pipe(i),i.on(`finish`,e),i.on(`error`,r)})}delete=async e=>{this.checkValid();let t=a(this.rootPath,e);if(await s.promises.stat(t).then(e=>e.isDirectory()).catch(()=>!1)){await s.promises.rmdir(t,{recursive:!0});return}await s.promises.unlink(t)};url=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return Zt.url(`/api/drives/${this.id}/stream${n}`,{expires:t?.expires||`30m`})};uploadUrl=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return Zt.url(`/api/drives/${this.id}/upload${n}`,{expires:t?.expires||`30m`,data:{mime_types:t?.mime_types,max_size:t?.max_size}})}},en=class e{static __container_entry_key=`DriveService`;gateways;drives=new Map;selected;defaultDrive;debug=!1;logger;get current(){if(!this.selected)return;let e=this.drives.get(this.selected);if(e)return e}constructor(e={}){this.selected=e.selected||this.selected,this.debug=e.debug||this.debug,this.drives=e.drives||this.drives,this.logger=e.logger||x.child({label:`drive`}),this.gateways=new Map,this.gateways.set(`s3`,Vt),this.gateways.set(`fs`,Qt)}listDrives(){return Array.from(this.drives.values()).map(e=>({...e,default:e.id===this.defaultDrive}))}get(e){if(!e||!this.drives.has(e||``))throw new y(`Drive not found`);let t=this.drives.get(e);if(!t)throw new y(`Drive not found`);return t}use(t){if(!this.drives.has(t||``))throw new y(`Drive not found`);return new e({selected:t,drives:this.drives,debug:this.debug})}list(e){if(!this.current)throw new y(`No drive selected`);return this.current.list(e)}find(e){if(!this.current)throw new y(`No drive selected`);return this.current.find(e)}exists(e){if(!this.current)throw new y(`No drive selected`);return this.current.exists(e)}read(e){if(!this.current)throw new y(`No drive selected`);return this.current.read(e)}readStream(e){if(!this.current)throw new y(`No drive selected`);return this.current.readStream(e)}async readAsText(e){let t=await this.read(e);return new TextDecoder().decode(t)}write(e,t){if(!this.current)throw new y(`No drive selected`);let n=t;return typeof t==`object`&&!(t instanceof Uint8Array)&&(n=JSON.stringify(t,null,4)),typeof n==`string`&&(n=new TextEncoder().encode(n)),this.current.write(e,n)}writeStream(e,t){if(!this.current)throw new y(`No drive selected`);return this.current.writeStream(e,t)}async url(e,t={}){if(!this.current)throw new y(`No drive selected`);return this.current.url(e,t)}async uploadUrl(e,t={}){if(!this.current)throw new y(`No drive selected`);return this.current.uploadUrl(e,t)}async upload(e,t){let n=await s.promises.readFile(e),r=new Uint8Array(n);return this.write(t,r)}async download(e,t){let n=await this.read(e);await s.promises.writeFile(t,n)}delete(e){if(!this.current)throw new y(`No drive selected`);return this.current.delete(e)}async load(){this.drives.clear();let e=await Kt.list();for(let t of e){let e=this.gateways.get(t.type);if(!e){this.logger.warn(`Drive gateway for type "${t.type}" not found`);continue}let n=new e(t);this.drives.set(t.id,n),this.debug&&this.logger.debug(`drive loaded ${t.id} (${t.type})`)}this.selected=R.get(`drive.default`),this.defaultDrive=R.get(`drive.default`)}async createDefaultDrives(){await Kt.updateOrCreate(`uploads`,{name:`Uploads`,type:`fs`,config:{directory:Pt(`uploads`)}}),R.get(`drive.default`)||R.set(`drive.default`,`uploads`),await this.load()}validateUpload(e,t){if(!e.mime_types.split(`,`).map(e=>e.trim()).some(e=>{if(!e.endsWith(`/*`))return e===t.mimetype;let n=e.slice(0,-2);return t.mimetype.startsWith(n+`/`)}))throw new y(`MIME type not allowed`,403);if(e.maxSize&&t.size>e.maxSize)throw new y(`File size exceeds the maximum allowed`,403)}},tn=class extends D{},nn=class{static __container_entry_key=`ExceptionService`;ignoreCodeErrors=[400,401,403,404,422];logger;env;constructor(e={}){this.logger=e.logger||new v,this.env=e.env||new B,e.ignoreCodeErrors&&(this.ignoreCodeErrors=e.ignoreCodeErrors)}handle(e,t){let n=e.name||`Internal Server Error`,r=e.message||`An unexpected error occurred`,i=e.status||500;return this.ignoreCodeErrors.includes(i)||this.logger.error(e),t.status(i).json({error:n,message:r,status:i})}},rn=class{static __container_entry_key=`HasherService`;hash(e){return Oe.hash(e,12)}async compare(e,t){return Oe.compare(e,t)}},V=class{path=``;method=`get`;handler=null;middlewares=[];metadata={};constructor(e={}){this.path=e.path||``,this.method=e.method||`get`,this.handler=e.handler||null,this.middlewares=e.middlewares||[],this.metadata=e.metadata||{}}static params(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}static query(e){let t={},n=e.split(`?`)[1];return n?se.parse(n):t}toJSON(){return{path:this.path,method:this.method,middlewares:this.middlewares.map(e=>e.constructor.name),metadata:this.metadata}}},H=class e extends S(ht){static __container_entry_key=`RouterService`;routes=[];middlewares=[];prefixes=[];groups=[];groupPrefixes=[];debug=!1;logger=new v;metadata={};constructor(e={}){super(),this.routes=e.routes||[],this.middlewares=e.middlewares||[],this.prefixes=e.prefixes||[],this.groups=e.groups||[],this.groupPrefixes=e.groupPrefixes||[],this.debug=e.debug||!1,this.metadata=e.metadata||{},this.listeners=e.listeners||[],this.logger=e.logger||new v}use(e,t=`route`){return this.middlewares.push({middleware:e,context:t}),this}prefix(e){return this.prefixes.push(e),this}makePath(e){let t=re([...this.groupPrefixes,...this.prefixes,e],`/`);return t=t.replace(/\/+/g,`/`),t}add(e){let t=new V({method:e.method,path:this.makePath(e.path),handler:e.handler,middlewares:this.middlewares.map(e=>e.middleware)});this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],this.routes.push(t),this.debug&&this.logger.debug(`added route`,t),this.emit(`added`,t)}get(e,t){this.add({path:e,method:`GET`,handler:t})}post(e,t){this.add({path:e,method:`POST`,handler:t})}put(e,t){this.add({path:e,method:`PUT`,handler:t})}patch(e,t){this.add({path:e,method:`PATCH`,handler:t})}many(e,t,n){e.forEach(e=>{this.add({path:t,method:e,handler:n})})}delete(e,t){this.add({path:e,method:`DELETE`,handler:t})}group(){let t=new e({listeners:this.listeners,debug:this.debug});return t.groupPrefixes=this.prefixes,t.middlewares=this.middlewares.map(e=>({middleware:e.middleware,context:`group`})),this.groups.push(t),this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],t}resolve(e,t){return this.list().find(n=>n.method.toUpperCase()===e.toUpperCase()?lt(n.path,t):!1)||null}async execute(e,t){if(!e.handler)throw Error(`Route handler not found for ${e.method} ${e.path}`);let n={...t};for await(let t of e.middlewares){let e=await t.handle(n);if(e&&`redirect`in e)return e;Object.assign(n,e)}return e.handler(n)}clear(){this.debug&&this.logger.debug(`clear`,{count:this.routes.length}),this.routes=[],this.groups=[]}list(){return this.routes.concat(...this.groups.map(e=>e.routes))}async load(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}loadSync(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}},an=class extends vt{request;response;constructor(e,t){super({cookies:new Map(Object.entries(e.cookies)),prefix:R.get(`cookie.prefix`,``)}),this.request=e,this.response=t}set(e,t,n){let r=this.prefix+e,i={httpOnly:!0,...n};this.response.cookie(r,t,i),super.set(r,t,n)}},on=class{static __container_entry_key=`HttpService`;app;server=null;router;exception;logger;emmitter;env;debug=!1;onUnhandlerRouted=null;constructor(e){this.debug=e.debug||!1,this.logger=e.logger||new v,this.router=e.router||new H,this.emmitter=e.emmitter||new D,this.env=e.env||new B,this.exception=e.exception||new nn({logger:this.logger,env:this.env}),this.app=ke(),this.app.use(je()),this.app.use(this.parser)}getExpressApp(){return this.app}cors(e){this.app.use(Ae(e))}use=(...e)=>(this.app.use(...e),this.app);routes(){this.app.use(`*all`,(e,t)=>{let n=new URL(e.originalUrl,`http://${e.headers.host}`),r=e.method.toLowerCase(),i=this.router.resolve(r,n.pathname);if(this.router.debug&&this.router.logger.debug(`${r.toUpperCase()} ${n.pathname}`),i)return this.execute(n,e,t,i);if(n.pathname.startsWith(`/api/`))return t.status(404).json({error:`Not Found`,message:`No API route found for ${r.toUpperCase()} ${n}`});if(this.onUnhandlerRouted)return this.onUnhandlerRouted(e,t)})}parser(e,t,n){if((e.headers[`content-type`]||``).startsWith(`multipart/form-data`))return n();ke.json()(e,t,r=>{if(r)return n(r);ke.urlencoded({extended:!0})(e,t,n)})}async execute(e,t,n,r){let i={response:n,request:t,url:e.pathname,method:t.method.toLowerCase(),params:V.params(r.path,e.pathname),query:V.query(e.href),body:t.body||{},cookie:new an(t,n)},[a,o]=await _(()=>this.router.execute(r,i));if(a){this.exception.handle(a,n);return}if(!n.headersSent){if(o&&o.redirect){n.redirect(o.redirect);return}n.status(200),(typeof o==`object`||Array.isArray(o))&&n.setHeader(`Content-Type`,`application/json`),n.send(o)}}start(){let e=this.env.get(`ZENITH_PORT`),t=this.env.get(`ZENITH_HOST`),n=`http://${t}:${e}`;this.server=this.app.listen(e,t,()=>{this.logger.info(`server started`,{url:n,env:this.env.get(`NODE_ENV`)}),this.emmitter.emit(`http:started`)})}stop(){return new Promise(e=>{if(!this.server)return this.logger.warn(`server is not running`),e();this.server.on(`close`,()=>{e(),this.logger.info(`server stopped`,{pid:process.pid,env:this.env.get(`NODE_ENV`)})}),this.server.close()})}},sn=class extends Me{static __container_entry_key=`DatabaseGateway`};const U=b.proxy(sn);function cn(){return function(e){class t extends e{}return t}}const W=()=>Ne`CURRENT_TIMESTAMP`;async function ln(e,t){let n=U.selectFrom(e);t?.query&&(n=t.query(U.selectFrom(e))),n=n.clearSelect().clearOrderBy().select(e=>e.fn.countAll().as(`count`)),t?.debug&&console.log(n.compile());let r=await n.executeTakeFirst();return Number(r?.count??0)}var un=He({fromDb:()=>fn,toDb:()=>dn});function dn(e){if(e===null)return null;let t=U.currentConnectionDialectName;return t===`sqlite`||t===`mysql`?f(new Date(e),`yyyy-MM-dd HH:mm:ss`):new Date(e).toISOString()}function fn(e){return e===null?null:new Date(e)}function pn(e){return e===null?null:JSON.stringify(e)}const mn=U;function hn(e){return e===null?null:mn.currentConnectionDialectName===`sqlite`?+!!e:!!e}var gn=He({fromDb:()=>vn,toDb:()=>_n});function _n(e){let t={...e};for(let e in t)t[e]instanceof Date&&(t[e]=dn(t[e])),typeof t[e]==`object`&&(t[e]=pn(t[e])),typeof t[e]==`boolean`&&(t[e]=hn(t[e])),Array.isArray(t[e])&&(t[e]=pn(t[e]));return t}function vn(e){let t={...e};for(let e in t)t[e]=parseValue(t[e]);return t}const yn={all:gn,datetime:un};async function bn(e,t){let n=t?.values||{},r=await U.insertInto(e).values(n).returningAll().executeTakeFirst();return t?.serialize&&(r=t.serialize(r)),r}async function xn(e,t){let n=t?.values||{},r=U.insertInto(e).values(n),i=t?.primaryKey||`id`,a=(await r.executeTakeFirst()).insertId,o=await U.selectFrom(e).selectAll().where(i,`=`,a).executeTakeFirst();return t?.serialize&&(o=t.serialize(o)),o}async function G(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:yn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return U.driver===`mysql`?xn(e,i):bn(e,i)}async function Sn(e,t){let n=t?.query?t.query(U.deleteFrom(e)):U.deleteFrom(e);t?.where&&(n=n.where(e=>t.where(e))),await n.execute()}async function K(e,t){let n=t?.query||U.selectFrom(e).selectAll();t?.query&&(n=t.query(U.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),t?.limit&&(n=n.limit(t.limit)),t?.offset&&(n=n.offset(t.offset)),t?.debug&&console.log(n.compile());let r=await n.execute();return t?.serialize&&(r=r.map(t.serialize)),r}async function Cn(e,t){return!!(await K(e,t))[0]}async function q(e,t){let n=U.selectFrom(e).selectAll();t?.query&&(n=t.query(n)),t?.where&&(n=n.where(e=>t.where(e)));let r=await n.limit(1).executeTakeFirst();return r?t?.serialize?t.serialize(r):r:null}async function J(e,t){let n=await q(e,t);if(!n)throw new y(`${t?.name??`Record`} not found`,404);return n}async function wn(e,t){let n=await K(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where,query:()=>{let n=t?.select?t.select(U.selectFrom(e)):U.selectFrom(e).selectAll();return t?.where&&(n=n.where(e=>t.where(e))),n.limit(1)}});return n.length>0?n[0]:await G(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}async function Tn(e,t){let n=t?.page&&t.page>0?t.page:1,r=t?.limit&&t.limit>0?t.limit:10,i=(n-1)*r,a=t?.orderBy&&(Array.isArray(t.orderBy)?t.orderBy:[t.orderBy]),o=t?.orderDesc&&(Array.isArray(t.orderDesc)?t.orderDesc:[t.orderDesc]),s=await K(e,{serialize:t?.serialize,query:()=>{let n=U.selectFrom(e).selectAll();return t?.query&&(n=t.query(U.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),a&&a.map((e,t)=>[e,o&&o[t]?o[t]:`asc`]).forEach(([e,t])=>{n=n.orderBy(e,t)}),r>0&&(n=n.limit(r).offset(i)),t?.debug&&console.log(n.compile()),n}}),c=await ln(e,{query:()=>{let n=U.selectFrom(e).selectAll();return t?.query&&(n=t.query(U.selectFrom(e))),t?.debug&&console.log(n.compile()),n}});return Dt.from({items:s,total:c,page:n,per_page:r,total_pages:Math.ceil(c/r)})}function En(e){return e.where(`deleted_at`,`is`,null)}function Dn(e){return e.eb(e.ref(`deleted_at`),`is`,null)}Dn.column=e=>t=>t.eb(e,`is`,null);const On=e=>e.eb(`deleted_at`,`is not`,null),kn=e=>e.addColumn(`deleted_at`,`timestamp`);async function An(e,t){let n=t?.query?t.query(U.updateTable(e)):U.updateTable(e);n=n.set({deleted_at:W()}).where(Dn);let r=await n.returningAll().execute();return t?.serialize&&(r=r.map(t.serialize)),r}g.prototype.addSoftDeleteColumn=function(){return this.addColumn(`deleted_at`,`timestamp`)};const jn=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(W()).notNull()),Mn=e=>e.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(W()).notNull()),Nn=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(W()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(W()).notNull());g.prototype.addTimestampColumns=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(W()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(W()).notNull())},g.prototype.addCreatedColumn=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(W()).notNull())},g.prototype.addUpdatedColumn=function(){return this.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(W()).notNull())};async function Pn(e,t){let n=t?.values||[],r=U.updateTable(e);r=r.set(n).returningAll(),t?.query&&(r=t.query(r)),t?.where&&(r=r.where(e=>t.where(e))),t?.debug&&console.log(r.compile());let i=await r.execute();return t?.serialize&&(i=i.map(t.serialize)),i}async function Fn(e,t){let n=t?.values||[],r=U.updateTable(e);t?.where&&r.where(e=>t.where(e)),await r.set(n).execute();let i=U.selectFrom(e).selectAll();t?.where&&i.where(e=>t.where(e)),t?.debug&&console.log(i.compile());let a=await i.execute();return t?.serialize&&(a=a.map(t.serialize)),a}async function In(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:yn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return U.driver===`mysql`?Fn(e,i):Pn(e,i)}async function Ln(e,t){return await q(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})?(await In(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values,where:t?.where}),q(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})):await G(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}g.prototype.addIdColumn=function(e=`id`){return U.driver===`postgresql`?this.addColumn(e,`serial`,e=>e.primaryKey()):U.driver===`mysql`?this.addColumn(e,`integer`,e=>e.primaryKey().autoIncrement()):this.addColumn(e,`integer`,e=>e.primaryKey())};var Y=class{autoCreatedAt=!1;autoUpdatedAt=!1;constructor(e,t,n){this.db=e,this.table=t,this.primaryKey=n}query(e){return e?.qb||this.db.selectFrom(this.table)}async count(e){let t=this.query(e);t=t.select(e=>e.fn.countAll().as(`count`));let n=await t.executeTakeFirstOrThrow();return Number(n.count)}async findMany(e){let t=this.query(e);if(t=t.selectAll(),e?.limit!==void 0&&(t=t.limit(e.limit)),e?.offset!==void 0&&(t=t.offset(e.offset)),e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];n.forEach((e,n)=>{t=t.orderBy(e,r[n]||`asc`)})}return await t.execute()}async findOne(e){let t=this.query(e);return t=t.selectAll(),await t.executeTakeFirst()}async findById(e,t){let n=this.query(t);return n=n.selectAll(),n=n.where(this.primaryKey,`=`,e),await n.executeTakeFirst()}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new y(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=(t-1)*(e?.limit??10),r=e?.limit??10,i={...e,limit:r,offset:n},a={...e},[o,s]=await Promise.all([this.findMany(i),this.count(a)]);return{items:o,page:t,per_page:r,total:s,total_pages:Math.ceil(s/r)}}async beforeCreate(e){return e}async afterCreate(e){}async create(e){this.autoCreatedAt&&u(e,`created_at`,W()),this.autoUpdatedAt&&u(e,`updated_at`,W()),e=await this.beforeCreate(e);let t=this.db.insertInto(this.table);t=t.values(e).returningAll();let n=await t.executeTakeFirst();return await this.afterCreate(n),n}async beforeCreateMany(e){return e}async afterCreateMany(e){return e}async createMany(e){this.autoCreatedAt&&(e=e.map(e=>(u(e,`created_at`,W()),e))),e=await this.beforeCreateMany(e);let t=this.db.insertInto(this.table);t=t.values(e).returningAll();let n=await t.execute();return await this.afterCreateMany(n),n}async beforeUpdate(e,t){return e}async afterUpdate(e){return e}async updateById(e,t){this.autoUpdatedAt&&u(t,`updated_at`,W()),t=await this.beforeUpdate(t,e);let n=await this.findByIdOrFail(e),r=this.db.updateTable(this.table);r=r.set(t).where(this.primaryKey,`=`,n[this.primaryKey]).returningAll();let i=await r.executeTakeFirst();await this.afterUpdate(i)}async beforeDelete(e){}async afterDelete(e){}async deleteById(e){await this.beforeDelete(e);let t=await this.findByIdOrFail(e),n=this.db.deleteFrom(this.table);n=n.where(this.primaryKey,`=`,t[this.primaryKey]),await n.executeTakeFirst(),await this.afterDelete(e)}beforeDeleteMany(e){return e}afterDeleteMany(e){}async deleteMany(e){e=this.beforeDeleteMany(e);let t={...e,qb:this.db.deleteFrom(this.table)},n=this.query(t);e?.limit&&(n=n.limit(e.limit)),await n.execute(),await this.afterDeleteMany(e)}},Rn=class extends S(Ye(Y),cn()){autoCreatedAt=!0;autoUpdatedAt=!1;constructor(e){super(e,`tokens`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),e?.type){let n=Array.isArray(e.type)?e.type:[e.type];t=t.where(`type`,`in`,n)}return t}async findByToken(e){let t=this.query();return t=t.selectAll(),t=t.where(`token`,`=`,e),await t.executeTakeFirst()||null}async generate(e){let t=Ee(64).toString(`hex`),n=e.expires_in_hours?new Date(Date.now()+e.expires_in_hours*60*60*1e3):null;return await this.create({user_id:e.user_id,token:t,type:e.type||`auth`,expires_at:n})}};const zn=new Rn(U),Bn=b.proxy(D),Vn=b.proxy(rn);var Hn=class extends Y{static __container_entry_key=`UserRepository`;autoCreatedAt=!0;autoUpdatedAt=!0;constructor(e){super(e,`users`,`id`)}async hashUserPasswordIfDefined(e){e.password&&=await Vn.hash(e.password)}async beforeCreate(e){return await this.hashUserPasswordIfDefined(e),e}async beforeCreateMany(e){for(let t of e)await this.hashUserPasswordIfDefined(t);return e}async beforeUpdate(e){return await this.hashUserPasswordIfDefined(e),e}async afterCreate(e){Bn.emit(`user:created`,{user:e})}query(e={}){let t=super.query(e);if(e.showDeleted||(t=t.where(`deleted_at`,`is`,null)),e.search&&(t=t.where(t=>t.or([t(`name`,`like`,`%${e.search}%`),t(`username`,`like`,`%${e.search}%`),t(`email`,`like`,`%${e.search}%`)]))),e?.email&&(t=t.where(`email`,`=`,e.email)),e?.username&&(t=t.where(`username`,`like`,`%${e.username}%`)),e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return t}};const Un=new Hn(U);var Wn=class{static __container_entry_key=`HttpTesterService`;http;request;headers={};cookies={};constructor(e){this.http=e.http,this.request=Pe(this.http.getExpressApp())}create(e){for(let[t,n]of Object.entries(this.headers))e.set(t,n);for(let[t,n]of Object.entries(this.cookies))e.set(`Cookie`,`${t}=${n}`);return e}get(e){return this.create(this.request.get(e))}post(e,t){return this.create(this.request.post(e).send(t))}async loginByUser(e){let t=await zn.generate({user_id:e.id});this.cookies.Authorization=t.token}async loginByUsername(e){let t=await Un.findOne({username:e});if(!t)throw new y(`User not found`);return this.loginByUser(t)}},Gn=class extends Qe{async addDirectory(e){let t=await Je(e),n=[];for(let[e,r]of Object.entries(t)){let t=new(r.default||r);t.hook_id=t.hook_id||e,n.push(t)}n.forEach(e=>this.add(e))}},Kn=class{payload;table;foreignKey;parentKey=`id`;constructor(e,t,n,r){this.payload=e,this.table=t,this.foreignKey=n,r&&(this.parentKey=r)}get needWhereIn(){for(let e of Object.values(this.payload))if(typeof e==`string`||e.eq!==void 0||e.neq!==void 0||e.like!==void 0||e.nlike!==void 0||e.in!==void 0||e.nin!==void 0||e.gt!==void 0||e.gte!==void 0||e.lt!==void 0||e.lte!==void 0||e.is_null!==void 0||e.exists===!0)return!0;return!1}get needWhereNotIn(){for(let e of Object.values(this.payload))if(typeof e!=`string`&&e.exists===!1)return!0;return!1}apply(e){let t=e;return this.needWhereIn&&(t=t.where(this.parentKey,`in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereIn(e)))),this.needWhereNotIn&&(t=t.where(this.parentKey,`not in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereNotIn(e)))),t}buildRowConditions(e,t,n){if(typeof n==`string`)return[e.eb(`name`,`=`,t),e.eb(`value`,`=`,n)];let r=[e.eb(`name`,`=`,t)];return n.eq!==void 0&&r.push(e.eb(`value`,`=`,n.eq)),n.neq!==void 0&&r.push(e.eb(`value`,`!=`,n.neq)),n.like!==void 0&&r.push(e.eb(`value`,`like`,n.like)),n.nlike!==void 0&&r.push(e.eb(`value`,`not like`,n.nlike)),n.in&&r.push(e.eb(`value`,`in`,n.in)),n.nin&&r.push(e.eb(`value`,`not in`,n.nin)),n.gt!==void 0&&r.push(e.eb(`value`,`>`,n.gt)),n.gte!==void 0&&r.push(e.eb(`value`,`>=`,n.gte)),n.lt!==void 0&&r.push(e.eb(`value`,`<`,n.lt)),n.lte!==void 0&&r.push(e.eb(`value`,`<=`,n.lte)),n.is_null!==void 0&&r.push(e.eb(`value`,n.is_null?`is`:`is not`,null)),r}whereIn=e=>{let t=e;for(let[n,r]of Object.entries(this.payload))typeof r!=`string`&&r.exists===!1||(t=t.and(this.buildRowConditions(e,n,r)));return t};whereNotIn=e=>{let t=e;for(let[e,n]of Object.entries(this.payload))typeof n!=`string`&&n.exists===!1&&(t=t(`name`,`=`,e));return t}},qn=class e{id;table;foreignKey;constructor(e){this.id=e.id,this.table=e.table,this.foreignKey=e.foreignKey}static parse(e){return typeof e==`string`&&e.startsWith(`json:`)?JSON.parse(e.slice(5)):typeof e==`string`&&e.startsWith(`bool:`)?e.slice(5)===`true`:typeof e==`string`&&e.startsWith(`number:`)?Number(e.slice(7)):typeof e==`string`&&e.startsWith(`string:`)?e.slice(7):e}static flatten(t){let n={};for(let r of t)n[r.name]=e.parse(r.value);return n}async get(t,n){let r=U.selectFrom(this.table);r=r.selectAll().where(this.foreignKey,`=`,this.id).where(`name`,`=`,t).limit(1);let i=await r.executeTakeFirst();return!i||!i.value?n:e.parse(i.value)}async set(e,t){let n=this.foreignKey,r=this.table,i={[n]:this.id,name:e,value:t};if(typeof t==`object`&&(i.value=`json:${JSON.stringify(t)}`),await U.selectFrom(r).where(n,`=`,this.id).where(`name`,`=`,e).executeTakeFirst()){await U.updateTable(r).set(i).where(n,`=`,this.id).where(`name`,`=`,e).execute();return}await U.insertInto(r).values(i).execute()}async list(){let t=this.foreignKey,n=this.table,r=U.selectFrom(n);return r=r.selectAll().where(t,`=`,this.id),(await r.execute()).map(t=>({name:t.name,value:e.parse(t.value)}))}async all(){let e=await this.list(),t={};for(let n of e)t[n.name]=n.value;return t}},Jn=class{name;source;filename;executedAt;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename,this.executedAt=e.executedAt}async up(e){let t=await import(this.filename);if(typeof t.up!=`function`)throw new y(`Migration ${this.name} does not export an up function`);await t.up(e)}async down(e){let t=await import(this.filename);if(typeof t.down!=`function`)throw new y(`Migration ${this.name} does not export a down function`);await t.down(e)}},Yn=class{static __container_entry_key=`MigratorService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new D,this.logger=e.logger||new v,this.db=e.db,this.sources=e.sources}addSource(e){this.sources.push(e)}async ensureMigrationsTable(){await this.db.schema.createTable(`migrations`).ifNotExists().addColumn(`name`,`varchar(255)`,e=>e.primaryKey()).addColumn(`module`,`varchar(255)`).addColumn(`executed_at`,`timestamp`,e=>e.notNull()).execute()}async listSource(e){if(!s.existsSync(e.directory))return this.logger.warn(`Migration source directory does not exist: ${e.directory}`),[];let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.some(e=>a.endsWith(e)))continue;let t=r.join(e.directory,a),o=new Jn({name:r.basename(a,r.extname(a)),source:e.id,filename:t,executedAt:null});i.push(o)}return i}async list(e){await this.ensureMigrationsTable();let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}let n=await this.db.selectFrom(`migrations`).selectAll().execute();for(let e of n){e.source||=`root`;let n=t.find(t=>t.name===e.name);n&&(n.executedAt=new Date(e.executed_at))}if(e?.source&&(t=t.filter(t=>t.source===e.source)),e?.name){let n=Array.isArray(e.name)?e.name:[e.name];t=t.filter(e=>n.includes(e.name))}return t=ae(t,[`source`,`name`],[`asc`,`asc`]),t}async migrateUp(e){await e.up(this.db),await this.db.insertInto(`migrations`).values({name:e.name,module:e.source,executed_at:f(new Date,`yyyy-MM-dd HH:mm:ss`)}).execute(),this.logger.info(`${e.name} migrated successfully`)}async migrateDown(e){await e.down(this.db),await this.db.deleteFrom(`migrations`).where(`name`,`=`,e.name).where(`module`,`=`,e.source).execute(),this.logger.info(`${e.name} rolled back successfully`)}async migrateFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:Error(`Migration ${e} not found`)};if(t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await _(()=>this.migrateUp(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async rollbackFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:`Migration ${e} not found`};if(!t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await _(()=>this.migrateDown(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async migrate(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>!e.executedAt),t.sort((e,t)=>e.name.localeCompare(t.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-migrate`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.migrateFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-migrate`,{migrations:t,results:n}),n}async rollback(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>e.executedAt),t.sort((e,t)=>t.name.localeCompare(e.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-rollback`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.rollbackFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-rollback`,{migrations:t.map(e=>e.name)}),n}async up(e=1,t={}){return this.migrate({...t,steps:e})}async down(e=1,t={}){return this.rollback({...t,steps:e})}async latest(e={}){return this.migrate(e)}async latestOrFail(e={}){let t=await this.latest(e),n=t.find(e=>e.result===`failed`);if(n)throw n.error||new y(`Migration failed: ${n.name}`);return t}async fresh(e={}){let t=await this.rollback(e);return t.some(e=>e.result===`failed`)?t:await this.migrate(e)}},Xn=class{listeners=new Map;constructor(){process.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!process.send)throw Error(`PluginIpcClient.emit: process.send is not available — process was not spawned with IPC channel`);let n=T(),r={id:n,event:e,data:t};return process.send(r),n}},Zn=class{listeners=new Map;constructor(e){this.child=e,this.child.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!this.child.send)throw Error(`PluginIpcHost.emit: child process was not spawned with an IPC channel`);let n=T(),r={id:n,event:e,data:t};return this.child.send(r),n}};function Qn(e){let t=[],n=e.replace(/:[a-zA-Z_][a-zA-Z0-9_]*/g,e=>(t.push(e.slice(1)),`([^/]+)`)).replace(/\//g,`\\/`);return{pattern:RegExp(`^${n}$`),paramNames:t}}var $n=class{routes=[];constructor(e){this.client=e,this.client.on(`router:request`,e=>this.dispatch(e))}async dispatch(e){for(let t of this.routes){if(t.method!==e.method)continue;let n=t.pattern.exec(e.path);if(!n)continue;let r={};t.paramNames.forEach((e,t)=>{r[e]=n[t+1]});let i=200,a={},o={status(e){return i=e,this},send:t=>{let n={requestId:e.requestId,status:i,body:t,headers:a};this.client.emit(`router:response`,n)}};await t.handler({...e,params:r},o);return}this.client.emit(`router:response`,{requestId:e.requestId,status:404,body:{message:`Not Found`}})}register(e,t,n){let{pattern:r,paramNames:i}=Qn(t);this.routes.push({method:e,path:t,handler:n,pattern:r,paramNames:i}),this.client.emit(`router:register`,{method:e,path:t})}get(e,t){this.register(`GET`,e,t)}post(e,t){this.register(`POST`,e,t)}put(e,t){this.register(`PUT`,e,t)}patch(e,t){this.register(`PATCH`,e,t)}delete(e,t){this.register(`DELETE`,e,t)}},er=class e{directory;prefix;module;router;logger=new v;routes=[];debug=!1;setDirectory(e){return this.directory=e,this}setPrefix(e){return this.prefix=e,this}setRouter(e){return this.router=e,this}setModule(e){return this.module=e,this}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}static create(t){return new e().setDirectory(t)}async loadFiles(){let e=l.sync(`**/*.(ts|js|mjs)`,{cwd:this.directory});this.debug&&this.logger.debug(`Found ${e.length} route files in ${this.directory}`,{files:e});let t=[];for(let n of e){let e=n.replace(/\.(ts|js|mjs)$/,``),r=`get`;for(let t of[`.post`,`.patch`,`.delete`,`.put`])if(e.endsWith(t)){r=t.substring(1),e=e.replace(t,``);break}e=e.replace(/\/index$/,``),e=e.replace(/^index$/,``),e=e.replace(/\[\.\.\.([^\]]+)]/g,`*$1`),e=e.replace(/\[([^\]]+)]/g,`:$1`),e.startsWith(`/`)||(e=`/`+e),e===`/`&&(e=`/`),this.prefix&&(e=(this.prefix.startsWith(`/`)?this.prefix:`/`+this.prefix)+e);let i=0;e.includes(`*`)&&(i+=1e6);let a=(e.match(/:/g)||[]).length;i+=a*1e4;let o=e.split(`/`).filter(e=>e).length;i-=o*100,t.push({file:n,routePath:e,method:r,sortKey:i,module:this.module})}t.sort((e,t)=>e.sortKey-t.sortKey),this.routes=t}async registerRoutes(){if(!this.router)throw new y(`Router instance not set`);let e=this.module||`unknown`,t=function(t){t.metadata={...t.metadata,module:e}};this.router.on(`added`,t);for(let e of this.routes){let t=(await import(`${this.directory}/${e.file}`)).default;if(typeof t!=`function`){this.logger.warn(`Route file ${e.file} does not export a default function`);continue}this.router[e.method](e.routePath,t)}this.router.off(`added`,t)}async load(){await this.loadFiles(),await this.registerRoutes()}},tr=class extends H{files=new Map;dirs=new Map;constructor(e={}){super(e)}addFile(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.files.set(e,n)}addDir(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.dirs.set(e,n)}async loadFile(e){if(!s.existsSync(e.filepath))return this.logger.warn(`File not found: ${e.filepath}`),!1;let t=function(t){t.metadata={...t.metadata,...e.metadata,filename:e.filepath}},n=`${e.filepath}?t=${Date.now()}`;this.on(`added`,t);let[r]=await _(()=>import(n));return this.off(`added`,t),r?(Object.assign(r,e),this.logger.error(`failed to load file`,r),!1):!0}async loadDir(e){let t=new Set;if(!s.existsSync(e.filepath))return this.logger.warn(`Directory not found: ${e.filepath}`),Array.from(t);let n=s.readdirSync(e.filepath);for(let i of n){if(i.endsWith(`.test.ts`)||i.endsWith(`.spec.ts`)||i.endsWith(`.test.js`)||i.endsWith(`.spec.js`))continue;let n=r.join(e.filepath,i),a={filepath:n,metadata:e.metadata};await this.loadFile(a)&&t.add(n)}return Array.from(t)}async load(){let e=new Set;for(let t of this.files.values())await this.loadFile(t)&&e.add(t.filepath);for(let t of this.dirs.values())(await this.loadDir(t)).forEach(t=>e.add(t));this.debug&&this.logger.debug(`load files`,{files:Array.from(e).map(e=>r.relative(process.cwd(),e))})}};const nr=[{method:`get`,path:`/`,handler:`index`,hooks:{before:[`beforeIndex`],after:[`afterIndex`]}},{method:`get`,path:`/:id`,handler:`show`,hooks:{before:[`beforeShow`],after:[`afterShow`]}},{method:`post`,path:`/`,handler:`store`,hooks:{before:[`beforeStore`,`beforeSave`],after:[`afterStore`,`afterSave`]}},{method:`put`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`patch`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`delete`,path:`/:id`,handler:`destroy`,hooks:{before:[`beforeDestroy`],after:[`afterDestroy`]}}];var rr=class extends S(ht){options;constructor(e={}){super(),this.options=e}async index(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async show(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async store(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async update(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async destroy(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}wrap(e,t,n){return async r=>{await this.emit(`beforeAll`,r);for(let e of t)await this.emit(e,r);let i=await this[e](r);for(let e of n)await this.emit(e,r,i);return i}}register(e){for(let t of nr){let n=t.method,r=t.handler;this.options.except&&this.options.except.includes(r)||(this.options.middleware&&this.options.middleware.all&&e.use(this.options.middleware.all),this.options.middleware&&this.options.middleware[r]&&e.use(this.options.middleware[r]),e[n](t.path,this.wrap(t.handler,t.hooks?.before||[],t.hooks?.after||[])))}}},ir=class extends rr{model;constructor(e,t={}){if(super(t),!e.__isConfigModel)throw Error(`RouterResourceConfigService requires a ConfigModel`);this.model=e}async index(e){let t=await this.model.list();return{page:1,total:t.length,total_pages:1,items:t}}async show(e){let t=e.params.id;return await this.model.findOrFail(t)}async store(e){let t=e.request.body;return await this.model.create(t),{message:`Resource created successfully`}}async update(e){let t=e.params.id,n=e.request.body;return await this.model.update(t,n)}async destroy(e){let t=e.params.id;return await this.model.destroy(t),{success:!0}}},ar=class e{id;cron;job;static create(){return new e}handle=()=>{throw Error(`RoutineEntity handler not implemented`)};setId(e){return this.id=e,this}setCron(e){return this.cron=e,this}setHandler(e){return this.handle=e,this}},or=class e{static __container_entry_key=`SchedulerService`;routines;logger;debug;dirs=[];constructor(e){this.routines=[],this.logger=e?.logger||new v,this.debug=e?.debug||!1}static create(t){return new e(t)}setLogger(e){this.logger=e}setDebug(e){this.debug=e}addDir(e){this.dirs.push(e)}add(e){let t=e?.id||T();this.routines.push(e),this.debug&&this.logger.debug(`${t} routine added`,{id:t,cron:e.cron})}remove(e){let t=Array.isArray(e)?e:[e];this.routines=this.routines.filter(e=>!t.includes(e.id)),this.debug&&this.logger.info(`routines removed`,{ids:t})}async loadFile(e){if(!s.existsSync(e)){this.logger.warn(`File not found: ${e}`);return}let[t,n]=await _(()=>import(e));if(t){this.logger.error(`failed to load routines from ${e}`,t);return}let r=n?.default||n;if(!r?.is_routine){this.logger.warn(`file does not export a routine: ${e}`);return}let i=new r;i.id=i.id||e,this.add(i),this.debug&&this.logger.debug(`file loaded`,{filename:e})}async loadDirectory(e){if(!s.existsSync(e)){x.warn(`directory not found`,{directory:e});return}let t=s.readdirSync(e).filter(e=>e.endsWith(`.ts`));for(let n of t)await this.loadFile(r.join(e,n))}async load(){for(let e of this.dirs)await this.loadDirectory(e)}has(e){return this.routines.some(t=>t.id===e)}async startRoutine(e){let t=this.routines.find(t=>t.id===e);if(!t)throw new y(`RoutineEntity not found: ${e}`);t.job&&t.job.cancel();let n=this.logger.child({routineId:t.id,routineCron:t.cron});t.job=Fe.scheduleJob(t.cron,async()=>{let[e]=await _(()=>t.handle());if(e){n.error(e.message,e);return}n.info(`${t.id} routine executed`)}),n.info(`${t.id} routine started`)}async addAndStart(e){this.add(e),await this.startRoutine(e.id)}async stopRoutine(e){let t=this.routines.find(t=>t.id===e);if(!t)throw new y(`RoutineEntity not found`,404);t.job&&(t.job.cancel(),this.logger.info(`${t.id} routine stopped`))}async stopAndRemove(e){await this.stopRoutine(e),this.remove(e)}async boot(){for(let e of this.routines)await this.startRoutine(e.id)}async shutdown(){for(let e of this.routines)await this.stopRoutine(e.id)}list(){return this.routines}},sr=class{name;source;filename;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename}async run(e){let t=await import(this.filename);if(typeof t.default!=`function`)throw new y(`Seeder ${this.name} does not export a function`);await t.default(e)}},cr=class{static __container_entry_key=`SeederService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new D,this.logger=e.logger||new v,this.db=e.db,this.sources=e.sources||[]}addSource(e){this.sources.push(e)}async listSource(e){let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.includes(r.extname(a)))continue;let t=r.join(e.directory,a),o=new sr({name:r.basename(a,r.extname(a)),source:e.id,filename:t});i.push(o)}return i}async list(e){let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}if(e?.source){let n=Array.isArray(e.source)?e.source:[e.source];t=t.filter(e=>e.source&&n.includes(e.source))}if(e?.name){let n=Array.isArray(e.name)?e.name:[e.name];t=t.filter(e=>n.includes(e.name))}return t.sort((e,t)=>e.name.localeCompare(t.name)),t}async runSeeder(e){let[t]=await _(()=>e.run(this.db));return t?(this.logger.error(`failed to run seeder ${e.name}`,t),{name:e.name,filename:e.filename,source:e.source,result:`failed`,error:t}):(this.logger.info(`seeder ${e.name} ran successfully`),{name:e.name,filename:e.filename,source:e.source,result:`success`})}async run(e={}){let t=await this.list(e);await this.emmitter.emitAndWait(`seeder:before-run`,{seeders:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.runSeeder(e);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`seeder:after-run`,{seeders:n.map(e=>e.name)}),n}},X=class{static __container_entry_key=`ShellService`;debug;logger;constructor(e={}){this.debug=e.debug??!1,this.logger=e.logger||new v,this.debug&&this.logger.debug(`initialized in debug mode`)}async command(e,t,n={}){return new Promise((r,i)=>{let a=fe(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell??!0,env:n.env||process.env}),o=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{o+=e.toString()}),a.on(`close`,n=>{if(this.debug&&this.logger.debug(`command executed`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`,output:o}),n===0)return r();let a=`Command failed with exit code ${n}`;this.logger.error(a,{bin:e,args:t,code:n,output:o}),i(new pt(a,o,e,t))}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`,error:n?.message||n}),i(n)})})}async executeCommandWithOutput(e,t,n={}){return this.debug&&this.logger.debug(`executing command`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`}),new Promise((r,i)=>{let a=fe(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell===void 0?!0:n.shell,env:n.env||process.env}),o=``,s=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{s+=e.toString()}),a.on(`close`,n=>{if(n===0)r(o.trim());else{let r=`Command failed with exit code ${n}: ${s}`;this.logger.error(r,{bin:e,args:t,code:n,fullCommand:`${e} ${t.join(` `)}`,errorOutput:s}),i(new pt(r,o,e,t))}}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),i(n)})})}},lr=class{constructor(e,t,n=`id`){this.config=e,this.key=t,this.primaryKey=n}getItems(){return this.config.get(this.key,[])}setItems(e){this.config.set(this.key,e)}query(e){return this.getItems()}async count(e){return this.query(e).length}async findMany(e){let t=this.query(e);if(e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];t=ae(t,n,r)}return e?.offset&&(t=t.slice(e.offset)),e?.limit&&(t=t.slice(0,e.limit)),t}async findOne(e){return this.query(e)[0]??null}async findById(e,t){return this.query(t).find(t=>t[this.primaryKey]===e)??null}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new y(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=e?.limit??10,r=(t-1)*n,[i,a]=await Promise.all([this.findMany({...e,limit:n,offset:r}),this.count(e)]);return{items:i,page:t,per_page:n,total:a,total_pages:Math.ceil(a/n)}}async create(e){let t=this.getItems(),n={[this.primaryKey]:T(),...e};return t.push(n),this.setItems(t),n}async createMany(e){let t=this.getItems(),n=e.map(e=>({[this.primaryKey]:T(),...e}));return this.setItems([...t,...n]),n}async updateById(e,t){let n=this.getItems(),r=n.findIndex(t=>t[this.primaryKey]===e);if(r===-1)throw new y(`Item not found`,404);return n[r]={...n[r],...t},this.setItems(n),n[r]}async deleteById(e){await this.findByIdOrFail(e);let t=this.getItems().filter(t=>t[this.primaryKey]!==e);this.setItems(t)}async deleteMany(e){let t=this.query(e),n=e?.limit??t.length,r=new Set(t.slice(0,n).map(e=>e[this.primaryKey])),i=this.getItems().filter(e=>!r.has(e[this.primaryKey]));this.setItems(i)}},ur=class extends Y{constructor(e){super(e,`files`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`f.client_name`,`like`,`%${e.search}%`)),e?.purpose?.length&&(t=t.where(`f.purpose`,`in`,e.purpose)),e?.client_name?.length&&(t=t.where(`f.client_name`,`in`,e.client_name)),e?.metas&&(t=new Kn(e.metas,`file_metas`,`file_id`).apply(t)),t}},dr=class{cwd;shell;constructor(e){this.cwd=e.cwd,this.shell=e.shell??new X}async list(){return(await this.shell.executeCommandWithOutput(`git`,[`branch`,`-a`,`--format='%(HEAD)|%(refname:short)|%(refname)|%(upstream:remotename)'`],{cwd:this.cwd})).split(`
|
|
2
|
-
`).filter(Boolean).filter(e=>e.includes(`|`)).map(e=>{let[t,n,r,i]=e.split(`|`),a=r.startsWith(`refs/remotes/`);return new
|
|
3
|
-
`).filter(Boolean):[];return{directory:this.cwd,head:t?null:e,shortHash:n,isDetachedHead:t,remotes:i}}};function vr(e){return typeof e==`object`?`json:${JSON.stringify(e)}`:typeof e==`boolean`?`bool:${e}`:typeof e==`number`?`number:${e}`:String(e)}function yr(e,t){return function(n){return class extends n{async get(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s=U.selectFrom(e);s=s.selectAll().where(t,`=`,this[o]).where(`name`,`=`,n).limit(1);let c=await s.executeTakeFirst();if(!c||!c.value)return r;let l=c?.value;return typeof l==`string`&&l.startsWith(`json:`)&&(l=JSON.parse(l.slice(5))),typeof l==`string`&&l.startsWith(`bool:`)&&(l=l.slice(5)===`true`),l}async set(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s={[t]:this[o],name:n,value:r};s.value=vr(r),await Ln(e,{values:s,where:e=>e.and([e.eb(t,`=`,this[o]),e.eb(`name`,`=`,n)])})}}}}function br(e,t=`id`){return function(n){return class extends n{static __model={table:e,primaryKey:t};static serialize(e){let t=new this;return Object.assign(t,e),t}static select(){return U.selectFrom(e)}static async paginate(t){let n=this,r=await Tn(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r.items)await N(n,`serialized`,e);return await N(n,`afterPaginate`,r),r}static async list(t){let n=this,r=await K(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r)await N(n,`serialized`,e);return await N(n,`afterList`,r),r}static async findOne(t){let n=this,r=await q(e,{query:t?.query,where:t?.where,serialize:e=>n.serialize(e)});return r&&await N(n,`serialized`,r),await N(n,`afterFind`,r),r}static async findOneOrFail(t){let n=this,r=await J(e,{...t,name:t?.name??n.name,serialize:e=>n.serialize(e)});return await N(n,`serialized`,r),await N(n,`afterFind`,r),r}static async find(n){let r=this,i=await q(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return i&&(await N(r,`serialized`,i),await N(r,`afterFind`,i)),i}static async findOrFail(n){let r=this,i=await J(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static async findBy(t,n){let r=this,i=await J(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static async findByOrFail(t,n){let r=this,i=await J(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static exists(t){return Cn(e,{query:t?.query})}static count(t){return ln(e,t)}static async create(t){let n=this,r={...t};await N(n,`beforeCreate`,r);let i=await G(e,{serialize:e=>n.serialize(e),values:r});return await N(n,`afterCreate`,i),await N(n,`serialized`,i),await N(n,`afterFind`,i),i}static async createMany(t){let n=this,r=[];for await(let i of t){await N(n,`beforeCreate`,i);let t=await G(e,{values:i,serialize:e=>n.serialize(e)});await N(n,`afterCreate`,t),await N(n,`serialized`,t),await N(n,`afterFind`,t),r.push(t)}return r}static async update(t){let n=this,r={...t.values};await N(n,`beforeUpdate`,r,t.where),await In(e,{debug:t.debug,where:t.where,values:r,serialize:e=>n.serialize(e)});let i=await J(e,{where:t.where,serialize:e=>n.serialize(e)});return await N(n,`afterUpdate`,i),i}static updateById(e,n,r){return this.update({debug:r?.debug,where:n=>n(t,`=`,e),values:n})}static async destroy(t){let n=this;await N(n,`beforeDestroy`,t),await Sn(e,t),await N(n,`afterDestroy`,t)}static firstOrCreate(t){let n=this;return wn(e,{...t,serialize:e=>n.serialize(e)})}static updateOrCreate(t){let n=this;return Ln(e,{debug:t.debug,where:t.where,select:t.select,update:t.update,values:t.values,serialize:e=>n.serialize(e)})}static async destroyById(n){let r=this,i={query:e=>e.where(t,`=`,n)};await N(r,`beforeDestroy`,i),await Sn(e,i),await N(r,`afterDestroy`,i)}async save(){let n=this.constructor,r=ie(this,[t]);await N(n,`beforeSave`,this,r),await In(e,{where:e=>e(t,`=`,this[t]),values:r}),await N(n,`afterSave`,this)}async destroy(){let n=this.constructor;await N(n,`beforeDestroy`,this),await Sn(e,{query:e=>e.where(t,`=`,this.id)}),await N(n,`afterDestroy`,this)}async softDelete(){let n=this.constructor;await N(n,`beforeSoftDelete`,this);let r=(await An(e,{query:e=>e.where(t,`=`,this.id)}))[0];Object.assign(this,r),await N(n,`afterSoftDelete`,this)}}}}function xr(e){return function(t){return class extends t{static async load(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw Error(`Relation ${String(t)} declared`);await n.load(r)}}}}}const Sr=new Wt,Z=b.proxy(en),Cr=b.proxy(B),wr=new ur(U),Tr=b.proxy(on),Er=b.proxy(Yn),Dr=new hr(U),Or=new gr(U),kr=b.proxy(H),Ar=b.proxy(or),jr=b.proxy(X);function Mr(e){return e}async function Nr(e,t){let n=Array.isArray(e)?e:[e],r=t.target,i=t.pivot;function a(e,t){return typeof t==`function`?t(e):te(e,t)}let o=n.map(e=>a(e,i.sourceKey)).filter(Boolean),s=await i.findEntities(o),c=s.map(e=>a(e,i.targetKey)).filter(Boolean),l=await r.findEntities(c);for(let e of n){let n=s.filter(t=>a(t,i.sourceKey)===a(e,i.sourceKey));if(!n.length){u(e,t.key,[]);continue}let o=l.filter(e=>n.some(t=>a(t,r.sourceKey)===a(e,r.targetKey)));u(e,t.key,o)}}function Pr(e){return Mr({load:async t=>Nr(t,e)})}async function Fr(e,t){let n=Array.isArray(e)?e:[e],r=t?.targetKey||`permissions`,i=typeof t?.assignableType==`function`?t.assignableType:()=>t?.assignableType,a=typeof t?.assignableId==`function`?t.assignableId:()=>t?.assignableId,o=new Set,s=new Set;for(let e of n){let t=i(e),n=a(e);t&&n&&(o.add(t),s.add(n))}let c=await Dr.findMany({assignableId:Array.from(s.values()),assignableType:Array.from(o.values())}),l=Array.from(new Set(c.map(e=>e.permission_id))),ee=await Or.findMany({id:l});for(let e of n){let t=i(e),n=a(e);!t||!n||u(e,r,c.filter(e=>e.assignable_type===t&&e.assignable_id===n).map(e=>ee.find(t=>t.id===e.permission_id)).filter(Boolean))}}function Ir(e){return Mr({load:t=>Fr(t,e)})}var Lr=class extends _t{authorize(e,t,n){if(this.cannot(e,t,n)){let n=new y(`Unauthorized`,403),r=``;throw typeof t==`string`&&(r=t),t&&typeof t==`function`&&t.name&&(r=t.name),t&&typeof t==`object`&&t.constructor&&t.constructor.name&&(r=t.constructor.name),Object.assign(n,{action:e,subject:r}),n}}},Rr=class extends C(Ct,br(`file_metas`)){},zr=class{table;tableKey;targetTable;targetKey;property;constructor(e){this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=U.selectFrom(this.targetTable);n=n.selectAll().where(this.targetKey,`in`,Array.from(t));let r=await n.execute();e.forEach(e=>{let t=r.filter(t=>t[this.targetKey]===e[this.tableKey]);u(e,this.property,qn.flatten(t))})}};const Br={metas:new zr({table:`files`,tableKey:`id`,targetTable:`file_metas`,targetKey:`file_id`,property:`metas`})};var Q=class e extends C(St,ht,br(`files`),xr(Br),yr(`file_metas`,`file_id`)){static cache=new Map;static async has(e){return await this.exists({query:t=>t.where(`filename`,`=`,e)})}static async findByFilename(e){return await this.findOne({where:t=>t(`filename`,`=`,e)})}readStream(){return Z.use(this.drive).readStream(this.filename)}async read(){return await Z.use(this.drive).read(this.filename)}async loadUrl(t={}){let n=e.cache.get(this.filename),r=Date.now();if(n&&r<n.expires){this.url=n.url;return}if(t.expires||=`1h`,this.url=await Z.use(this.drive).url(this.filename,t),!this.url)return;let i=r+m(t.expires)-1e3;e.cache.set(this.filename,{url:this.url,expires:i})}static async loadUrls(e,t={}){let n=Date.now();for(let r of e){let e=this.cache.get(r.filename);if(e&&n<e.expires){r.url=e.url;continue}await r.loadUrl(t)}}static async loadMetas(e){let t=e.map(e=>e.id);if(!t.length)return;let n=await Rr.list({query:e=>e.selectAll().where(`file_id`,`in`,t)});e.forEach(e=>{e.metas=qn.flatten(n.filter(t=>t.file_id===e.id))})}async deleteFromDrive(){await Z.use(this.drive).delete(this.filename)}},Vr=class extends C(Et){get git(){return new _r({cwd:this.directory,sshKey:R.get(`modules.${this.id}.ssh_key`),sshKeyTmpFileName:It(`ssh_key_${this.id}.pem`),logger:x.child({label:`git`}),debug:R.get(`git.debug`,!1)})}makePath(...e){return a(this.directory,...e)}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}command=(e,t,n)=>jr.command(e,t,{cwd:this.directory,...n});load(){let e=this.makePath(`module.json`);if(!s.existsSync(e))return;let t=s.readFileSync(e,`utf-8`),n=JSON.parse(t);this.dependencies=n.dependencies||{},this.build=n.build||{}}findClientEntrypointFilename(e=`dev`){let t=[];e===`dev`&&t.push(this.makePath(`client`,`module.client.ts`),this.makePath(`client`,`module.client.js`),this.makePath(`client`,`client.ts`),this.makePath(`client`,`client.js`)),e===`node`&&t.push(this.makePath(`client-dist/node`,`index.js`),this.makePath(`client-dist/node`,`index.mjs`),this.makePath(`client-dist/node`,`module.client.js`),this.makePath(`client-dist/node`,`module.client.mjs`)),e===`browser`&&t.push(this.makePath(`client-dist/browser`,`index.js`),this.makePath(`client-dist/browser`,`index.mjs`),this.makePath(`client-dist/browser`,`module.client.js`),this.makePath(`client-dist/browser`,`module.client.mjs`));for(let e of t)if(s.existsSync(e))return e;return null}},Hr=class{url;request;response;cookies;head;nodeContainer;nodeConfig;nodeState;browserContainer;browserConfig;browserState;constructor(e){this.url=e.url,this.request=e.request,this.response=e.response,this.cookies=new an(this.request,this.response),this.head=[],this.nodeContainer=e.nodeContainer||new Ge,this.nodeConfig=e.nodeConfig||new E,this.nodeState=e.nodeState||new Map,this.browserConfig=e.browserConfig||new E,this.browserContainer=e.browserContainer||new Ge,this.browserState=e.browserState||new Map}setBrowserState(e,t){this.browserState.set(e,t)}setNodeState(e,t){this.nodeState.set(e,t)}setState(e,t){this.setNodeState(e,t),this.setBrowserState(e,t)}setBrowserContainerValue(e,t){this.browserContainer.set(e,t)}setNodeContainerValue(e,t){this.nodeContainer.set(e,t)}setContainerValue(e,t){this.setNodeContainerValue(e,t),this.setBrowserContainerValue(e,t)}setBrowserConfigValue(e,t){this.browserConfig.set(e,t)}setNodeConfigValue(e,t){this.nodeConfig.set(e,t)}setConfigValue(e,t){this.setNodeConfigValue(e,t),this.setBrowserConfigValue(e,t)}},Ur=class extends C(Ot){directory;makePath(...e){return Re(this.directory,...e)}set=(e,t,n)=>{R.set(`plugins.registry.${this.id}.${e}`,t,n)};get=(e,t)=>R.get(`plugins.registry.${this.id}.${e}`,t);get git(){return new _r({cwd:this.directory,shell:b.has(X)?b.get(X):void 0,sshKey:R.get(`plugins.registry.${this.id}.ssh_key`),sshKeyFile:R.get(`plugins.registry.${this.id}.ssh_key_file`)})}get commits(){return new mr({cwd:this.directory,shell:b.has(X)?b.get(X):void 0})}get branches(){return new dr({cwd:this.directory,shell:b.has(X)?b.get(X):void 0})}},Wr=class e extends Ur{apiFolders=new Map;apiDirectories=new Set;constructor(){super(),Bn.on(`router:registered`,this.onRouterRegistered.bind(this))}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}async load(){}async onRouterRegistered(e){let t=e.router;for(let[e,n]of this.apiFolders){let r=n.prefix||`/api/`;await er.create(e).setPrefix(r).setRouter(t).setModule(this.id).load()}for(let e of this.apiDirectories)t.addDir(e,{module:this.id})}addApiFolder(e,t={}){this.apiFolders.set(e,t)}addRouterFolder(e){this.apiDirectories.add(e)}static fromPluginDiscoverEntity(t){let n=typeof this==`function`?this:e,r=new n,i={id:t.id,name:t.name,version:t.version,directory:t.directory};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}},$=class{async load(e){let t=Error(`Not implemented`);throw Object.assign(t,{entities:e}),t}},Gr=class extends ${table;tableKey;targetTable;targetKey;property;serialize;constructor(e){super(),this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property,this.serialize=e.serialize||(e=>e)}async load(e){let t=[...new Set(e.map(e=>e[this.targetKey]).filter(Boolean))];if(!t.length)return;let n=(await U.selectFrom(this.targetTable).selectAll().where(this.tableKey,`in`,t).execute()).map(e=>this.serialize(e)),r=new Map(n.map(e=>[e[this.tableKey],e]));e.forEach(e=>{e[this.property]=r.get(e[this.targetKey])||null})}},Kr=class extends ${fileKey;property;constructor(e=`file`,t=`url`){super(),this.fileKey=e,this.property=t}async load(e){let t=e.map(e=>e[this.fileKey]).filter(e=>e instanceof Q);await Q.load(t,`metas`)}},qr=class extends ${fileKey;property;constructor(e=`file`,t=`url`){super(),this.fileKey=e,this.property=t}async load(e){for(let t of e){let e=t[this.fileKey];e&&await e.loadUrl(),u(t,this.property,e?e.url:null)}}},Jr=class extends Gr{constructor(e=`file`,t=`file_id`){super({table:`files`,tableKey:`id`,targetTable:`files`,targetKey:t,property:e,serialize:e=>Q.from(e)})}url(e=`url`){return new qr(this.property,e)}metas(e=`metas`){return new Kr(this.property,e)}},Yr=class extends Gr{constructor(){super({table:`users`,tableKey:`id`,targetTable:`users`,targetKey:`user_id`,property:`user`,serialize:e=>kt.from(e)})}},Xr=class{table;tableKey;targetTable;targetKey;property;serialize;after;constructor(e){this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property,this.serialize=e.serialize||(e=>e),this.after=e.after||(async e=>e)}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=(await U.selectFrom(this.targetTable).selectAll().where(this.targetKey,`in`,Array.from(t)).execute()).map(e=>this.serialize(e));e.forEach(e=>{e[this.property]=n.filter(t=>t[this.targetKey]===e[this.tableKey])}),await this.after(n)}},Zr=class extends ${table;tableKey;targetTable;targetKey;pivotTable;pivotSourceKey;pivotTargetKey;property;serialize;after;constructor(e){super(),this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.pivotTable=e.pivotTable,this.pivotSourceKey=e.pivotSourceKey,this.pivotTargetKey=e.pivotTargetKey,this.property=e.property,this.serialize=e.serialize||(e=>e),this.after=e.after||(async e=>e)}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=(await U.selectFrom(this.targetTable).selectAll(this.targetTable).innerJoin(this.pivotTable,`${this.targetTable}.${this.targetKey}`,`${this.pivotTable}.${this.pivotTargetKey}`).where(`${this.pivotTable}.${this.pivotSourceKey}`,`in`,Array.from(t)).execute()).map(e=>this.serialize(e));e.forEach(e=>{e[this.property]=n.filter(t=>t[this.pivotSourceKey]===e[this.tableKey])}),await this.after(e)}},Qr=class{async handle(e){if(!e.user||!e.token)throw new y(`Invalid authentication token`,401);return{user:e.user,token:e.token}}},$r=class{async handle(e){let t=e.cookie.get(`Authorization`);if(e.request&&e.request.headers.authorization&&(t=e.request.headers.authorization),t&&t.startsWith(`Bearer `)&&(t=t.slice(7)),!t)return{user:void 0,token:void 0};let n=await zn.findByToken(t),r;return n&&(r=await Un.findOrFail(n.user_id)),{user:r,token:n||void 0}}},ei=class{permissions;constructor(e){this.permissions=Array.isArray(e)?e:[e]}async handle(e){for(let t of this.permissions)e.acl.authorize(t.action,t.resource,t.conditions||{})}},ti=class{async handle(e){let t=e.token,n=[],r={};if(e.user&&t?.type===`auth`){let t=await Dr.findMany({assignableId:String(e.user.id),assignableType:`user`});n=await Or.findMany({id:t.map(e=>e.permission_id)}),r.auth={user:{id:e.user.id,name:e.user.name,email:e.user.email}}}if(t&&t.type===`api`){let e=await Dr.findMany({assignableId:String(t.id),assignableType:`token`});n=await Or.findMany({id:e.map(e=>e.permission_id)}),r.api={token:{id:t.id,name:t.name}}}return{acl:new Lr({permissions:gt.applyContext(n,r),debug:R.get(`acl.debug`)||R.get(`app.debug`),logger:x.child({label:`acl`})})}}static create(e){return new ei(e)}};function ni(e){async function t(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw new y(`Loader ${String(t)} not declared`);await n.load(r)}}return{keys:Object.keys(e),loaders:e,load:t}}function ri(){let e=new Uint8Array(8);h.getRandomValues(e);let t=Array.from(e,e=>e.toString(36).padStart(2,`0`)).join(``);return`c${Date.now().toString(36)}${t.slice(0,12)}`}function ii(e){return e}function ai(e){let t=e.folders,n=e.filename,i=e.patterns||[],a=[`**/node_modules`,`**/*.spec.ts`,`**/*.spec-d.ts`,`**/*.test.ts`,`**/*.test-d.ts`];if(e.folders)for(let e of t)i.push(`${e}/**/*.ts`,`${e}/**/*.js`);let o=e.ignore||[],c=``,ee=l.sync(i,{ignore:[...a,...o]});for(let e of ee){let t=r.relative(r.dirname(n),e),i=r.extname(e),a=s.readFileSync(e,`utf-8`).includes(`export default`)&&!t.includes(`generateIndexFile.ts`);e.endsWith(`.vue`)&&(a=!0),c+=`export * from './${t}'\n`,a&&(c+=`export { default as ${r.basename(e,i)} } from './${t}'\n`)}c=c.trim(),s.writeFileSync(n,c)}async function oi(e){for(let t of e){let e=ze(t);if(Be.existsSync(t))return await import(e.toString())}return null}export{Lr as AclEntity,Qr as AuthMiddleware,$r as AuthSilenceMiddleware,ti as AuthorizationMiddleware,ei as AuthorizePermission,$ as BaseRelation,Jr as BelongsToFileRelation,Gr as BelongsToRelation,Yr as BelongsToUserRelation,At as CliCommand,jt as CliService,Mt as CliTesterService,Nt as CliWrapperService,Lt as ConfigFSService,Ut as ConfigManagerService,lr as ConfigRepository,Ht as ConfigS3Service,an as CookieMapEntity,sn as DatabaseGateway,Y as DatabaseRepository,cn as DatabaseRepositoryInferMixin,Wt as DownloadService,Rt as DriveBaseGateway,Kt as DriveConfigEntity,Qt as DriveFSGateway,Vt as DriveS3Gateway,en as DriveService,tn as EmmitterService,Xt as EncryptService,B as EnvService,nn as ExceptionService,Q as FileEntity,Rr as FileMetaEntity,ur as FileRepository,dr as GitBranchRepository,mr as GitCommitRepository,_r as GitGateway,Xr as HasManyRelation,zr as HasMetasRelation,rn as HasherService,on as HttpService,Wn as HttpTesterService,Gn as LifecycleService,Kr as LoadFileMetas,qr as LoadFileUrl,yr as MetadataMixin,Kn as MetadataQueryService,qn as MetadataService,Jn as MigrationEntity,Yn as MigratorService,Gt as ModelConfigMixin,br as ModelMixin,Vr as ModuleEntity,Hr as PageRequestContextEntity,hr as PermissionAssignmentRepository,gr as PermissionRepository,Wr as PluginEntity,Ur as PluginEntryEntity,Xn as PluginIpcClient,Zn as PluginIpcHost,$n as PluginRouter,xr as RelationsMixin,V as RouteEntity,er as RouterFileBaseRoutingService,tr as RouterRegisterService,ir as RouterResourceConfigService,rr as RouterResourceService,H as RouterService,ar as RoutineEntity,or as SchedulerService,sr as SeederEntity,cr as SeederService,X as ShellService,Rn as TokenRepository,Hn as UserRepository,jn as addCreatedColumn,kn as addSoftDeleteColumn,Nn as addTimestampColumns,Mn as addUpdatedColumn,L as basePath,R as config,b as container,ln as count,G as create,bn as createDefault,Pr as createHasManyThroughLoader,ni as createLoaderFactory,xn as createMysql,Ir as createPermissionLoader,ri as cuid,U as database,ii as defineHandler,Mr as defineLoader,On as deleted,Sn as destroy,Sr as download,Z as drive,Bn as emmitter,Zt as encrypt,Cr as env,Cn as exists,wr as filesRepository,q as findOne,J as findOneOrFail,wn as firstOrCreate,ai as generateIndexFile,Zr as hasManyThroughRelation,Vn as hasher,Tr as http,Je as importAll,Ke as importFiles,qe as importGlob,oi as importOne,K as list,Nr as loadHasManyThrough,Fr as loadPermissions,x as logger,Er as migrator,W as now,Tn as paginate,Dr as permissionAssignmentRepository,Or as permissionRepository,Ue as printObject,We as printTable,Ft as relativeToBasePath,kr as router,Ar as scheduler,jr as shell,An as softDelete,Pt as storagePath,It as tmpPath,zn as tokenRepository,Dn as undeleted,In as update,Pn as updateDefault,Fn as updateMysql,Ln as updateOrCreate,Un as userRepository,vr as valueToString,En as whereNotDeleted};
|
|
4
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiRW1taXR0ZXJTZXJ2aWNlIiwiTGlmZWN5Y2xlU2VydmljZSIsImJvb2xlYW4iLCJrZXlWYWx1ZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkNvb2tpZU1hcEVudGl0eSIsIkRyaXZlQ29uZmlnIiwiQmFzZUVudGl0eU1peGluIiwiRmlsZU1ldGEiLCJCYXNlRW50aXR5TWl4aW4iLCJCYXNlRW50aXR5TWl4aW4iLCJNb2R1bGUiLCJQbHVnaW5FbnRpdHkiLCJDb21tYW5kZXJDb21tYW5kIiwiRW1taXR0ZXJTZXJ2aWNlIiwiQmFzZURyaXZlIiwiRHJpdmVFbnRpdHkiLCJTM0RyaXZlIiwiQmFzZSIsImNyeXB0byIsIkJhc2VEcml2ZSIsIkRyaXZlRW50aXR5IiwiQmFzZUVtbWl0dGVyU2VydmljZSIsImpvaW4iLCJCYXNlIiwiUm91dGVyIiwiRW1taXR0ZXJTZXJ2aWNlIiwiZGIiLCJ0b0RiIiwiZGIiLCJmcm9tRGIiLCJ0b0RiIiwidG9EYiIsImRhdGV0aW1lLnRvRGIiLCJqc29uLnRvRGIiLCJib29sZWFuLnRvRGIiLCJkYiIsImRiIiwiZGIiLCJkYiIsImRiIiwiZGIiLCJQYWdpbmF0aW9uIiwiZGIiLCJkYiIsImRiIiwiRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXIiLCJkYiIsIkVtbWl0dGVyU2VydmljZSIsImRiIiwiQmFzZUxpZmVjeWNsZVNlcnZpY2UiLCJkYiIsIkVtbWl0dGVyU2VydmljZSIsIkVtbWl0dGVyU2VydmljZSIsIlNoZWxsRXhlY3B0aW9uIiwiZGIiLCJkYiIsInF1ZXJpZXMucGFnaW5hdGUiLCJxdWVyaWVzLmxpc3QiLCJxdWVyaWVzLmZpbmRPbmUiLCJxdWVyaWVzLmZpbmRPbmVPckZhaWwiLCJxdWVyaWVzLmV4aXN0cyIsInF1ZXJpZXMuY291bnQiLCJxdWVyaWVzLmNyZWF0ZSIsInF1ZXJpZXMudXBkYXRlIiwicXVlcmllcy5kZXN0cm95IiwicXVlcmllcy5maXJzdE9yQ3JlYXRlIiwicXVlcmllcy51cGRhdGVPckNyZWF0ZSIsInF1ZXJpZXMuc29mdERlbGV0ZSIsImRiIiwiZGIiLCJCYXNlQWNsIiwiQmFzZU1ldGEiLCJkYiIsIkJhc2UiLCJIb29rc1N0YXRpYyIsIkJhc2UiLCJCYXNlIiwiam9pbiIsImRiIiwiVXNlciIsImRiIiwiZGIiLCJQZXJtaXNzaW9uIiwicGF0aFRvRmlsZVVSTCIsImZzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci91dGlscy9wcmludFRhYmxlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy90cnlDYXRjaC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2ltcG9ydEFsbC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvbWF0Y2hQYXRocy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL1NoZWxsRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVDb25maWdFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVNZXRhRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlVXBsb2FkU2Vzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvR2l0QnJhbmNoRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRDb21taXRFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpVGVzdGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpV3JhcHBlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdGU1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlQmFzZUdhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlUzNHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NvbmZpZ01hbmFnZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Eb3dubG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvTW9kZWxDb25maWdNaXhpbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvRHJpdmVDb25maWdFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NjaGVtYXMvZW52U2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbnZTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbmNyeXB0U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9lbmNyeXB0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9Ecml2ZUZTR2F0ZXdheS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRHJpdmVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0V4Y2VwdGlvblNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0hhc2hlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0h0dHBTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9EYXRhYmFzZUdhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2NvbW1vbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9jb3VudC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvZGF0ZXRpbWUudHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2pzb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2Jvb2xlYW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2FsbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvY3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2Rlc3Ryb3kudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvbGlzdC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9leGlzdHMudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9maXJzdE9yQ3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3NvZnREZWxldGUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvdGltZXN0YW1wLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy91cGRhdGVPckNyZWF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9pbmNyZW1lbnRhbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Rva2VuUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy90b2tlblJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvaGFzaGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvVXNlclJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvdXNlclJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0h0dHBUZXN0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL01pZ3JhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUGx1Z2luSXBjQ2xpZW50LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5JcGNIb3N0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5Sb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlclJlZ2lzdGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVzb3VyY2VTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJSZXNvdXJjZUNvbmZpZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRpbmVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1NjaGVkdWxlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1NlZWRlckVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvU2VlZGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvQ29uZmlnUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0ZpbGVSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvR2l0QnJhbmNoUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0dpdENvbW1pdFJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZ2F0ZXdheXMvR2l0R2F0ZXdheS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01ldGFkYXRhTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvUmVsYXRpb25zTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZG93bmxvYWQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZHJpdmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW52LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2ZpbGVzUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9odHRwLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL21pZ3JhdG9yLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvc2NoZWR1bGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3NoZWxsLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvaGFzTWFueVRocm91Z2hMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvcGVybWlzc2lvbkxvYWRlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVsYXRpb25zL0hhc01ldGFzUmVsYXRpb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9QbHVnaW5FbnRyeUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGx1Z2luRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvQmFzZVJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvQmVsb25nc1RvUmVsYXRpb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlbGF0aW9ucy9CZWxvbmdzVG9GaWxlUmVsYXRpb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlbGF0aW9ucy9CZWxvbmdzVG9Vc2VyUmVsYXRpb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlbGF0aW9ucy9IYXNNYW55UmVsYXRpb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlbGF0aW9ucy9oYXNNYW55VGhyb3VnaFJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taWRkbGV3YXJlcy9BdXRoTWlkZGxld2FyZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aFNpbGVuY2VNaWRkbGV3YXJlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taWRkbGV3YXJlcy9BdXRob3JpemF0aW9uTWlkZGxld2FyZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvY3JlYXRlTG9hZGVyRmFjdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvY3VpZC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvZGVmaW5lSGFuZGxlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvdXRpbHMvZ2VuZXJhdGVJbmRleEZpbGUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2ltcG9ydE9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVGFibGUgZnJvbSAnY2xpLXRhYmxlMydcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUNvbHVtbiB7XG4gICAgbGFiZWw6IHN0cmluZ1xuICAgIHZhbHVlOiBzdHJpbmcgfCAoKGl0ZW06IGFueSkgPT4gc3RyaW5nKVxuICAgIHdpZHRoPzogbnVtYmVyXG4gICAgcmVhbFdpZHRoPzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JqZWN0T3B0aW9ucyB7XG4gICAga2V5V2lkdGg/OiBudW1iZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50T2JqZWN0KG91dHB1dDogYW55ID0ge30sIG9wdGlvbnM6IE9iamVjdE9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyB8fCA4MFxuICAgIGNvbnN0IGtleVdpZHRoID0gb3B0aW9ucy5rZXlXaWR0aCB8fCBNYXRoLmZsb29yKHNjcmVlbldpZHRoICogMC4yKVxuICAgIGNvbnN0IHZhbHVlV2lkdGggPSBNYXRoLmZsb29yKHNjcmVlbldpZHRoICogMC43KVxuXG4gICAgY29uc3QgdGFibGUgPSBuZXcgVGFibGUoe1xuICAgICAgICB3b3JkV3JhcDogdHJ1ZSxcbiAgICAgICAgd3JhcE9uV29yZEJvdW5kYXJ5OiBmYWxzZSxcbiAgICAgICAgY29sV2lkdGhzOiBba2V5V2lkdGgsIHZhbHVlV2lkdGhdLFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvdXRwdXQpKSB7XG4gICAgICAgIHRhYmxlLnB1c2goW2tleSwgU3RyaW5nKG91dHB1dFtrZXldKV0pXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2codGFibGUudG9TdHJpbmcoKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50VGFibGUoaXRlbXM6IGFueVtdLCBjb2x1bW5zPzogVGFibGVDb2x1bW5bXSkge1xuICAgIGNvbnN0IHNjcmVlbldpZHRoID0gKHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODApIC0gNlxuICAgIGNvbnN0IHJvd3MgPSBbXSBhcyBzdHJpbmdbXVtdXG4gICAgY29uc3QgaGVhZDogVGFibGVDb2x1bW5bXSA9IFtdXG5cbiAgICBpZiAoY29sdW1ucykge1xuICAgICAgICBoZWFkLnB1c2goLi4uY29sdW1ucylcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbnMpIHtcbiAgICAgICAgaXRlbXMubWFwKChpdGVtOiBhbnkpID0+IE9iamVjdC5rZXlzKGl0ZW0pKVxuICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBoZWFkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDoga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZToga2V5LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgIH1cblxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSBbXSBhcyBzdHJpbmdbXVxuXG4gICAgICAgIGhlYWQuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gJydcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBoLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBoLnZhbHVlKGl0ZW0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0ZW1baC52YWx1ZV1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcm93LnB1c2godmFsdWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgcm93cy5wdXNoKHJvdylcbiAgICB9KVxuXG4gICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGlmIChoLndpZHRoKSB7XG4gICAgICAgICAgICBoLndpZHRoID0gTnVtYmVyKGgud2lkdGgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWgubGFiZWwpIHtcbiAgICAgICAgICAgIGgubGFiZWwgPSBTdHJpbmcoaC52YWx1ZSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB1c2VkV2lkdGggPSBoZWFkLmZpbHRlcigoaCkgPT4gISFoLndpZHRoKS5yZWR1Y2UoKGFjYywgaCkgPT4gYWNjICsgaC53aWR0aCEsIDApXG4gICAgY29uc3QgcmVtYWluaW5nV2lkdGggPSAxMDAgLSB1c2VkV2lkdGhcbiAgICBjb25zdCB3aXRoTm9XaWR0aCA9IGhlYWQuZmlsdGVyKChoKSA9PiAhaC53aWR0aCkubGVuZ3RoXG5cbiAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgaWYgKCFoLndpZHRoKSB7XG4gICAgICAgICAgICBoLndpZHRoID0gTWF0aC5mbG9vcihyZW1haW5pbmdXaWR0aCAvIHdpdGhOb1dpZHRoKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGhlYWQuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBpZiAoaC53aWR0aCkge1xuICAgICAgICAgICAgaC5yZWFsV2lkdGggPSBNYXRoLmZsb29yKHNjcmVlbldpZHRoICogKGgud2lkdGggLyAxMDApKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHtcbiAgICAgICAgaGVhZDogaGVhZC5tYXAoKGgpID0+IGgubGFiZWwpLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgaGVhZDogW10sIC8vZGlzYWJsZSBjb2xvcnMgaW4gaGVhZGVyIGNlbGxzXG4gICAgICAgICAgICBib3JkZXI6IFtdLCAvL2Rpc2FibGUgY29sb3JzIGZvciB0aGUgYm9yZGVyXG4gICAgICAgIH0sXG4gICAgICAgIHdvcmRXcmFwOiB0cnVlLFxuICAgICAgICB3cmFwT25Xb3JkQm91bmRhcnk6IGZhbHNlLFxuICAgICAgICBjb2xXaWR0aHM6IGhlYWQubWFwKChoKSA9PiBoLnJlYWxXaWR0aCkgYXMgbnVtYmVyW10sXG4gICAgfSlcblxuICAgIHRhYmxlLnB1c2goLi4ucm93cylcblxuICAgIGNvbnNvbGUubG9nKHRhYmxlLnRvU3RyaW5nKCkpXG59XG4iLCJpbnRlcmZhY2UgVHJ5ZXIge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IGFueVxufVxuXG5pbnRlcmZhY2UgVHJ5ZXJBc3luYyB7XG4gICAgKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxhbnk+IHwgYW55XG59XG5cbnR5cGUgVHJ5Q2F0Y2hSZXN1bHQ8VCBleHRlbmRzIFRyeWVyPiA9IFtudWxsLCBSZXR1cm5UeXBlPFQ+XSB8IFtFcnJvciwgbnVsbF1cblxudHlwZSBUcnlDYXRjaEFzeW5jUmVzdWx0PFQgZXh0ZW5kcyBUcnllckFzeW5jPiA9IFtudWxsLCBBd2FpdGVkPFJldHVyblR5cGU8VD4+XSB8IFtFcnJvciwgbnVsbF1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyeUNhdGNoPFQgZXh0ZW5kcyBUcnllckFzeW5jPih0cnllcjogVCk6IFByb21pc2U8VHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUPj4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuXG50cnlDYXRjaC5zeW5jID0gZnVuY3Rpb24gPFQgZXh0ZW5kcyBUcnllcj4odHJ5ZXI6IFQpOiBUcnlDYXRjaFJlc3VsdDxUPiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdHJ5ZXIoKVxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdF1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gW2Vycm9yIGFzIGFueSwgbnVsbF1cbiAgICB9XG59XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCAqL1xuLy8gQHRzLW5vY2hlY2tcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTG9nZ2VyU2VydmljZScgXG5cbiAgICBwdWJsaWMgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIG1ldGE/OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gaGVyZVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZGVidWcobWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHdhcm4obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGVycm9yKG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hpbGQob3B0aW9uczogYW55KTogTG9nZ2VyU2VydmljZSB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICAgICAgcmV0dXJuIG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIHB1YmxpYyBzdGF0dXM6IG51bWJlciA9IDUwMFxuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciA9IDUwMCkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKVxuICAgICAgICB0aGlzLm5hbWUgPSAnQmFzZUV4Y2VwdGlvbidcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb21FcnJvcihlcnJvcjogRXJyb3IpOiBCYXNlRXhjZXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIG5ldyBCYXNlRXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UsIDUwMClcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tIFwiI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHNcIlxuXG50eXBlIENvbnN0cnVjdG9yPFQgPSBvYmplY3Q+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVFxuXG50eXBlIEVudHJ5S2V5ID0gc3RyaW5nIHwgc3ltYm9sIHwgQ29uc3RydWN0b3JcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGFpbmVyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxFbnRyeUtleSwgYW55PigpXG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHJlY29yZCkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICByZWNvcmRbU3RyaW5nKGtleSldID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShwYXlsb2FkOiBFbnRyeUtleSk6IEVudHJ5S2V5IHtcbiAgICAgICAgbGV0IGtleSA9IHBheWxvYWRcblxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBrZXkgPSBwYXlsb2FkLm5hbWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uc3RydWN0b3IgPSB0eXBlb2YgcGF5bG9hZCAhPT0gJ3N0cmluZycgJiYgdHlwZW9mIHBheWxvYWQgIT09ICdzeW1ib2wnXG5cbiAgICAgICAgaWYgKGlzQ29uc3RydWN0b3IgJiYgIShwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IFRoZSBjb25zdHJ1Y3RvciAke3BheWxvYWQubmFtZX0gZG9lcyBub3QgaGF2ZSBhIHVuaXF1ZSBpZGVudGlmaWVyLiBDb25zaWRlciBhZGRpbmcgYSBzdGF0aWMgcHJvcGVydHkgX19jb250YWluZXJfZW50cnlfa2V5IHRvIGF2b2lkIHBvdGVudGlhbCBjb25mbGljdHMuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmIChwYXlsb2FkIGFzIGFueSkuX19jb250YWluZXJfZW50cnlfa2V5KSB7XG4gICAgICAgICAgICBrZXkgPSAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGtleVxuXG4gICAgfVxuXG4gICAgcHVibGljIHNldChwYXlsb2FkOiBFbnRyeUtleSwgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXMocGF5bG9hZDogRW50cnlLZXkpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmhhcyhrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihwYXlsb2FkOiBFbnRyeUtleSk6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIGlmICghdGhpcy5lbnRyaWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRW50cnkgd2l0aCBrZXkgXCIke1N0cmluZyhrZXkpfVwiIG5vdCBmb3VuZCBpbiBjb250YWluZXIuYClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KHBheWxvYWQ6IEVudHJ5S2V5KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgfVxuXG4gICAgcHVibGljIHNpbmdsZXRvbjxUPihjbGFzc0NvbnN0cnVjdG9yOiBDb25zdHJ1Y3RvcjxUPik6IFQge1xuICAgICAgICBjb25zdCBrZXkgPSBjbGFzc0NvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgY2xhc3NDb25zdHJ1Y3RvcigpXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBuZXdJbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuIG5ld0luc3RhbmNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoZW50cmllczogUmVjb3JkPGFueSwgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhlbnRyaWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHByb3h5PFQgPSB1bmtub3duPihrZXk6IEVudHJ5S2V5KTogVCB7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkoe30sIHtcbiAgICAgICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbnRyeVtwcm9wXVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYmluZChlbnRyeSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlbcHJvcF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6IChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5nZXQ8VD4oa2V5KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGVudHJ5W3Byb3BdID0gdmFsdWVcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMga2V5cygpOiBFbnRyeUtleVtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmtleXMoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29udGFpbmVyU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzXCI7XG5cbmNvbnN0IGNvbnRhaW5lciA9IChnbG9iYWxUaGlzIGFzIGFueSkuc2VydmVyQ29udGFpbmVyIHx8IG5ldyBDb250YWluZXJTZXJ2aWNlKClcblxuZ2xvYmFsVGhpcy5zZXJ2ZXJDb250YWluZXIgPSBjb250YWluZXJcblxuZXhwb3J0IGRlZmF1bHQgY29udGFpbmVyIGFzIENvbnRhaW5lclNlcnZpY2VcbiIsImltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5cbmNvbnN0IGxvZ2dlciA9IGNvbnRhaW5lci5wcm94eTxMb2dnZXJTZXJ2aWNlPihMb2dnZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBsb2dnZXJcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAndXJsJ1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYidcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCBsb2dnZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cydcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICAgIGNhY2hlPzogYm9vbGVhbjtcbiAgICBvbkJlZm9yZUltcG9ydD86IChjdHg6IHsgZmlsZW5hbWU6IHN0cmluZyB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBvbkFmdGVySW1wb3J0PzogKGN0eDogeyBmaWxlbmFtZTogc3RyaW5nLCBtb2R1bGU6IGFueSB9KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBvbkVycm9yPzogKGN0eDogeyBmaWxlbmFtZTogc3RyaW5nLCBlcnJvcjogRXJyb3IgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RmlsZXMoZmlsZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBsZXQgb25FcnJvcjogUmVxdWlyZWQ8T3B0aW9ucz5bJ29uRXJyb3InXSA9IGN0eCA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY3R4LmVycm9yLCB7IGZpbGVuYW1lOiBjdHguZmlsZW5hbWUgfSkgXG5cbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW1wb3J0ICR7Y3R4LmZpbGVuYW1lfWAsIGN0eC5lcnJvcilcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vbkVycm9yKSB7XG4gICAgICAgIG9uRXJyb3IgPSBvcHRpb25zLm9uRXJyb3JcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmV4Y2x1ZGUgJiYgb3B0aW9ucy5leGNsdWRlLnNvbWUocGF0dGVybiA9PiBmaWxlbmFtZS5pbmNsdWRlcyhwYXR0ZXJuKSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHggPSB7IGZpbGVuYW1lIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5vbkJlZm9yZUltcG9ydCkge1xuICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5vbkJlZm9yZUltcG9ydChjdHgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbkZpbGVuYW1lID0gY3R4LmZpbGVuYW1lLnNwbGl0KCc/JylbMF1cblxuICAgICAgICBpZiAoL1xcLihtdHN8dHN8anMpJC8udGVzdChjbGVhbkZpbGVuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgYWJzID0gcGF0aC5yZXNvbHZlKGN0eC5maWxlbmFtZSlcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBwYXRoVG9GaWxlVVJMKGFicylcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2FjaGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZmlsZVVybC5zZWFyY2hQYXJhbXMuc2V0KCd0JywgRGF0ZS5ub3coKS50b1N0cmluZygpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIG1vZF0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBpbXBvcnQoZmlsZVVybC50b1N0cmluZygpKSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwge1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogY3R4LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICB1cmw6IGZpbGVVcmwsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGVzW2ZpbGVuYW1lXSA9IG1vZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoL1xcLmpzb24kLy50ZXN0KGNsZWFuRmlsZW5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShjdHguZmlsZW5hbWUsICd1dGY4JylcblxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvbkVycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtb2R1bGVzW2ZpbGVuYW1lXSA9IGpzb25cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm9uQWZ0ZXJJbXBvcnQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25BZnRlckltcG9ydCh7XG4gICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlc1tmaWxlbmFtZV1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbW9kdWxlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0R2xvYihwYXR0ZXJuOiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcocGF0dGVybilcblxuICAgIHJldHVybiBpbXBvcnRGaWxlcyhmaWxlcyBhcyBzdHJpbmdbXSwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEFsbChkaXJlY3Rvcnk6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgZGlyZW50cyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblxuICAgIGNvbnN0IGZpbGVzID0gZGlyZW50c1xuICAgICAgICAuZmlsdGVyKGRpcmVudCA9PiBkaXJlbnQuaXNGaWxlKCkpXG4gICAgICAgIC5tYXAoZGlyZW50ID0+IHBhdGguam9pbihkaXJlY3RvcnksIGRpcmVudC5uYW1lKSlcblxuICAgIHJldHVybiBpbXBvcnRGaWxlcyhmaWxlcywgb3B0aW9ucylcbn1cblxuXG5cbiIsImltcG9ydCB0eXBlIHsgVW5pb25Ub0ludGVyc2VjdGlvbiB9IGZyb20gJy4vdHlwaW5nLnRzJ1xuXG5leHBvcnQgdHlwZSBBbnlDbGFzcyA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueVxuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VCA9IHt9PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcbmV4cG9ydCB0eXBlIE1peGluPFQ+ID0gKGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3RvcjxUPlxuXG4vKipcbiAqIENvbXBvc2VzIG11bHRpcGxlIG1peGlucyBpbnRvIGEgc2luZ2xlIGNsYXNzIHRoYXQgY2FuIGJlIGV4dGVuZGVkLlxuICogQWxsb3dzIGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS1saWtlIGJlaGF2aW9yIGJ5IGFwcGx5aW5nIG1peGlucyBzZXF1ZW50aWFsbHkuXG4gKiBcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gY29tcG9zZVxuICogQHJldHVybnMgQSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IGluY2x1ZGVzIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZShUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlPFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3I8YW55PikgPT4gQ29uc3RydWN0b3I8YW55Pj5cbj4oLi4ubWl4aW5zOiBNKTogVW5pb25Ub0ludGVyc2VjdGlvbjxSZXR1cm5UeXBlPE1bbnVtYmVyXT4+IHtcbiAgICByZXR1cm4gbWl4aW5zLnJlZHVjZSgoYmFzZSwgbWl4aW4pID0+IG1peGluKGJhc2UpLCBjbGFzcyB7fSBhcyBhbnkpIGFzIGFueVxufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIGNvbXBvc2UgZnVuY3Rpb24gdGhhdCBzdGFydHMgd2l0aCBhIGJhc2UgY2xhc3NcbiAqIFxuICogQHBhcmFtIGJhc2VDbGFzcyAtIFRoZSBiYXNlIGNsYXNzIHRvIHN0YXJ0IHdpdGhcbiAqIEBwYXJhbSBtaXhpbnMgLSBBcnJheSBvZiBtaXhpbiBmdW5jdGlvbnMgdG8gYXBwbHlcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBleHRlbmRzIHRoZSBiYXNlIGNsYXNzIHdpdGggYWxsIG1peGluIGZ1bmN0aW9uYWxpdHlcbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIFVzZXIgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlRW50aXR5LCBUaW1lc3RhbXAsIFNvZnREZWxldGUpIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge1xuICogICAgIHN1cGVyKClcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlV2l0aDxcbiAgICBUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yLFxuICAgIE0gZXh0ZW5kcyBBcnJheTwoYmFzZTogQ29uc3RydWN0b3IpID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KFxuICAgIGJhc2VDbGFzczogVEJhc2UsXG4gICAgLi4ubWl4aW5zOiBNXG4pOiBUQmFzZSAmIFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgYmFzZUNsYXNzIGFzIGFueSkgYXMgYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtaXhpbjxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihTb3VyY2U6IFRCYXNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUVGFyZ2V0IGV4dGVuZHMgQ29uc3RydWN0b3I+KFRhcmdldDogVFRhcmdldCkge1xuICAgICAgICBjbGFzcyBNaXhlZCBleHRlbmRzIFRhcmdldCB7XG4gICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZSguLi5hcmdzKVxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgc291cmNlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29weSBtZXRob2RzXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFJlZmxlY3Qub3duS2V5cyhTb3VyY2UucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICAgICAgTWl4ZWQucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoU291cmNlLnByb3RvdHlwZSwga2V5KSFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gTWl4ZWQgYXMgVFRhcmdldCAmIFRCYXNlXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbihvYmo6IGFueSwgcHJlZml4ID0gJycsIHJlczogYW55ID0ge30pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGNvbnN0IGlzSW5kZXggPSAvXlxcZCskLy50ZXN0KGtleSlcbiAgICAgICAgY29uc3QgbmV3S2V5ID0gaXNJbmRleCA/IGAke3ByZWZpeH1bJHtrZXl9XWAgOiBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZmxhdHRlbih2YWx1ZSwgbmV3S2V5LCByZXMpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzW25ld0tleV0gPSB2YWx1ZVxuICAgIH1cblxuICAgIHJldHVybiByZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdHRlbihvYmo6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG59XG4iLCJmdW5jdGlvbiB1dWlkKCl7XG4gICAgaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5yYW5kb21VVUlEKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5jcnlwdG8gJiYgc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gc2VsZi5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY3J5cHRvICYmIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gd2luZG93LmNyeXB0by5yYW5kb21VVUlEKClcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgY3J5cHRvLnJhbmRvbVVVSURcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwXG4gICAgICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4XG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KVxuICAgIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJZChwcmVmaXggPSAnJykge1xuICAgIHJldHVybiBwcmVmaXggKyB1dWlkKClcbn0iLCJpbXBvcnQgeyBnZXQsIHNldCwgaGFzLCB1bnNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGZsYXR0ZW4gfSBmcm9tICcuLi91dGlscydcblxuaW50ZXJmYWNlIEVudHJ5IHtcbiAgICBrZXk6IHN0cmluZ1xuICAgIHZhbHVlOiBhbnlcbiAgICBzb3VyY2U6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdDb25maWdTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGVudHJpZXM6IE1hcDxzdHJpbmcsIEVudHJ5PlxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ldyBNYXAoKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgfVxuXG4gICAgcHVibGljIHBhcnNlVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmVuZHNXaXRoKCc6Ym9vbGVhbicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgnOmJvb2xlYW4nLCAnJykudHJpbSgpID09PSAndHJ1ZSdcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbVJlY29yZChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4sIHNvdXJjZSA9ICd1bmtub3cnKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnBhcnNlVmFsdWUodmFsdWUpLFxuICAgICAgICAgICAgICAgIHNvdXJjZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkRnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdLCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW2tleV0gPSBlbnRyeS52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlY29yZFxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IHRydWUgOiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcmltYXJ5RW50cnkudmFsdWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFzKHZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUID0gYW55IHwgdW5kZWZpbmVkPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogVCB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gZW50cnkudmFsdWUgYXMgVFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGtleS5zcGxpdCgnLicpWzBdXG4gICAgICAgIGNvbnN0IHByaW1hcnlFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQocHJpbWFyeSlcblxuICAgICAgICBpZiAoIXByaW1hcnlFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnkudmFsdWUgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGdldCh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpLCBkZWZhdWx0VmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRPbmU8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldDxUPihrZXkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3J1bnRpbWUnKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCB7XG4gICAgICAgICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBsZXQgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcHJpbWFyeVZhbHVlID0ge31cbiAgICAgICAgfVxuXG4gICAgICAgIHNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgdmFsdWUpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5VmFsdWUgPSB0aGlzLmdldChwcmltYXJ5LCB7fSlcblxuICAgICAgICBpZiAoIXByaW1hcnlWYWx1ZSkgcmV0dXJuXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcmltYXJ5VmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocHJpbWFyeVZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB1bnNldChwcmltYXJ5VmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSlcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KHByaW1hcnksIHtcbiAgICAgICAgICAgIGtleTogcHJpbWFyeSxcbiAgICAgICAgICAgIHNvdXJjZTogJ3J1bnRpbWUnLFxuICAgICAgICAgICAgdmFsdWU6IHByaW1hcnlWYWx1ZVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZHVtcCgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4odGhpcy50b1JlY29yZCgpKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgY3JlYXRlSWQsIHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMge1xuICAgIGV2ZW50OiBzdHJpbmdcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRW1taXR0ZXJMaXN0ZW5lciB7XG4gICAgKGRhdGE6IGFueSwgb3B0aW9uczogRW1taXR0ZXJMaXN0ZW5lck9wdGlvbnMpOiB2b2lkXG59XG5cbmludGVyZmFjZSBFbW1pdHRlckhhbmRsZXIge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgbGlzdGVuZXI6IEVtbWl0dGVyTGlzdGVuZXJcbiAgICBvcmlnaW5hbExpc3RlbmVyPzogRW1taXR0ZXJMaXN0ZW5lclxufVxuXG5pbnRlcmZhY2UgT25PcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIHVuaXF1ZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIE9uRGVib3VuY2VPcHRpb25zIGV4dGVuZHMgT25PcHRpb25zIHtcbiAgICBkZWJvdW5jZT86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRW1taXR0ZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhhbmRsZXJzOiBFbW1pdHRlckhhbmRsZXJbXSA9IFtdXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IgKG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zPy5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnM/LmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdlbW1pdHRlciBsb2FkZWQgd2l0aCBkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGU8RXZlbnRzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBFbW1pdHRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW1taXR0ZXJTZXJ2aWNlPEV2ZW50cz4ob3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdkZWJ1ZyBtb2RlIGVuYWJsZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb248SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaWQgPSBvcHRpb25zPy5pZCB8fCBjcmVhdGVJZCgpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnVuaXF1ZSkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5oYW5kbGVycy5zb21lKGggPT4gKGguZXZlbnQgPT09IGV2ZW50ICYmIGgubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB8fCBoLmlkID09PSBpZClcblxuICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlcjogRW1taXR0ZXJIYW5kbGVyID0ge1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzLnB1c2goaGFuZGxlcilcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2hhbmRsZXIgYWRkZWQnLCBoYW5kbGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgb25jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlciA9IChhcmdzOiBhbnksIG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgICAgICAgbGlzdGVuZXIoYXJncywgb3B0aW9ucylcblxuICAgICAgICAgICAgdGhpcy5vZmYoZXZlbnQsIHdyYXBwZXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudCwgd3JhcHBlciBhcyBhbnksIG9wdGlvbnMpXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgb25EZWJvdW5jZTxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgbGlzdGVuZXI6IChhcmdzOiBFdmVudHNbS10pID0+IHZvaWQsIG9wdGlvbnM/OiBPbkRlYm91bmNlT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbkRlYm91bmNlKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoYXJnczogYW55KSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZGVib3VuY2VkID0gZGVib3VuY2UobGlzdGVuZXIsIG9wdGlvbnM/LmRlYm91bmNlIHx8IDMwMClcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgZGVib3VuY2VkIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgaGFuZGxlci5vcmlnaW5hbExpc3RlbmVyID0gbGlzdGVuZXJcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uQW55T2Y8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnRzOiBLW10sIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyW11cbiAgICBwdWJsaWMgb25BbnlPZihldmVudHM6IHN0cmluZ1tdLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uT3B0aW9ucykge1xuICAgICAgICBjb25zdCBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vbihldmVudCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuXG4gICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSkge1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiB7XG4gICAgICAgICAgICBpZiAoaC5ldmVudCA9PT0gZXZlbnQgJiYgKGgubGlzdGVuZXIgPT09IGxpc3RlbmVyIHx8IGgub3JpZ2luYWxMaXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIHJlbW92ZWQnLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiB2b2lkXG4gICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgYXJncz86IGFueSkge1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgIHRyeUNhdGNoLnN5bmMoKCkgPT4gaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBhcmdzOiBFdmVudHNbS10pOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpOiBQcm9taXNlPHZvaWQ+XG4gICAgcHVibGljIGFzeW5jIGVtaXRBbmRXYWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1pdHRpbmcgZXZlbnQgYW5kIHdhaXQnLCB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBhcmdzXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyLmxpc3RlbmVyKGFyZ3MsIHsgZXZlbnQgfSlcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RCeUV2ZW50KGV2ZW50OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShwYXlsb2FkOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+ICFpZHMuaW5jbHVkZXMoaC5pZCkpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVycyByZW1vdmVkJywgeyBpZHMgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IFtdXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhbGwgaGFuZGxlcnMgY2xlYXJlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzSGFuZGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDBcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVIb29rIHtcbiAgICBwdWJsaWMgaG9va19pZDogc3RyaW5nXG4gICAgcHVibGljIGhvb2tfYWxpYXNlcz86IHN0cmluZ1tdXG4gICAgcHVibGljIG9yZGVyPzogbnVtYmVyXG4gICAgcHVibGljIHN1Ymhvb2tzPzogTGlmZWN5Y2xlSG9va1tdXG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4geyB9XG5cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHJlZ2lzdGVyICovXG4gICAgcHVibGljIGFzeW5jIG9uUmVnaXN0ZXIoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIGxvYWQgKi9cbiAgICBwdWJsaWMgYXN5bmMgb25Mb2FkKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBib290ICovXG4gICAgcHVibGljIGFzeW5jIG9uQm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Ugc2h1dGRvd24gKi9cbiAgICBwdWJsaWMgYXN5bmMgb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG59XG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcuL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcuLi91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbnR5cGUgTGlmZWN5Y2xlTWV0aG9kID0gJ3JlZ2lzdGVyJyB8ICdsb2FkJyB8ICdib290JyB8ICdzaHV0ZG93bidcblxuaW50ZXJmYWNlIExpc3RPcHRpb25zIHtcbiAgICBpbmNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBleGNsdWRlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgaG9va3M/OiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBvbkVycm9yPzogKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkgPT4gdm9pZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdMaWZlY3ljbGVTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhvb2tzOiBNYXA8c3RyaW5nLCBMaWZlY3ljbGVIb29rPlxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuaG9va3MgPSBkYXRhLmhvb2tzID8/IG5ldyBNYXAoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgXG4gICAgICAgIGlmIChkYXRhLm9uRXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IGRhdGEub25FcnJvclxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9uRXJyb3IoaGFuZGxlcjogUmVxdWlyZWQ8TGlmZWN5Y2xlU2VydmljZU9wdGlvbnM+WydvbkVycm9yJ10pIHtcbiAgICAgICAgdGhpcy5vbkVycm9yID0gaGFuZGxlclxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRXJyb3IoZXJyb3I6IEVycm9yLCBjb250ZXh0OiB7IGhvb2tJZDogc3RyaW5nOyBtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCB9KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY29udGV4dCB9KVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBob29rICR7Y29udGV4dC5tZXRob2R9ICgke2NvbnRleHQuaG9va0lkfSk6YCwgZXJyb3IpXG4gICAgfVxuXG4gICAgcHVibGljIG1hcEFsaWFzZXMoYXJnczogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdXG4gICAgICAgIGNvbnN0IGFsbCA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYWxsKSB7XG4gICAgICAgICAgICBpZiAoYXJncy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLmhvb2tfYWxpYXNlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRBbGlhcyA9IGhvb2suaG9va19hbGlhc2VzLmZpbmQoYWxpYXMgPT4gYXJncy5pbmNsdWRlcyhhbGlhcykpXG5cbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Qob3B0aW9ucz86IExpc3RPcHRpb25zKSB7XG4gICAgICAgIGxldCBob29rcyA9IEFycmF5LmZyb20odGhpcy5ob29rcy52YWx1ZXMoKSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhjbHVkZSkge1xuICAgICAgICAgICAgbGV0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5leGNsdWRlKSA/IG9wdGlvbnMuZXhjbHVkZSA6IFtvcHRpb25zLmV4Y2x1ZGVdXG5cbiAgICAgICAgICAgIGlkcyA9IHRoaXMubWFwQWxpYXNlcyhpZHMpXG5cbiAgICAgICAgICAgIGhvb2tzID0gaG9va3MuZmlsdGVyKGhvb2sgPT4gIWlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZSkgPyBvcHRpb25zLmluY2x1ZGUgOiBbb3B0aW9ucy5pbmNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+IGlkcy5pbmNsdWRlcyhob29rLmhvb2tfaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MgPSBvcmRlckJ5KGhvb2tzLCBbJ29yZGVyJ10sIFsnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGhvb2tzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZCguLi5wYXlsb2FkOiAoTGlmZWN5Y2xlSG9vayB8IENvbnN0cnVjdG9yPExpZmVjeWNsZUhvb2s+KVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGF5bG9hZCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2gobmV3IGl0ZW0oKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnN0YW5jZXMucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGluc3RhbmNlcykge1xuICAgICAgICAgICAgaWYgKCFob29rLmhvb2tfaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdTa2lwcGluZyBob29rIHdpdGhvdXQgaG9va19pZDonLCBob29rKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaG9va3Muc2V0KGhvb2suaG9va19pZCwgaG9vaylcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkICcgKyBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChob29rLnN1Ymhvb2tzKSB7XG4gICAgICAgICAgICAgICAgaG9vay5zdWJob29rcy5mb3JFYWNoKHN1Ymhvb2sgPT4gdGhpcy5hZGQoc3ViaG9vaykpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZW1pdE1ldGhvZChtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgb3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGhvb2tzID0gdGhpcy5saXN0KG9wdGlvbnMpIFxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZW1pdHRpbmcgJHttZXRob2R9IGZvciBob29rczpgLCB7XG4gICAgICAgICAgICAgICAgaG9va3M6IGhvb2tzLm1hcChob29rID0+IGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgdGhpcy5saXN0KG9wdGlvbnMpKSB7XG4gICAgICAgICAgICBjb25zdCBtYXAgPSB7XG4gICAgICAgICAgICAgICAgcmVnaXN0ZXI6ICgpID0+IFByb21pc2UuYWxsKFtob29rLnJlZ2lzdGVyKCksIGhvb2sub25SZWdpc3RlcigpXSksXG4gICAgICAgICAgICAgICAgbG9hZDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2subG9hZCgpLCBob29rLm9uTG9hZCgpXSksXG4gICAgICAgICAgICAgICAgYm9vdDogKCkgPT4gUHJvbWlzZS5hbGwoW2hvb2suYm9vdCgpLCBob29rLm9uQm9vdCgpXSksXG4gICAgICAgICAgICAgICAgc2h1dGRvd246ICgpID0+IFByb21pc2UuYWxsKFtob29rLnNodXRkb3duKCksIGhvb2sub25TaHV0ZG93bigpXSksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBtYXBbbWV0aG9kXSgpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IsIHsgaG9va0lkOiBob29rLmhvb2tfaWQsIG1ldGhvZCB9KVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7bWV0aG9kfSBgICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXQocGF5bG9hZDogTGlmZWN5Y2xlTWV0aG9kIHwgTGlmZWN5Y2xlTWV0aG9kW10sIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtZXRob2RzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiBtZXRob2RzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXRNZXRob2QobWV0aG9kLCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uKG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kLCBoYW5kbGVyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGggPSBuZXcgTGlmZWN5Y2xlSG9vaygpXG5cbiAgICAgICAgaC5ob29rX2lkID0gYGN1c3RvbToke21ldGhvZH06JHtEYXRlLm5vdygpfWBcblxuICAgICAgICBoW21ldGhvZF0gPSBoYW5kbGVyXG5cbiAgICAgICAgdGhpcy5hZGQoaClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXIob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ3JlZ2lzdGVyJywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW1pdCgnbG9hZCcsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGJvb3Qob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2Jvb3QnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bihvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdzaHV0ZG93bicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvb2tzLmNsZWFyKClcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IGdldCwgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuaW1wb3J0IHFzIGZyb20gJ3FzJ1xuXG5leHBvcnQgY29uc3QgbnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYubnVtYmVyKCldKSxcbiAgICB2LnRyYW5zZm9ybShOdW1iZXIpLFxuICAgIHYuaW50ZWdlcigpLFxuKVxuXG5leHBvcnQgY29uc3QgYm9vbGVhbiA9ICgpID0+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/IGNiKHRoaXMudikgOiBjYlxuXG4gICAgICAgIGNvbnN0IHsgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIHJldHVybiBzdWNjZXNzXG4gICAgfVxufVxuXG4iLCJleHBvcnQgZnVuY3Rpb24gbWF0Y2hQYXRoKHBhdHRlcm46IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gU3BsaXQgcGF0aHMgaW50byBzZWdtZW50c1xuICAgIGNvbnN0IHBhdHRlcm5TZWdtZW50cyA9IHBhdHRlcm4uc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAvLyBDaGVjayBlYWNoIHNlZ21lbnRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5TZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSBwYXR0ZXJuU2VnbWVudHNbaV1cbiAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSBwYXRoU2VnbWVudHNbaV1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgd2lsZGNhcmQgKCopLCBpdCBtYXRjaGVzIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHBvaW50XG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlJ3ZlIHJ1biBvdXQgb2YgcmVxdWVzdCBzZWdtZW50cyBidXQgc3RpbGwgaGF2ZSByb3V0ZSBzZWdtZW50cywgbm8gbWF0Y2hcbiAgICAgICAgaWYgKGkgPj0gcGF0aFNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiByb3V0ZSBzZWdtZW50IGlzIGEgcGFyYW1ldGVyIChzdGFydHMgd2l0aCA6KSwgaXQgbWF0Y2hlcyBhbnkgdmFsdWVcbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIHNlZ21lbnRzIG11c3QgbWF0Y2ggZXhhY3RseVxuICAgICAgICBpZiAocm91dGVTZWdtZW50ICE9PSByZXF1ZXN0U2VnbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIG1vcmUgcmVxdWVzdCBzZWdtZW50cyB0aGFuIHJvdXRlIHNlZ21lbnRzIChhbmQgbm8gd2lsZGNhcmQpLCBubyBtYXRjaFxuICAgIGlmIChwYXRoU2VnbWVudHMubGVuZ3RoID4gcGF0dGVyblNlZ21lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxufVxuIiwiaW1wb3J0IFZhbGlkYXRvclNlcnZpY2UgZnJvbSBcIi4uL3NlcnZpY2VzL1ZhbGlkYXRvclNlcnZpY2VcIlxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvclNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCB2YWxpZGF0b3JcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5cbmV4cG9ydCB0eXBlIERhc2hib2FyZE1ldGFTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkTWV0YVNjaGVtYT4+XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoYm9hcmRNZXRhU2NoZW1hKCkge1xuICAgIHJldHVybiB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5vYmplY3Qoe1xuICAgICAgICBpZDogdi5udW1iZXIoKSxcbiAgICAgICAgZGFzaGJvYXJkX2lkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2LnN0cmluZygpLFxuICAgICAgICB2YWx1ZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkTWV0YVNjaGVtYS5jcmVhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5waWNrKGRhc2hib2FyZE1ldGFTY2hlbWEoKSwgWydkYXNoYm9hcmRfaWQnLCAnbmFtZScsICd2YWx1ZSddKSlcblxuZGFzaGJvYXJkTWV0YVNjaGVtYS51cGRhdGUgPSB2YWxpZGF0b3IuY3JlYXRlKHYgPT4gdi5wYXJ0aWFsKGRhc2hib2FyZE1ldGFTY2hlbWEuY3JlYXRlKSlcbiIsImltcG9ydCB0eXBlIHsgVmFsaWRhdG9yUmVzdWx0IH0gZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRTY2hlbWEgPSBWYWxpZGF0b3JSZXN1bHQ8UmV0dXJuVHlwZTx0eXBlb2YgZGFzaGJvYXJkU2NoZW1hPj5cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hib2FyZFNjaGVtYSgpIHtcbiAgICByZXR1cm4gdmFsaWRhdG9yLmNyZWF0ZSh2ID0+IHYub2JqZWN0KHtcbiAgICAgICAgaWQ6IHYubnVtYmVyKCksXG4gICAgICAgIG5hbWU6IHYuc3RyaW5nKCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuXG4gICAgICAgIG1ldGFzOiB2Lm9wdGlvbmFsKHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpKSxcbiAgICB9KSlcbn1cblxuZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBpY2soZGFzaGJvYXJkU2NoZW1hKCksIFsnbmFtZScsICdkZXNjcmlwdGlvbiddKSlcblxuZGFzaGJvYXJkU2NoZW1hLnVwZGF0ZSA9IHZhbGlkYXRvci5jcmVhdGUodiA9PiB2LnBhcnRpYWwoZGFzaGJvYXJkU2NoZW1hLmNyZWF0ZSkpXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb25Bc3NpZ25tZW50ID0gdi5JbmZlck91dHB1dDx0eXBlb2YgcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWE+XG5cbmV4cG9ydCBjb25zdCBwZXJtaXNzaW9uQXNzaWdubWVudFNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBwZXJtaXNzaW9uX2lkOiB2Lm51bWJlcigpLFxuICAgIGFzc2lnbmFibGVfdHlwZTogdi5zdHJpbmcoKSxcbiAgICBhc3NpZ25hYmxlX2lkOiB2LnN0cmluZygpLFxuICAgIGNyZWF0ZWRfYXQ6IHYuc3RyaW5nKCksXG4gICAgdXBkYXRlZF9hdDogdi5zdHJpbmcoKSxcbn0pXG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5cbmV4cG9ydCB0eXBlIFBlcm1pc3Npb24gPSB2LkluZmVyT3V0cHV0PHR5cGVvZiBwZXJtaXNzaW9uU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgcGVybWlzc2lvblNjaGVtYSA9IHYub2JqZWN0KHtcbiAgICBpZDogdi5udW1iZXIoKSxcbiAgICBuYW1lOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGRlc2NyaXB0aW9uOiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgIGFjdGlvbjogdi5zdHJpbmcoKSxcbiAgICBzdWJqZWN0OiB2LnN0cmluZygpLFxuICAgIGNvbmRpdGlvbnM6IHYubnVsbGFibGUodi5zdHJpbmcoKSksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5leHBvcnQgdHlwZSBUb2tlbiA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIHRva2VuU2NoZW1hPlxuXG5leHBvcnQgY29uc3QgdG9rZW5TY2hlbWEgPSB2Lm9iamVjdCh7XG4gICAgaWQ6IHYubnVtYmVyKCksXG4gICAgbmFtZTogdi5udWxsYWJsZSh2LnN0cmluZygpKSxcbiAgICB0eXBlOiB2LnN0cmluZygpLFxuICAgIHVzZXJfaWQ6IHYubnVtYmVyKCksXG4gICAgdG9rZW46IHYuc3RyaW5nKCksXG4gICAgY3JlYXRlZF9hdDogdi5zdHJpbmcoKSxcbiAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgIGV4cGlyZXNfYXQ6IHYuc3RyaW5nKCksXG59KVxuIiwiaW1wb3J0ICogYXMgdiBmcm9tICd2YWxpYm90J1xuXG5mdW5jdGlvbiB1c2VyU2NoZW1hKCkge1xuICAgIHJldHVybiB2Lm9iamVjdCh7XG4gICAgICAgIGlkOiB2Lm51bWJlcigpLFxuICAgICAgICBuYW1lOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgICAgICBlbWFpbDogdi5waXBlKHYuc3RyaW5nKCksIHYuZW1haWwoKSksXG4gICAgICAgIHBhc3N3b3JkOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoNikpLFxuICAgICAgICB1c2VybmFtZTogdi5waXBlKHYuc3RyaW5nKCksIHYucmVnZXgoL15bYS16QS1aMC05Xy1dKyQvKSksXG4gICAgICAgIHZlcmlmaWVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpLFxuICAgICAgICBjcmVhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICB1cGRhdGVkX2F0OiB2LnN0cmluZygpLFxuICAgICAgICBkZWxldGVkX2F0OiB2Lm51bGxhYmxlKHYuc3RyaW5nKCkpXG4gICAgfSlcbn1cblxudXNlclNjaGVtYS5jcmVhdGUgPSAoKSA9PiB2Lm9taXQodXNlclNjaGVtYSgpLCBbJ2lkJywgJ3ZlcmlmaWVkX2F0JywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdkZWxldGVkX2F0J10pXG51c2VyU2NoZW1hLnVwZGF0ZSA9ICgpID0+IHYucGFydGlhbCh1c2VyU2NoZW1hLmNyZWF0ZSgpKVxuXG5leHBvcnQgZGVmYXVsdCB1c2VyU2NoZW1hXG4iLCJpbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoZWxsRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gICAgcHVibGljIG91dHB1dDogc3RyaW5nXG4gICAgcHVibGljIGJpbjogc3RyaW5nIFxuICAgIHB1YmxpYyBhcmdzOiBzdHJpbmdbXVxuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBvdXRwdXQ6IHN0cmluZywgYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIDUwMSlcblxuICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dFxuICAgICAgICB0aGlzLmJpbiA9IGJpbiBcbiAgICAgICAgdGhpcy5hcmdzID0gYXJncyBcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5pbnRlcmZhY2UgQ3JlYXRlQmFzZUVudGl0eU9wdGlvbnMge1xuICAgIHBhcnNlPzogKGRhdGE6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYXNlRW50aXR5KG9wdGlvbnM6IENyZWF0ZUJhc2VFbnRpdHlPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQmFzZUVudGl0eTxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZnJvbTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRydWN0b3IgPSAodHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogQmFzZSkgYXMgYW55XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCA9IHsgLi4uZGF0YSB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wYXJzZSkge1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gb3B0aW9ucy5wYXJzZShkYXRhKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCBwYXlsb2FkKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBtZXJnZShkYXRhOiBQYXJ0aWFsPHRoaXM+KTogdGhpcyB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEJhc2VFbnRpdHk8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBkYXRhOiBQYXJ0aWFsPFQ+KTogVCB7XG4gICAgICAgICAgICBjb25zdCBjb250cnVjdG9yID0gKHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IEJhc2UpIGFzIGFueVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjb250cnVjdG9yKCkgYXMgYW55XG5cbiAgICAgICAgICAgIGxldCBwYXlsb2FkID0geyAuLi5kYXRhIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSAoY29udHJ1Y3RvciBhcyBhbnkpLnBhcnNlKGRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRoaXMgYXMgYW55KT8ucGFyc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gKHRoaXMgYXMgYW55KS5wYXJzZShkYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlIGFzIGFueSwgcGF5bG9hZClcblxuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgbWVyZ2UoZGF0YTogUGFydGlhbDx0aGlzPik6IHRoaXMge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXNcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdGVuZXIge1xuICAgIGV2ZW50OiBzdHJpbmdcbiAgICBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWl0SG9vayhjb25zdHJ1Y3RvcjogYW55LCBldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkgeyAgICAgICAgICAgICAgICBcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGZvciBhd2FpdCAoY29uc3QgbCBvZiBsaXN0ZW5lcnMuZmlsdGVyKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50KSkge1xuICAgICAgICBhd2FpdCBsLmxpc3RlbmVyKC4uLmFyZ3MpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gb25Ib29rKGNvbnN0cnVjdG9yOiBhbnksIGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBjb25zdHJ1Y3Rvci5saXN0ZW5lcnMgfHwgW11cblxuICAgIGNvbnN0IGV4aXN0cyA9IGxpc3RlbmVycy5maW5kKChsOiBhbnkpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgaWYgKGV4aXN0cykge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsaXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICBldmVudCxcbiAgICAgICAgbGlzdGVuZXIgXG4gICAgfSlcblxuICAgIGNvbnN0cnVjdG9yLmxpc3RlbmVycyA9IGxpc3RlbmVyc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gSG9va3NTdGF0aWM8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAodHlwZW9mICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICh0aGlzLmNvbnN0cnVjdG9yIGFzIGFueSkuYm9vdC5hcHBseSh0aGlzLmNvbnN0cnVjdG9yKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBsaXN0ZW5lcnMgPSBbXSBhcyBBcnJheTwoLi4uYXJnczogYW55W10pID0+IHZvaWQ+XG5cbiAgICAgICAgcHVibGljIHN0YXRpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKSB7XG4gICAgICAgICAgICByZXR1cm4gb25Ib29rKHRoaXMsIGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZW1pdChldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXRIb29rKHRoaXMsIGV2ZW50LCAuLi5hcmdzKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBIb29rczxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICBwdWJsaWMgbGlzdGVuZXJzOiBMaXN0ZW5lcltdXG5cbiAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IFtdXG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgb24oZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaCh7IFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGxpc3RlbmVyIFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmxpc3RlbmVycy5maW5kSW5kZXgoKGwpID0+IGwuZXZlbnQgPT09IGV2ZW50ICYmIGwubGlzdGVuZXIgPT09IGxpc3RlbmVyKVxuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKVxuICAgICAgICB9XG5cbiAgICAgICAgcHVibGljIGVtaXQoZXZlbnQ6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzLmZpbHRlcigobCkgPT4gbC5ldmVudCA9PT0gZXZlbnQpXG5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcHVibGljIGFzeW5jIGVtaXRBc3luYyhldmVudDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnMuZmlsdGVyKChsKSA9PiBsLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBsIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGwubGlzdGVuZXIoLi4uYXJncylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuSG9va3NTdGF0aWMuZW1pdCA9IGVtaXRIb29rXG5Ib29rc1N0YXRpYy5vbiA9IG9uSG9va1xuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gU29mdERlbGV0ZU1peGluPFQgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oYmFzZTogVCkge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2Uge1xuICAgICAgICBwdWJsaWMgZGVsZXRlZF9hdDogRGF0ZSB8IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGltZXN0YW1wTWl4aW48VCBleHRlbmRzIENvbnN0cnVjdG9yPihiYXNlOiBUKSB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7XG4gICAgICAgIHB1YmxpYyBjcmVhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgICAgIHB1YmxpYyB1cGRhdGVkX2F0OiBEYXRlIHwgc3RyaW5nXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkVudGl0eSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSkge1xuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgb3JpZ2luOiBzdHJpbmdcbiAgICBwdWJsaWMgc3ViamVjdDogc3RyaW5nXG4gICAgcHVibGljIGFjdGlvbjogc3RyaW5nXG4gICAgcHVibGljIGNvbmRpdGlvbnM6IHN0cmluZyB8IG51bGwgfCBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gbnVsbFxuXG4gICAgcHVibGljIGdldCBlZGl0YWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luID09PSAnY3VzdG9tJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcGFyc2VkQ29uZGl0aW9ucygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmRpdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiB7fVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmRpdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5jb25kaXRpb25zIGFzIHN0cmluZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZGl0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGVycm9yID8ge30gOiBqc29uXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lQWJpbGl0eSwgc3ViamVjdCBhcyBjcmVhdGVTdWJqZWN0IH0gZnJvbSAnQGNhc2wvYWJpbGl0eSdcbmltcG9ydCBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsRW50aXR5IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdBY2xFbnRpdHknXG5cbiAgICBwdWJsaWMgYWJpbGl0eTogUmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lQWJpbGl0eT5cbiAgICBwdWJsaWMgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxBY2xFbnRpdHk+ID0ge30pIHtcbiAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IHBlcm1zID0gcGVybWlzc2lvbnMubWFwKChwZXJtaXNzaW9uKSA9PiBQZXJtaXNzaW9uLmZyb20ocGVybWlzc2lvbikpXG5cbiAgICAgICAgXG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBwZXJtc1xuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKCkuY2hpbGQoeyBsYWJlbDogJ2FjbCcgfSlcbiAgICAgICAgXG4gICAgICAgIHRoaXMuYWJpbGl0eSA9IGRlZmluZUFiaWxpdHkoKGNhbikgPT4ge1xuICAgICAgICAgICAgcGVybXMuZm9yRWFjaCgocGVybWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbihwZXJtaXNzaW9uLmFjdGlvbiwgcGVybWlzc2lvbi5zdWJqZWN0LCBwZXJtaXNzaW9uLnBhcnNlZENvbmRpdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScsIHtcbiAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogdGhpcy5wZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuKGFjdGlvbjogc3RyaW5nLCBzdWJqZWN0OiBhbnksIG9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW4oYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbihhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBjYW5ub3QoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWJpbGl0eS5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3ViamVjdFdpdGhPYmplY3QgPSBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcblxuICAgICAgICByZXR1cm4gdGhpcy5hYmlsaXR5LmNhbm5vdChhY3Rpb24sIHN1YmplY3RXaXRoT2JqZWN0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdWJqZWN0KHN1YmplY3Q6IHN0cmluZywgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVTdWJqZWN0KHN1YmplY3QsIG9iamVjdClcbiAgICB9XG59XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvb2tpZU1hcEVudGl0eU9wdGlvbnMge1xuICAgIGNvb2tpZXM/OiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29va2llTWFwRW50aXR5J1xuXG4gICAgcHVibGljIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgcHJlZml4OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBDb29raWVNYXBFbnRpdHlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY29va2llcyA9IGRhdGE/LmNvb2tpZXMgfHwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgICAgICB0aGlzLnByZWZpeCA9IGRhdGE/LnByZWZpeCB8fCAnJ1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBNYXA8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIGlmIChjb29raWVzIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjb29raWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY29va2llcykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGtleSwgY29va2llc1trZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSB0aGlzLnByZWZpeCArIG5hbWVcblxuICAgICAgICByZXR1cm4gdGhpcy5jb29raWVzLmdldChmdWxsTmFtZSkgfHwgZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIFdlIHdhbnQgdG8gYWxsb3cgYW55IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGhlcmUsIGFzIHRoZXkgbWF5IGJlIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcgY29va2llXG4gICAgLy8gIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IGFueSkge1xuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMucHJlZml4ICsgbmFtZVxuXG4gICAgICAgIHRoaXMuY29va2llcy5zZXQoZnVsbE5hbWUsIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b1JlY29yZCgpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLmNvb2tpZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5wcmVmaXhlZEtleSA9IGtleS5zbGljZSh0aGlzLnByZWZpeC5sZW5ndGgpXG5cbiAgICAgICAgICAgICAgICByZXN1bHRbdW5wcmVmaXhlZEtleV0gPSB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBUWVBFUyA9ICgpID0+IFtcbiAgICB7XG4gICAgICAgIGlkOiAnZnMnLFxuICAgICAgICBsYWJlbDogJHQoJ0ZpbGUgU3lzdGVtJyksXG4gICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnU3RvcmUgZmlsZXMgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLicpLFxuICAgICAgICBjb25maWdfZmllbGRzOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0RpcmVjdG9yeScpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAkdCgnVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIGZpbGVzIHdpbGwgYmUgc3RvcmVkLicpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdSZWxhdGl2ZSB0byB0aGUgYXBwbGljYXRpb24gcm9vdCBvciBhYnNvbHV0ZSBwYXRoLCBlLmcuLCA6MCAgb3IgOjEnLCBbJy92YXIvemVuaXRoL3VwbG9hZHMnLCAnc3RvcmFnZS91cGxvYWRzJ10pLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiAnczMnLFxuICAgICAgICBsYWJlbDogJ1MzJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICR0KCdTdG9yZSBmaWxlcyBvbiBhbiBTMy1jb21wYXRpYmxlIHNlcnZpY2UgbGlrZSBBV1MgUzMsIERpZ2l0YWxPY2VhbiBTcGFjZXMsIGV0Yy4nKSxcbiAgICAgICAgY29uZmlnX2ZpZWxkczoge1xuICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0FjY2VzcyBLZXkgSUQnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1MgYWNjZXNzIGtleSBJRC4nKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFzc3dvcmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleToge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogJ3RleHQtZmllbGQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAkdCgnU2VjcmV0IEFjY2VzcyBLZXknKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnWW91ciBBV1Mgc2VjcmV0IGFjY2VzcyBrZXkuJyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ0J1Y2tldCBOYW1lJyksXG4gICAgICAgICAgICAgICAgaGludDogJHQoJ1RoZSBuYW1lIG9mIHRoZSBTMyBidWNrZXQgdG8gc3RvcmUgZmlsZXMgaW4uJyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVnaW9uOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdSZWdpb24nKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnVGhlIEFXUyByZWdpb24gd2hlcmUgeW91ciBidWNrZXQgaXMgbG9jYXRlZC4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVmaXg6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6ICd0ZXh0LWZpZWxkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJHQoJ1ByZWZpeCcpLFxuICAgICAgICAgICAgICAgIGhpbnQ6ICR0KCdBbiBvcHRpb25hbCBwcmVmaXggKGZvbGRlciBwYXRoKSB0byBzdG9yZSBmaWxlcyB1bmRlciBpbiB0aGUgYnVja2V0LicpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuZHBvaW50OiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiAndGV4dC1maWVsZCcsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICR0KCdFbmRwb2ludCBVUkwnKSxcbiAgICAgICAgICAgICAgICBoaW50OiAkdCgnT3B0aW9uYWwgY3VzdG9tIGVuZHBvaW50IFVSTCBmb3IgUzMtY29tcGF0aWJsZSBzZXJ2aWNlcy4nKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICB9XG5dXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUNvbmZpZyB7XG4gICAgcHVibGljIHN0YXRpYyBnZXQgVFlQRVMoKSB7XG4gICAgICAgIHJldHVybiBUWVBFUygpXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB0eXBlOiBzdHJpbmdcbiAgICBwdWJsaWMgaXNfZGVmYXVsdDogYm9vbGVhblxuICAgIHB1YmxpYyBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IERyaXZlQ29uZmlnKXtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29uZmlnX2ZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gRHJpdmVDb25maWcuVFlQRVMuZmluZChvcHQgPT4gb3B0LmlkID09PSB0aGlzLnR5cGUpXG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi5jb25maWdfZmllbGRzIDoge31cbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVFbnRyeSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmdcbiAgICBwdWJsaWMgdHlwZTogJ2ZpbGUnIHwgJ2RpcmVjdG9yeSdcbiAgICBwdWJsaWMgbWV0YXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogRHJpdmVFbnRyeSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGVFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHlNaXhpbiwgVGltZXN0YW1wTWl4aW4sIFNvZnREZWxldGVNaXhpbikgeyAgXG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgZHJpdmU6IHN0cmluZ1xuICAgIHB1YmxpYyBtaW1ldHlwZTogc3RyaW5nXG4gICAgcHVibGljIHB1cnBvc2U6IHN0cmluZ1xuICAgIHB1YmxpYyBjbGllbnRfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcHVibGljOiBib29sZWFuXG5cbiAgICAvLyBkeW5hbWljXG4gICAgcHVibGljIHVybD86IHN0cmluZ1xuICAgIHB1YmxpYyBtZXRhcz86IFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBpc0ltYWdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1ldHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBmaWxlX2lkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgfCBudWxsXG59XG4iLCJpbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBCYXNlRW50aXR5TWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXBsb2FkU2Vzc2lvbiBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eU1peGluLCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgcHVycG9zZTogc3RyaW5nXG4gICAgcHVibGljIG1pbWVfdHlwZXM6IHN0cmluZ1xuICAgIHB1YmxpYyBtYXhfc2l6ZTogbnVtYmVyXG5cbiAgICAvLyBkeW5hbWljIFxuICAgIHB1YmxpYyB1cGxvYWRfdXJsPzogc3RyaW5nXG4gICAgcHVibGljIGNyZWF0ZV9maWxlX3VybD86IHN0cmluZ1xuXG4gICAgcHVibGljIGdldFBhcnNlZE1pbWVUeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodHlwZSA9PiB0eXBlLnRyaW0oKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkTWltZVR5cGUobWltZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSB0aGlzLmdldFBhcnNlZE1pbWVUeXBlcygpXG4gICAgICAgIHJldHVybiBhbGxvd2VkVHlwZXMuaW5jbHVkZXMobWltZVR5cGUpIHx8IGFsbG93ZWRUeXBlcy5pbmNsdWRlcygnKi8qJylcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBbGxvd2VkU2l6ZShzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHNpemUgPD0gdGhpcy5tYXhfc2l6ZVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpdEJyYW5jaEVudGl0eSB7XG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyByZW1vdGU6IHN0cmluZyB8IG51bGxcbiAgICBwdWJsaWMgaXNfY3VycmVudDogYm9vbGVhblxuICAgIHB1YmxpYyBpc19yZW1vdGU6IGJvb2xlYW5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IEdpdEJyYW5jaEVudGl0eSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0Q29tbWl0RW50aXR5IHtcbiAgICBwdWJsaWMgaGFzaDogc3RyaW5nXG4gICAgcHVibGljIHNob3J0X2hhc2g6IHN0cmluZ1xuICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmdcbiAgICBwdWJsaWMgYm9keTogc3RyaW5nXG4gICAgcHVibGljIGF1dGhvcl9uYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgYXV0aG9yX2VtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgZGF0ZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBHaXRDb21taXRFbnRpdHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIE1vZHVsZU1hbmlmZXN0IGZyb20gJy4vTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMnXG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuaW50ZXJmYWNlIE1vZHVsZVVwZ3JhZGVJbmZvIHtcbiAgICBzb3VyY2U6ICdnaXQnIHwgJ3ppcCdcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBtaXhpbihMaWZlY3ljbGVIb29rKSkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuID0gZmFsc2VcbiAgICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cbiAgICBwdWJsaWMgYnVpbGQ6IE1vZHVsZU1hbmlmZXN0WydidWlsZCddID0ge31cbiAgICBwdWJsaWMgZGlyZWN0b3J5OiBzdHJpbmdcblxuICAgIHB1YmxpYyB1cGdyYWRlX2luZm8/OiBNb2R1bGVVcGdyYWRlSW5mb1xuXG4gICAgcHVibGljIHNldERhdGEoZGF0YTogUGFydGlhbDxNb2R1bGUgfCBNb2R1bGVNYW5pZmVzdD4pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhkYXRhKS5maWx0ZXIoKFssIHZdKSA9PiB2ICE9PSB1bmRlZmluZWQpXG4gICAgICAgIClcblxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGZpbHRlcmVkKVxuXG4gICAgICAgIHRoaXMuaG9va19pZCA9IGBtb2R1bGU6JHt0aGlzLmlkfWBcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGRJbXBvcnQge1xuICAgIGZyb206IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHlwZTogJ2dsb2JhbF9pbXBvcnQnXG59XG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0QnVpbGQge1xuICAgIGltcG9ydHM/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0W11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kdWxlTWFuaWZlc3QgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYXV0aG9yPzogc3RyaW5nXG4gICAgcHVibGljIGRlcGVuZGVuY2llcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwdWJsaWMgYnVpbGQ/OiBNb2R1bGVNYW5pZmVzdEJ1aWxkXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdpbmF0aW9uRW50aXR5PFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgcHVibGljIGl0ZW1zOiBUW11cbiAgICBwdWJsaWMgdG90YWw6IG51bWJlclxuICAgIHB1YmxpYyBwYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgcGVyX3BhZ2U6IG51bWJlclxuICAgIHB1YmxpYyB0b3RhbF9wYWdlczogbnVtYmVyXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZyb208VCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPihwYXlsb2FkOiBQYXJ0aWFsPFBhZ2luYXRpb25FbnRpdHk8VD4+KTogUGFnaW5hdGlvbkVudGl0eTxUPiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFnaW5hdGlvbkVudGl0eShwYXlsb2FkIGFzIGFueSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5FbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHkpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuYWJsZWQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgYWxpYXNlczogc3RyaW5nW11cbiAgICBwdWJsaWMgdmVyc2lvbl9jaGFubmVsOiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyc2lvbl9hdmFpbGFibGVfY2hhbm5lbHM6IHN0cmluZ1tdXG59XG4iLCJpbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5pbXBvcnQgU29mdERlbGV0ZU1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2UgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvbGUgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbn1cbiIsImltcG9ydCB0eXBlIFBlcm1pc3Npb24gZnJvbSAnLi9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgUm9sZSBmcm9tICcuL1JvbGVFbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFRpbWVzdGFtcE1peGluIGZyb20gJyNzaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJFbnRpdHkgZXh0ZW5kcyBjb21wb3NlKEJhc2VFbnRpdHksIFRpbWVzdGFtcE1peGluLCBTb2Z0RGVsZXRlTWl4aW4pIHsgIFxuICAgIHB1YmxpYyBpZDogbnVtYmVyXG4gICAgcHVibGljIGVtYWlsOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHVzZXJuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgdmVyaWZpZWRfYXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbFxuXG4gICAgcHVibGljIHBlcm1pc3Npb25zPzogUGVybWlzc2lvbltdXG4gICAgcHVibGljIHJvbGVzPzogUm9sZVtdXG5cbiAgICBwdWJsaWMgZ2V0IGluaXRpYWxzKCl7XG4gICAgICAgIGNvbnN0IFtmaXJzdE5hbWUsIHNlY29uZE5hbWVdID0gdGhpcy5uYW1lLnNwbGl0KCcgJylcblxuICAgICAgICBpZiAoIXNlY29uZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYSA9IGZpcnN0TmFtZVswXS50b1VwcGVyQ2FzZSgpXG4gICAgICAgIGNvbnN0IGIgPSBzZWNvbmROYW1lWzBdLnRvVXBwZXJDYXNlKClcblxuICAgICAgICByZXR1cm4gYSArIGJcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBDb21tYW5kIGFzIENvbW1hbmRlckNvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBwcmludFRhYmxlLCBwcmludE9iamVjdCB9IGZyb20gJy4uL3V0aWxzL3ByaW50VGFibGUudHMnXG5pbXBvcnQgeyBpbXBvcnRBbGwgfSBmcm9tICcjc2VydmVyL3V0aWxzL2ltcG9ydEFsbC50cydcbmltcG9ydCB7IEVtbWl0dGVyU2VydmljZSwgTG9nZ2VyU2VydmljZSwgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0ICogYXMgaW5xdWlyZXIgZnJvbSAnQGlucXVpcmVyL3Byb21wdHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpRXZlbnRzIHtcbiAgICAnY2xpOnJlZ2lzdGVyZWQnOiB7XG4gICAgICAgIGNsaTogQ2xpU2VydmljZVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kZXJDb21tYW5kIHtcbiAgICBwdWJsaWMgX19pc19jbGlfY29tbWFuZCA9IHRydWVcbiAgICBwdWJsaWMgdGFibGUgPSBwcmludFRhYmxlXG4gICAgcHVibGljIG9iamVjdCA9IHByaW50T2JqZWN0XG4gICAgcHVibGljIGNvbG9ycyA9IGNoYWxrXG4gICAgcHVibGljIGlucXVpcmVyID0gaW5xdWlyZXJcblxuICAgIHB1YmxpYyBuZWVkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KClcbiAgICBwdWJsaWMgbmVlZCguLi5hcmdzOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHRoaXMubmVlZHMuYWRkKGFyZykpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBjcmVhdGVDb21tYW5kKG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGlDb21tYW5kKG5hbWUpXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGlTZXJ2aWNlIGV4dGVuZHMgQ2xpQ29tbWFuZCB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ2xpU2VydmljZSdcblxuICAgIHB1YmxpYyBkaXJzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBwdWJsaWMgbG9nZ2VyID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHB1YmxpYyBlbW1pdHRlciA9IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShuYW1lID0gJ2NsaScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGlTZXJ2aWNlKG5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFbW1pdHRlcihlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBlbW1pdHRlclxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgY3JlYXRlQ29tbWFuZChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpU2VydmljZShuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGREaXIoZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXJzLmFkZChkaXIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERpcihkaXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtb2RzID0gYXdhaXQgaW1wb3J0QWxsKGRpciwge1xuICAgICAgICAgICAgZXhjbHVkZTogWycudGVzdC50cycsICcuc3BlYy50cycsICcudGVzdC5qcycsICcuc3BlYy5qcyddLFxuICAgICAgICAgICAgb25FcnJvcjogKHsgZXJyb3IsIGZpbGVuYW1lIH0pID0+IHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgbW9kXSBvZiBPYmplY3QuZW50cmllcyhtb2RzKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgaW1wb3J0ZWQgZmlsZSAke2ZpbGVuYW1lfSBmcm9tICR7ZGlyfWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbW9kLmRlZmF1bHQgfHwgT2JqZWN0LmtleXMobW9kLmRlZmF1bHQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbW9kLmRlZmF1bHQuX19pc19jbGlfY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGRlZmF1bHQgZXhwb3J0IG9mIGZpbGUgJHttb2QuZmlsZW5hbWV9IGlzIG5vdCBhIENsaUNvbW1hbmQsIHNraXBwaW5nYClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gdHJ5Q2F0Y2guc3luYygoKSA9PiB0aGlzLmFkZENvbW1hbmQobW9kLmRlZmF1bHQpKVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lOiBtb2QuZmlsZW5hbWUgfSlcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yKVxuXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgYWRkZWQgY29tbWFuZCBmcm9tIGZpbGUgJHtmaWxlbmFtZX0gdG8gY2xpYClcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGlyIG9mIHRoaXMuZGlycykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGlyKGRpcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiaW1wb3J0IENsaVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9DbGlTZXJ2aWNlLnRzJ1xuaW1wb3J0IGRpIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFydGVUZXN0ZXJTZXJ2aWNlIGV4dGVuZHMgQ2xpU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCkgXG5cbiAgICAgICAgdGhpcy5leGl0T3ZlcnJpZGUoKVxuXG4gICAgICAgIHRoaXMuY29uZmlndXJlT3V0cHV0KHtcbiAgICAgICAgICAgIHdyaXRlT3V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcHJlc3MgY29tbWFuZCBvdXRwdXQgZHVyaW5nIHRlc3RzXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd3JpdGVFcnI6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBlcnJvciBvdXRwdXQgZHVyaW5nIHRlc3RzXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGRpLnNldChDbGlTZXJ2aWNlLCB0aGlzKVxuXG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhZGQocGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGF3YWl0IGltcG9ydChwYXRoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGFyc2VBc3luYyhbJ25vZGUnLCAnYXJ0ZScsIC4uLmFyZ3NdKVxuICAgIH1cbn1cbiIsImltcG9ydCBjcCBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGlXcmFwcGVyU2VydmljZSB7XG4gICAgcHVibGljIHByb2Nlc3M6IGNwLkNoaWxkUHJvY2VzcyB8IG51bGwgPSBudWxsO1xuICAgIHB1YmxpYyBhcHBCYXNlUGF0aDogc3RyaW5nO1xuICAgIHB1YmxpYyBlbnYgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIHB1YmxpYyBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHB1YmxpYyBjb25maWdBcmd1bWVudHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIHB1YmxpYyBjb25maWdGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9nZ2VyID0gbmV3IExvZ2dlclNlcnZpY2UoKTtcblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IENsaVdyYXBwZXJTZXJ2aWNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEJhc2VQYXRoKHBhdGg6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFwcEJhc2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1ZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb25maWdBcmd1bWVudChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbmZpZ0FyZ3VtZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRDb25maWdGaWxlKC4uLmZpbGVQYXRoczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5jb25maWdGaWxlcy5wdXNoKC4uLmZpbGVQYXRocyk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFbnYoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5lbnYuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0FyZ3VtZW50cygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKS5maWx0ZXIoYXJnID0+IGFyZy5zdGFydHNXaXRoKCdAY29uZmlnOicpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnQXJncykge1xuICAgICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnkuc2xpY2UoJ0Bjb25maWc6Jy5sZW5ndGgpLnNwbGl0KCc9JykubWFwKHMgPT4gcy50cmltKCkpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ0FyZ3VtZW50cy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0ZpbGVzKCkge1xuICAgICAgICBjb25zdCBjb25maWdGaWxlQXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKVxuICAgICAgICAgICAgLmZpbHRlcihhcmcgPT4gYXJnLnN0YXJ0c1dpdGgoJ0Bjb25maWctZmlsZTonKSlcbiAgICAgICAgICAgIC5tYXAoYXJnID0+IGFyZy5zbGljZSgnQGNvbmZpZy1maWxlOicubGVuZ3RoKSk7XG5cbiAgICAgICAgdGhpcy5hZGRDb25maWdGaWxlKC4uLmNvbmZpZ0ZpbGVBcmdzKTtcblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuQ09ORklHX0ZJTEVTKSB7XG4gICAgICAgICAgICBjb25zdCBlbnZGaWxlcyA9IHByb2Nlc3MuZW52LkNPTkZJR19GSUxFUy5zcGxpdCgnLCcpLm1hcChmID0+IGYudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkQ29uZmlnRmlsZSguLi5lbnZGaWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEVudmlyb25tZW50KCkge1xuICAgICAgICBjb25zdCBjb25maWdBcmd1bWVudHMgPSBBcnJheS5mcm9tKHRoaXMuY29uZmlnQXJndW1lbnRzLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fT0ke3ZhbHVlfWApLmpvaW4oJzsnKTtcblxuICAgICAgICB0aGlzLmFkZEVudignWkVOSVRIX0NPTkZJR19BUkdVTUVOVFMnLCBjb25maWdBcmd1bWVudHMpOyBcbiAgICAgICAgdGhpcy5hZGRFbnYoJ1pFTklUSF9DT05GSUdfRklMRVMnLCB0aGlzLmNvbmZpZ0ZpbGVzLmpvaW4oJywnKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRBcmd1bWVudHMoYXJnczogc3RyaW5nW10gPSBbXSkge1xuICAgICAgICBjb25zdCBuYW1lc3BhY2VzID0gWydAY29uZmlnOicsICdAY29uZmlnLWZpbGU6J107XG5cbiAgICAgICAgY29uc3QgZm9yd2FyZEFyZ3MgPSBhcmdzLmZpbHRlcihhcmcgPT4gIW5hbWVzcGFjZXMuc29tZShucyA9PiBhcmcuc3RhcnRzV2l0aChucykpKTtcblxuICAgICAgICB0aGlzLmFyZ3MgPSBbXG4gICAgICAgICAgICAnLS1uby13YXJuaW5ncycsXG4gICAgICAgICAgICAnLS1leHBlcmltZW50YWwtc3RyaXAtdHlwZXMnLFxuICAgICAgICAgICAgJy0tZW5hYmxlLXNvdXJjZS1tYXBzJyxcbiAgICAgICAgICAgIHBhdGguam9pbih0aGlzLmFwcEJhc2VQYXRoLCAnc2VydmVyJywgJ2NsaS50cycpLFxuICAgICAgICAgICAgLi4uZm9yd2FyZEFyZ3MsXG4gICAgICAgIF07XG5cbiAgICB9XG5cbiAgICBwdWJsaWMga2lsbChjb2RlOiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2Nlc3MgJiYgIXRoaXMucHJvY2Vzcy5raWxsZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzcy5raWxsKCdTSUdURVJNJyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLmV4aXQoY29kZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1bihhcmdzPzogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcEJhc2VQYXRoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jhc2UgcGF0aCBub3Qgc2V0LiBQbGVhc2UgY2FsbCBzZXRCYXNlUGF0aCgpIGJlZm9yZSBydW4oKS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZENvbmZpZ0FyZ3VtZW50cygpO1xuICAgICAgICB0aGlzLmxvYWRDb25maWdGaWxlcygpO1xuICAgICAgICB0aGlzLmxvYWRBcmd1bWVudHMoYXJncyB8fCBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpO1xuXG4gICAgICAgIHRoaXMubG9hZEVudmlyb25tZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdydW4nLCB7XG4gICAgICAgICAgICAgICAgYXJnczogdGhpcy5hcmdzLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9jZXNzID0gY3Auc3Bhd24oJ25vZGUnLCB0aGlzLmFyZ3MsIHtcbiAgICAgICAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAgICAgICAuLi5PYmplY3QuZnJvbUVudHJpZXModGhpcy5lbnYuZW50cmllcygpKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgICAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgICAgICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4gdGhpcy5raWxsKCkpO1xuICAgIH1cbn1cbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBCQVNFX1BBVEggPSBwcm9jZXNzLmVudi5aRU5JVEhfQkFTRV9QQVRIIVxuXG4gICAgaWYgKCFCQVNFX1BBVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdaRU5JVEhfQkFTRV9QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoQkFTRV9QQVRILCAuLi5hcmdzKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcmFnZVBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IEJBU0VfUEFUSCA9IHByb2Nlc3MuZW52LlpFTklUSF9CQVNFX1BBVEghXG4gICAgY29uc3QgU1RPUkFHRV9QQVRIID0gcHJvY2Vzcy5lbnYuWkVOSVRIX1NUT1JBR0VfUEFUSCB8fCBwYXRoLmpvaW4oQkFTRV9QQVRIIHx8ICcnLCAnc3RvcmFnZScpXG5cbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKFNUT1JBR0VfUEFUSCwgLi4uYXJncylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlVG9CYXNlUGF0aCguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgQkFTRV9QQVRIID0gcHJvY2Vzcy5lbnYuWkVOSVRIX0JBU0VfUEFUSCFcblxuICAgIGlmICghQkFTRV9QQVRIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWkVOSVRIX0JBU0VfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0JylcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwYXRoLnJlc29sdmUoQkFTRV9QQVRILCAuLi5hcmdzKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRtcFBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlUGF0aCgndG1wJywgLi4uYXJncylcbn1cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBiYXNlUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuaW1wb3J0IHR5cGUgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRlNTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGlyZWN0b3J5Pzogc3RyaW5nXG4gICAgZm9ybWF0PzogJ2pzb24nIHwgJ3ltbCdcbiAgICBmb3JtYXRPcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnRlNTZXJ2aWNlIGV4dGVuZHMgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGZvcm1hdDogJ2pzb24nIHwgJ3ltbCcgPSAnanNvbidcbiAgICBwdWJsaWMgZm9ybWF0T3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGRpcmVjdG9yeTogc3RyaW5nXG5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbmZpZ0ZTU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IGZhbHNlXG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gb3B0aW9ucy5kaXJlY3RvcnkgPz8gYmFzZVBhdGgoJ2NvbmZpZycpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLmNoaWxkKHsgbGFiZWw6ICdjb25maWcnIH0pXG4gICAgICAgIHRoaXMuZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgPz8gJ2pzb24nXG4gICAgICAgIHRoaXMuZm9ybWF0T3B0aW9ucyA9IG9wdGlvbnMuZm9ybWF0T3B0aW9ucyA/PyB7fVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cml0ZShlbnRyeTogc3RyaW5nLCBkYXRhOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5mb3JtYXQgPT09ICd5bWwnID8gJ3ltbCcgOiAnanNvbidcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGAke2VudHJ5fS4ke2V4dH1gKVxuXG4gICAgICAgIGxldCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgdGhpcy5mb3JtYXRPcHRpb25zLmluZGVudCB8fCA0KVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gJ3ltbCcpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSB5YW1sLmR1bXAoZGF0YSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGZpbGVuYW1lLCBjb250ZW50LCAndXRmLTgnKVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN5bmMoZW50cnk6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcblxuICAgICAgICBsZXQgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDQpXG5cbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSAneW1sJykge1xuICAgICAgICAgICAgY29udGVudCA9IHlhbWwuZHVtcChkYXRhLCB0aGlzLmZvcm1hdE9wdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCBjb250ZW50LCAndXRmLTgnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICB0aGlzLmNsZWFyKClcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5kaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBjb25maWcgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LCBjcmVhdGluZzogJHt0aGlzLmRpcmVjdG9yeX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBmcy5ta2RpclN5bmModGhpcy5kaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIodGhpcy5kaXJlY3RvcnkpXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKGZpbGVuYW1lKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09ICdqc29uJyAmJiBleHQgIT09ICcuanNvbicpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09ICd5bWwnICYmIGV4dCAhPT0gJy55bWwnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGZpbGVuYW1lKVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGpzb25dID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04JylcblxuICAgICAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZW5hbWUpID09PSAnLnltbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlhbWwubG9hZCh0ZXh0KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZmFpbGVkIHRvIGxvYWQgY29uZmlnIGZpbGUgJHtmaWxlbmFtZX1gLCBlcnJvcilcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lLCBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKVxuXG4gICAgICAgICAgICBzdXBlci5zZXQoa2V5LCBqc29uLCAnZmlsZXN5c3RlbScpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGxvYWRlZCBjb25maWcgZmlsZTogJHtmaWxlbmFtZX1gKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdjb25maWcgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUtleShmdWxsS2V5OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgW2VudHJ5LCAuLi5yZXN0XSA9IGZ1bGxLZXkuc3BsaXQoJy4nKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbnRyeSxcbiAgICAgICAgICAgIGtleTogcmVzdC5qb2luKCcuJykgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGZ1bGxLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ2ZpbGVzeXN0ZW0nKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLnNldChmdWxsS2V5LCB2YWx1ZSwgc291cmNlKVxuXG4gICAgICAgIGlmIChzb3VyY2UgIT09ICdmaWxlc3lzdGVtJykge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGVudHJ5LCBrZXkgfSA9IHRoaXMucGFyc2VLZXkoZnVsbEtleSlcbiAgICAgICAgXG4gICAgICAgIGxldCB2YWx1ZXMgPSB0aGlzLmdldChlbnRyeSlcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgJiYgdmFsdWVzKSB7XG4gICAgICAgICAgICBzZXQodmFsdWVzLCBrZXksIHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZVN5bmMoZW50cnksIHZhbHVlcylcbiAgICAgICAgXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGZ1bGxLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGVudHJ5LCBrZXkgfSA9IHRoaXMucGFyc2VLZXkoZnVsbEtleSlcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgY29uc3QgZXh0ID0gdGhpcy5mb3JtYXQgPT09ICd5bWwnID8gJ3ltbCcgOiAnanNvbidcblxuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmpvaW4odGhpcy5kaXJlY3RvcnksIGAke2VudHJ5fS4ke2V4dH1gKVxuXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKGZpbGVuYW1lKVxuXG4gICAgICAgICAgICBzdXBlci51bnNldChmdWxsS2V5KVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXQoZW50cnkpXG5cbiAgICAgICAgc2V0KHZhbHVlcywga2V5LCB1bmRlZmluZWQpXG5cbiAgICAgICAgdGhpcy53cml0ZVN5bmMoZW50cnksIHZhbHVlcylcblxuICAgICAgICBzdXBlci51bnNldChmdWxsS2V5KVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IG1zIGZyb20gJ21zJ1xuaW1wb3J0IHR5cGUgRHJpdmVFbnRyeSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsT3B0aW9ucyB7XG4gICAgZXhwaXJlcz86IG1zLlN0cmluZ1ZhbHVlOyAvLyBtcyBmb3JtYXQsIGUuZy4gJzFoJywgJzMwbScsICcxNXMnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkVXJsT3B0aW9ucyB7XG4gICAgZXhwaXJlcz86IG1zLlN0cmluZ1ZhbHVlOyAvLyBtcyBmb3JtYXQsIGUuZy4gJzFoJywgJzMwbScsICcxNXMnXG4gICAgbWltZV90eXBlcz86IHN0cmluZ1tdO1xuICAgIG1heF9zaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUJhc2VHYXRld2F5IHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICBwdWJsaWMgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBpY2s8RHJpdmVCYXNlR2F0ZXdheSwgJ2lkJyB8ICduYW1lJyB8ICdkZXNjcmlwdGlvbicgfCAnY29uZmlnJz4pIHtcbiAgICAgICAgdGhpcy5pZCA9IGRhdGEuaWRcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lXG4gICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uXG4gICAgICAgIHRoaXMuY29uZmlnID0gZGF0YS5jb25maWdcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdChmb2xkZXI/OiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnlbXT4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZm9sZGVyIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgcHVibGljIGZpbmQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeT4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZmlsZW5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgZmlsZW5hbWUgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxOb2RlSlMuUmVhZGFibGVTdHJlYW0+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZmlsZW5hbWU6IHN0cmluZywgZGF0YTogVWludDhBcnJheSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIGRhdGEgXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBzdHJlYW0gXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKGZpbGVuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiBVcmxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBvcHRpb25zIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHVwbG9hZFVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogVXBsb2FkVXJsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgb3B0aW9ucyBcbiAgICAgICAgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgICBcbn1cbiIsImltcG9ydCB7IFJlYWRhYmxlIH0gZnJvbSAnc3RyZWFtJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgbXMgZnJvbSAnbXMnXG5pbXBvcnQge1xuICAgIFMzQ2xpZW50LFxuICAgIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICAgIEdldE9iamVjdENvbW1hbmQsXG4gICAgUHV0T2JqZWN0Q29tbWFuZCxcbiAgICBEZWxldGVPYmplY3RDb21tYW5kLFxuICAgIERlbGV0ZU9iamVjdHNDb21tYW5kLFxuICAgIEhlYWRPYmplY3RDb21tYW5kLFxufSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnXG5pbXBvcnQgeyBnZXRTaWduZWRVcmwgfSBmcm9tICdAYXdzLXNkay9zMy1yZXF1ZXN0LXByZXNpZ25lcidcbmltcG9ydCB7IFVwbG9hZCB9IGZyb20gJ0Bhd3Mtc2RrL2xpYi1zdG9yYWdlJ1xuaW1wb3J0IHR5cGUgeyBJbmZlck91dHB1dCB9IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lJ1xuaW1wb3J0IERyaXZlRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cydcbmltcG9ydCBCYXNlRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUJhc2VHYXRld2F5LnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmNvbnN0IHNjaGVtYSA9IHZhbGlkYXRvci5jcmVhdGUoKHYpID0+IHYub2JqZWN0KHtcbiAgICBidWNrZXQ6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCgxKSksXG4gICAgcmVnaW9uOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIGFjY2Vzc0tleUlkOiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoMSkpLFxuICAgIHNlY3JldEFjY2Vzc0tleTogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICBzZXNzaW9uVG9rZW46IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgZW5kcG9pbnQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgcHJlZml4OiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxufSkpXG5cbmV4cG9ydCB0eXBlIFMzRHJpdmVDb25maWcgPSBJbmZlck91dHB1dDx0eXBlb2Ygc2NoZW1hPlxuXG5mdW5jdGlvbiBzdHJlYW1Ub1VpbnQ4QXJyYXkoc3RyZWFtOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICBpZiAoIXN0cmVhbSB8fCB0eXBlb2Ygc3RyZWFtICE9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygc3RyZWFtLm9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IFVpbnQ4QXJyYXkoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBjaHVua3M6IEJ1ZmZlcltdID0gW11cbiAgICAgICAgc3RyZWFtLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSkpXG4gICAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShuZXcgVWludDhBcnJheShCdWZmZXIuY29uY2F0KGNodW5rcykpKSlcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdClcbiAgICB9KVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZVMzIGV4dGVuZHMgQmFzZURyaXZlIHtcbiAgICBwcml2YXRlIHNjaGVtYSA9IHNjaGVtYVxuXG4gICAgcHJpdmF0ZSBfY2xpZW50PzogUzNDbGllbnRcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBpY2s8QmFzZURyaXZlLCAnaWQnIHwgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdjb25maWcnPikge1xuICAgICAgICBzdXBlcihkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCh0aGlzLmNvbmZpZywgdGhpcy5zY2hlbWEpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1ZhbGlkKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCR0KCdJbnZhbGlkIGRyaXZlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgYnVja2V0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAodGhpcy5jb25maWcgYXMgUzNEcml2ZUNvbmZpZykuYnVja2V0XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBwcmVmaXgoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZz8ucHJlZml4KSByZXR1cm4gJydcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnPy5wcmVmaXguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnByZWZpeCArICcvJ1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnByZWZpeFxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0S2V5KGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGVhbkZpbGVuYW1lID0gZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpID8gZmlsZW5hbWUuc2xpY2UoMSkgOiBmaWxlbmFtZVxuICAgICAgICBpZiAoIXRoaXMucHJlZml4KSB7XG4gICAgICAgICAgICByZXR1cm4gY2xlYW5GaWxlbmFtZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNsZWFuUHJlZml4ID0gdGhpcy5wcmVmaXguZW5kc1dpdGgoJy8nKSA/IHRoaXMucHJlZml4IDogYCR7dGhpcy5wcmVmaXh9L2BcbiAgICAgICAgcmV0dXJuIGAke2NsZWFuUHJlZml4fSR7Y2xlYW5GaWxlbmFtZX1gXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBjbGllbnQoKTogUzNDbGllbnQge1xuICAgICAgICBpZiAodGhpcy5fY2xpZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZyBhcyBTM0RyaXZlQ29uZmlnXG5cbiAgICAgICAgdGhpcy5fY2xpZW50ID0gbmV3IFMzQ2xpZW50KHtcbiAgICAgICAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgICAgICAgIGVuZHBvaW50OiBjb25maWcuZW5kcG9pbnQsXG4gICAgICAgICAgICBjcmVkZW50aWFsczoge1xuICAgICAgICAgICAgICAgIGFjY2Vzc0tleUlkOiBjb25maWcuYWNjZXNzS2V5SWQsXG4gICAgICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiBjb25maWcuc2VjcmV0QWNjZXNzS2V5LFxuICAgICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogY29uZmlnLnNlc3Npb25Ub2tlbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gdGhpcy5fY2xpZW50XG4gICAgfVxuXG4gICAgcHVibGljIGV4aXN0czogQmFzZURyaXZlWydleGlzdHMnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNsaWVudC5zZW5kKG5ldyBIZWFkT2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5XG4gICAgICAgIH0pKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdDogQmFzZURyaXZlWydsaXN0J10gPSBhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgbGV0IFByZWZpeCA9IGZvbGRlciA/IHRoaXMuZ2V0S2V5KGZvbGRlcikgOiB0aGlzLnByZWZpeCB8fCB1bmRlZmluZWRcblxuICAgICAgICBpZiAoUHJlZml4ICYmICFQcmVmaXguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgUHJlZml4ICs9ICcvJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgUHJlZml4LFxuICAgICAgICAgICAgRGVsaW1pdGVyOiAnLycsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoY29tbWFuZClcblxuICAgICAgICBjb25zdCBlbnRyaWVzOiBEcml2ZUVudGl0eVtdID0gW11cblxuICAgICAgICBjb25zdCBjb21tb25QcmVmaXhlcyA9IHJlc3AuQ29tbW9uUHJlZml4ZXMgfHwgW11cblxuICAgICAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiBjb21tb25QcmVmaXhlcykge1xuICAgICAgICAgICAgbGV0IGtleSA9IHByZWZpeC5QcmVmaXggfHwgJydcblxuICAgICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UodGhpcy5wcmVmaXgsICcnKVxuXG4gICAgICAgICAgICBpZiAoa2V5LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICBrZXkgPSBrZXkuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IERyaXZlRW50aXR5KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXkuc3BsaXQoJy8nKS5wb3AoKSB8fCBrZXksXG4gICAgICAgICAgICAgICAgcGF0aDogJy8nICsga2V5LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdkaXJlY3RvcnknLFxuICAgICAgICAgICAgICAgIG1ldGFzOiB7XG4gICAgICAgICAgICAgICAgICAgIHNpemU6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiAnYXBwbGljYXRpb24veC1kaXJlY3RvcnknXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udGVudHMgPSByZXNwLkNvbnRlbnRzIHx8IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBvYmogb2YgY29udGVudHMpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBvYmouS2V5IHx8ICcnXG5cbiAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKHRoaXMucHJlZml4LCAnJylcblxuICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgRHJpdmVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGtleS5zcGxpdCgnLycpLnBvcCgpIHx8IGtleSxcbiAgICAgICAgICAgICAgICBwYXRoOiAnLycgKyBrZXksXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ZpbGUnLFxuICAgICAgICAgICAgICAgIG1ldGFzOiB7XG4gICAgICAgICAgICAgICAgICAgIHNpemU6IG9iai5TaXplLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogbWltZS5nZXRUeXBlKGtleSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cmllc1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kOiBCYXNlRHJpdmVbJ2ZpbmQnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpID8gZmlsZW5hbWUgOiAnLycgKyBmaWxlbmFtZVxuICAgICAgICBjb25zdCBmb2xkZXIgPSBkaXJuYW1lKGZpbGVwYXRoKVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmxpc3QoZm9sZGVyKVxuXG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5maW5kKGUgPT4gZS5wYXRoID09PSBmaWxlcGF0aClcblxuICAgICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZpbGVwYXRofVwiIG5vdCBmb3VuZGApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWtkaXIoX2ZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICAvLyBTMyBpcyBvYmplY3Qgc3RvcmFnZTsgZGlyZWN0b3JpZXMgYXJlIGltcGxpY2l0LiBDcmVhdGUgYSB6ZXJvLWJ5dGUgb2JqZWN0IHdpdGggdHJhaWxpbmcgc2xhc2ggdG8gZW11bGF0ZSBkaXJlY3RvcnkgaWYgbmVlZGVkLlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZDogQmFzZURyaXZlWydyZWFkJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5XG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSByZXNwLkJvZHkgYXMgUmVhZGFibGVcblxuICAgICAgICByZXR1cm4gc3RyZWFtVG9VaW50OEFycmF5KGJvZHkpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlYWRTdHJlYW0oZmlsZW5hbWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgS2V5XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoY29tbWFuZClcblxuICAgICAgICBjb25zdCBib2R5ID0gcmVzcC5Cb2R5IGFzIGFueVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYm9keSlcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGU6IEJhc2VEcml2ZVsnd3JpdGUnXSA9IGFzeW5jIChmaWxlbmFtZSwgZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleSxcbiAgICAgICAgICAgIEJvZHk6IEJ1ZmZlci5mcm9tKGRhdGEpXG4gICAgICAgIH0pKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB3cml0ZVN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBzdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IHVwbG9hZCA9IG5ldyBVcGxvYWQoe1xuICAgICAgICAgICAgY2xpZW50OiB0aGlzLmNsaWVudCxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICAgICAgS2V5LFxuICAgICAgICAgICAgICAgIEJvZHk6IFJlYWRhYmxlLmZyb20oc3RyZWFtKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgdXBsb2FkLmRvbmUoKVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGU6IEJhc2VEcml2ZVsnZGVsZXRlJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuZmluZChmaWxlbmFtZSlcblxuICAgICAgICBpZiAoZW50cnkudHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IERlbGV0ZU9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICAgICAgS2V5XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKGNvbW1hbmQpXG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBsaXN0UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgUHJlZml4OiBLZXlcbiAgICAgICAgfSkpXG5cbiAgICAgICAgY29uc3QgdG9EZWxldGUgPSAobGlzdFJlc3BvbnNlLkNvbnRlbnRzIHx8IFtdKS5tYXAoYyA9PiAoeyBLZXk6IGMuS2V5IH0pKVxuXG4gICAgICAgIGlmICh0b0RlbGV0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIERlbGV0ZTogeyBPYmplY3RzOiB0b0RlbGV0ZSB9XG4gICAgICAgIH0pKVxuXG4gICAgICAgIGlmIChsaXN0UmVzcG9uc2UuSXNUcnVuY2F0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlKGZpbGVuYW1lKSAvLyBSZWN1cnNpdmVseSBkZWxldGUgaWYgdGhlcmUgYXJlIG1vcmUgb2JqZWN0cyB0byBkZWxldGVkXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cblxuICAgIH1cblxuICAgIHB1YmxpYyB1cmw6IEJhc2VEcml2ZVsndXJsJ10gPSBhc3luYyAoZmlsZW5hbWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBleHBpcmVzTXMgPSBtcyhvcHRpb25zPy5leHBpcmVzIHx8ICczMG0nKSB8fCAzMCAqIDYwICogMTAwMFxuICAgICAgICBjb25zdCBleHBpcmVzU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZXhwaXJlc01zIC8gMTAwMCkpXG5cbiAgICAgICAgcmV0dXJuIGdldFNpZ25lZFVybCh0aGlzLmNsaWVudCwgbmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KSwgeyBleHBpcmVzSW46IGV4cGlyZXNTZWNvbmRzIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVwbG9hZFVybDogQmFzZURyaXZlWyd1cGxvYWRVcmwnXSA9IGFzeW5jIChmaWxlbmFtZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGNvbnN0IEtleSA9IHRoaXMuZ2V0S2V5KGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IGV4cGlyZXNNcyA9IG1zKG9wdGlvbnM/LmV4cGlyZXMgfHwgJzMwbScpIHx8IDMwICogNjAgKiAxMDAwXG4gICAgICAgIGNvbnN0IGV4cGlyZXNTZWNvbmRzID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChleHBpcmVzTXMgLyAxMDAwKSlcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleSxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZ2V0U2lnbmVkVXJsKHRoaXMuY2xpZW50LCBjb21tYW5kLCB7IGV4cGlyZXNJbjogZXhwaXJlc1NlY29uZHMgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgUzNEcml2ZSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RyaXZlUzNHYXRld2F5LnRzJ1xuaW1wb3J0IHR5cGUgeyBTM0RyaXZlQ29uZmlnIH0gZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcblxuaW50ZXJmYWNlIEluaXRpT3B0aW9ucyBleHRlbmRzIE9taXQ8UzNEcml2ZUNvbmZpZywgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJz4ge1xuICAgIHByZWZpeD86IHN0cmluZ1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnUzNTZXJ2aWNlIGV4dGVuZHMgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIHByZWZpeCA9ICcnXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGRyaXZlOiBTM0RyaXZlXG4gICAgcHVibGljIGJ1Y2tldDogc3RyaW5nXG4gICAgcHVibGljIHJlZ2lvbjogc3RyaW5nXG4gICAgcHVibGljIGVuZHBvaW50Pzogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbml0aU9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKVxuXG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IGZhbHNlXG4gICAgICAgIHRoaXMucHJlZml4ID0gb3B0aW9ucy5wcmVmaXggPz8gJydcbiAgICAgICAgdGhpcy5idWNrZXQgPSBvcHRpb25zLmJ1Y2tldFxuICAgICAgICB0aGlzLnJlZ2lvbiA9IG9wdGlvbnMucmVnaW9uIHx8ICcnXG4gICAgICAgIHRoaXMuZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50XG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIHRoaXMuZHJpdmUgPSBuZXcgUzNEcml2ZSh7XG4gICAgICAgICAgICBpZDogJ2NvbmZpZy1zMycsXG4gICAgICAgICAgICBuYW1lOiAnY29uZmlnLXMzJyxcbiAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIGJ1Y2tldDogb3B0aW9ucy5idWNrZXQsXG4gICAgICAgICAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXlJZDogb3B0aW9ucy5hY2Nlc3NLZXlJZCxcbiAgICAgICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IG9wdGlvbnMuc2VjcmV0QWNjZXNzS2V5LFxuICAgICAgICAgICAgICAgIHNlc3Npb25Ub2tlbjogb3B0aW9ucy5zZXNzaW9uVG9rZW4sXG4gICAgICAgICAgICAgICAgZW5kcG9pbnQ6IG9wdGlvbnMuZW5kcG9pbnQsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzZXJ2aWNlIGluaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZUtleShmdWxsS2V5OiBzdHJpbmcpOiB7IGZpbGVuYW1lOiBzdHJpbmc7IGtleTogc3RyaW5nIH0ge1xuICAgICAgICBjb25zdCBbZmlsZW5hbWUsIC4uLnJlc3RdID0gZnVsbEtleS5zcGxpdCgnLicpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAga2V5OiByZXN0LmpvaW4oJy4nKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKVxuXG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMucHJlZml4LnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJylcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5kcml2ZS5saXN0KHByZWZpeCB8fCB1bmRlZmluZWQpXG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWVudHJ5Lm5hbWUuZW5kc1dpdGgoJy5qc29uJykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGVudHJ5Lm5hbWVcblxuICAgICAgICAgICAgY29uc3QgZmlsZXBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LyR7ZmlsZW5hbWV9YCA6IGZpbGVuYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IFtlcnJvciwgZGF0YV0gPSBhd2FpdCB0cnlDYXRjaChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYnVmID0gYXdhaXQgdGhpcy5kcml2ZS5yZWFkKGZpbGVwYXRoKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IEJ1ZmZlci5mcm9tKGJ1ZikudG9TdHJpbmcoJ3V0Zi04JylcblxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZmFpbGVkIHRvIGxvYWQgY29uZmlnIGZpbGUgJHtmaWxlbmFtZX1gLCBlcnJvcilcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBrZXkgPSBmaWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sICcnKVxuXG4gICAgICAgICAgICBzdXBlci5zZXQoa2V5LCBkYXRhKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkZWQgY29uZmlnIGZpbGU6ICR7ZmlsZW5hbWV9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29uZmlnIGxvYWRlZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoZnVsbEtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBzb3VyY2UgPSAnczMnKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLnNldChmdWxsS2V5LCB2YWx1ZSwgc291cmNlKVxuXG4gICAgICAgIGlmIChzb3VyY2UgIT09ICdzMycpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG5cbiAgICAgICAgbGV0IHZhbHVlcyA9IHRoaXMuZ2V0KGZpbGVuYW1lKVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleSAmJiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIHNldCh2YWx1ZXMsIGtleSwgdmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhblByZWZpeCA9IHRoaXMucHJlZml4LnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJylcblxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGNsZWFuUHJlZml4ID8gYCR7Y2xlYW5QcmVmaXh9LyR7ZmlsZW5hbWV9Lmpzb25gIDogYCR7ZmlsZW5hbWV9Lmpzb25gXG5cbiAgICAgICAgY29uc3QgYm9keSA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlcywgbnVsbCwgNCkpXG5cbiAgICAgICAgdGhpcy5kcml2ZS53cml0ZShmaWxlUGF0aCwgYm9keSBhcyB1bmtub3duIGFzIFVpbnQ4QXJyYXkpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZmFpbGVkIHRvIHdyaXRlIGNvbmZpZyB0byBzMycsIGVycilcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZXQoZnVsbEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsZWFuUHJlZml4ID0gdGhpcy5wcmVmaXgucmVwbGFjZSgvXlxcL3xcXC8kL2csICcnKVxuXG4gICAgICAgIGlmICghZnVsbEtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGNsZWFuUHJlZml4ID8gYCR7Y2xlYW5QcmVmaXh9LyR7ZnVsbEtleX0uanNvbmAgOiBgJHtmdWxsS2V5fS5qc29uYFxuXG4gICAgICAgICAgICB0aGlzLmRyaXZlLmRlbGV0ZShmaWxlUGF0aClcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byBkZWxldGUgY29uZmlnIGZyb20gczMnLCBlcnIpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBmaWxlbmFtZSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5nZXQoZmlsZW5hbWUpXG5cbiAgICAgICAgc2V0KHZhbHVlcywga2V5LCB1bmRlZmluZWQpXG5cblxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGNsZWFuUHJlZml4ID8gYCR7Y2xlYW5QcmVmaXh9LyR7ZmlsZW5hbWV9Lmpzb25gIDogYCR7ZmlsZW5hbWV9Lmpzb25gXG5cbiAgICAgICAgdGhpcy5kcml2ZS53cml0ZShmaWxlUGF0aCwgQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkodmFsdWVzLCBudWxsLCA0KSkgYXMgdW5rbm93biBhcyBVaW50OEFycmF5KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byB3cml0ZSBjb25maWcgdG8gczMnLCBlcnIpXG4gICAgICAgIH0pXG5cbiAgICAgICAgc3VwZXIudW5zZXQoZnVsbEtleSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnRlNTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvQ29uZmlnRlNTZXJ2aWNlLnRzJ1xuaW1wb3J0IENvbmZpZ1MzU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0NvbmZpZ1MzU2VydmljZS50cydcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24sIHR5cGUgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnI3NoYXJlZC91dGlscy9mbGF0dGVuLnRzJ1xuaW1wb3J0IHR5cGUgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UudHMnXG5pbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ01hbmFnZXJPcHRpb25zIHtcbiAgICBlbnY6IEVudlNlcnZpY2VcbiAgICBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBzaWxlbnQ/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ01hbmFnZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgZW52OiBFbnZTZXJ2aWNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBzaWxlbnQ6IGJvb2xlYW5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW52ID0gb3B0aW9ucy5lbnZcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlclxuICAgICAgICB0aGlzLnNpbGVudCA9IG9wdGlvbnMuc2lsZW50ID8/IGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ29uZmlnTWFuYWdlck9wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBDb25maWdNYW5hZ2VyU2VydmljZShvcHRpb25zKVxuXG4gICAgICAgIHJldHVybiBzZXJ2aWNlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkUzNDb25maWcoKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgQ29uZmlnUzNTZXJ2aWNlKHtcbiAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX0JVQ0tFVCcpISxcbiAgICAgICAgICAgIHJlZ2lvbjogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX1JFR0lPTicpISxcbiAgICAgICAgICAgIGFjY2Vzc0tleUlkOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfQUNDRVNTX0tFWV9JRCcpISxcbiAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX1NFQ1JFVF9BQ0NFU1NfS0VZJykhLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19ERUJVRycpLFxuICAgICAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19FTkRQT0lOVCcpLFxuICAgICAgICAgICAgcHJlZml4OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfUFJFRklYJyksXG4gICAgICAgICAgICBzZXNzaW9uVG9rZW46IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19TRVNTSU9OX1RPS0VOJyksXG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNlcnZpY2UubG9hZCgpXG5cbiAgICAgICAgaWYgKCF0aGlzLnNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygndXNpbmcgUzMgY29uZmlndXJhdGlvbiBzZXJ2aWNlJywge1xuICAgICAgICAgICAgICAgIGJ1Y2tldDogc2VydmljZS5idWNrZXQsXG4gICAgICAgICAgICAgICAgcmVnaW9uOiBzZXJ2aWNlLnJlZ2lvbixcbiAgICAgICAgICAgICAgICBwcmVmaXg6IHNlcnZpY2UucHJlZml4XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gc2VydmljZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEZTQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IENvbmZpZ0ZTU2VydmljZSh7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19GU19QQVRIJyksXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0RFQlVHJyksXG4gICAgICAgICAgICBmb3JtYXQ6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19GU19GT1JNQVQnKSEsXG4gICAgICAgICAgICBmb3JtYXRPcHRpb25zOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRlNfRk9STUFUX09QVElPTlMnKSB8fCB7fSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgc2VydmljZS5sb2FkKClcblxuICAgICAgICBpZiAoIXRoaXMuc2lsZW50KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCd1c2luZyBmaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24gc2VydmljZScsIHsgcGF0aDogc2VydmljZS5kaXJlY3RvcnkgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZXJ2aWNlXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGcm9tRW52KHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdHRlbih0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUcnKSB8fCB7fSkpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlLnNldChrZXksIHZhbHVlLCAnZW52JylcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4odGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0FSR1VNRU5UUycpIHx8IHt9KSkpIHtcbiAgICAgICAgICAgIHNlcnZpY2Uuc2V0KGtleSwgdmFsdWUsICdhcmd1bWVudCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0Zyb21GaWxlKHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIGZpbGU6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGNvbmZpZ3VyYXRpb24gZmlsZSBub3QgZm91bmQ6ICR7ZmlsZX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0ZXh0ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpXG4gICAgICAgIGxldCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGxcblxuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnltbCcpIHx8IGZpbGUuZW5kc1dpdGgoJy55YW1sJykpIHtcbiAgICAgICAgICAgIGRhdGEgPSB5YW1sLmxvYWQodGV4dCkgYXMgUmVjb3JkPHN0cmluZywgYW55PlxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgdW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBmaWxlIGZvcm1hdDogJHtmaWxlfWApXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmbGF0dGVuKGRhdGEpKSkge1xuICAgICAgICAgICAgc2VydmljZS5zZXQoa2V5LCB2YWx1ZSwgZmlsZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQ29uZmlnRnJvbUZpbGVzKHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UsIGZpbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZENvbmZpZ0Zyb21GaWxlKHNlcnZpY2UsIGZpbGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpOiBQcm9taXNlPENvbmZpZ1NlcnZpY2U+IHtcbiAgICAgICAgbGV0IHNlcnZpY2U6IENvbmZpZ1NlcnZpY2UgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGlmICh0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRFJJVkVSJykgPT09ICdzMycpIHtcbiAgICAgICAgICAgIHNlcnZpY2UgPSBhd2FpdCB0aGlzLmxvYWRTM0NvbmZpZygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlcnZpY2UgfHwgdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0RSSVZFUicpID09PSAnZnMnKSB7XG4gICAgICAgICAgICBzZXJ2aWNlID0gYXdhaXQgdGhpcy5sb2FkRlNDb25maWcoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlOiBObyB2YWxpZCBkcml2ZXIgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZENvbmZpZ0Zyb21GaWxlcyhzZXJ2aWNlLCB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRklMRVMnKSlcblxuICAgICAgICB0aGlzLmxvYWRDb25maWdGcm9tRW52KHNlcnZpY2UpXG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG59XG5cbiIsImltcG9ydCB0eXBlIHsgUmVxdWVzdEluaXQgfSBmcm9tICd1bmRpY2knXG5pbXBvcnQgeyBmZXRjaCwgUHJveHlBZ2VudCB9IGZyb20gJ3VuZGljaSdcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIERvd25sb2FkZWRGZXRjaE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5pdCB7XG4gICAgcHJveHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG93bmxvYWRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYXN5bmMgZmV0Y2godXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBEb3dubG9hZGVkRmV0Y2hPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGZldGNoT3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICAgICAgICBpZiAob3B0aW9ucz8ucHJveHkpIHtcbiAgICAgICAgICAgIGZldGNoT3B0aW9ucy5kaXNwYXRjaGVyICA9IG5ldyBQcm94eUFnZW50KG9wdGlvbnMucHJveHkpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnRG93bmxvYWRpbmcgZnJvbSBVUkw6JywgdXJsLCAnd2l0aCBvcHRpb25zOicsIGZldGNoT3B0aW9ucylcblxuICAgICAgICByZXR1cm4gYXdhaXQgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RyZWFtKHVybDogc3RyaW5nLCBvcHRpb25zPzogRG93bmxvYWRlZEZldGNoT3B0aW9ucykge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2godXJsLCBvcHRpb25zKVxuICAgIFxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKCdGYWlsZWQgdG8gZG93bmxvYWQnLCA0MDApXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQgXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGlmICghcmVzcG9uc2UuYm9keSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGJvZHknLCA0MDApXG4gICAgICAgIH1cbiAgICBcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0cmVhbTogcmVzcG9uc2UuYm9keSBhcyB1bmtub3duIGFzIE5vZGVKUy5SZWFkYWJsZVN0cmVhbSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBjb25maWcgPSBjb250YWluZXIucHJveHk8Q29uZmlnU2VydmljZT4oQ29uZmlnU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXG4iLCJpbXBvcnQgeyBIb29rc1N0YXRpYyB9IGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCB0eXBlIENvbmZpZ01vZGVsID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBNb2RlbENvbmZpZz4+XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgICByZWFkb25seT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTW9kZWxDb25maWcoa2V5OiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBDb25maWdNb2RlbE1peGluRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfX2lzQ29uZmlnTW9kZWwgPSB0cnVlXG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdGhpcygpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBsaXN0PFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGNvbmZpZy5nZXQ8UmVjb3JkPHN0cmluZywgYW55Pj4oa2V5KSB8fCB7fVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBbXVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIGtdIG9mIE9iamVjdC5lbnRyaWVzKG1hcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmssIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQgXG4gICAgICAgICAgICAgICAgICAgIH0pKSlcblxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgSG9va3NTdGF0aWMuZW1pdCh0aGlzLCAnYWZ0ZXJMaXN0JywgaXRlbXMpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZDxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnkgYXMgQ29uZmlnTW9kZWxcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbCA9IGF3YWl0IGNvbnN0cnVjdG9yLmxpc3QoKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGFsbC5maW5kKGkgPT4gKGkgYXMgYW55KS5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSlcblxuICAgICAgICAgICAgICAgIGF3YWl0IEhvb2tzU3RhdGljLmVtaXQodGhpcywgJ2FmdGVyRmluZCcsIGl0ZW0pXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKGl0ZW0gfHwgbnVsbCkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9yRmFpbDxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueSBhcyBDb25maWdNb2RlbFxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IGNvbnN0cnVjdG9yLmZpbmQoaWQpXG5cbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXRlbSBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpdGVtOiBUICYgeyBpZDogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignUmVhZG9ubHkgY29uZmlnIG1vZGVsJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXRlbSByZXF1aXJlcyBhbiBpZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueSBhcyBDb25maWdNb2RlbFxuXG4gICAgICAgICAgICAgICAgY29uc3QgbWFwID0gY29uZmlnLmdldDxSZWNvcmQ8c3RyaW5nLCBhbnk+PihrZXkpIHx8IHt9XG5cbiAgICAgICAgICAgICAgICBpZiAobWFwW2l0ZW0uaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGl0ZW0gYWxyZWFkeSBleGlzdHMnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IEhvb2tzU3RhdGljLmVtaXQodGhpcywgJ2JlZm9yZUNyZWF0ZScsIGl0ZW0pXG5cbiAgICAgICAgICAgICAgICBtYXBbaXRlbS5pZF0gPSB7IC4uLml0ZW0gfSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtYXBbaXRlbS5pZF0uaWRcblxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbmZpZy5zZXQoa2V5LCBtYXApXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZmluZE9yRmFpbChpdGVtLmlkKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyB1cGRhdGU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZywgZGF0YTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSZWFkb25seSBjb25maWcgbW9kZWwnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnkgYXMgQ29uZmlnTW9kZWxcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGNvbmZpZy5nZXQ8UmVjb3JkPHN0cmluZywgYW55Pj4oa2V5KSB8fCB7fVxuXG4gICAgICAgICAgICAgICAgaWYgKCFtYXBbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGl0ZW0gbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBIb29rc1N0YXRpYy5lbWl0KHRoaXMsICdiZWZvcmVVcGRhdGUnLCBkYXRhKVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtYXBbaWRdLCBkYXRhKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnLnNldChrZXksIG1hcClcblxuICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5maW5kT3JGYWlsKGlkKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyB1cGRhdGVPckNyZWF0ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCBpZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueSBhcyBDb25maWdNb2RlbFxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBjb25zdHJ1Y3Rvci5maW5kKGlkKVxuXG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci51cGRhdGUoaWQsIGRhdGEgYXMgYW55KSBhcyBhbnlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuY3JlYXRlKHsgXG4gICAgICAgICAgICAgICAgICAgIC4uLihkYXRhIGFzIGFueSksXG4gICAgICAgICAgICAgICAgICAgIGlkIFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc3Ryb3k8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSZWFkb25seSBjb25maWcgbW9kZWwnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGNvbmZpZy5nZXQ8UmVjb3JkPHN0cmluZywgYW55Pj4oa2V5KSB8fCB7fVxuXG4gICAgICAgICAgICAgICAgaWYgKCFtYXBbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGl0ZW0gbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgbWFwW2lkXVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgY29uZmlnLnNldChrZXksIG1hcClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RlbENvbmZpZyBmcm9tICcjc2VydmVyL21peGlucy9Nb2RlbENvbmZpZ01peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlQ29uZmlnRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUNvbmZpZyBleHRlbmRzIGNvbXBvc2VXaXRoKFxuICAgIEJhc2UsXG4gICAgTW9kZWxDb25maWcoJ2RyaXZlLmRpc2tzJylcbikge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoKSBhcyBEcml2ZUNvbmZpZ1xuXG4gICAgICAgIGluc3RhbmNlLmlkID0gcm93LmlkXG4gICAgICAgIGluc3RhbmNlLm5hbWUgPSByb3cubmFtZSB8fCByb3cuaWRcbiAgICAgICAgaW5zdGFuY2UudHlwZSA9IHJvdy50eXBlXG4gICAgICAgIGluc3RhbmNlLmNvbmZpZyA9IHJvdy5jb25maWcgfHwge31cbiAgICAgICAgaW5zdGFuY2UuaXNfZGVmYXVsdCA9IGNvbmZpZy5nZXQoJ2RyaXZlLmRlZmF1bHQnKSA9PT0gcm93LmlkXG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlIGFzIGFueVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IHR5cGUgRW52U2NoZW1hID0gdi5JbmZlck91dHB1dDx0eXBlb2YgZW52U2NoZW1hPlxuXG5jb25zdCBib29sZWFuID0gdi5waXBlKFxuICAgIHYudW5pb24oW3YubGl0ZXJhbCgndHJ1ZScpLCB2LmxpdGVyYWwoJ2ZhbHNlJyksIHYubGl0ZXJhbCgnMScpLCB2LmxpdGVyYWwoJzAnKV0pLFxuICAgIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4gdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJzEnKSxcbiAgICB2LmJvb2xlYW4oKVxuKVxuXG5jb25zdCBrZXlWYWx1ZSA9IHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdmFsdWUuc3BsaXQoL1s7XFxuXS8pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLmZpbHRlcihsID0+IGwuaW5jbHVkZXMoJz0nKSlcbiAgICAgICAgLm1hcChsID0+IGwudHJpbSgpLnNwbGl0KCc9JykpXG5cbiAgICBjb25zdCBvYmogPSBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcykgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgbGV0IHBhcnNlZFZhbHVlOiBhbnkgPSB2YWx1ZVxuXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ2Jvb2w6JywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBzZXQocmVzdWx0LCBrZXksIHBhcnNlZFZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn0pKVxuXG5jb25zdCBzdHJpbmdBcnJheSA9IHYucGlwZShcbiAgICB2LnN0cmluZygpLFxuICAgIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4gdmFsdWVcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgKVxuKVxuXG5leHBvcnQgY29uc3QgZW52U2NoZW1hID0gdi5sb29zZU9iamVjdCh7XG4gICAgTk9ERV9FTlY6IHYub3B0aW9uYWwodi51bmlvbihbdi5saXRlcmFsKCdkZXZlbG9wbWVudCcpLCB2LmxpdGVyYWwoJ3Byb2R1Y3Rpb24nKSwgdi5saXRlcmFsKCd0ZXN0JyldKSwgJ2RldmVsb3BtZW50JyksXG5cbiAgICBaRU5JVEhfQkFTRV9QQVRIOiB2LnN0cmluZygpLFxuICAgIFpFTklUSF9TVE9SQUdFX1BBVEg6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG5cbiAgICBaRU5JVEhfQVBQX1VSTDogdi5vcHRpb25hbCh2LnN0cmluZygpLCAnaHR0cDovL2xvY2FsaG9zdDozMDAwJyksXG4gICAgWkVOSVRIX1BPUlQ6IHYub3B0aW9uYWwodi5waXBlKHYuc3RyaW5nKCksIHYudHJhbnNmb3JtKCh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUpKSksICczMDAwJyksXG4gICAgWkVOSVRIX0hPU1Q6IHYub3B0aW9uYWwodi5zdHJpbmcoKSwgJzAuMC4wLjAnKSxcblxuICAgIFpFTklUSF9MT0dfTEVWRUw6IHYub3B0aW9uYWwodi5waWNrbGlzdChbJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbycsICdkZWJ1ZyddKSwgJ2luZm8nKSxcbiAgICBaRU5JVEhfTElGRUNZQ0xFX0RFQlVHOiB2Lm9wdGlvbmFsKGJvb2xlYW4sICdmYWxzZScpLFxuICAgIFpFTklUSF9DTElFTlRfQ09ORklHOiB2Lm9wdGlvbmFsKGtleVZhbHVlLCAnJyksXG5cbiAgICBaRU5JVEhfQ09ORklHOiB2Lm9wdGlvbmFsKGtleVZhbHVlLCAnJyksXG4gICAgWkVOSVRIX0NPTkZJR19BUkdVTUVOVFM6IHYub3B0aW9uYWwoa2V5VmFsdWUsICcnKSxcbiAgICBaRU5JVEhfQ09ORklHX0ZJTEVTOiB2Lm9wdGlvbmFsKHN0cmluZ0FycmF5LCAnJyksXG5cbiAgICBaRU5JVEhfQ09ORklHX0RFQlVHOiB2Lm9wdGlvbmFsKGJvb2xlYW4sICdmYWxzZScpLFxuICAgIFpFTklUSF9DT05GSUdfRFJJVkVSOiB2Lm9wdGlvbmFsKHYucGlja2xpc3QoWydmcycsICdzMyddKSwgJ2ZzJyksXG4gICAgWkVOSVRIX0NPTkZJR19GU19QQVRIOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIFpFTklUSF9DT05GSUdfRlNfRk9STUFUOiB2Lm9wdGlvbmFsKHYucGlja2xpc3QoWydqc29uJywgJ3ltbCddKSwgJ2pzb24nKSxcbiAgICBaRU5JVEhfQ09ORklHX0ZTX0ZPUk1BVF9PUFRJT05TOiB2Lm9wdGlvbmFsKGtleVZhbHVlLCAnJyksXG5cbiAgICBaRU5JVEhfQ09ORklHX1MzX0JVQ0tFVDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1JFR0lPTjogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX0FDQ0VTU19LRVlfSUQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19TRUNSRVRfQUNDRVNTX0tFWTogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1NFU1NJT05fVE9LRU46IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19FTkRQT0lOVDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX1MzX1BSRUZJWDogdi5vcHRpb25hbCh2LnN0cmluZygpLCAnJyksXG5cbiAgICBaRU5JVEhfUExVR0lOU19ESVJTOiB2Lm9wdGlvbmFsKHN0cmluZ0FycmF5LCAnJyksXG59KVxuXG4iLCJpbXBvcnQgZG90ZW52IGZyb20gJ2RvdGVudidcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHsgZW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcbmltcG9ydCB0eXBlIHsgRW52U2NoZW1hIH0gZnJvbSAnI3NlcnZlci9zY2hlbWFzL2VudlNjaGVtYS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW52U2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRW52U2VydmljZSdcbiAgICBwcml2YXRlIGVudjogRW52U2NoZW1hIHwgbnVsbCA9IG51bGxcbiAgICBwcml2YXRlIGZpbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbnZTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGRvdEVudkNvbmZpZyhvcHRpb25zPzogZG90ZW52LkRvdGVudkNvbmZpZ09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGRvdGVudi5jb25maWcob3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RmlsZXMoZmlsZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWxlKGZpbGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZCgpIHtcbiAgICAgICAgRW52U2VydmljZS5kb3RFbnZDb25maWcoe1xuICAgICAgICAgICAgcGF0aDogdGhpcy5maWxlcyxcbiAgICAgICAgICAgIG92ZXJyaWRlOiB0cnVlLFxuICAgICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5lbnYgPSB2LnBhcnNlKGVudlNjaGVtYSwgcHJvY2Vzcy5lbnYpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHByb2R1Y3Rpb24oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnTk9ERV9FTlYnKSA9PT0gJ3Byb2R1Y3Rpb24nXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBkZXZlbG9wbWVudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdOT0RFX0VOVicpID09PSAnZGV2ZWxvcG1lbnQnXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZXN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ05PREVfRU5WJykgPT09ICd0ZXN0J1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXM8SyBleHRlbmRzIGtleW9mIEVudlNjaGVtYT4oa2V5OiBLKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5lbnYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdFbnZpcm9ubWVudCB2YXJpYWJsZXMgbm90IGxvYWRlZC4gQ2FsbCBsb2FkKCkgYmVmb3JlIGFjY2Vzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudiFba2V5XSAhPT0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgcHVibGljIGdldDxLIGV4dGVuZHMga2V5b2YgRW52U2NoZW1hPihrZXk6IEssIGRlZmF1bHRWYWx1ZT86IGFueSk6IEVudlNjaGVtYVtLXSB7XG4gICAgICAgIGlmICghdGhpcy5lbnYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdFbnZpcm9ubWVudCB2YXJpYWJsZXMgbm90IGxvYWRlZC4gQ2FsbCBsb2FkKCkgYmVmb3JlIGFjY2Vzc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVudiFba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpcy5lbnYhW2tleV0gOiBkZWZhdWx0VmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0PEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSywgdmFsdWU6IEVudlNjaGVtYVtLXSkge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVudiFba2V5XSA9IHZhbHVlXG4gICAgfVxufVxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXG5pbXBvcnQgbXMgZnJvbSAnbXMnXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCBFbnZTZXJ2aWNlIGZyb20gJy4vRW52U2VydmljZSc7XG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnO1xuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnO1xuXG5pbnRlcmZhY2UgVVJMT3B0aW9ucyB7XG4gICAgZGF0YT86IGFueTtcbiAgICBleHBpcmVzPzogbXMuU3RyaW5nVmFsdWU7XG4gICAgZXhwaXJlQXQ/OiBudW1iZXIgfCBEYXRlO1xufVxuXG5pbnRlcmZhY2UgRW5jcnlwdFNlcnZpY2VPcHRpb25zIHtcbiAgICBrZXk/OiBzdHJpbmc7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2U7XG4gICAgZW52PzogRW52U2VydmljZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW5jcnlwdFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VuY3J5cHRTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgZW52OiBFbnZTZXJ2aWNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuXG4gICAgcHJpdmF0ZSByZWFkb25seSBhbGdvcml0aG0gPSAnYWVzLTI1Ni1jYmMnXG4gICAgcHJpdmF0ZSBrZXk6IEJ1ZmZlciB8IG51bGwgPSBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFbmNyeXB0U2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBvcHRpb25zLmVudiB8fCBuZXcgRW52U2VydmljZSgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZVxuXG4gICAgICAgIGlmIChvcHRpb25zLmtleSkge1xuICAgICAgICAgICAgdGhpcy5rZXkgPSBjcnlwdG8uc2NyeXB0U3luYyhvcHRpb25zLmtleSwgJ3NhbHQnLCAzMilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IEVuY3J5cHRTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVuY3J5cHRTZXJ2aWNlKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIHNldEVudihlbnY6IEVudlNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnZcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0S2V5KGtleTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMua2V5ID0gY3J5cHRvLnNjcnlwdFN5bmMoa2V5LCAnc2FsdCcsIDMyKVxuICAgIH1cblxuICAgIHB1YmxpYyBlbmNyeXB0KHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMua2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRpb24ga2V5IG5vdCBzZXQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpXG4gICAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdih0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXksIGl2KVxuXG4gICAgICAgIGxldCBlbmNyeXB0ZWQgPSBjaXBoZXIudXBkYXRlKHRleHQsICd1dGY4JywgJ2hleCcpXG4gICAgICAgIGVuY3J5cHRlZCArPSBjaXBoZXIuZmluYWwoJ2hleCcpXG5cbiAgICAgICAgcmV0dXJuIGAke2l2LnRvU3RyaW5nKCdoZXgnKX06JHtlbmNyeXB0ZWR9YFxuICAgIH1cblxuXG5cbiAgICBwdWJsaWMgZGVjcnlwdChvcHRpb25zOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMua2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY3J5cHRpb24ga2V5IG5vdCBzZXQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2l2LCBlbmNyeXB0ZWRdID0gb3B0aW9ucy5zcGxpdCgnOicpXG5cbiAgICAgICAgY29uc3QgaXZCdWZmZXIgPSBCdWZmZXIuZnJvbShpdiwgJ2hleCcpXG5cbiAgICAgICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdih0aGlzLmFsZ29yaXRobSwgdGhpcy5rZXksIGl2QnVmZmVyKVxuXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkLCAnaGV4JywgJ3V0ZjgnKVxuICAgICAgICBkZWNyeXB0ZWQgKz0gZGVjaXBoZXIuZmluYWwoJ3V0ZjgnKVxuXG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5jcnlwdE9iamVjdChvYmo6IGFueSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShvYmopXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW5jcnlwdChqc29uU3RyaW5nKVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWNyeXB0T2JqZWN0PFQ+KGVuY3J5cHRlZFN0cmluZzogc3RyaW5nKTogVCB7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSB0aGlzLmRlY3J5cHQoZW5jcnlwdGVkU3RyaW5nKVxuXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHJpbmcpIGFzIFRcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IFVSTE9wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZXhwaXJlQXQgPSBvcHRpb25zPy5leHBpcmVBdFxuXG4gICAgICAgIGlmIChvcHRpb25zPy5leHBpcmVzKSB7XG4gICAgICAgICAgICBjb25zdCBleHBpcmVzID0gbXMob3B0aW9ucy5leHBpcmVzKSBhcyBudW1iZXJcblxuICAgICAgICAgICAgZXhwaXJlQXQgPSBEYXRlLm5vdygpICsgZXhwaXJlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFleHBpcmVBdCkge1xuICAgICAgICAgICAgZXhwaXJlQXQgPSBEYXRlLm5vdygpICsgbXMoJzE1IG1pbnV0ZXMnKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cGlyZUF0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgZXhwaXJlQXQgPSBleHBpcmVBdC5nZXRUaW1lKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICBkYXRhOiBvcHRpb25zPy5kYXRhIHx8IHt9LFxuICAgICAgICAgICAgZXhwaXJlQXQsXG4gICAgICAgICAgICBleHBpcmVBdFJlYWRhYmxlOiBmb3JtYXQobmV3IERhdGUoZXhwaXJlQXQpLCAneXl5eS1NTS1kZCBISDptbTpzcycpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmVuY3J5cHQoSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG5cbiAgICAgICAgY29uc3QgYXBwVXJsID0gdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQVBQX1VSTCcpXG5cbiAgICAgICAgaWYgKCFhcHBVcmwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdBUFBfVVJMIG5vdCBzZXQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzJylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgYXBwVXJsKVxuXG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdrZXknLCBlbmNvZGVVUklDb21wb25lbnQoa2V5KSlcblxuICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICBwdWJsaWMgdmVyaWZ5VXJsKGVuY3J5cHRlZEtleTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IHRoaXMuZGVjcnlwdChkZWNvZGVVUklDb21wb25lbnQoZW5jcnlwdGVkS2V5KSlcblxuICAgICAgICBjb25zdCBwYXlsb2FkID0gSlNPTi5wYXJzZShkZWNyeXB0ZWREYXRhKVxuXG4gICAgICAgIGlmIChwYXlsb2FkLmV4cGlyZUF0ICYmIERhdGUubm93KCkgPiBwYXlsb2FkLmV4cGlyZUF0KSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKCdVUkwgaGFzIGV4cGlyZWQnLCA0MDMpXG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHtcbiAgICAgICAgICAgICAgICBleHBpcmVBdDogcGF5bG9hZC5leHBpcmVBdCxcbiAgICAgICAgICAgICAgICBleHBpcmVBdFJlYWRhYmxlOiBwYXlsb2FkLmV4cGlyZUF0UmVhZGFibGVcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF5bG9hZC5kYXRhXG4gICAgfVxufVxuIiwiaW1wb3J0IEVuY3J5cHRTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvRW5jcnlwdFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyLnRzJ1xuXG5jb25zdCBlbmNyeXB0ID0gY29udGFpbmVyLnByb3h5PEVuY3J5cHRTZXJ2aWNlPihFbmNyeXB0U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZW5jcnlwdFxuXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCwgeyBqb2luLCByZWxhdGl2ZSB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lJ1xuaW1wb3J0IERyaXZlRW50aXR5IGZyb20gJyNzaGFyZWQvZW50aXRpZXMvRHJpdmVFbnRyeUVudGl0eS50cydcbmltcG9ydCBCYXNlRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUJhc2VHYXRld2F5LnRzJ1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcjc2hhcmVkL2ZhY2FkZXMvdmFsaWRhdG9yLnRzJ1xuaW1wb3J0IGVuY3J5cHQgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2VuY3J5cHQudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcbmltcG9ydCB7IGJhc2VQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcblxuZXhwb3J0IGludGVyZmFjZSBEcml2ZUZTQ29uZmlnIHtcbiAgICBkaXJlY3Rvcnk6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZUZTIGV4dGVuZHMgQmFzZURyaXZlIHtcbiAgICBwcml2YXRlIHNjaGVtYSA9IHZhbGlkYXRvci5jcmVhdGUoKHYpID0+IHYub2JqZWN0KHtcbiAgICAgICAgZGlyZWN0b3J5OiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoMSkpLFxuICAgIH0pKVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGljazxCYXNlRHJpdmUsICdpZCcgfCAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbmZpZyc+KSB7XG4gICAgICAgIHN1cGVyKGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKHRoaXMuY29uZmlnLCB0aGlzLnNjaGVtYSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrVmFsaWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJHQoJ0ludmFsaWQgZHJpdmUgY29uZmlndXJhdGlvbicpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMucm9vdFBhdGgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigkdCgnRHJpdmUgcm9vdCBwYXRoIGRvZXMgbm90IGV4aXN0JykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBiYXNlUGF0aCh0aGlzLmNvbmZpZy5kaXJlY3RvcnkgYXMgc3RyaW5nKVxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHM6IEJhc2VEcml2ZVsnZXhpc3RzJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmcy5wcm9taXNlcy5hY2Nlc3Moam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0OiBCYXNlRHJpdmVbJ2xpc3QnXSA9IGFzeW5jIChmb2xkZXIpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gZm9sZGVyID8gam9pbih0aGlzLnJvb3RQYXRoLCBmb2xkZXIpIDogdGhpcy5yb290UGF0aFxuXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZXhpc3RzKHJlbGF0aXZlKHRoaXMucm9vdFBhdGgsIGZpbGVwYXRoKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmaWxlcGF0aClcblxuICAgICAgICBjb25zdCBlbnRyaWVzOiBEcml2ZUVudGl0eVtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZmlsZXBhdGgsIGZpbGVuYW1lKVxuXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpXG5cbiAgICAgICAgICAgIGNvbnN0IG1ldGFzOiBhbnkgPSB7fVxuXG4gICAgICAgICAgICBpZiAoc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICBtZXRhcy5zaXplID0gc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICAgIG1ldGFzLm1pbWV0eXBlID0gbWltZS5nZXRUeXBlKGZpbGVuYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBEcml2ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgcGF0aDogJy8nICsgcmVsYXRpdmUodGhpcy5yb290UGF0aCwgZmlsZVBhdGgpLFxuICAgICAgICAgICAgICAgIHR5cGU6IHN0YXRzLmlzRGlyZWN0b3J5KCkgPyAnZGlyZWN0b3J5JyA6ICdmaWxlJyxcbiAgICAgICAgICAgICAgICBtZXRhc1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZDogQmFzZURyaXZlWydmaW5kJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpID8gZmlsZW5hbWUgOiAnLycgKyBmaWxlbmFtZVxuXG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmxpc3QocGF0aC5kaXJuYW1lKGZpbGVwYXRoKSlcblxuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZChlID0+IGUucGF0aCA9PT0gZmlsZXBhdGgpXG5cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIFwiJHtmaWxlcGF0aH1cIiBub3QgZm91bmRgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1rZGlyKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuZXhpc3RzKHBhdGguZGlybmFtZShmaWxlbmFtZSkpKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBqb2luKHRoaXMucm9vdFBhdGgsIGZpbGVuYW1lKVxuXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGZpbGVwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkOiBCYXNlRHJpdmVbJ3JlYWQnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHRoaXMucm9vdFBhdGgsIGZpbGVuYW1lKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IGZzLmNyZWF0ZVJlYWRTdHJlYW0oZmlsZVBhdGgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0cmVhbSlcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGU6IEJhc2VEcml2ZVsnd3JpdGUnXSA9IGFzeW5jIChmaWxlbmFtZSwgZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmV4aXN0cyhwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ta2RpcihwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHRoaXMucm9vdFBhdGgsIGZpbGVuYW1lKVxuXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlUGF0aCwgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5leGlzdHMocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSlcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHRoaXMucm9vdFBhdGgsIGZpbGVuYW1lKVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3cml0ZVN0cmVhbSA9IGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGVQYXRoKVxuXG4gICAgICAgICAgICBzdHJlYW0ucGlwZSh3cml0ZVN0cmVhbSlcblxuICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2ZpbmlzaCcsIHJlc29sdmUpXG4gICAgICAgICAgICB3cml0ZVN0cmVhbS5vbignZXJyb3InLCByZWplY3QpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZTogQmFzZURyaXZlWydkZWxldGUnXSA9IGFzeW5jIChmaWxlbmFtZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKHRoaXMucm9vdFBhdGgsIGZpbGVuYW1lKVxuXG4gICAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gYXdhaXQgZnMucHJvbWlzZXMuc3RhdChmaWxlUGF0aClcbiAgICAgICAgICAgIC50aGVuKHN0YXQgPT4gc3RhdC5pc0RpcmVjdG9yeSgpKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuXG4gICAgICAgIGlmIChpc0RpcmVjdG9yeSkge1xuICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMucm1kaXIoZmlsZVBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnVubGluayhmaWxlUGF0aClcbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsOiBCYXNlRHJpdmVbJ3VybCddID0gYXN5bmMgKGZpbGVuYW1lLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lIDogYC8ke2ZpbGVuYW1lfWBcblxuICAgICAgICByZXR1cm4gZW5jcnlwdC51cmwoYC9hcGkvZHJpdmVzLyR7dGhpcy5pZH0vc3RyZWFtJHtmaWxlcGF0aH1gLCB7XG4gICAgICAgICAgICBleHBpcmVzOiBvcHRpb25zPy5leHBpcmVzIHx8ICczMG0nXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVwbG9hZFVybDogQmFzZURyaXZlWyd1cGxvYWRVcmwnXSA9IGFzeW5jIChmaWxlbmFtZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBmaWxlbmFtZS5zdGFydHNXaXRoKCcvJykgPyBmaWxlbmFtZSA6IGAvJHtmaWxlbmFtZX1gXG5cbiAgICAgICAgcmV0dXJuIGVuY3J5cHQudXJsKGAvYXBpL2RyaXZlcy8ke3RoaXMuaWR9L3VwbG9hZCR7ZmlsZXBhdGh9YCwge1xuICAgICAgICAgICAgZXhwaXJlczogb3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBtaW1lX3R5cGVzOiBvcHRpb25zPy5taW1lX3R5cGVzLFxuICAgICAgICAgICAgICAgIG1heF9zaXplOiBvcHRpb25zPy5tYXhfc2l6ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgRHJpdmVFbnRyeSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcbmltcG9ydCB0eXBlIHsgRHJpdmVVcmxPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRHJpdmVDb250cmFjdC50cydcbmltcG9ydCB7IHN0b3JhZ2VQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcbmltcG9ydCBCYXNlRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUJhc2VHYXRld2F5LnRzJ1xuaW1wb3J0IERyaXZlUzMgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cydcbmltcG9ydCBEcml2ZUNvbmZpZyBmcm9tICcjc2VydmVyL2VudGl0aWVzL0RyaXZlQ29uZmlnRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5pbXBvcnQgRHJpdmVGUyBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RyaXZlRlNHYXRld2F5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5pbnRlcmZhY2UgVmFsaWRhdGVVcGxvYWRPcHRpb25zIHtcbiAgICBtaW1lX3R5cGVzOiBzdHJpbmdcbiAgICBtYXhTaXplPzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyaXZlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnRHJpdmVTZXJ2aWNlJ1xuXG5cbiAgICBwdWJsaWMgZ2F0ZXdheXM6IE1hcDxzdHJpbmcsIHR5cGVvZiBCYXNlRHJpdmU+XG4gICAgcHVibGljIGRyaXZlczogTWFwPHN0cmluZywgQmFzZURyaXZlPiA9IG5ldyBNYXAoKVxuICAgIHB1YmxpYyBzZWxlY3RlZD86IHN0cmluZ1xuICAgIHB1YmxpYyBkZWZhdWx0RHJpdmU/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIHB1YmxpYyBnZXQgY3VycmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm4gdW5kZWZpbmVkIFxuICAgICAgICBcbiAgICAgICAgY29uc3QgZHJpdmUgPSB0aGlzLmRyaXZlcy5nZXQodGhpcy5zZWxlY3RlZClcbiAgICAgICAgXG4gICAgICAgIGlmICghZHJpdmUpIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgICByZXR1cm4gZHJpdmVcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPERyaXZlU2VydmljZT4gPSB7fSkgeyAgICAgICAgXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBkYXRhLnNlbGVjdGVkIHx8IHRoaXMuc2VsZWN0ZWRcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgfHwgdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmRyaXZlcyA9IGRhdGEuZHJpdmVzIHx8IHRoaXMuZHJpdmVzXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbG9nZ2VyLmNoaWxkKHsgbGFiZWw6ICdkcml2ZScgfSlcbiAgICAgICAgdGhpcy5nYXRld2F5cyA9IG5ldyBNYXA8c3RyaW5nLCB0eXBlb2YgQmFzZURyaXZlPigpXG5cbiAgICAgICAgdGhpcy5nYXRld2F5cy5zZXQoJ3MzJywgRHJpdmVTMylcbiAgICAgICAgdGhpcy5nYXRld2F5cy5zZXQoJ2ZzJywgRHJpdmVGUylcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdERyaXZlcygpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5kcml2ZXMudmFsdWVzKCkpLm1hcChkcml2ZSA9PiAoe1xuICAgICAgICAgICAgLi4uZHJpdmUsXG4gICAgICAgICAgICBkZWZhdWx0OiBkcml2ZS5pZCA9PT0gdGhpcy5kZWZhdWx0RHJpdmVcbiAgICAgICAgfSkpXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBnZXQobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIXRoaXMuZHJpdmVzLmhhcyhuYW1lIHx8ICcnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0RyaXZlIG5vdCBmb3VuZCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkcml2ZSA9IHRoaXMuZHJpdmVzLmdldChuYW1lKVxuXG4gICAgICAgIGlmICghZHJpdmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdEcml2ZSBub3QgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRyaXZlXG4gICAgfVxuXG4gICAgcHVibGljIHVzZShuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5kcml2ZXMuaGFzKG5hbWUgfHwgJycpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRHJpdmUgbm90IGZvdW5kJylcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBEcml2ZVNlcnZpY2UoeyBcbiAgICAgICAgICAgIHNlbGVjdGVkOiBuYW1lLFxuICAgICAgICAgICAgZHJpdmVzOiB0aGlzLmRyaXZlcyxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnIFxuICAgICAgICB9KVxuICAgIH1cbiAgICBcblxuICAgIHB1YmxpYyBsaXN0KGZvbGRlcj86IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeVtdPiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQubGlzdChmb2xkZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8RHJpdmVFbnRyeT4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmZpbmQoZmlsZW5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGV4aXN0cyhmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuZXhpc3RzKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5yZWFkKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5yZWFkU3RyZWFtKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkQXNUZXh0KGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZWFkKGZpbGVuYW1lKVxuXG4gICAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZmlsZW5hbWU6IHN0cmluZywgcGF5bG9hZDogVWludDhBcnJheSB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+ICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICBsZXQgZGF0YTogYW55ID0gcGF5bG9hZFxuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJiAhKHBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIG51bGwsIDQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBkYXRhID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGRhdGEpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LndyaXRlKGZpbGVuYW1lLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVN0cmVhbShmaWxlbmFtZTogc3RyaW5nLCBzdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LndyaXRlU3RyZWFtKGZpbGVuYW1lLCBzdHJlYW0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBVUkwgZm9yIGEgZmlsZSBpbiB0aGUgZHJpdmUuXG4gICAgICogQHBhcmFtIHBheWxvYWQgIEZpbGUgaW5zdGFuY2UsIEZpbGUgSUQsIERyaXZlRW50cnkgaW5zdGFuY2Ugb3IgZmlsZW5hbWUgc3RyaW5nXG4gICAgICogQHBhcmFtIG9wdGlvbnMgXG4gICAgICogQHJldHVybnMgc3RyaW5nXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zOiBEcml2ZVVybE9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7ICAgICAgICBcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC51cmwoZmlsZW5hbWUsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZFVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zOiBEcml2ZVVybE9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7ICAgICAgICBcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC51cGxvYWRVcmwoZmlsZW5hbWUsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBsb2FkIGEgZmlsZSBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHRvIHRoZSBkcml2ZS5cbiAgICAgKiBAcGFyYW0gc291cmNlIGZpbGVuYW1lIGluIGxvY2FsIGZpbGVzeXN0ZW1cbiAgICAgKiBAcGFyYW0gZGVzdGluYXRpb24gXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHVwbG9hZChzb3VyY2U6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShzb3VyY2UpXG5cbiAgICAgICAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheShidWZmZXIpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMud3JpdGUoZGVzdGluYXRpb24sIHVpbnQ4KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERvd25sb2FkIGEgZmlsZSBmcm9tIHRoZSBkcml2ZSB0byB0aGUgbG9jYWwgZmlsZXN5c3RlbS5cbiAgICAgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgaW4gdGhlIGRyaXZlXG4gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZChmaWxlbmFtZTogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlYWQoZmlsZW5hbWUpXG4gICAgICAgIFxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZGVzdGluYXRpb24sIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQuZGVsZXRlKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCl7XG4gICAgICAgIHRoaXMuZHJpdmVzLmNsZWFyKClcblxuICAgICAgICBjb25zdCBjb25maWdzID0gYXdhaXQgRHJpdmVDb25maWcubGlzdCgpXG5cbiAgICAgICAgZm9yIChjb25zdCBjIG9mIGNvbmZpZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGdhdGV3YXlDbGFzcyA9IHRoaXMuZ2F0ZXdheXMuZ2V0KGMudHlwZSlcblxuICAgICAgICAgICAgaWYgKCFnYXRld2F5Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBEcml2ZSBnYXRld2F5IGZvciB0eXBlIFwiJHtjLnR5cGV9XCIgbm90IGZvdW5kYClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBnYXRld2F5ID0gbmV3IGdhdGV3YXlDbGFzcyhjKVxuXG4gICAgICAgICAgICB0aGlzLmRyaXZlcy5zZXQoYy5pZCwgZ2F0ZXdheSlcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgZHJpdmUgbG9hZGVkICR7Yy5pZH0gKCR7Yy50eXBlfSlgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGNvbmZpZy5nZXQoJ2RyaXZlLmRlZmF1bHQnKVxuICAgICAgICB0aGlzLmRlZmF1bHREcml2ZSA9IGNvbmZpZy5nZXQoJ2RyaXZlLmRlZmF1bHQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjcmVhdGVEZWZhdWx0RHJpdmVzKCl7XG5cbiAgICAgICAgYXdhaXQgRHJpdmVDb25maWcudXBkYXRlT3JDcmVhdGUoJ3VwbG9hZHMnLCB7XG4gICAgICAgICAgICBuYW1lOiAnVXBsb2FkcycsXG4gICAgICAgICAgICB0eXBlOiAnZnMnLFxuICAgICAgICAgICAgY29uZmlnOiB7IGRpcmVjdG9yeTogc3RvcmFnZVBhdGgoJ3VwbG9hZHMnKSB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5zZXQoJ2RyaXZlLmRlZmF1bHQnLCAndXBsb2FkcycpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmxvYWQoKVxuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZVVwbG9hZChvcHRpb25zOiBWYWxpZGF0ZVVwbG9hZE9wdGlvbnMsIGZpbGU6IHsgbWltZXR5cGU6IHN0cmluZywgc2l6ZTogbnVtYmVyIH0sKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWRUeXBlcyA9IG9wdGlvbnMubWltZV90eXBlcy5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKVxuXG4gICAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IGFsbG93ZWRUeXBlcy5zb21lKGFsbG93ZWRUeXBlID0+IHtcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFR5cGUuZW5kc1dpdGgoJy8qJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGUgPT09IGZpbGUubWltZXR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYmFzZVR5cGUgPSBhbGxvd2VkVHlwZS5zbGljZSgwLCAtMilcblxuICAgICAgICAgICAgcmV0dXJuIGZpbGUubWltZXR5cGUuc3RhcnRzV2l0aChiYXNlVHlwZSArICcvJylcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ01JTUUgdHlwZSBub3QgYWxsb3dlZCcsIDQwMylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLm1heFNpemUgJiYgZmlsZS5zaXplID4gb3B0aW9ucy5tYXhTaXplKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRmlsZSBzaXplIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCcsIDQwMylcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBCYXNlRW1taXR0ZXJTZXJ2aWNlIGZyb20gXCIuLi8uLi9zaGFyZWQvc2VydmljZXMvRW1taXR0ZXJTZXJ2aWNlXCI7XG5pbXBvcnQgdHlwZSB7IEV2ZW50Q29udHJhY3QgfSBmcm9tICcuLi9jb250cmFjdHMvRXZlbnRDb250cmFjdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZSBleHRlbmRzIEJhc2VFbW1pdHRlclNlcnZpY2U8RXZlbnRDb250cmFjdD4ge31cbiIsImltcG9ydCB0eXBlIHsgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjZXB0aW9uU2VydmljZU9wdGlvbnMge1xuICAgIGlnbm9yZUNvZGVFcnJvcnM/OiBudW1iZXJbXVxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBlbnY/OiBFbnZTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV4Y2VwdGlvblNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0V4Y2VwdGlvblNlcnZpY2UnXG4gICAgcHVibGljIGlnbm9yZUNvZGVFcnJvcnM6IG51bWJlcltdID0gWzQwMCwgNDAxLCA0MDMsIDQwNCwgNDIyXVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZW52OiBFbnZTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFeGNlcHRpb25TZXJ2aWNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmVudiA9IG9wdGlvbnMuZW52IHx8IG5ldyBFbnZTZXJ2aWNlKClcblxuICAgICAgICBpZiAob3B0aW9ucy5pZ25vcmVDb2RlRXJyb3JzKSB7XG4gICAgICAgICAgICB0aGlzLmlnbm9yZUNvZGVFcnJvcnMgPSBvcHRpb25zLmlnbm9yZUNvZGVFcnJvcnNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGUoZXJyb3I6IEVycm9yLCByZXNwb25zZTogUmVzcG9uc2UpIHtcblxuICAgICAgICBjb25zdCBlcnJvck5hbWUgPSBlcnJvci5uYW1lIHx8ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQnXG4gICAgICAgIGNvbnN0IGVycm9yU3RhdHVzID0gKGVycm9yIGFzIGFueSkuc3RhdHVzIHx8IDUwMFxuXG4gICAgICAgIGlmICghdGhpcy5pZ25vcmVDb2RlRXJyb3JzLmluY2x1ZGVzKGVycm9yU3RhdHVzKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzKGVycm9yU3RhdHVzKS5qc29uKHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvck5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgICAgICBzdGF0dXM6IGVycm9yU3RhdHVzLFxuICAgICAgICB9KVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IGJjcnlwdCBmcm9tICdiY3J5cHQnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhc2hlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0hhc2hlclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgaGFzaCh2YWx1ZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGJjcnlwdC5oYXNoKHZhbHVlLCAxMilcbiAgICB9XG5cbiAgICBhc3luYyBjb21wYXJlKGE6IHN0cmluZywgYjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBiY3J5cHQuY29tcGFyZShhLCBiKVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHFzIGZyb20gJ3FzJ1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyLCAgTWlkZGxld2FyZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuXG50eXBlIFJvdXRlTWV0aG9kID0gJ2dldCcgXG4gICAgfCAnR0VUJyBcbiAgICB8ICdwb3N0JyBcbiAgICB8ICdQT1NUJyBcbiAgICB8ICdwdXQnIFxuICAgIHwgJ1BVVCcgXG4gICAgfCAncGF0Y2gnIFxuICAgIHwgJ1BBVENIJyBcbiAgICB8ICdkZWxldGUnIFxuICAgIHwgJ0RFTEVURSdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGUge1xuICAgIHB1YmxpYyBwYXRoOiBzdHJpbmcgPSAnJ1xuICAgIHB1YmxpYyBtZXRob2Q6IFJvdXRlTWV0aG9kID0gJ2dldCdcbiAgICBwdWJsaWMgaGFuZGxlcjogSGFuZGxlcjxhbnk+IHwgbnVsbCA9IG51bGxcbiAgICBwdWJsaWMgbWlkZGxld2FyZXM6IE1pZGRsZXdhcmVbXSA9IFtdXG4gICAgcHVibGljIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFJvdXRlPiA9IHt9KSB7XG4gICAgICAgIHRoaXMucGF0aCA9IGRhdGEucGF0aCB8fCAnJ1xuICAgICAgICB0aGlzLm1ldGhvZCA9IGRhdGEubWV0aG9kIHx8ICdnZXQnXG4gICAgICAgIHRoaXMuaGFuZGxlciA9IGRhdGEuaGFuZGxlciB8fCBudWxsXG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMgPSBkYXRhLm1pZGRsZXdhcmVzIHx8IFtdXG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhIHx8IHt9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJhbXMocm91dGVQYXRoOiBzdHJpbmcsIHJlcXVlc3RQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnRzID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50cyA9IHJlcXVlc3RQYXRoLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3V0ZVNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSByb3V0ZVNlZ21lbnRzW2ldXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudCA9IHJlcXVlc3RTZWdtZW50c1tpXVxuXG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50LnN0YXJ0c1dpdGgoJzonKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZSA9IHJvdXRlU2VnbWVudC5zbGljZSgxKSAvLyBSZW1vdmUgdGhlICc6JyBwcmVmaXhcbiAgICAgICAgICAgICAgICBwYXJhbXNbcGFyYW1OYW1lXSA9IHJlcXVlc3RTZWdtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChyb3V0ZVNlZ21lbnQgPT09ICcqJykge1xuICAgICAgICAgICAgICAgIC8vIENhcHR1cmUgYWxsIHJlbWFpbmluZyBzZWdtZW50cyBhcyBhIHNpbmdsZSBwYXRoXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU2VnbWVudHMgPSByZXF1ZXN0U2VnbWVudHMuc2xpY2UoaSlcbiAgICAgICAgICAgICAgICBwYXJhbXNbJyonXSA9IHJlbWFpbmluZ1NlZ21lbnRzLmpvaW4oJy8nKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFyYW1zXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBxdWVyeShyZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSByZXF1ZXN0UGF0aC5zcGxpdCgnPycpWzFdXG5cbiAgICAgICAgaWYgKCFxdWVyeVN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXMucGFyc2UocXVlcnlTdHJpbmcpXG4gICAgfVxuXG4gICAgcHVibGljIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2QsXG4gICAgICAgICAgICBtaWRkbGV3YXJlczogdGhpcy5taWRkbGV3YXJlcy5tYXAobXcgPT4gbXcuY29uc3RydWN0b3IubmFtZSksXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgeyBIYW5kbGVyLCBNaWRkbGV3YXJlLCBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEhvb2tzIGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcbmltcG9ydCB7IG1hdGNoUGF0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvbWF0Y2hQYXRocy50cydcblxudHlwZSBSb3V0ZUNvbnRleHQgPSAnZ2xvYmFsJyB8ICdncm91cCcgfCAncm91dGUnXG5cbmludGVyZmFjZSBNaWRkbGV3YXJlUmVnaXN0ZXIge1xuICAgIG1pZGRsZXdhcmU6IE1pZGRsZXdhcmVcbiAgICBjb250ZXh0OiBSb3V0ZUNvbnRleHRcbn1cblxuaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVyRXZlbnRzIHtcbiAgICAncm91dGVyOnJlZ2lzdGVyZWQnOiB7XG4gICAgICAgIHJvdXRlcjogUm91dGVyU2VydmljZVxuICAgIH1cbiAgICAncm91dGVyOmxvYWRlZCc6IHtcbiAgICAgICAgcm91dGVyOiBSb3V0ZXJTZXJ2aWNlXG4gICAgfVxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlclNlcnZpY2U8QyA9IHt9PiBleHRlbmRzIGNvbXBvc2UoSG9va3MpIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdSb3V0ZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIHJvdXRlczogUm91dGVbXSA9IFtdXG5cbiAgICBwdWJsaWMgbWlkZGxld2FyZXM6IE1pZGRsZXdhcmVSZWdpc3RlcltdID0gW11cbiAgICBwdWJsaWMgcHJlZml4ZXM6IHN0cmluZ1tdID0gW11cblxuICAgIHB1YmxpYyBncm91cHM6IFJvdXRlclNlcnZpY2U8YW55PltdID0gW11cbiAgICBwdWJsaWMgZ3JvdXBQcmVmaXhlczogc3RyaW5nW10gPSBbXVxuXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHB1YmxpYyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQYXJ0aWFsPFJvdXRlclNlcnZpY2U8Qz4+ID0ge30pIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLnJvdXRlcyA9IGRhdGEucm91dGVzIHx8IFtdXG4gICAgICAgIHRoaXMubWlkZGxld2FyZXMgPSBkYXRhLm1pZGRsZXdhcmVzIHx8IFtdXG4gICAgICAgIHRoaXMucHJlZml4ZXMgPSBkYXRhLnByZWZpeGVzIHx8IFtdXG4gICAgICAgIHRoaXMuZ3JvdXBzID0gZGF0YS5ncm91cHMgfHwgW11cbiAgICAgICAgdGhpcy5ncm91cFByZWZpeGVzID0gZGF0YS5ncm91cFByZWZpeGVzIHx8IFtdXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBkYXRhLm1ldGFkYXRhIHx8IHt9XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gZGF0YS5saXN0ZW5lcnMgfHwgW11cbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHVzZTxUIGV4dGVuZHMgTWlkZGxld2FyZT4obWlkZGxld2FyZTogVCwgY29udGV4dDogUm91dGVDb250ZXh0ID0gJ3JvdXRlJykge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzLnB1c2goe1xuICAgICAgICAgICAgbWlkZGxld2FyZSxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgUm91dGVyU2VydmljZTxDICYgTWlkZGxld2FyZUhhbmRsZVJlc3VsdDxbdHlwZW9mIG1pZGRsZXdhcmVdPj5cbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlZml4KHByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJlZml4ZXMucHVzaChwcmVmaXgpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFrZVBhdGgoYXJnczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGpvaW4oWy4uLnRoaXMuZ3JvdXBQcmVmaXhlcywgLi4udGhpcy5wcmVmaXhlcywgYXJnc10sICcvJylcblxuICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHNsYXNoZXNcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1xcLysvZywgJy8nKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkKHBheWxvYWQ6IFBpY2s8Um91dGUsICdwYXRoJyB8ICdtZXRob2QnIHwgJ2hhbmRsZXInPikge1xuICAgICAgICBjb25zdCByb3V0ZSA9IG5ldyBSb3V0ZSh7XG4gICAgICAgICAgICBtZXRob2Q6IHBheWxvYWQubWV0aG9kLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5tYWtlUGF0aChwYXlsb2FkLnBhdGgpLFxuICAgICAgICAgICAgaGFuZGxlcjogcGF5bG9hZC5oYW5kbGVyLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IHRoaXMubWlkZGxld2FyZXMubWFwKG0gPT4gbS5taWRkbGV3YXJlKSxcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gdGhpcy5taWRkbGV3YXJlcy5maWx0ZXIobSA9PiBtLmNvbnRleHQgIT09ICdyb3V0ZScpXG5cbiAgICAgICAgdGhpcy5wcmVmaXhlcyA9IFtdIC8vIFJlc2V0IHByZWZpeGVzIGFmdGVyIHVzZVxuXG4gICAgICAgIHRoaXMucm91dGVzLnB1c2gocm91dGUpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdhZGRlZCByb3V0ZScsIHJvdXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdhZGRlZCcsIHJvdXRlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcHV0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHBhdGNoKHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnUEFUQ0gnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbWFueShtZXRob2RzOiBSb3V0ZVsnbWV0aG9kJ11bXSwgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIG1ldGhvZHMuZm9yRWFjaChtZXRob2QgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIHB1YmxpYyBncm91cCgpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgUm91dGVyU2VydmljZTxDPih7XG4gICAgICAgICAgICBsaXN0ZW5lcnM6IHRoaXMubGlzdGVuZXJzLCAvLyBJbmhlcml0IGxpc3RlbmVycyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgIH0pXG5cbiAgICAgICAgZ3JvdXAuZ3JvdXBQcmVmaXhlcyA9IHRoaXMucHJlZml4ZXMgLy8gSW5oZXJpdCBwcmVmaXhlcyBmcm9tIHBhcmVudFxuICAgICAgICBncm91cC5taWRkbGV3YXJlcyA9IHRoaXMubWlkZGxld2FyZXMubWFwKHIgPT4gKHtcbiAgICAgICAgICAgIG1pZGRsZXdhcmU6IHIubWlkZGxld2FyZSxcbiAgICAgICAgICAgIGNvbnRleHQ6ICdncm91cCdcbiAgICAgICAgfSkpXG5cbiAgICAgICAgdGhpcy5ncm91cHMucHVzaChncm91cClcblxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gdGhpcy5taWRkbGV3YXJlcy5maWx0ZXIobSA9PiBtLmNvbnRleHQgIT09ICdyb3V0ZScpXG4gICAgICAgIHRoaXMucHJlZml4ZXMgPSBbXSAvLyBSZXNldCBwcmVmaXhlcyBhZnRlciB1c2VcblxuICAgICAgICByZXR1cm4gZ3JvdXBcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzb2x2ZShtZXRob2Q6IHN0cmluZywgcGF0aDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5saXN0KClcbiAgICAgICAgICAgIC5maW5kKHIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyLm1ldGhvZC50b1VwcGVyQ2FzZSgpICE9PSBtZXRob2QudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hQYXRoKHIucGF0aCwgcGF0aClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb3V0ZVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKHJvdXRlOiBSb3V0ZSwgaW5pdGlhbEN0eDogYW55KSB7XG4gICAgICAgIGlmICghcm91dGUuaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBoYW5kbGVyIG5vdCBmb3VuZCBmb3IgJHtyb3V0ZS5tZXRob2R9ICR7cm91dGUucGF0aH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3R4ID0geyAuLi5pbml0aWFsQ3R4IH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IG1pZGRsZXdhcmUgb2Ygcm91dGUubWlkZGxld2FyZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pZGRsZXdhcmUuaGFuZGxlKGN0eClcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAncmVkaXJlY3QnIGluIHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjdHgsIHJlc3VsdClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByb3V0ZS5oYW5kbGVyKGN0eClcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY2xlYXInLCB7IGNvdW50OiB0aGlzLnJvdXRlcy5sZW5ndGggfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVzID0gW11cbiAgICAgICAgdGhpcy5ncm91cHMgPSBbXVxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXMuY29uY2F0KC4uLnRoaXMuZ3JvdXBzLm1hcChnID0+IGcucm91dGVzKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zOiBMb2FkT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IHRoaXMuZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRTeW5jKG9wdGlvbnM6IExvYWRPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBsb2FkZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gICAgUmVxdWVzdCwgXG4gICAgUmVzcG9uc2UsXG4gICAgQ29va2llT3B0aW9uc1xufSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvb2tpZU1hcEVudGl0eSBleHRlbmRzIEJhc2Uge1xuICAgIHB1YmxpYyByZXF1ZXN0OiBSZXF1ZXN0XG4gICAgcHVibGljIHJlc3BvbnNlOiBSZXNwb25zZVxuXG4gICAgY29uc3RydWN0b3IocmVxdWVzdDogUmVxdWVzdCwgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIGNvb2tpZXM6IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KE9iamVjdC5lbnRyaWVzKHJlcXVlc3QuY29va2llcykpLFxuICAgICAgICAgICAgcHJlZml4OiBjb25maWcuZ2V0KCdjb29raWUucHJlZml4JywgJycpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdFxuICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgb3B0aW9ucz86IENvb2tpZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5wcmVmaXhcblxuICAgICAgICBjb25zdCBmdWxsTmFtZSA9IHByZWZpeCArIG5hbWVcblxuICAgICAgICBjb25zdCBvcHRzOiBDb29raWVPcHRpb25zID0ge1xuICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc3BvbnNlLmNvb2tpZShmdWxsTmFtZSwgdmFsdWUsIG9wdHMpXG4gICAgICAgIFxuICAgICAgICBzdXBlci5zZXQoZnVsbE5hbWUsIHZhbHVlLCBvcHRpb25zKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgU2VydmVyIH0gZnJvbSAnaHR0cCdcbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnXG5pbXBvcnQgY29ycyBmcm9tICdjb3JzJ1xuaW1wb3J0IGNvb2tpZVBhcnNlciBmcm9tICdjb29raWUtcGFyc2VyJ1xuaW1wb3J0IFJvdXRlciBmcm9tICcuL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgRXhjZXB0aW9uU2VydmljZSBmcm9tICcuL0V4Y2VwdGlvblNlcnZpY2UudHMnXG5pbXBvcnQgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IEVtbWl0dGVyU2VydmljZSwgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50cydcbmltcG9ydCBDb29raWVNYXBFbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMnXG5pbXBvcnQgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cFNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgcm91dGVyPzogUm91dGVyO1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2U7XG4gICAgZXhjZXB0aW9uPzogRXhjZXB0aW9uU2VydmljZTtcbiAgICBlbW1pdHRlcj86IEVtbWl0dGVyU2VydmljZTtcbiAgICBlbnY/OiBFbnZTZXJ2aWNlO1xuICAgIG9yaWdpbnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSHR0cFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0h0dHBTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGFwcDogZXhwcmVzcy5BcHBsaWNhdGlvblxuICAgIHB1YmxpYyBzZXJ2ZXI6IFNlcnZlciB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIHJvdXRlcjogUm91dGVyXG4gICAgcHVibGljIGV4Y2VwdGlvbjogRXhjZXB0aW9uU2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuICAgIHB1YmxpYyBlbnY6IEVudlNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBvblVuaGFuZGxlclJvdXRlZDogKChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBIdHRwU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIHRoaXMucm91dGVyID0gb3B0aW9ucy5yb3V0ZXIgfHwgbmV3IFJvdXRlcigpXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBvcHRpb25zLmVtbWl0dGVyIHx8IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmVudiA9IG9wdGlvbnMuZW52IHx8IG5ldyBFbnZTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5leGNlcHRpb24gPSBvcHRpb25zLmV4Y2VwdGlvbiB8fCBuZXcgRXhjZXB0aW9uU2VydmljZSh7IGxvZ2dlcjogdGhpcy5sb2dnZXIsIGVudjogdGhpcy5lbnYgfSlcblxuICAgICAgICB0aGlzLmFwcCA9IGV4cHJlc3MoKVxuICAgICAgICB0aGlzLmFwcC51c2UoY29va2llUGFyc2VyKCkpXG4gICAgICAgIHRoaXMuYXBwLnVzZSh0aGlzLnBhcnNlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RXhwcmVzc0FwcCgpOiBleHByZXNzLkFwcGxpY2F0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwXG4gICAgfVxuXG4gICAgcHVibGljIGNvcnMob3B0aW9uczogY29ycy5Db3JzT3B0aW9ucykge1xuICAgICAgICB0aGlzLmFwcC51c2UoY29ycyhvcHRpb25zKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdXNlOiBleHByZXNzLkFwcGxpY2F0aW9uWyd1c2UnXSA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC51c2UoLi4uYXJncylcblxuICAgICAgICByZXR1cm4gdGhpcy5hcHBcbiAgICB9XG5cbiAgICBwdWJsaWMgcm91dGVzKCkge1xuICAgICAgICB0aGlzLmFwcC51c2UoJyphbGwnLCAocmVxLCByZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLm9yaWdpbmFsVXJsLCBgaHR0cDovLyR7cmVxLmhlYWRlcnMuaG9zdH1gKVxuICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZC50b0xvd2VyQ2FzZSgpXG5cbiAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5yb3V0ZXIucmVzb2x2ZShtZXRob2QsIHVybC5wYXRobmFtZSlcblxuICAgICAgICAgICAgaWYgKHRoaXMucm91dGVyLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubG9nZ2VyLmRlYnVnKGAke21ldGhvZC50b1VwcGVyQ2FzZSgpfSAke3VybC5wYXRobmFtZX1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocm91dGUpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodXJsLCByZXEsIHJlcywgcm91dGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh1cmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAnTm90IEZvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYE5vIEFQSSByb3V0ZSBmb3VuZCBmb3IgJHttZXRob2QudG9VcHBlckNhc2UoKX0gJHt1cmx9YCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vblVuaGFuZGxlclJvdXRlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uVW5oYW5kbGVyUm91dGVkKHJlcSwgcmVzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZXIocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSwgbmV4dDogZXhwcmVzcy5OZXh0RnVuY3Rpb24pIHtcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXEuaGVhZGVyc1snY29udGVudC10eXBlJ10gfHwgJydcblxuICAgICAgICBpZiAoY29udGVudFR5cGUuc3RhcnRzV2l0aCgnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpKSB7XG4gICAgICAgICAgICAvLyBTa2lwIEpTT04gYW5kIFVSTC1lbmNvZGVkIHBhcnNlcnMgZm9yIG11bHRpcGFydCByZXF1ZXN0c1xuICAgICAgICAgICAgcmV0dXJuIG5leHQoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIG90aGVyIGNvbnRlbnQgdHlwZXMsIHBhcnNlIEpTT04gYW5kIFVSTC1lbmNvZGVkIGJvZHlcbiAgICAgICAgZXhwcmVzcy5qc29uKCkocmVxLCByZXMsIChlcnIpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBuZXh0KGVycilcblxuICAgICAgICAgICAgZXhwcmVzcy51cmxlbmNvZGVkKHsgZXh0ZW5kZWQ6IHRydWUgfSkocmVxLCByZXMsIG5leHQpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGUodXJsOiBVUkwsIHJlcXVlc3Q6IGV4cHJlc3MuUmVxdWVzdCwgcmVzcG9uc2U6IGV4cHJlc3MuUmVzcG9uc2UsIHJvdXRlOiBSb3V0ZSkge1xuICAgICAgICBjb25zdCBjdHg6IE9taXQ8SHR0cENvbnRleHQsICdhY2wnPiA9IHtcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgICAgcmVxdWVzdCxcblxuICAgICAgICAgICAgdXJsOiB1cmwucGF0aG5hbWUsXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBwYXJhbXM6IFJvdXRlLnBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwucGF0aG5hbWUpLFxuICAgICAgICAgICAgcXVlcnk6IFJvdXRlLnF1ZXJ5KHVybC5ocmVmKSxcbiAgICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSB8fCB7fSxcblxuICAgICAgICAgICAgY29va2llOiBuZXcgQ29va2llTWFwRW50aXR5KHJlcXVlc3QsIHJlc3BvbnNlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCByZXN1bHRdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gdGhpcy5yb3V0ZXIuZXhlY3V0ZShyb3V0ZSwgY3R4KSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uLmhhbmRsZShlcnJvciwgcmVzcG9uc2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzU2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIC8vIGlmIGhlYWRlcnMgYXJlIGFscmVhZHkgc2VudCwgZG8gbm90IG1vZGlmeSB0aGUgcmVzcG9uc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnJlZGlyZWN0KSB7XG4gICAgICAgICAgICByZXNwb25zZS5yZWRpcmVjdChyZXN1bHQucmVkaXJlY3QpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGhlYWRlcnMgbm90IHNldCBcbiAgICAgICAgcmVzcG9uc2Uuc3RhdHVzKDIwMClcblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLnNlbmQocmVzdWx0KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydCgpIHtcbiAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMuZW52LmdldCgnWkVOSVRIX1BPUlQnKVxuICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5lbnYuZ2V0KCdaRU5JVEhfSE9TVCcpXG5cbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gXG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSB0aGlzLmFwcC5saXN0ZW4ocG9ydCwgaG9zdCwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnc2VydmVyIHN0YXJ0ZWQnLCB7XG4gICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYuZ2V0KCdOT0RFX0VOVicpLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5lbW1pdHRlci5lbWl0KCdodHRwOnN0YXJ0ZWQnKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdG9wKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdzZXJ2ZXIgaXMgbm90IHJ1bm5pbmcnKVxuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygnc2VydmVyIHN0b3BwZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICAgICAgICAgICAgICAgIGVudjogdGhpcy5lbnYuZ2V0KCdOT0RFX0VOVicpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLnNlcnZlci5jbG9zZSgpXG5cbiAgICAgICAgfSlcbiAgICB9XG59XG5cbiIsImltcG9ydCB7IEt5c2VseSB9IGZyb20gXCJreXNlbHlcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGF0YWJhc2VHYXRld2F5PERCPiBleHRlbmRzIEt5c2VseTxEQj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0RhdGFiYXNlR2F0ZXdheSdcbn1cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IERhdGFiYXNlR2F0ZXdheSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0RhdGFiYXNlR2F0ZXdheS50cydcblxuY29uc3QgZGF0YWJhc2UgPSBjb250YWluZXIucHJveHk8RGF0YWJhc2VHYXRld2F5PERhdGFiYXNlQ29udHJhY3Q+PihEYXRhYmFzZUdhdGV3YXkpXG5cbmV4cG9ydCBkZWZhdWx0IGRhdGFiYXNlXG5cbiIsImltcG9ydCB0eXBlIHsgRmluZE1hbnlPcHRpb25zLCBQYWdpbmF0ZU9wdGlvbnMsIFBhZ2luYXRpb24gfSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZXBvc2l0b3J5VHlwZXM8VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQcmltYXJ5S2V5VHlwZSA9IGFueSwgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY291bnQob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+XG5cbiAgICBmaW5kTWFueShvcHRpb25zPzogVE9wdGlvbnMgJiBGaW5kTWFueU9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT5cbiAgICBmaW5kQnlJZChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPlxuICAgIGZpbmRCeUlkT3JGYWlsKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT5cblxuICAgIHBhZ2luYXRlKG9wdGlvbnM/OiBUT3B0aW9ucyAmIFBhZ2luYXRlT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbj5cblxuICAgIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG4gICAgY3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10sIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiBcblxuICAgIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSk6IFByb21pc2U8dm9pZD5cbiAgICBkZXN0cm95TWFueShvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW48VEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sIFRQcmltYXJ5S2V5VHlwZSA9IGFueSwgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIGFic3RyYWN0IGNsYXNzIE9wdGlvbnNNaXhpbiBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgLy8gV2UgXCJkZWNsYXJlXCIgdGhlc2UgbWV0aG9kcyBzbyB0aGV5IGV4aXN0IGluIHRoZSB0eXBlIHNwYWNlXG4gICAgICAgICAgICAvLyBmb3IgdGhpcyBzcGVjaWZpYyBUT3B0aW9ucywgd2l0aG91dCBvdmVycmlkaW5nIHRoZSBsb2dpYy5cbiAgICAgICAgICAgIGFic3RyYWN0IGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPlxuXG4gICAgICAgICAgICBhYnN0cmFjdCBmaW5kTWFueShvcHRpb25zPzogVE9wdGlvbnMgJiBGaW5kTWFueU9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT5cbiAgICAgICAgICAgIGFic3RyYWN0IGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+XG4gICAgICAgICAgICBhYnN0cmFjdCBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IHBhZ2luYXRlKG9wdGlvbnM/OiBUT3B0aW9ucyAmIFBhZ2luYXRlT3B0aW9ucyk6IFByb21pc2U8eyBpdGVtczogVEVudGl0eVtdOyB0b3RhbDogbnVtYmVyIH0+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG4gICAgICAgICAgICBhYnN0cmFjdCBjcmVhdGVNYW55KGRhdGE6IFBhcnRpYWw8VEVudGl0eT5bXSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+XG5cbiAgICAgICAgICAgIGFic3RyYWN0IGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSk6IFByb21pc2U8dm9pZD5cbiAgICAgICAgICAgIGFic3RyYWN0IGRlc3Ryb3lNYW55KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8dm9pZD5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBPcHRpb25zTWl4aW4gYXMgVEJhc2UgJiBDb25zdHJ1Y3RvcjxJUmVwb3NpdG9yeVR5cGVzPFRFbnRpdHksIFRQcmltYXJ5S2V5VHlwZSwgVE9wdGlvbnM+PlxuICAgIH1cbn1cbiIsImltcG9ydCB7ICBzcWwgIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RhYmxlLCBTZWxlY3RRdWVyeUJ1aWxkZXIsIEV4cHJlc3Npb25CdWlsZGVyIGFzIEtFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBTZWxlY3RGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPVxuICAgIFJldHVyblR5cGU8dHlwZW9mIGRiLnNlbGVjdEZyb208VD4+XG4gICAgfCBTZWxlY3RRdWVyeUJ1aWxkZXI8RGF0YWJhc2UsIFQsIGFueT5cblxuZXhwb3J0IHR5cGUgSW5zZXJ0RnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuaW5zZXJ0SW50bzxUPj5cbmV4cG9ydCB0eXBlIFVwZGF0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLnVwZGF0ZVRhYmxlPFQ+PlxuZXhwb3J0IHR5cGUgRGVsZXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuZGVsZXRlRnJvbTxUPj5cblxuZXhwb3J0IHR5cGUgU2VsZWN0QnVpbGRlcjxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBULCBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPj5cbmV4cG9ydCB0eXBlIEV4cHJlc3Npb25CdWlsZGVyPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBLRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+XG5cbmV4cG9ydCBjb25zdCBub3cgPSAoKSAgPT4gc3FsPHN0cmluZz5gQ1VSUkVOVF9USU1FU1RBTVBgXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55XG59XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHwgdW5kZWZpbmVkPiA9XG4gICAgTyBleHRlbmRzIHVuZGVmaW5lZCA/IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+IDpcbiAgICBPIGV4dGVuZHMgeyBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSIH0gPyBSIDogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT5cbiIsImltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgZGVidWc/OiBib29sZWFuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3VudDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDb3VudE9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkgYXMgYW55IFxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgfVxuXG4gICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAuY2xlYXJTZWxlY3QoKVxuICAgICAgICAuY2xlYXJPcmRlckJ5KClcbiAgICAgICAgLnNlbGVjdCgoZWI6IGFueSkgPT4gZWIuZm4uY291bnRBbGwoKS5hcygnY291bnQnKSlcblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgY29uc3Qgcm93ID0gYXdhaXQgKHF1ZXJ5IGFzIGFueSkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICByZXR1cm4gTnVtYmVyKHJvdz8uY291bnQgPz8gMClcbn0iLCJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RiKHZhbHVlOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSAoZGIgYXMgYW55KS5jdXJyZW50Q29ubmVjdGlvbkRpYWxlY3ROYW1lXG5cbiAgICBpZiAoZGlhbGVjdCA9PT0gJ3NxbGl0ZScpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdChuZXcgRGF0ZSh2YWx1ZSksICd5eXl5LU1NLWRkIEhIOm1tOnNzJylcbiAgICB9XG5cbiAgICBpZiAoZGlhbGVjdCA9PT0gJ215c3FsJykge1xuICAgICAgICByZXR1cm4gZm9ybWF0KG5ldyBEYXRlKHZhbHVlKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSkudG9JU09TdHJpbmcoKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbURiKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogRGF0ZSB8IG51bGwgeyAgICBcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpXG59XG4iLCJleHBvcnQgZnVuY3Rpb24gdG9EYih2YWx1ZTogb2JqZWN0IHwgYW55W10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IGFueSk6IG9iamVjdCB8IGFueVtdIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpXG59XG4iLCJpbXBvcnQgZGF0YWJhc2UgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5jb25zdCBkYiA9IGRhdGFiYXNlIGFzIGFueVxuXG5leHBvcnQgZnVuY3Rpb24gdG9EYih2YWx1ZTogYm9vbGVhbiB8IG51bWJlciB8IG51bGwpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gZGIuY3VycmVudENvbm5lY3Rpb25EaWFsZWN0TmFtZVxuXG4gICAgaWYgKGRpYWxlY3QgPT09ICdzcWxpdGUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA/IDEgOiAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlID8gdHJ1ZSA6IGZhbHNlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IGFueSB8IG51bGwpOiBib29sZWFuIHwgbnVsbCB7ICAgIFxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGNvbnN0IGRpYWxlY3QgPSBkYi5jdXJyZW50Q29ubmVjdGlvbkRpYWxlY3ROYW1lXG5cbiAgICBpZiAoZGlhbGVjdCAgPT09ICdzcWxpdGUnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSA/IHRydWUgOiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA9PT0gJ3RydWUnID8gdHJ1ZSA6IGZhbHNlXG59XG4iLCJpbXBvcnQgKiBhcyAgZGF0ZXRpbWUgZnJvbSAnLi9kYXRldGltZS50cydcbmltcG9ydCAqIGFzIGpzb24gZnJvbSAnLi9qc29uLnRzJ1xuaW1wb3J0ICogYXMgYm9vbGVhbiBmcm9tICcuL2Jvb2xlYW4udHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB0b0RiKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4ucGF5bG9hZCB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdFtrZXldIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBkYXRldGltZS50b0RiKHJlc3VsdFtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0ganNvbi50b0RiKHJlc3VsdFtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGJvb2xlYW4udG9EYihyZXN1bHRba2V5XSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdFtrZXldKSkge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBqc29uLnRvRGIocmVzdWx0W2tleV0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tRGIodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLnZhbHVlIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHJlc3VsdCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHBhcnNlVmFsdWUocmVzdWx0W2tleV0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vYWxsLnRzJ1xuaW1wb3J0ICogYXMgZGF0ZXRpbWUgZnJvbSAnLi9kYXRldGltZS50cydcblxuY29uc3Qgbm9ybWFsaXplcnMgPSB7XG4gICAgYWxsLFxuICAgIGRhdGV0aW1lXG59XG5cbmV4cG9ydCBkZWZhdWx0IG5vcm1hbGl6ZXJzXG4iLCJpbXBvcnQgdHlwZSB7IEluc2VydGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgbm9ybWFsaXplcnMgZnJvbSAnI3NlcnZlci9ub3JtYWxpemVycy9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICB2YWx1ZXM6IEluc2VydGFibGU8RGF0YWJhc2VbVF0+XG4gICAgcHJpbWFyeUtleT86IHN0cmluZyAvLyBkZWZhdWx0ICdpZCdcbiAgICBub3JtYWxpemU/OiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBhbnkpIC8vIGRlZmF1bHQgdHJ1ZVxufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIENyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IHZhbHVlcyA9IChvcHRpb25zPy52YWx1ZXMgfHwge30pIGFzIEluc2VydGFibGU8RGF0YWJhc2VbVF0+XG4gICAgY29uc3QgaW5zZXJ0ID0gZGIuaW5zZXJ0SW50byh0YWJsZSkudmFsdWVzKHZhbHVlcylcblxuICAgIGxldCByb3c6IGFueSA9IGF3YWl0IGluc2VydC5yZXR1cm5pbmdBbGwoKS5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93ID0gb3B0aW9ucy5zZXJpYWxpemUocm93KVxuICAgIH1cblxuICAgIHJldHVybiByb3cgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVNeXNxbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSAob3B0aW9ucz8udmFsdWVzIHx8IHt9KSBhcyBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPlxuICAgIGNvbnN0IGluc2VydCA9IGRiLmluc2VydEludG8odGFibGUpLnZhbHVlcyh2YWx1ZXMpXG5cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gKG9wdGlvbnM/LnByaW1hcnlLZXkgfHwgJ2lkJykgYXMga2V5b2YgRGF0YWJhc2VbVF1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGluc2VydC5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGNvbnN0IHJlc3VsdElkID0gcmVzdWx0Lmluc2VydElkIGFzIGFueVxuXG4gICAgY29uc3Qgc2VsZWN0ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKCkgYXMgYW55XG5cbiAgICBsZXQgcm93ID0gYXdhaXQgc2VsZWN0XG4gICAgICAgIC53aGVyZShwcmltYXJ5S2V5LCAnPScsIHJlc3VsdElkKVxuICAgICAgICAuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvdyA9IG9wdGlvbnMuc2VyaWFsaXplKHJvdylcbiAgICB9XG5cbiAgICByZXR1cm4gcm93IGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgbGV0IHZhbHVlczogYW55ID0gb3B0aW9ucz8udmFsdWVzIHx8IHt9XG5cbiAgICBjb25zdCBub3JtYWxpemUgPSB0eXBlb2Ygb3B0aW9ucz8ubm9ybWFsaXplID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucz8ubm9ybWFsaXplIDogbm9ybWFsaXplcnMuYWxsLnRvRGJcblxuICAgIGlmIChvcHRpb25zPy5ub3JtYWxpemUgIT09IGZhbHNlKSB7XG4gICAgICAgIHZhbHVlcyA9IG5vcm1hbGl6ZSh2YWx1ZXMpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKGRiLmRyaXZlciA9PT0gJ215c3FsJykge1xuICAgICAgICByZXR1cm4gY3JlYXRlTXlzcWwodGFibGUsIHBhcnNlZE9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZURlZmF1bHQodGFibGUsIHBhcnNlZE9wdGlvbnMpXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uV3JhcHBlciwgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxudHlwZSBEZWxldGVGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBSZXR1cm5UeXBlPHR5cGVvZiBkYi5kZWxldGVGcm9tPFQ+PlxuXG5leHBvcnQgaW50ZXJmYWNlIERlc3Ryb3lPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHF1ZXJ5PzogKHFiOiBEZWxldGVGcm9tPFQ+KSA9PiBEZWxldGVGcm9tPFQ+XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3Ryb3k8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRGVzdHJveU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCBxdWVyeTogYW55ID0gb3B0aW9ucz8ucXVlcnkgXG4gICAgICAgID8gb3B0aW9ucy5xdWVyeShkYi5kZWxldGVGcm9tKHRhYmxlKSkgXG4gICAgICAgIDogZGIuZGVsZXRlRnJvbSh0YWJsZSlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpIGFzIGFueVxuICAgIH1cblxuICAgIGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemVPcHRpb25zLCBTZXJpYWxpemFibGVSZXN1bHQgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gIGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvZmZzZXQ/OiBudW1iZXJcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaXN0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIExpc3RPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBsZXQgcXVlcnkgPSAob3B0aW9ucz8ucXVlcnkgfHwgZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKCkpIGFzIGFueVxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSlcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5saW1pdChvcHRpb25zLmxpbWl0KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5vZmZzZXQpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS5vZmZzZXQob3B0aW9ucy5vZmZzZXQpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5LmNvbXBpbGUoKSlcbiAgICB9XG5cbiAgICBsZXQgcm93czogYW55W10gPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPltdXG59IiwiaW1wb3J0IHsgbGlzdCAgfSBmcm9tICcuL2xpc3QudHMnXG5pbXBvcnQgdHlwZSB7IExpc3RPcHRpb25zIH0gZnJvbSAnLi9saXN0LnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4aXN0czxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBMaXN0T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IGxpc3QodGFibGUsIG9wdGlvbnMpXG5cbiAgICBjb25zdCBmb3VuZCA9IHJvd3NbMF1cblxuICAgIHJldHVybiAhIWZvdW5kXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20sIFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGludGVyZmFjZSBGaW5kT25lT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHF1ZXJ5PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPbmU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRmluZE9uZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpIGFzIGFueVxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSkgYXMgYW55XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSkgYXMgYW55XG4gICAgfVxuXG4gICAgY29uc3Qgcm93OiBhbnkgPSBhd2FpdCBxdWVyeS5saW1pdCgxKS5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgIGlmICghcm93KSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlcmlhbGl6ZSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5zZXJpYWxpemUocm93KSBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbiAgICB9XG5cbiAgICByZXR1cm4gcm93IGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZE9uZU9yRmFpbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBGaW5kT25lT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kT25lKHRhYmxlLCBvcHRpb25zKVxuXG4gICAgaWYgKCFmb3VuZCkge1xuICAgICAgICBjb25zdCBuYW1lID0gb3B0aW9ucz8ubmFtZSA/PyAnUmVjb3JkJ1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtuYW1lfSBub3QgZm91bmRgLCA0MDQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kXG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIsIEluc2VydGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20sIFNlcmlhbGl6YWJsZVJlc3VsdCwgU2VyaWFsaXplT3B0aW9ucyB9IGZyb20gJy4vY29tbW9uLnRzJ1xuaW1wb3J0IHsgbGlzdCB9IGZyb20gJy4vbGlzdC50cydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY3JlYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlyc3RPckNyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHNlbGVjdD86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPiB8IEluc2VydGFibGU8RGF0YWJhc2VbVF0+W11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpcnN0T3JDcmVhdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRmlyc3RPckNyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgbGlzdCh0YWJsZSwgeyBcbiAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgd2hlcmU6IG9wdGlvbnM/LndoZXJlLFxuICAgICAgICBxdWVyeTogKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHF1ZXJ5OiBhbnkgPSBvcHRpb25zPy5zZWxlY3QgXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLnNlbGVjdChkYi5zZWxlY3RGcm9tKHRhYmxlKSkgXG4gICAgICAgICAgICAgICAgOiBkYi5zZWxlY3RGcm9tKHRhYmxlKS5zZWxlY3RBbGwoKVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeS5saW1pdCgxKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBpdGVtc1swXSBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVkID0gYXdhaXQgY3JlYXRlKHRhYmxlLCB7IFxuICAgICAgICBkZWJ1Zzogb3B0aW9ucz8uZGVidWcsXG4gICAgICAgIHNlcmlhbGl6ZTogb3B0aW9ucz8uc2VyaWFsaXplLFxuICAgICAgICB2YWx1ZXM6IG9wdGlvbnM/LnZhbHVlcyBhcyBhbnlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGNyZWF0ZWQgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG59IiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciwgRXhwcmVzc2lvbldyYXBwZXIsIFNlbGVjdGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20gfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IGxpc3QgfSBmcm9tICcuL2xpc3QudHMnXG5pbXBvcnQgeyBjb3VudCB9IGZyb20gJy4vY291bnQudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBQYWdpbmF0aW9uIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvUGFnaW5hdGlvbkVudGl0eS50cydcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgcGFnZT86IG51bWJlclxuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgb3JkZXJCeT86IERhdGFiYXNlW1RdIHwgKGtleW9mIERhdGFiYXNlW1RdKVtdIFxuICAgIG9yZGVyRGVzYz86ICgnYXNjJyB8ICdkZXNjJykgfCAoJ2FzYycgfCAnZGVzYycpW11cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHNlcmlhbGl6ZT86IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBhbnlcbiAgICBxdWVyeT86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gYW55XG59XG5cbmV4cG9ydCB0eXBlIFBhZ2luYXRlUmVzdWx0PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFBhZ2luYXRlT3B0aW9uczxUPiB8IHVuZGVmaW5lZD4gPVxuICAgIE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPiA6XG4gICAgTyBleHRlbmRzIHsgc2VyaWFsaXplOiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gaW5mZXIgUiB9ID8gUiA6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWdpbmF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBQYWdpbmF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zPy5wYWdlICYmIG9wdGlvbnMucGFnZSA+IDAgPyBvcHRpb25zLnBhZ2UgOiAxXG4gICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCAmJiBvcHRpb25zLmxpbWl0ID4gMCA/IG9wdGlvbnMubGltaXQgOiAxMFxuICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiBsaW1pdFxuICAgIGNvbnN0IG9yZGVyQnkgPSBvcHRpb25zPy5vcmRlckJ5ICYmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJCeSkgPyBvcHRpb25zLm9yZGVyQnkgOiBbb3B0aW9ucy5vcmRlckJ5XSlcbiAgICBjb25zdCBvcmRlckRlc2MgPSBvcHRpb25zPy5vcmRlckRlc2MgJiYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRlc2MpID8gb3B0aW9ucy5vcmRlckRlc2MgOiBbb3B0aW9ucy5vcmRlckRlc2NdKVxuICAgIFxuICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgbGlzdCh0YWJsZSwgeyBcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgcXVlcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeTogYW55ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKClcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KGRiLnNlbGVjdEZyb20odGFibGUpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3JkZXJCeSkge1xuICAgICAgICAgICAgICAgIG9yZGVyQnlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sLCBpKSA9PiBbY29sLCBvcmRlckRlc2MgJiYgb3JkZXJEZXNjW2ldID8gb3JkZXJEZXNjW2ldIDogJ2FzYyddIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoW2NvbCwgZGlyZWN0aW9uXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS5vcmRlckJ5KGNvbCBhcyBzdHJpbmcsIGRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbWl0ID4gMCkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQobGltaXQpLm9mZnNldChvZmZzZXQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgY291bnQodGFibGUsIHtcbiAgICAgICAgcXVlcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeTogYW55ID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKClcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KGRiLnNlbGVjdEZyb20odGFibGUpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiBQYWdpbmF0aW9uLmZyb208UGFnaW5hdGVSZXN1bHQ8VCwgTz4+KHtcbiAgICAgICAgaXRlbXM6IGl0ZW1zIGFzIFBhZ2luYXRlUmVzdWx0PFQsIE8+LFxuICAgICAgICB0b3RhbCxcbiAgICAgICAgcGFnZSxcbiAgICAgICAgcGVyX3BhZ2U6IGxpbWl0LFxuICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKHRvdGFsIC8gbGltaXQpLFxuICAgIH0pXG59IiwiaW1wb3J0IHsgQ3JlYXRlVGFibGVCdWlsZGVyICB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgQ29sdW1uVHlwZSwgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGFibGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgeyBub3cgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG50eXBlIFdoZXJlQ2FwYWJsZTxRQj4gPSB7XG4gIHdoZXJlOiAoLi4uYXJnczogYW55W10pID0+IFFCXG59XG5cbnR5cGUgVXBkYXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIudXBkYXRlVGFibGU8VD4+XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29mdERlbGV0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgc2VyaWFsaXplPzogKHJvdzogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4pID0+IGFueVxuICAgIHF1ZXJ5OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD5cbn1cblxuZXhwb3J0IHR5cGUgU29mdERlbGV0ZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTb2Z0RGVsZXRlT3B0aW9uczxUPiB8IHVuZGVmaW5lZD4gPVxuICAgIE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPltdIDpcbiAgICBPIGV4dGVuZHMgeyBzZXJpYWxpemU6IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBpbmZlciBSIH0gPyBSW10gOiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPltdXG5cbmV4cG9ydCBpbnRlcmZhY2UgU29mdERlbGV0ZVRhYmxlIHtcbiAgZGVsZXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlIHwgbnVsbCwgbmV2ZXIgfCBudWxsIHwgUmV0dXJuVHlwZTx0eXBlb2Ygbm93Piwgc3RyaW5nIHwgbnVsbCB8IFJldHVyblR5cGU8dHlwZW9mIG5vdz4+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aGVyZU5vdERlbGV0ZWQ8UUIgZXh0ZW5kcyBXaGVyZUNhcGFibGU8UUI+PihxYjogUUIpOiBRQiB7XG4gICAgcmV0dXJuIHFiLndoZXJlKCdkZWxldGVkX2F0JywgJ2lzJywgbnVsbClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVsZXRlZCAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55Pikge1xuICAgIHJldHVybiBxYi5lYihxYi5yZWYoJ2RlbGV0ZWRfYXQnKSwgJ2lzJywgbnVsbClcbn1cblxudW5kZWxldGVkLmNvbHVtbiA9IChjb2w6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAgICByZXR1cm4gcWIuZWIoY29sLCAnaXMnLCBudWxsKVxuICAgIH1cbn1cblxuXG5leHBvcnQgY29uc3QgZGVsZXRlZCA9IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgcmV0dXJuIHFiLmViKCdkZWxldGVkX2F0JywgJ2lzIG5vdCcsIG51bGwpXG59XG5cbmV4cG9ydCBjb25zdCBhZGRTb2Z0RGVsZXRlQ29sdW1uID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBjdGIuYWRkQ29sdW1uKCdkZWxldGVkX2F0JywgJ3RpbWVzdGFtcCcpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzb2Z0RGVsZXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFNvZnREZWxldGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPFNvZnREZWxldGVSZXN1bHQ8VCwgTz4+IHtcbiAgICBsZXQgcXVlcnk6IGFueSA9IG9wdGlvbnM/LnF1ZXJ5IFxuICAgICAgICA/IG9wdGlvbnMucXVlcnkoZGIudXBkYXRlVGFibGUodGFibGUpKSBcbiAgICAgICAgOiBkYi51cGRhdGVUYWJsZSh0YWJsZSlcblxuICAgIHF1ZXJ5ID0gcXVlcnkuc2V0KHsgZGVsZXRlZF9hdDogbm93KCkgfSkud2hlcmUodW5kZWxldGVkKVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgcXVlcnlcbiAgICAgICAgLnJldHVybmluZ0FsbCgpXG4gICAgICAgIC5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNvZnREZWxldGVSZXN1bHQ8VCwgTz5cbn1cblxuZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICBpbnRlcmZhY2UgQ3JlYXRlVGFibGVCdWlsZGVyPFRCIGV4dGVuZHMgc3RyaW5nLCBDIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+IHtcbiAgICBhZGRTb2Z0RGVsZXRlQ29sdW1uKCk6IENyZWF0ZVRhYmxlQnVpbGRlcjxUQiwgQyB8ICdkZWxldGVkX2F0Jz5cbiAgfVxufVxuXG5DcmVhdGVUYWJsZUJ1aWxkZXIucHJvdG90eXBlLmFkZFNvZnREZWxldGVDb2x1bW4gPSBmdW5jdGlvbiAoXG4gICAgdGhpczogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55Pixcbikge1xuICAgIHJldHVybiB0aGlzLmFkZENvbHVtbignZGVsZXRlZF9hdCcsICd0aW1lc3RhbXAnKVxufSIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciAgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IENvbHVtblR5cGUgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgeyBub3cgfSBmcm9tICcuL2NvbW1vbi50cydcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lc3RhbXBUYWJsZSB7XG4gIGNyZWF0ZWRfYXQ6IENvbHVtblR5cGU8RGF0ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBuZXZlcj5cbiAgdXBkYXRlZF9hdDogQ29sdW1uVHlwZTxEYXRlLCBzdHJpbmcgfCB1bmRlZmluZWQsIERhdGUgfCBzdHJpbmcgfCBSZXR1cm5UeXBlPHR5cGVvZiBub3c+PlxufVxuXG5leHBvcnQgY29uc3QgYWRkQ3JlYXRlZENvbHVtbiA9IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICByZXR1cm4gY3RiXG4gICAgICAgIC5hZGRDb2x1bW4oJ2NyZWF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbn1cblxuZXhwb3J0IGNvbnN0IGFkZFVwZGF0ZWRDb2x1bW4gPSAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgcmV0dXJuIGN0YlxuICAgICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbmV4cG9ydCBjb25zdCBhZGRUaW1lc3RhbXBDb2x1bW5zID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBjdGJcbiAgICAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxuICAgICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbmRlY2xhcmUgbW9kdWxlICdreXNlbHknIHtcbiAgaW50ZXJmYWNlIENyZWF0ZVRhYmxlQnVpbGRlcjxUQiBleHRlbmRzIHN0cmluZywgQyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPiB7XG4gICAgYWRkVGltZXN0YW1wQ29sdW1ucygpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnY3JlYXRlZF9hdCcgfCAndXBkYXRlZF9hdCc+XG4gICAgYWRkQ3JlYXRlZENvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnY3JlYXRlZF9hdCc+XG4gICAgYWRkVXBkYXRlZENvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAndXBkYXRlZF9hdCc+XG4gIH1cbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRUaW1lc3RhbXBDb2x1bW5zID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4pIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG4gICAgICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRDcmVhdGVkQ29sdW1uID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4pIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbkNyZWF0ZVRhYmxlQnVpbGRlci5wcm90b3R5cGUuYWRkVXBkYXRlZENvbHVtbiA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+LFxuKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmFkZENvbHVtbigndXBkYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxufSIsImltcG9ydCB0eXBlIHsgVXBkYXRlYWJsZSwgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IG5vcm1hbGl6ZXJzIGZyb20gJyNzZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgdmFsdWVzOiBVcGRhdGVhYmxlPERhdGFiYXNlW1RdPlxuICAgIG5vcm1hbGl6ZT86IGJvb2xlYW4gfCAoKHZhbHVlOiBhbnkpID0+IGFueSkgLy8gZGVmYXVsdCB0cnVlXG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbiAgICBxdWVyeT86IChxYjogVXBkYXRlRnJvbTxUPikgPT4gVXBkYXRlRnJvbTxUPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVmYXVsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zPy52YWx1ZXMgfHwgW11cbiAgICBsZXQgcXVlcnkgPSBkYi51cGRhdGVUYWJsZSh0YWJsZSkgYXMgYW55XG5cbiAgICBxdWVyeSA9IHF1ZXJ5LnNldCh2YWx1ZXMpLnJldHVybmluZ0FsbCgpXG5cbiAgICBpZiAob3B0aW9ucz8ucXVlcnkpIHtcbiAgICAgICAgcXVlcnkgPSBvcHRpb25zLnF1ZXJ5KHF1ZXJ5KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHF1ZXJ5LmNvbXBpbGUoKSlcbiAgICB9XG5cbiAgICBsZXQgcm93czogYW55W10gPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcm93cyA9IHJvd3MubWFwKG9wdGlvbnMuc2VyaWFsaXplKVxuICAgIH1cblxuICAgIHJldHVybiByb3dzIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPltdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVNeXNxbDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zPy52YWx1ZXMgfHwgW11cbiAgICBjb25zdCB1cGRhdGVRYiA9IGRiLnVwZGF0ZVRhYmxlKHRhYmxlKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICB1cGRhdGVRYi53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgIH1cblxuICAgIGF3YWl0IHVwZGF0ZVFiLnNldCh2YWx1ZXMpLmV4ZWN1dGUoKVxuXG4gICAgY29uc3Qgc2VsZWN0UWIgPSBkYi5zZWxlY3RGcm9tKHRhYmxlKS5zZWxlY3RBbGwoKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBzZWxlY3RRYi53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhzZWxlY3RRYi5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgc2VsZWN0UWIuZXhlY3V0ZSgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvd3MgPSByb3dzLm1hcChvcHRpb25zLnNlcmlhbGl6ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFVwZGF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCB2YWx1ZXM6IGFueSA9IG9wdGlvbnM/LnZhbHVlcyB8fCB7fVxuXG4gICAgY29uc3Qgbm9ybWFsaXplID0gdHlwZW9mIG9wdGlvbnM/Lm5vcm1hbGl6ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnM/Lm5vcm1hbGl6ZSA6IG5vcm1hbGl6ZXJzLmFsbC50b0RiXG5cbiAgICBpZiAob3B0aW9ucz8ubm9ybWFsaXplICE9PSBmYWxzZSkge1xuICAgICAgICB2YWx1ZXMgPSBub3JtYWxpemUodmFsdWVzKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChkYi5kcml2ZXIgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU15c3FsKHRhYmxlLCBwYXJzZWRPcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVEZWZhdWx0KHRhYmxlLCBwYXJzZWRPcHRpb25zKVxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMsIFVwZGF0ZUZyb20gfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJy4vY3JlYXRlLnRzJ1xuaW1wb3J0IHsgdXBkYXRlIH0gZnJvbSAnLi91cGRhdGUudHMnXG5pbXBvcnQgeyBmaW5kT25lIH0gZnJvbSAnLi9maW5kT25lLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG4gICAgc2VsZWN0PzogKHFiOiBTZWxlY3RGcm9tPFQ+KSA9PiBTZWxlY3RGcm9tPFQ+XG4gICAgdXBkYXRlPzogKHFiOiBVcGRhdGVGcm9tPFQ+KSA9PiBVcGRhdGVGcm9tPFQ+XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPiB8IEluc2VydGFibGU8RGF0YWJhc2VbVF0+W11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZU9yQ3JlYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IGZpbmRPbmUodGFibGUsIHsgXG4gICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgd2hlcmU6IG9wdGlvbnM/LndoZXJlLFxuICAgIH0pXG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgICBhd2FpdCB1cGRhdGUodGFibGUsIHsgXG4gICAgICAgICAgICBkZWJ1Zzogb3B0aW9ucz8uZGVidWcsXG4gICAgICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgICAgIHZhbHVlczogb3B0aW9ucz8udmFsdWVzIGFzIGFueSxcbiAgICAgICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBmaW5kT25lKHRhYmxlLCB7IFxuICAgICAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsICBcbiAgICAgICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSxcbiAgICAgICAgfSkgYXMgUHJvbWlzZTxTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz4+XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZSh0YWJsZSwgeyBcbiAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgdmFsdWVzOiBvcHRpb25zPy52YWx1ZXMgYXMgYW55XG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVkIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuIiwiaW1wb3J0IHsgQ3JlYXRlVGFibGVCdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuZGVjbGFyZSBtb2R1bGUgJ2t5c2VseScge1xuICBpbnRlcmZhY2UgQ3JlYXRlVGFibGVCdWlsZGVyPFRCIGV4dGVuZHMgc3RyaW5nLCBDIGV4dGVuZHMgc3RyaW5nID0gbmV2ZXI+IHtcbiAgICBhZGRJZENvbHVtbjxDTiBleHRlbmRzIHN0cmluZyA9ICdpZCc+KFxuICAgICAgY29sPzogQ05cbiAgICApOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCBDTj5cbiAgfVxufVxuXG5DcmVhdGVUYWJsZUJ1aWxkZXIucHJvdG90eXBlLmFkZElkQ29sdW1uID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4gICAgY29sOiBzdHJpbmcgPSAnaWQnXG4pIHtcbiAgICBpZiAoZGIuZHJpdmVyID09PSAncG9zdGdyZXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ3NlcmlhbCcsIGNvbCA9PiBjb2wucHJpbWFyeUtleSgpKVxuICAgIH1cblxuICAgIGlmIChkYi5kcml2ZXIgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKS5hdXRvSW5jcmVtZW50KCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYWRkQ29sdW1uKGNvbCwgJ2ludGVnZXInLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbn0iLCJpbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi4vcXVlcmllcydcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uPFQgPSBhbnk+IHtcbiAgICBpdGVtczogVFtdXG4gICAgcGFnZTogbnVtYmVyXG4gICAgcGVyX3BhZ2U6IG51bWJlclxuICAgIHRvdGFsOiBudW1iZXJcbiAgICB0b3RhbF9wYWdlczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZE1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlclxuICAgIG9mZnNldD86IG51bWJlclxuICAgIG9yZGVyQnk/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIG9yZGVyRGlyZWN0aW9uPzogJ2FzYycgfCAnZGVzYycgfCAoJ2FzYycgfCAnZGVzYycpW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZU9wdGlvbnMge1xuICAgIHBhZ2U/OiBudW1iZXJcbiAgICBsaW1pdD86IG51bWJlclxuICAgIG9yZGVyQnk/OiBGaW5kTWFueU9wdGlvbnNbJ29yZGVyQnknXVxuICAgIG9yZGVyRGlyZWN0aW9uPzogRmluZE1hbnlPcHRpb25zWydvcmRlckRpcmVjdGlvbiddXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlTWFueU9wdGlvbnMge1xuICAgIGxpbWl0PzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBURW50aXR5ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUHJpbWFyeUtleSA9IGFueSxcbiAgICBUT3B0aW9ucyA9IFJlY29yZDxzdHJpbmcsIGFueT5cbj4ge1xuXG4gICAgcHVibGljIGF1dG9DcmVhdGVkQXQgPSBmYWxzZVxuICAgIHB1YmxpYyBhdXRvVXBkYXRlZEF0ID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgZGI6IEt5c2VseTxhbnk+LCBcbiAgICAgICAgcHJvdGVjdGVkIHRhYmxlOiBzdHJpbmcsIFxuICAgICAgICBwcm90ZWN0ZWQgcHJpbWFyeUtleTogc3RyaW5nXG4gICAgKSB7ICAgIH1cblxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiB7IHFiPzogYW55IH0gJiBUT3B0aW9ucykge1xuICAgICAgICBjb25zdCBxYiA9IG9wdGlvbnM/LnFiIHx8IHRoaXMuZGIuc2VsZWN0RnJvbSh0aGlzLnRhYmxlIGFzIGFueSlcblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG5cbiAgICBhc3luYyBjb3VudChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdCgoZWI6IGFueSkgPT4gZWIuZm4uY291bnRBbGwoKS5hcygnY291bnQnKSlcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0T3JUaHJvdygpXG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihyZXN1bHQuY291bnQpXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZE1hbnkob3B0aW9ucz86IEZpbmRNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShvcHRpb25zKSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmxpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHFiID0gcWIubGltaXQob3B0aW9ucy5saW1pdClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5vZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcWIgPSBxYi5vZmZzZXQob3B0aW9ucy5vZmZzZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub3JkZXJCeSkge1xuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeSA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckJ5KSA/IG9wdGlvbnMub3JkZXJCeSA6IFtvcHRpb25zLm9yZGVyQnldXG4gICAgICAgICAgICBjb25zdCBvcmRlckRpcmVjdGlvbiA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRpcmVjdGlvbikgPyBvcHRpb25zLm9yZGVyRGlyZWN0aW9uIDogW29wdGlvbnMub3JkZXJEaXJlY3Rpb24gPz8gJ2FzYyddXG5cbiAgICAgICAgICAgIG9yZGVyQnkuZm9yRWFjaCgob2IsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgcWIgPSBxYi5vcmRlckJ5KG9iLCBvcmRlckRpcmVjdGlvbltpbmRleF0gfHwgJ2FzYycpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHFiLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRPbmUob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEJ5SWQoaWQ6IFRQcmltYXJ5S2V5LCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucyBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2VsZWN0QWxsKClcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCBpZClcblxuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9XG5cbiAgICBhc3luYyBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXksIG9wdGlvbnM/OiBUT3B0aW9ucykge1xuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5maW5kQnlJZChpZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJdGVtIG5vdCBmb3VuZCcsIDQwNClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHBhZ2luYXRlKG9wdGlvbnM/OiBQYWdpbmF0ZU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8UGFnaW5hdGlvbj4ge1xuICAgICAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiAob3B0aW9ucz8ubGltaXQgPz8gMTApXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gMTBcblxuICAgICAgICBjb25zdCBmaW5kQWxsT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBsaW1pdCxcbiAgICAgICAgICAgIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY291bnRPcHRpb25zID0geyAuLi5vcHRpb25zIH1cblxuICAgICAgICBjb25zdCBbaXRlbXMsIHRvdGFsSXRlbXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5maW5kTWFueShmaW5kQWxsT3B0aW9ucyBhcyBhbnkpLFxuICAgICAgICAgICAgdGhpcy5jb3VudChjb3VudE9wdGlvbnMgYXMgYW55KVxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwZXJfcGFnZTogbGltaXQsXG4gICAgICAgICAgICB0b3RhbDogdG90YWxJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodG90YWxJdGVtcyAvIGxpbWl0KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZUNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KTogUHJvbWlzZTxQYXJ0aWFsPFRFbnRpdHk+PiB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmUgbm9uIHVzZWQgcGFyYW1ldGVyIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgY2hpbGQgY2xhc3NcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGFzeW5jIGFmdGVyQ3JlYXRlKGRhdGE6IFRFbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlKGRhdGE6IFBhcnRpYWw8VEVudGl0eT4pOiBQcm9taXNlPFRFbnRpdHk+IHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0NyZWF0ZWRBdCkge1xuICAgICAgICAgICAgc2V0KGRhdGEsICdjcmVhdGVkX2F0Jywgbm93KCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlZEF0KSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgJ3VwZGF0ZWRfYXQnLCBub3coKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmJlZm9yZUNyZWF0ZShkYXRhKSBcblxuICAgICAgICBsZXQgcWIgPSB0aGlzLmRiLmluc2VydEludG8odGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIudmFsdWVzKGRhdGEpLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckNyZWF0ZShyZXN1bHQpXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyBhbnlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlQ3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10pOiBQcm9taXNlPFBhcnRpYWw8VEVudGl0eT5bXT4ge1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckNyZWF0ZU1hbnkoZGF0YTogVEVudGl0eVtdKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10pIHtcbiAgICAgICAgaWYgKHRoaXMuYXV0b0NyZWF0ZWRBdCkge1xuICAgICAgICAgICAgZGF0YSA9IGRhdGEubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIHNldChpdGVtLCAnY3JlYXRlZF9hdCcsIG5vdygpKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuYmVmb3JlQ3JlYXRlTWFueShkYXRhKSBcblxuICAgICAgICBsZXQgcWIgPSB0aGlzLmRiLmluc2VydEludG8odGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIudmFsdWVzKGRhdGEpLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZSgpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckNyZWF0ZU1hbnkocmVzdWx0KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgYW55W11cbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yZSBub24gdXNlZCBwYXJhbWV0ZXIgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjaGlsZCBjbGFzc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlVXBkYXRlKGRhdGE6IFBhcnRpYWw8VEVudGl0eT4sIGlkOiBUUHJpbWFyeUtleSk6IFByb21pc2U8UGFydGlhbDxURW50aXR5Pj4ge1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlclVwZGF0ZShkYXRhOiBURW50aXR5KTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5LCBkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGRhdGVkQXQpIHtcbiAgICAgICAgICAgIHNldChkYXRhLCAndXBkYXRlZF9hdCcsIG5vdygpKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuYmVmb3JlVXBkYXRlKGRhdGEsIGlkKSBcblxuICAgICAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBhd2FpdCB0aGlzLmZpbmRCeUlkT3JGYWlsKGlkKVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIudXBkYXRlVGFibGUodGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2V0KGRhdGEpXG4gICAgICAgICAgICAud2hlcmUodGhpcy5wcmltYXJ5S2V5LCAnPScsIHJvd1t0aGlzLnByaW1hcnlLZXldKVxuICAgICAgICAgICAgLnJldHVybmluZ0FsbCgpXG5cbiAgICAgICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJVcGRhdGUodXBkYXRlZClcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yZSBub24gdXNlZCBwYXJhbWV0ZXIgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjaGlsZCBjbGFzc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlRGVsZXRlKGlkOiBUUHJpbWFyeUtleSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmUgbm9uIHVzZWQgcGFyYW1ldGVyIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgY2hpbGQgY2xhc3NcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGFzeW5jIGFmdGVyRGVsZXRlKGlkOiBUUHJpbWFyeUtleSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlbGV0ZUJ5SWQoaWQ6IFRQcmltYXJ5S2V5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlRGVsZXRlKGlkKVxuXG4gICAgICAgIGNvbnN0IHJvdzogUmVjb3JkPHN0cmluZywgYW55PiA9IGF3YWl0IHRoaXMuZmluZEJ5SWRPckZhaWwoaWQpXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5kYi5kZWxldGVGcm9tKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCByb3dbdGhpcy5wcmltYXJ5S2V5XSlcblxuICAgICAgICBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyRGVsZXRlKGlkKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBiZWZvcmVEZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKXtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnNcblxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JlIG5vbiB1c2VkIHBhcmFtZXRlciBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGNoaWxkIGNsYXNzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBhZnRlckRlbGV0ZU1hbnkob3B0aW9ucz86IERlbGV0ZU1hbnlPcHRpb25zICYgVE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZCB7XG5cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLmJlZm9yZURlbGV0ZU1hbnkob3B0aW9ucyApXG5cbiAgICAgICAgY29uc3QgZGVsZXRlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBxYjogdGhpcy5kYi5kZWxldGVGcm9tKHRoaXMudGFibGUgYXMgYW55KVxuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KGRlbGV0ZU9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBpZiAob3B0aW9ucz8ubGltaXQpIHtcbiAgICAgICAgICAgIHFiID0gcWIubGltaXQob3B0aW9ucy5saW1pdClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHFiLmV4ZWN1dGUoKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJEZWxldGVNYW55KG9wdGlvbnMpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeUluZmVyIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL0RhdGFiYXNlUmVwb3NpdG9yeUluZmVyTWl4aW4udHMnXG5pbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cydcbmltcG9ydCB7IGNvbXBvc2UsIG1peGluIH0gZnJvbSAnI3NoYXJlZC91dGlscy9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgVG9rZW4gfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvdG9rZW5TY2hlbWEudHMnXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0bydcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBzZWFyY2g/OiBzdHJpbmdcbiAgICB0eXBlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlcG9zaXRvcnlHZW5lcmF0ZU9wdGlvbnMge1xuICAgIHVzZXJfaWQ6IG51bWJlclxuICAgIHR5cGU/OiBzdHJpbmdcbiAgICBleHBpcmVzX2luX2hvdXJzPzogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRva2VuUmVwb3NpdG9yeSBleHRlbmRzIGNvbXBvc2UoXG4gICAgbWl4aW4oRGF0YWJhc2VSZXBvc2l0b3J5KSxcbiAgICBEYXRhYmFzZVJlcG9zaXRvcnlJbmZlcjxUb2tlbiwgVG9rZW5bJ2lkJ10sIFRva2VuUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4oKVxuKSB7XG4gICAgcHVibGljIGF1dG9DcmVhdGVkQXQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgcHVibGljIGF1dG9VcGRhdGVkQXQ6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSkge1xuICAgICAgICBzdXBlcihkYiwgJ3Rva2VucycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ25hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy50eXBlKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy50eXBlKSA/IG9wdGlvbnMudHlwZSA6IFtvcHRpb25zLnR5cGVdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ3R5cGUnLCAnaW4nLCB0eXBlcylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQnlUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IG51bGw+IHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeSgpIGFzIGFueVxuXG4gICAgICAgIHFiID0gcWIuc2VsZWN0QWxsKClcblxuICAgICAgICBxYiA9IHFiLndoZXJlKCd0b2tlbicsICc9JywgdG9rZW4pXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtIHx8IG51bGxcbiAgICB9XG5cbiAgICBhc3luYyBnZW5lcmF0ZShvcHRpb25zOiBUb2tlblJlcG9zaXRvcnlHZW5lcmF0ZU9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSByYW5kb21CeXRlcyg2NCkudG9TdHJpbmcoJ2hleCcpXG5cbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gb3B0aW9ucy5leHBpcmVzX2luX2hvdXJzXG4gICAgICAgICAgICA/IG5ldyBEYXRlKERhdGUubm93KCkgKyBvcHRpb25zLmV4cGlyZXNfaW5faG91cnMgKiA2MCAqIDYwICogMTAwMClcbiAgICAgICAgICAgIDogbnVsbFxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICB1c2VyX2lkOiBvcHRpb25zLnVzZXJfaWQsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZSB8fCAnYXV0aCcsXG4gICAgICAgICAgICBleHBpcmVzX2F0OiBleHBpcmVzQXRcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IFRva2VuUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9Ub2tlblJlcG9zaXRvcnkudHMnXG5cbmNvbnN0IHRva2VuUmVwb3NpdG9yeSA9IG5ldyBUb2tlblJlcG9zaXRvcnkoZGIgYXMgYW55KVxuXG5leHBvcnQgZGVmYXVsdCB0b2tlblJlcG9zaXRvcnlcblxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcbmltcG9ydCB7IEVtbWl0dGVyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbmNvbnN0IGVtbWl0dGVyID0gY29udGFpbmVyLnByb3h5PEVtbWl0dGVyU2VydmljZT4oRW1taXR0ZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBlbW1pdHRlclxuXG4iLCJcbmltcG9ydCBIYXNoZXJTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvSGFzaGVyU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXIudHMnXG5cbmNvbnN0IGhhc2hlciA9IGNvbnRhaW5lci5wcm94eTxIYXNoZXJTZXJ2aWNlPihIYXNoZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBoYXNoZXJcblxuIiwiaW1wb3J0IGVtbWl0dGVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9lbW1pdHRlci50cydcbmltcG9ydCBoYXNoZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2hhc2hlci50cydcbmltcG9ydCB0eXBlIHsgVXNlckVudGl0eSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJy4vRGF0YWJhc2VSZXBvc2l0b3J5J1xuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJSZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgc2VhcmNoPzogc3RyaW5nXG4gICAgZW1haWw/OiBzdHJpbmdcbiAgICB1c2VybmFtZT86IHN0cmluZ1xuICAgIHNob3dEZWxldGVkPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJSZXBvc2l0b3J5RXZlbnRzIHtcbiAgICAndXNlcjpjcmVhdGVkJzoge1xuICAgICAgICB1c2VyOiBVc2VyRW50aXR5XG4gICAgfVxuICAgICd1c2VyOnVwZGF0ZWQnOiB7XG4gICAgICAgIHVzZXI6IFVzZXJFbnRpdHlcbiAgICB9XG4gICAgJ3VzZXI6ZGVsZXRlZCc6IHtcbiAgICAgICAgdXNlcjogVXNlckVudGl0eVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXNlclJlcG9zaXRvcnkgZXh0ZW5kcyBEYXRhYmFzZVJlcG9zaXRvcnk8VXNlckVudGl0eSwgbnVtYmVyLCBVc2VyUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucz4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1VzZXJSZXBvc2l0b3J5J1xuICAgIHB1YmxpYyBhdXRvQ3JlYXRlZEF0ID0gdHJ1ZSBcbiAgICBwdWJsaWMgYXV0b1VwZGF0ZWRBdCA9IHRydWVcblxuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICd1c2VycycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc2hVc2VyUGFzc3dvcmRJZkRlZmluZWQoZGF0YTogUGFydGlhbDxVc2VyRW50aXR5Pikge1xuICAgICAgICBpZiAoZGF0YS5wYXNzd29yZCkge1xuICAgICAgICAgICAgZGF0YS5wYXNzd29yZCA9IGF3YWl0IGhhc2hlci5oYXNoKGRhdGEucGFzc3dvcmQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlQ3JlYXRlKGRhdGE6IFBhcnRpYWw8VXNlckVudGl0eT4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYXNoVXNlclBhc3N3b3JkSWZEZWZpbmVkKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlQ3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFVzZXJFbnRpdHk+W10pOiBQcm9taXNlPFBhcnRpYWw8VXNlckVudGl0eT5bXT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZGF0YSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5oYXNoVXNlclBhc3N3b3JkSWZEZWZpbmVkKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBiZWZvcmVVcGRhdGUoZGF0YTogUGFydGlhbDxVc2VyRW50aXR5Pikge1xuICAgICAgICBhd2FpdCB0aGlzLmhhc2hVc2VyUGFzc3dvcmRJZkRlZmluZWQoZGF0YSlcblxuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckNyZWF0ZShkYXRhOiBVc2VyRW50aXR5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGVtbWl0dGVyLmVtaXQoJ3VzZXI6Y3JlYXRlZCcsIHtcbiAgICAgICAgICAgIHVzZXI6IGRhdGFcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcXVlcnkob3B0aW9uczogVXNlclJlcG9zaXRvcnlRdWVyeU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBsZXQgcXVlcnkgPSBzdXBlci5xdWVyeShvcHRpb25zKVxuXG4gICAgICAgIGlmICghb3B0aW9ucy5zaG93RGVsZXRlZCkge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgnZGVsZXRlZF9hdCcsICdpcycsIG51bGwpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoKGViOiBhbnkpID0+IGViLm9yKFtcbiAgICAgICAgICAgICAgICBlYignbmFtZScsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKSxcbiAgICAgICAgICAgICAgICBlYigndXNlcm5hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYCksXG4gICAgICAgICAgICAgICAgZWIoJ2VtYWlsJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy5zZWFyY2h9JWApLFxuICAgICAgICAgICAgXSkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvcHRpb25zXG4gICAgICAgIGlmIChvcHRpb25zPy5lbWFpbCkge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgnZW1haWwnLCAnPScsIG9wdGlvbnMuZW1haWwpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8udXNlcm5hbWUpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ3VzZXJuYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy51c2VybmFtZX0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmlkKSA/IG9wdGlvbnMuaWQgOiBbb3B0aW9ucy5pZF1cblxuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgnaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG59XG4iLCJpbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IFVzZXJSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1VzZXJSZXBvc2l0b3J5LnRzJ1xuXG5jb25zdCB1c2VyUmVwb3NpdG9yeSA9IG5ldyBVc2VyUmVwb3NpdG9yeShkYiBhcyBhbnkpXG5cbmV4cG9ydCBkZWZhdWx0IHVzZXJSZXBvc2l0b3J5XG5cbiIsImltcG9ydCB0b2tlblJlcG9zaXRvcnkgZnJvbSBcIiNzZXJ2ZXIvZmFjYWRlcy90b2tlblJlcG9zaXRvcnkudHNcIlxuaW1wb3J0IHVzZXJSZXBvc2l0b3J5IGZyb20gXCIjc2VydmVyL2ZhY2FkZXMvdXNlclJlcG9zaXRvcnkudHNcIlxuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiwgVXNlckVudGl0eSB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCJcbmltcG9ydCB0eXBlIEh0dHBTZXJ2aWNlIGZyb20gXCIuL0h0dHBTZXJ2aWNlXCJcbmltcG9ydCBzdXBlcnRlc3QsIHsgdHlwZSBUZXN0IH0gZnJvbSAnc3VwZXJ0ZXN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBUZXN0ZXJTZXJ2aWNlT3B0aW9ucyB7XG4gICAgaHR0cDogSHR0cFNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSHR0cFRlc3RlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0h0dHBUZXN0ZXJTZXJ2aWNlJ1xuICAgIHB1YmxpYyBodHRwOiBIdHRwU2VydmljZVxuICAgIHB1YmxpYyByZXF1ZXN0OiBzdXBlcnRlc3QuU3VwZXJUZXN0PHN1cGVydGVzdC5UZXN0PlxuICAgIHB1YmxpYyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICBwdWJsaWMgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBIdHRwVGVzdGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5odHRwID0gb3B0aW9ucy5odHRwXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHN1cGVydGVzdCh0aGlzLmh0dHAuZ2V0RXhwcmVzc0FwcCgpKVxuICAgIH1cblxuXG4gICAgcHVibGljIGNyZWF0ZShyZXF1ZXN0OiBUZXN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuaGVhZGVycykpIHtcbiAgICAgICAgICAgIHJlcXVlc3Quc2V0KGtleSwgdmFsdWUpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmNvb2tpZXMpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNldCgnQ29va2llJywgYCR7a2V5fT0ke3ZhbHVlfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVxdWVzdFxuXG4gICAgfVxuXG4gICAgcHVibGljIGdldCh1cmw6IHN0cmluZyk6IFRlc3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5yZXF1ZXN0LmdldCh1cmwpKVxuICAgIH1cblxuICAgIHB1YmxpYyBwb3N0KHVybDogc3RyaW5nLCBib2R5PzogYW55KTogVGVzdCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh0aGlzLnJlcXVlc3QucG9zdCh1cmwpLnNlbmQoYm9keSkpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvZ2luQnlVc2VyKHVzZXI6IFVzZXJFbnRpdHkpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0b2tlblJlcG9zaXRvcnkuZ2VuZXJhdGUoe1xuICAgICAgICAgICAgdXNlcl9pZDogdXNlci5pZCxcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvb2tpZXNbJ0F1dGhvcml6YXRpb24nXSA9IHRva2VuLnRva2VuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvZ2luQnlVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUmVwb3NpdG9yeS5maW5kT25lKHsgdXNlcm5hbWUgfSlcblxuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdVc2VyIG5vdCBmb3VuZCcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5sb2dpbkJ5VXNlcih1c2VyKVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGltcG9ydEFsbCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvaW1wb3J0QWxsLnRzJztcbmltcG9ydCBMaWZlY3ljbGVIb29rIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyc7XG5pbXBvcnQgQmFzZUxpZmVjeWNsZVNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSBleHRlbmRzIEJhc2VMaWZlY3ljbGVTZXJ2aWNlIHtcbiAgICBwdWJsaWMgYXN5bmMgYWRkRGlyZWN0b3J5KGRpcm5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtb2RzID0gYXdhaXQgaW1wb3J0QWxsKGRpcm5hbWUpXG4gICAgICAgIGNvbnN0IGhvb2tzOiBMaWZlY3ljbGVIb29rW10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMobW9kcykpIHtcbiAgICAgICAgICAgIGNvbnN0IEhvb2tDbGFzcyA9IG1vZC5kZWZhdWx0IHx8IG1vZFxuICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgSG9va0NsYXNzKCkgYXMgTGlmZWN5Y2xlSG9va1xuXG4gICAgICAgICAgICBpbnN0YW5jZS5ob29rX2lkID0gaW5zdGFuY2UuaG9va19pZCB8fCBuYW1lXG5cbiAgICAgICAgICAgIGhvb2tzLnB1c2goaW5zdGFuY2UpXG4gICAgICAgIH1cblxuICAgICAgICBob29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5hZGQoaG9vaykpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBFeHByZXNzaW9uQnVpbGRlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhZmlsdGVyIHtcbiAgICBlcT86IHN0cmluZyxcbiAgICBuZXE/OiBzdHJpbmcsXG4gICAgXG4gICAgbGlrZT86IHN0cmluZyxcbiAgICBubGlrZT86IHN0cmluZyxcblxuICAgIGluPzogc3RyaW5nW10sXG4gICAgbmluPzogc3RyaW5nW10sXG5cbiAgICBndD86IHN0cmluZyxcbiAgICBndGU/OiBzdHJpbmcsXG4gICAgbHQ/OiBzdHJpbmcsXG4gICAgbHRlPzogc3RyaW5nLFxuXG4gICAgaXNfbnVsbD86IGJvb2xlYW5cbiAgICBleGlzdHM/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFRdWVyeVBheWxvYWQge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE1ldGFkYWZpbHRlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXRhZGF0YVF1ZXJ5U2VydmljZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBwcml2YXRlIHBheWxvYWQ6IE1ldGFkYXRhUXVlcnlQYXlsb2FkXG4gICAgcHJpdmF0ZSB0YWJsZTogVFxuICAgIHByaXZhdGUgZm9yZWlnbktleToga2V5b2YgRGF0YWJhc2VbVF1cbiAgICBwcml2YXRlIHBhcmVudEtleSA9ICdpZCdcblxuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQ6IE1ldGFkYXRhUXVlcnlQYXlsb2FkLCB0YWJsZTogVCwgZm9yZWlnbktleToga2V5b2YgRGF0YWJhc2VbVF0sIHBhcmVudEtleT86IHN0cmluZykge1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkXG4gICAgICAgIHRoaXMudGFibGUgPSB0YWJsZVxuICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBmb3JlaWduS2V5XG5cbiAgICAgICAgaWYgKHBhcmVudEtleSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRLZXkgPSBwYXJlbnRLZXlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmVlZFdoZXJlSW4oKXtcbiAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uLmVxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubmVxICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubGlrZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLm5saWtlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24uaW4gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5uaW4gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5ndCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmd0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmx0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubHRlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24uaXNfbnVsbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmV4aXN0cyA9PT0gdHJ1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbmVlZFdoZXJlTm90SW4oKXtcbiAgICAgICAgZm9yIChjb25zdCBjb25kaXRpb24gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmIChjb25kaXRpb24uZXhpc3RzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgYXBwbHkoZGJRdWVyeTogYW55KSB7XG4gICAgICAgIGxldCBxdWVyeSA9IGRiUXVlcnlcblxuICAgICAgICBpZiAodGhpcy5uZWVkV2hlcmVJbikge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgICAgIC53aGVyZSh0aGlzLnBhcmVudEtleSwgJ2luJywgKGViOiBhbnkpID0+IFxuICAgICAgICAgICAgICAgICAgICBlYi5zZWxlY3RGcm9tKHRoaXMudGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KHRoaXMuZm9yZWlnbktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZSh0aGlzLndoZXJlSW4oZWIpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5lZWRXaGVyZU5vdEluKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAgICAgLndoZXJlKHRoaXMucGFyZW50S2V5LCAnbm90IGluJywgKGViOiBhbnkpID0+IFxuICAgICAgICAgICAgICAgICAgICBlYi5zZWxlY3RGcm9tKHRoaXMudGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KHRoaXMuZm9yZWlnbktleSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC53aGVyZSh0aGlzLndoZXJlTm90SW4oZWIpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeVxuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRSb3dDb25kaXRpb25zKGViOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4sIG5hbWU6IHN0cmluZywgY29uZGl0aW9uOiBzdHJpbmcgfCBNZXRhZGFmaWx0ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIGViLmViKCduYW1lJywgJz0nLCBuYW1lKSxcbiAgICAgICAgICAgICAgICBlYi5lYigndmFsdWUnLCAnPScsIGNvbmRpdGlvbilcbiAgICAgICAgICAgIF1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsYXVzZXMgPSBbXG4gICAgICAgICAgICBlYi5lYignbmFtZScsICc9JywgbmFtZSlcbiAgICAgICAgXVxuXG4gICAgICAgIGlmIChjb25kaXRpb24uZXEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICc9JywgY29uZGl0aW9uLmVxKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubmVxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnIT0nLCBjb25kaXRpb24ubmVxKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubGlrZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJ2xpa2UnLCBjb25kaXRpb24ubGlrZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLm5saWtlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnbm90IGxpa2UnLCBjb25kaXRpb24ubmxpa2UpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5pbikge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICdpbicsIGNvbmRpdGlvbi5pbikpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLm5pbikge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICdub3QgaW4nLCBjb25kaXRpb24ubmluKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24uZ3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICc+JywgY29uZGl0aW9uLmd0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24uZ3RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnPj0nLCBjb25kaXRpb24uZ3RlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICc8JywgY29uZGl0aW9uLmx0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24ubHRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnPD0nLCBjb25kaXRpb24ubHRlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24uaXNfbnVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgY29uZGl0aW9uLmlzX251bGwgPyAnaXMnIDogJ2lzIG5vdCcsIG51bGwpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNsYXVzZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgd2hlcmVJbiA9IDxEQlF1ZXJ5PihlYjogIEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAgICBsZXQgcXVlcnkgPSBlYiBhcyBhbnlcblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uICE9PSAnc3RyaW5nJyAmJiBjb25kaXRpb24uZXhpc3RzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkuYW5kKHRoaXMuYnVpbGRSb3dDb25kaXRpb25zKGViLCBuYW1lLCBjb25kaXRpb24pKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5IGFzIERCUXVlcnlcbiAgICB9XG5cbiAgICBwdWJsaWMgd2hlcmVOb3RJbiA9IDxEQlF1ZXJ5PihlYjogIEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgICAgICBsZXQgcXVlcnkgPSBlYiBhcyBhbnlcblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBjb25kaXRpb25dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucGF5bG9hZCkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnc3RyaW5nJykgY29udGludWVcblxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbi5leGlzdHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeSgnbmFtZScsICc9JywgbmFtZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeSBhcyBEQlF1ZXJ5XG4gICAgfVxufVxuIiwiaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWRhdGFTZXJ2aWNlIHtcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyB0YWJsZTogc3RyaW5nXG4gICAgcHVibGljIGZvcmVpZ25LZXk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogUGljazxNZXRhZGF0YVNlcnZpY2UsICd0YWJsZScgfCAnZm9yZWlnbktleScgfCAnaWQnPikge1xuICAgICAgICB0aGlzLmlkID0gcGF5bG9hZC5pZFxuICAgICAgICB0aGlzLnRhYmxlID0gcGF5bG9hZC50YWJsZVxuICAgICAgICB0aGlzLmZvcmVpZ25LZXkgPSBwYXlsb2FkLmZvcmVpZ25LZXlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdqc29uOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZS5zbGljZSg1KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2Jvb2w6JykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSg1KSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdudW1iZXI6JykpIHtcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUuc2xpY2UoNykpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ3N0cmluZzonKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDcpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZsYXR0ZW4oaXRlbXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH0+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICByZXN1bHRbaXRlbS5uYW1lXSA9IE1ldGFkYXRhU2VydmljZS5wYXJzZShpdGVtLnZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBcblxuICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPlxuICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiBQcm9taXNlPFQ+XG4gICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0aGlzLnRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUoKHRoaXMuZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG4gICAgICAgICAgICAud2hlcmUoJ25hbWUnLCAnPScsIG5hbWUpXG4gICAgICAgICAgICAubGltaXQoMSlcblxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyeS5leGVjdXRlVGFrZUZpcnN0KCkgXG5cbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBNZXRhZGF0YVNlcnZpY2UucGFyc2Uocm93LnZhbHVlKVxuXG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMuZm9yZWlnbktleVxuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVcblxuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICBbZm9yZWlnbktleV06IHRoaXMuaWQsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB2YWx1ZXMudmFsdWUgPSBganNvbjoke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBkYi5zZWxlY3RGcm9tKHRhYmxlIGFzIGFueSkud2hlcmUoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCB0aGlzLmlkKS53aGVyZSgnbmFtZScsICc9JywgbmFtZSkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgYXdhaXQgZGIudXBkYXRlVGFibGUodGFibGUgYXMgYW55KVxuICAgICAgICAgICAgICAgIC5zZXQodmFsdWVzKVxuICAgICAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG4gICAgICAgICAgICAgICAgLndoZXJlKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBkYi5pbnNlcnRJbnRvKHRhYmxlIGFzIGFueSlcbiAgICAgICAgICAgIC52YWx1ZXModmFsdWVzKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9Pj4ge1xuICAgICAgICBjb25zdCBmb3JlaWduS2V5ID0gdGhpcy5mb3JlaWduS2V5XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZVxuXG4gICAgICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxdWVyeSA9IHF1ZXJ5XG4gICAgICAgICAgICAuc2VsZWN0QWxsKClcbiAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsIHRoaXMuaWQpXG5cbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxuXG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93OiBhbnkpID0+ICh7XG4gICAgICAgICAgICBuYW1lOiByb3cubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBNZXRhZGF0YVNlcnZpY2UucGFyc2Uocm93LnZhbHVlKVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWxsKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgICAgICByZXN1bHRbcm93Lm5hbWVdID0gcm93LnZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSBcIiNzaGFyZWQvaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSBcImt5c2VseVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbkVudGl5RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaWdyYXRpb25FbnRpdHkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgc291cmNlOiBzdHJpbmcgfCBudWxsXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZXhlY3V0ZWRBdDogRGF0ZSB8IG51bGxcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IE1pZ3JhdGlvbkVudGl5RGF0YSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWVcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZVxuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZGF0YS5maWxlbmFtZVxuICAgICAgICB0aGlzLmV4ZWN1dGVkQXQgPSBkYXRhLmV4ZWN1dGVkQXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXAoZGI6IEt5c2VseTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydCh0aGlzLmZpbGVuYW1lKVxuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kLnVwICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTWlncmF0aW9uICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBleHBvcnQgYW4gdXAgZnVuY3Rpb25gKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbW9kLnVwKGRiKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3duKGRiOiBLeXNlbHk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQodGhpcy5maWxlbmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIG1vZC5kb3duICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTWlncmF0aW9uICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBleHBvcnQgYSBkb3duIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZC5kb3duKGRiKVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gJ2RhdGUtZm5zJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IE1pZ3JhdGlvbkVudGl0eSBmcm9tICcjc2VydmVyL2VudGl0aWVzL01pZ3JhdGlvbkVudGl0eS50cydcbmltcG9ydCB7IG9yZGVyQnkgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25Tb3VyY2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgZXhlY3V0ZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZpbHRlcnMge1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBuYW1lPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBNaWdyYXRpb25SZXN1bHQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICByZXN1bHQ6ICdzdWNjZXNzJyB8ICdmYWlsZWQnO1xuICAgIGVycm9yPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdG9yU2VydmljZU9wdGlvbnMge1xuICAgIHNvdXJjZXM6IE1pZ3JhdGlvblNvdXJjZVtdO1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdG9yU2VydmljZUV2ZW50cyB7XG4gICAgJ21pZ3JhdG9yOmJlZm9yZS1taWdyYXRlJzoge1xuICAgICAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXVxuICAgIH1cbiAgICAnbWlncmF0b3I6YWZ0ZXItbWlncmF0ZSc6IHtcbiAgICAgICAgbWlncmF0aW9uczogTWlncmF0aW9uRW50aXR5W11cbiAgICB9XG4gICAgJ21pZ3JhdG9yOmJlZm9yZS1yb2xsYmFjayc6IHtcbiAgICAgICAgbWlncmF0aW9uczogTWlncmF0aW9uRW50aXR5W11cbiAgICB9XG4gICAgJ21pZ3JhdG9yOmFmdGVyLXJvbGxiYWNrJzoge1xuICAgICAgICBtaWdyYXRpb25zOiBNaWdyYXRpb25FbnRpdHlbXVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNaWdyYXRvclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ01pZ3JhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRiOiBLeXNlbHk8YW55PlxuICAgIHB1YmxpYyBzb3VyY2VzOiBNaWdyYXRpb25Tb3VyY2VbXVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogTWlncmF0b3JTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBvcHRpb25zLmVtbWl0dGVyIHx8IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kYiA9IG9wdGlvbnMuZGJcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gb3B0aW9ucy5zb3VyY2VzXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvdXJjZShzb3VyY2U6IE1pZ3JhdGlvblNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMucHVzaChzb3VyY2UpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBlbnN1cmVNaWdyYXRpb25zVGFibGUoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZGIuc2NoZW1hXG4gICAgICAgICAgICAuY3JlYXRlVGFibGUoJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLmlmTm90RXhpc3RzKClcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ25hbWUnLCAndmFyY2hhcigyNTUpJywgKGNvbCkgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ21vZHVsZScsICd2YXJjaGFyKDI1NSknKSAvLyBtb2R1bGUgd2lsbCBiZSByZW5hbWVkIHRvIHNvdXJjZSBpbiBmdXR1cmUgdmVyc2lvbnNcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2V4ZWN1dGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+IGNvbC5ub3ROdWxsKCkpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3RTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpIHtcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc291cmNlLmRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYE1pZ3JhdGlvbiBzb3VyY2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0OiAke3NvdXJjZS5kaXJlY3Rvcnl9YClcblxuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2UuZGlyZWN0b3J5KVxuICAgICAgICBjb25zdCBleHRlbnNpb25zID0gWycuanMnLCAnLnRzJywgJy5tanMnLCAnLm10cyddXG5cbiAgICAgICAgY29uc3QgaXRlbXM6IE1pZ3JhdGlvbkVudGl0eVtdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghZXh0ZW5zaW9ucy5zb21lKGV4dCA9PiBlbnRyeS5lbmRzV2l0aChleHQpKSkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oc291cmNlLmRpcmVjdG9yeSwgZW50cnkpXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGF0aC5iYXNlbmFtZShlbnRyeSwgcGF0aC5leHRuYW1lKGVudHJ5KSlcblxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gbmV3IE1pZ3JhdGlvbkVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZS5pZCxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZnVsbFBhdGgsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3QoZmlsdGVycz86IExpc3RGaWx0ZXJzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBsZXQgaXRlbXMgPSBbXSBhcyBNaWdyYXRpb25FbnRpdHlbXVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3Qgc291cmNlIG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgY29uc3QgbWlncmF0aW9ucyA9IGF3YWl0IHRoaXMubGlzdFNvdXJjZShzb3VyY2UpXG5cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goLi4ubWlncmF0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBleGVjdXRlZCBtaWdyYXRpb25zIGZyb20gZGF0YWJhc2VcbiAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuc2VsZWN0RnJvbSgnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAuc2VsZWN0QWxsKClcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgZXhlY3V0ZWQpIHtcbiAgICAgICAgICAgIGlmICghZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBlLnNvdXJjZSA9ICdyb290J1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtID0gaXRlbXMuZmluZChtID0+IG0ubmFtZSA9PT0gZS5uYW1lKVxuXG4gICAgICAgICAgICBpZiAoIW0pIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIG0uZXhlY3V0ZWRBdCA9IG5ldyBEYXRlKGUuZXhlY3V0ZWRfYXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVycz8uc291cmNlKSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihtID0+IG0uc291cmNlID09PSBmaWx0ZXJzLnNvdXJjZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzPy5uYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IEFycmF5LmlzQXJyYXkoZmlsdGVycy5uYW1lKSA/IGZpbHRlcnMubmFtZSA6IFtmaWx0ZXJzLm5hbWVdXG5cbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKG0gPT4gbmFtZXMuaW5jbHVkZXMobS5uYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGl0ZW1zID0gb3JkZXJCeShpdGVtcywgWydzb3VyY2UnLCAnbmFtZSddLCBbJ2FzYycsICdhc2MnXSlcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVVcChtaWdyYXRpb246IE1pZ3JhdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBtaWdyYXRpb24udXAodGhpcy5kYilcblxuICAgICAgICBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuaW5zZXJ0SW50bygnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAudmFsdWVzKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZWRfYXQ6IGZvcm1hdChuZXcgRGF0ZSgpLCAneXl5eS1NTS1kZCBISDptbTpzcycpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGAke21pZ3JhdGlvbi5uYW1lfSBtaWdyYXRlZCBzdWNjZXNzZnVsbHlgKVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlRG93bihtaWdyYXRpb246IE1pZ3JhdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCBtaWdyYXRpb24uZG93bih0aGlzLmRiKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZGJcbiAgICAgICAgICAgIC5kZWxldGVGcm9tKCdtaWdyYXRpb25zJylcbiAgICAgICAgICAgIC53aGVyZSgnbmFtZScsICc9JywgbWlncmF0aW9uLm5hbWUpXG4gICAgICAgICAgICAud2hlcmUoJ21vZHVsZScsICc9JywgbWlncmF0aW9uLnNvdXJjZSlcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGAke21pZ3JhdGlvbi5uYW1lfSByb2xsZWQgYmFjayBzdWNjZXNzZnVsbHlgKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWlncmF0ZUZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgbWlncmF0aW9uID0gbWlncmF0aW9ucy5maW5kKG0gPT4gbS5maWxlbmFtZSA9PT0gZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYE1pZ3JhdGlvbiAke2ZpbGVuYW1lfSBub3QgZm91bmRgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbi5leGVjdXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMubWlncmF0ZVVwKG1pZ3JhdGlvbikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByb2xsYmFja0ZpbGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgdGhpcy5saXN0KClcbiAgICAgICAgY29uc3QgbWlncmF0aW9uID0gbWlncmF0aW9ucy5maW5kKG0gPT4gbS5maWxlbmFtZSA9PT0gZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFtaWdyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSksXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yOiBgTWlncmF0aW9uICR7ZmlsZW5hbWV9IG5vdCBmb3VuZGBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbWlncmF0aW9uLmV4ZWN1dGVkQXQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG1pZ3JhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnc3VjY2VzcycsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gdGhpcy5taWdyYXRlRG93bihtaWdyYXRpb24pKVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgcmVzdWx0OiAnc3VjY2VzcydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBtaWdyYXRlKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBsZXQgbWlncmF0aW9ucyA9IGF3YWl0IHRoaXMubGlzdChmaWx0ZXJzKVxuXG4gICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLmZpbHRlcihtID0+ICFtLmV4ZWN1dGVkQXQpXG5cbiAgICAgICAgbWlncmF0aW9ucy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLnN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLnNsaWNlKDAsIGZpbHRlcnMuc3RlcHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YmVmb3JlLW1pZ3JhdGUnLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHRbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5taWdyYXRlRmlsZShtaWdyYXRpb24uZmlsZW5hbWUpXG5cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXG5cbiAgICAgICAgICAgIC8vIFN0b3Agb24gZmlyc3QgZmFpbHVyZVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09ICdmYWlsZWQnKSB7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1taXR0ZXIuZW1pdEFuZFdhaXQoJ21pZ3JhdG9yOmFmdGVyLW1pZ3JhdGUnLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLFxuICAgICAgICAgICAgcmVzdWx0c1xuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJvbGxiYWNrKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTWlncmF0aW9uc1RhYmxlKClcblxuICAgICAgICBsZXQgbWlncmF0aW9ucyA9IGF3YWl0IHRoaXMubGlzdChmaWx0ZXJzKVxuXG4gICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLmZpbHRlcihtID0+IG0uZXhlY3V0ZWRBdClcblxuICAgICAgICBtaWdyYXRpb25zLnNvcnQoKGEsIGIpID0+IGIubmFtZS5sb2NhbGVDb21wYXJlKGEubmFtZSkpXG5cbiAgICAgICAgaWYgKGZpbHRlcnMuc3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWlncmF0aW9ucyA9IG1pZ3JhdGlvbnMuc2xpY2UoMCwgZmlsdGVycy5zdGVwcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWdyYXRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdtaWdyYXRvcjpiZWZvcmUtcm9sbGJhY2snLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBNaWdyYXRpb25SZXN1bHRbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBtaWdyYXRpb24gb2YgbWlncmF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yb2xsYmFja0ZpbGUobWlncmF0aW9uLmZpbGVuYW1lKVxuXG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KVxuXG4gICAgICAgICAgICAvLyBTdG9wIG9uIGZpcnN0IGZhaWx1cmVcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdtaWdyYXRvcjphZnRlci1yb2xsYmFjaycsIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnM6IG1pZ3JhdGlvbnMubWFwKG0gPT4gbS5uYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwKHN0ZXBzOiBudW1iZXIgPSAxLCBmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taWdyYXRlKHtcbiAgICAgICAgICAgIC4uLmZpbHRlcnMsXG4gICAgICAgICAgICBzdGVwc1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3duKHN0ZXBzOiBudW1iZXIgPSAxLCBmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yb2xsYmFjayh7XG4gICAgICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICAgICAgc3RlcHNcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbGF0ZXN0KGZpbHRlcnM6IExpc3RGaWx0ZXJzID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pZ3JhdGUoZmlsdGVycylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbGF0ZXN0T3JGYWlsKGZpbHRlcnM6IExpc3RGaWx0ZXJzID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmxhdGVzdChmaWx0ZXJzKVxuXG4gICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdHMuZmluZChyID0+IHIucmVzdWx0ID09PSAnZmFpbGVkJylcblxuICAgICAgICBpZiAoZmFpbGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBmYWlsZWQuZXJyb3IgfHwgbmV3IEJhc2VFeGNlcHRpb24oYE1pZ3JhdGlvbiBmYWlsZWQ6ICR7ZmFpbGVkLm5hbWV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZyZXNoKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdFtdPiB7XG4gICAgICAgIGNvbnN0IGRvd25SZXN1bHRzID0gYXdhaXQgdGhpcy5yb2xsYmFjayhmaWx0ZXJzKVxuXG4gICAgICAgIGlmIChkb3duUmVzdWx0cy5zb21lKHIgPT4gci5yZXN1bHQgPT09ICdmYWlsZWQnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRvd25SZXN1bHRzXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cFJlc3VsdHMgPSBhd2FpdCB0aGlzLm1pZ3JhdGUoZmlsdGVycylcblxuICAgICAgICByZXR1cm4gdXBSZXN1bHRzXG4gICAgfVxuXG59XG5cbiIsImltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWxzL2NyZWF0ZUlkLnRzJ1xuXG5leHBvcnQgdHlwZSBJcGNNZXNzYWdlPFQgPSBhbnk+ID0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBldmVudDogc3RyaW5nXG4gICAgZGF0YTogVFxufVxuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0NsaWVudCB7XG4gICAgcHJpdmF0ZSBsaXN0ZW5lcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PElwY0xpc3RlbmVyPj4oKVxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBwcm9jZXNzLm9uKCdtZXNzYWdlJywgKG1lc3NhZ2U6IElwY01lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KG1lc3NhZ2UuZXZlbnQpXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJzKSByZXR1cm5cblxuICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcihtZXNzYWdlLmRhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KSEuYWRkKGNhbGxiYWNrIGFzIElwY0xpc3RlbmVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmY8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZCB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCk/LmRlbGV0ZShjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgZW1pdDxUID0gYW55PihldmVudDogc3RyaW5nLCBkYXRhPzogVCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcHJvY2Vzcy5zZW5kKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsdWdpbklwY0NsaWVudC5lbWl0OiBwcm9jZXNzLnNlbmQgaXMgbm90IGF2YWlsYWJsZSDigJQgcHJvY2VzcyB3YXMgbm90IHNwYXduZWQgd2l0aCBJUEMgY2hhbm5lbCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IGNyZWF0ZUlkKClcbiAgICAgICAgY29uc3QgbWVzc2FnZTogSXBjTWVzc2FnZTxUPiA9IHsgaWQsIGV2ZW50LCBkYXRhOiBkYXRhIGFzIFQgfVxuICAgICAgICBwcm9jZXNzLnNlbmQobWVzc2FnZSlcblxuICAgICAgICByZXR1cm4gaWRcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cydcbmltcG9ydCB0eXBlIHsgSXBjTWVzc2FnZSB9IGZyb20gJy4vUGx1Z2luSXBjQ2xpZW50LnRzJ1xuXG50eXBlIElwY0xpc3RlbmVyPFQgPSBhbnk+ID0gKGRhdGE6IFQpID0+IHZvaWRcblxuZXhwb3J0IGNsYXNzIFBsdWdpbklwY0hvc3Qge1xuICAgIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxJcGNMaXN0ZW5lcj4+KClcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNoaWxkOiBDaGlsZFByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5jaGlsZC5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJcGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtZXNzYWdlLmV2ZW50KVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIobWVzc2FnZS5kYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCkhLmFkZChjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpPy5kZWxldGUoY2FsbGJhY2sgYXMgSXBjTGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgZGF0YT86IFQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuY2hpbGQuc2VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5JcGNIb3N0LmVtaXQ6IGNoaWxkIHByb2Nlc3Mgd2FzIG5vdCBzcGF3bmVkIHdpdGggYW4gSVBDIGNoYW5uZWwnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IElwY01lc3NhZ2U8VD4gPSB7IGlkLCBldmVudCwgZGF0YTogZGF0YSBhcyBUIH1cbiAgICAgICAgdGhpcy5jaGlsZC5zZW5kKG1lc3NhZ2UpXG5cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBQbHVnaW5JcGNDbGllbnQgfSBmcm9tICcuL1BsdWdpbklwY0NsaWVudC50cydcblxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZCA9ICdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURSdcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZURlZmluaXRpb24ge1xuICAgIG1ldGhvZDogSHR0cE1ldGhvZFxuICAgIHBhdGg6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUmVxdWVzdCB7XG4gICAgcmVxdWVzdElkOiBzdHJpbmdcbiAgICBtZXRob2Q6IEh0dHBNZXRob2RcbiAgICBwYXRoOiBzdHJpbmdcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVSZXNwb25zZVBheWxvYWQge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgc3RhdHVzOiBudW1iZXJcbiAgICBib2R5PzogYW55XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVJlcGx5IHtcbiAgICBzdGF0dXMoY29kZTogbnVtYmVyKTogUm91dGVSZXBseVxuICAgIHNlbmQoYm9keT86IGFueSk6IHZvaWRcbn1cblxuZXhwb3J0IHR5cGUgUm91dGVIYW5kbGVyID0gKHJlcTogUm91dGVSZXF1ZXN0LCByZXBseTogUm91dGVSZXBseSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5cblxuaW50ZXJmYWNlIFJvdXRlRW50cnkgZXh0ZW5kcyBSb3V0ZURlZmluaXRpb24ge1xuICAgIGhhbmRsZXI6IFJvdXRlSGFuZGxlclxuICAgIHBhdHRlcm46IFJlZ0V4cFxuICAgIHBhcmFtTmFtZXM6IHN0cmluZ1tdXG59XG5cbmZ1bmN0aW9uIGJ1aWxkUGF0dGVybihwYXRoOiBzdHJpbmcpOiB7IHBhdHRlcm46IFJlZ0V4cDsgcGFyYW1OYW1lczogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgcGFyYW1OYW1lczogc3RyaW5nW10gPSBbXVxuXG4gICAgY29uc3QgcmVnZXhTdHIgPSBwYXRoXG4gICAgICAgIC5yZXBsYWNlKC86W2EtekEtWl9dW2EtekEtWjAtOV9dKi9nLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICAgIHBhcmFtTmFtZXMucHVzaChtYXRjaC5zbGljZSgxKSlcbiAgICAgICAgICAgIHJldHVybiAnKFteL10rKSdcbiAgICAgICAgfSlcbiAgICAgICAgLnJlcGxhY2UoL1xcLy9nLCAnXFxcXC8nKVxuXG4gICAgcmV0dXJuIHsgcGF0dGVybjogbmV3IFJlZ0V4cChgXiR7cmVnZXhTdHJ9JGApLCBwYXJhbU5hbWVzIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBsdWdpblJvdXRlciB7XG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRW50cnlbXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogUGx1Z2luSXBjQ2xpZW50KSB7XG4gICAgICAgIHRoaXMuY2xpZW50Lm9uPFJvdXRlUmVxdWVzdD4oJ3JvdXRlcjpyZXF1ZXN0JywgKHJlcSkgPT4gdGhpcy5kaXNwYXRjaChyZXEpKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2gocmVxOiBSb3V0ZVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiB0aGlzLnJvdXRlcykge1xuICAgICAgICAgICAgaWYgKHJvdXRlLm1ldGhvZCAhPT0gcmVxLm1ldGhvZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSByb3V0ZS5wYXR0ZXJuLmV4ZWMocmVxLnBhdGgpXG4gICAgICAgICAgICBpZiAoIW1hdGNoKSBjb250aW51ZVxuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuICAgICAgICAgICAgcm91dGUucGFyYW1OYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gbWF0Y2hbaSArIDFdXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgc3RhdHVzQ29kZSA9IDIwMFxuICAgICAgICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcGx5OiBSb3V0ZVJlcGx5ID0ge1xuICAgICAgICAgICAgICAgIHN0YXR1cyhjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUgPSBjb2RlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZW5kOiAoYm9keT86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZTogUm91dGVSZXNwb25zZVBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudC5lbWl0KCdyb3V0ZXI6cmVzcG9uc2UnLCByZXNwb25zZSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCByb3V0ZS5oYW5kbGVyKHsgLi4ucmVxLCBwYXJhbXMgfSwgcmVwbHkpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZXNwb25zZScsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZDogcmVxLnJlcXVlc3RJZCxcbiAgICAgICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgICAgICAgYm9keTogeyBtZXNzYWdlOiAnTm90IEZvdW5kJyB9LFxuICAgICAgICB9IHNhdGlzZmllcyBSb3V0ZVJlc3BvbnNlUGF5bG9hZClcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlZ2lzdGVyKG1ldGhvZDogSHR0cE1ldGhvZCwgcGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0gPSBidWlsZFBhdHRlcm4ocGF0aClcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKHsgbWV0aG9kLCBwYXRoLCBoYW5kbGVyLCBwYXR0ZXJuLCBwYXJhbU5hbWVzIH0pXG4gICAgICAgIHRoaXMuY2xpZW50LmVtaXQoJ3JvdXRlcjpyZWdpc3RlcicsIHsgbWV0aG9kLCBwYXRoIH0gc2F0aXNmaWVzIFJvdXRlRGVmaW5pdGlvbilcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUm91dGVIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoJ0dFVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignUE9TVCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIHB1dChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQVVQnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdQQVRDSCcsIHBhdGgsIGhhbmRsZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdERUxFVEUnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cbn1cbiIsImltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InXG5pbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuXG5pbnRlcmZhY2UgUm91dGVGaWxlRGVmaW5pdGlvbiB7XG4gICAgZmlsZTogc3RyaW5nXG4gICAgcm91dGVQYXRoOiBzdHJpbmdcbiAgICBtb2R1bGU/OiBzdHJpbmdcbiAgICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCdcbiAgICBzb3J0S2V5OiBudW1iZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZSB7XG4gICAgcHJpdmF0ZSBkaXJlY3Rvcnk6IHN0cmluZyBcbiAgICBwcml2YXRlIHByZWZpeDogc3RyaW5nXG4gICAgcHJpdmF0ZSBtb2R1bGU/OiBzdHJpbmdcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICAgcHJpdmF0ZSBsb2dnZXIgPSBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgcHJpdmF0ZSByb3V0ZXM6IFJvdXRlRmlsZURlZmluaXRpb25bXSA9IFtdXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIHB1YmxpYyBzZXREaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3RvcnlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0UHJlZml4KHByZWZpeDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFJvdXRlcihyb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICB0aGlzLnJvdXRlciA9IHJvdXRlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRNb2R1bGUobW9kdWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZXMoKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gZmcuc3luYygnKiovKi4odHN8anN8bWpzKScsIHsgY3dkOiB0aGlzLmRpcmVjdG9yeSB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRm91bmQgJHtmaWxlcy5sZW5ndGh9IHJvdXRlIGZpbGVzIGluICR7dGhpcy5kaXJlY3Rvcnl9YCwge1xuICAgICAgICAgICAgICAgIGZpbGVzLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgYWxsIGZpbGVzIGFuZCBidWlsZCByb3V0ZSBkYXRhXG4gICAgICAgIGNvbnN0IHJvdXRlczogUm91dGVGaWxlRGVmaW5pdGlvbltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIFJlbW92ZSBleHRlbnNpb25cbiAgICAgICAgICAgIGxldCByb3V0ZVBhdGggPSBmaWxlLnJlcGxhY2UoL1xcLih0c3xqc3xtanMpJC8sICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgSFRUUCBtZXRob2QgZnJvbSBzdWZmaXhcbiAgICAgICAgICAgIGxldCBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3BhdGNoJyB8ICdkZWxldGUnIHwgJ3B1dCcgPSAnZ2V0J1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kU3VmZml4ZXMgPSBbJy5wb3N0JywgJy5wYXRjaCcsICcuZGVsZXRlJywgJy5wdXQnXVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN1ZmZpeCBvZiBtZXRob2RTdWZmaXhlcykge1xuICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBzdWZmaXguc3Vic3RyaW5nKDEpIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZShzdWZmaXgsICcnKVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29udmVydCBmaWxlIHBhdGggdG8gcm91dGUgcGF0aFxuICAgICAgICAgICAgLy8gUmVwbGFjZSAnaW5kZXgnIHdpdGggZW1wdHkgc3RyaW5nIGZvciBpbmRleCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXC9pbmRleCQvLCAnJylcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9eaW5kZXgkLywgJycpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbnZlcnQgWy4uLm5hbWVdIHRvIC86bmFtZSguKikgZm9yIG5hbWVkIGNhdGNoLWFsbCByb3V0ZXNcbiAgICAgICAgICAgIHJvdXRlUGF0aCA9IHJvdXRlUGF0aC5yZXBsYWNlKC9cXFtcXC5cXC5cXC4oW15cXF1dKyldL2csICcqJDEnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb252ZXJ0IFtwYXJhbV0gdG8gOnBhcmFtIGZvciByb3V0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXFxbKFteXFxdXSspXS9nLCAnOiQxJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRW5zdXJlIHJvdXRlIHN0YXJ0cyB3aXRoIC9cbiAgICAgICAgICAgIGlmICghcm91dGVQYXRoLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9ICcvJyArIHJvdXRlUGF0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBIYW5kbGUgcm9vdCBpbmRleCBjYXNlXG4gICAgICAgICAgICBpZiAocm91dGVQYXRoID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSAnLydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQXBwbHkgcHJlZml4IGlmIHByb3ZpZGVkXG4gICAgICAgICAgICBpZiAodGhpcy5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUHJlZml4ID0gdGhpcy5wcmVmaXguc3RhcnRzV2l0aCgnLycpID8gdGhpcy5wcmVmaXggOiAnLycgKyB0aGlzLnByZWZpeFxuICAgICAgICAgICAgICAgIHJvdXRlUGF0aCA9IG5vcm1hbGl6ZWRQcmVmaXggKyByb3V0ZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHNvcnQga2V5IGZvciBwcmlvcml0aXphdGlvblxuICAgICAgICAgICAgbGV0IHNvcnRLZXkgPSAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENhdGNoLWFsbCByb3V0ZXMgc2hvdWxkIGNvbWUgbGFzdCAoaGlnaCBzb3J0IGtleSlcbiAgICAgICAgICAgIGlmIChyb3V0ZVBhdGguaW5jbHVkZXMoJyonKSkge1xuICAgICAgICAgICAgICAgIHNvcnRLZXkgKz0gMTAwMDAwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb3VudCBwYXJhbWV0ZXJzIChyb3V0ZXMgd2l0aCBmZXdlciBwYXJhbXMgY29tZSBmaXJzdClcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtQ291bnQgPSAocm91dGVQYXRoLm1hdGNoKC86L2cpIHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICAgIHNvcnRLZXkgKz0gcGFyYW1Db3VudCAqIDEwMDAwXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvdW50IHNlZ21lbnRzIChyb3V0ZXMgd2l0aCBtb3JlIHNlZ21lbnRzIGNvbWUgZmlyc3QsIHNvIHdlIHN1YnRyYWN0KVxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudENvdW50ID0gcm91dGVQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHMgPT4gcykubGVuZ3RoXG4gICAgICAgICAgICBzb3J0S2V5IC09IHNlZ21lbnRDb3VudCAqIDEwMFxuICAgICAgICAgICAgXG4gICAgICAgICAgICByb3V0ZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgIHNvcnRLZXksXG4gICAgICAgICAgICAgICAgbW9kdWxlOiB0aGlzLm1vZHVsZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNvcnQgcm91dGVzIGJ5IHNwZWNpZmljaXR5IChsb3dlciBzb3J0S2V5ID0gbW9yZSBzcGVjaWZpYyA9IHJlZ2lzdGVyZWQgZmlyc3QpXG4gICAgICAgIHJvdXRlcy5zb3J0KChhLCBiKSA9PiBhLnNvcnRLZXkgLSBiLnNvcnRLZXkpXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMgPSByb3V0ZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJSb3V0ZXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5yb3V0ZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdSb3V0ZXIgaW5zdGFuY2Ugbm90IHNldCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5tb2R1bGUgfHwgJ3Vua25vd24nXG5cbiAgICAgICAgY29uc3QgaG9vayA9IGZ1bmN0aW9uKHJvdXRlOiBSb3V0ZSl7XG4gICAgICAgICAgICByb3V0ZS5tZXRhZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5yb3V0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZU5hbWUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5vbignYWRkZWQnLCBob29rKVxuXG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdXRlTW9kdWxlID0gYXdhaXQgaW1wb3J0KGAke3RoaXMuZGlyZWN0b3J5fS8ke3JvdXRlLmZpbGV9YClcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZU1vZHVsZS5kZWZhdWx0XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFJvdXRlIGZpbGUgJHtyb3V0ZS5maWxlfSBkb2VzIG5vdCBleHBvcnQgYSBkZWZhdWx0IGZ1bmN0aW9uYClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJvdXRlcltyb3V0ZS5tZXRob2RdKHJvdXRlLnJvdXRlUGF0aCwgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucm91dGVyLm9mZignYWRkZWQnLCBob29rKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCl7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZXMoKVxuICAgICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUm91dGVzKClcblxuICAgIH1cbn1cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgUm91dGVyU2VydmljZSBmcm9tICcuL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgdHlwZSBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclJlZ2lzdGVyRW50cnkge1xuICAgIGZpbGVwYXRoOiBzdHJpbmdcbiAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJSZWdpc3RlcjxDID0ge30+IGV4dGVuZHMgUm91dGVyU2VydmljZTxDPiB7XG4gICAgcHVibGljIGZpbGVzID0gbmV3IE1hcDxzdHJpbmcsIFJvdXRlclJlZ2lzdGVyRW50cnk+KClcbiAgICBwdWJsaWMgZGlycyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZXJSZWdpc3RlckVudHJ5PigpXG4gICAgXG4gICAgY29uc3RydWN0b3Iocm91dGVyOiBQYXJ0aWFsPFJvdXRlclNlcnZpY2U8Qz4+ID0ge30pIHtcbiAgICAgICAgc3VwZXIocm91dGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWxlKGZpbGVuYW1lOiBzdHJpbmcsIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHtcbiAgICAgICAgICAgIGZpbGVwYXRoOiBmaWxlbmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSB8fCB7fVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdhZGRFbnRyeScsIGVudHJ5KVxuXG4gICAgICAgIHRoaXMuZmlsZXMuc2V0KGZpbGVuYW1lLCBlbnRyeSlcblxuICAgIH1cblxuICAgIHB1YmxpYyBhZGREaXIoZGlybmFtZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBmaWxlcGF0aDogZGlybmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YSB8fCB7fVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbWl0KCdhZGRFbnRyeScsIGVudHJ5KVxuXG4gICAgICAgIHRoaXMuZGlycy5zZXQoZGlybmFtZSwgZW50cnkpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRmlsZShlbnRyeTogUm91dGVyUmVnaXN0ZXJFbnRyeSk6IFByb21pc2U8Ym9vbGVhbj4geyAgICAgICAgXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhlbnRyeS5maWxlcGF0aCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZpbGUgbm90IGZvdW5kOiAke2VudHJ5LmZpbGVwYXRofWApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhvb2sgPSBmdW5jdGlvbihyb3V0ZTogUm91dGUpe1xuICAgICAgICAgICAgcm91dGUubWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgLi4ucm91dGUubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgLi4uZW50cnkubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGVudHJ5LmZpbGVwYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IHVuYWNoZWQgPSBgJHtlbnRyeS5maWxlcGF0aH0/dD0ke0RhdGUubm93KCl9YCAvLyBQcmV2ZW50IGNhY2hpbmcgaXNzdWVzXG5cbiAgICAgICAgdGhpcy5vbignYWRkZWQnLCBob29rKVxuICAgIFxuICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gaW1wb3J0KHVuYWNoZWQpKVxuXG4gICAgICAgIHRoaXMub2ZmKCdhZGRlZCcsIGhvb2spXG4gICAgXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgZW50cnkpXG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gbG9hZCBmaWxlJywgZXJyb3IpXG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWREaXIoZW50cnk6IFJvdXRlclJlZ2lzdGVyRW50cnkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIGNvbnN0IGxvYWRlZDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KClcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZW50cnkuZmlsZXBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBEaXJlY3Rvcnkgbm90IGZvdW5kOiAke2VudHJ5LmZpbGVwYXRofWApXG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShsb2FkZWQpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGVudHJ5LmZpbGVwYXRoKVxuICAgICAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgLy8gaWdub3JlIHRlc3QgZmlsZXNcbiAgICAgICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcudGVzdC50cycpIHx8IGZpbGUuZW5kc1dpdGgoJy5zcGVjLnRzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnRlc3QuanMnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3BlYy5qcycpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZW50cnkuZmlsZXBhdGgsIGZpbGUpXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBmaWxlUm91dGVyUmVnaXN0ZXJFbnRyeSA9IHsgXG4gICAgICAgICAgICAgICAgZmlsZXBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBlbnRyeS5tZXRhZGF0YSBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChhd2FpdCB0aGlzLmxvYWRGaWxlKGZpbGVSb3V0ZXJSZWdpc3RlckVudHJ5KSkpIHtcbiAgICAgICAgICAgICAgICBsb2FkZWQuYWRkKGZ1bGxQYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obG9hZGVkKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBsb2FkZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gICAgICAgIGZvciAoY29uc3QgZSBvZiB0aGlzLmZpbGVzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBpZiAoKGF3YWl0IHRoaXMubG9hZEZpbGUoZSkpKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkLmFkZChlLmZpbGVwYXRoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkaXIgb2YgdGhpcy5kaXJzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBkaXJMb2FkZWQgPSBhd2FpdCB0aGlzLmxvYWREaXIoZGlyKVxuXG4gICAgICAgICAgICBkaXJMb2FkZWQuZm9yRWFjaChwID0+IGxvYWRlZC5hZGQocCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2xvYWQgZmlsZXMnLCB7XG4gICAgICAgICAgICAgICAgZmlsZXM6IEFycmF5LmZyb20obG9hZGVkKS5tYXAocCA9PiBwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHApKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEhvb2tzIGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgdHlwZSBSb3V0ZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5cbmV4cG9ydCB0eXBlIFJlc291cmNlTWV0aG9kID0gJ2luZGV4JyB8ICdzaG93JyB8ICdzdG9yZScgfCAndXBkYXRlJyB8ICdkZXN0cm95J1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlclJlc291cmNlT3B0aW9ucyB7XG4gICAgbWlkZGxld2FyZT86IFBhcnRpYWw8UmVjb3JkPFJlc291cmNlTWV0aG9kIHwgJ2FsbCcsIE1pZGRsZXdhcmU+PlxuICAgIGV4Y2VwdD86IFJlc291cmNlTWV0aG9kW11cbn1cblxuY29uc3Qgcm91dGVzID0gW1xuICAgIHtcbiAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICBoYW5kbGVyOiAnaW5kZXgnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZUluZGV4J10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJJbmRleCddLFxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgIHBhdGg6ICcvOmlkJyxcbiAgICAgICAgaGFuZGxlcjogJ3Nob3cnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVNob3cnXSxcbiAgICAgICAgICAgIGFmdGVyOiAgWydhZnRlclNob3cnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICBoYW5kbGVyOiAnc3RvcmUnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVN0b3JlJywgJ2JlZm9yZVNhdmUnXSxcbiAgICAgICAgICAgIGFmdGVyOiAgWydhZnRlclN0b3JlJywgJ2FmdGVyU2F2ZSddLFxuICAgICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICAgIG1ldGhvZDogJ3B1dCcsXG4gICAgICAgIHBhdGg6ICcvOmlkJyxcbiAgICAgICAgaGFuZGxlcjogJ3VwZGF0ZScsXG4gICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmU6IFsnYmVmb3JlVXBkYXRlJywgJ2JlZm9yZVNhdmUnXSxcbiAgICAgICAgICAgIGFmdGVyOiAgWydhZnRlclVwZGF0ZScsICdhZnRlclNhdmUnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdwYXRjaCcsXG4gICAgICAgIHBhdGg6ICcvOmlkJyxcbiAgICAgICAgaGFuZGxlcjogJ3VwZGF0ZScsXG4gICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmU6IFsnYmVmb3JlVXBkYXRlJywgJ2JlZm9yZVNhdmUnXSxcbiAgICAgICAgICAgIGFmdGVyOiAgWydhZnRlclVwZGF0ZScsICdhZnRlclNhdmUnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICdkZXN0cm95JyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVEZXN0cm95J10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJEZXN0cm95J10sXG4gICAgICAgIH1cbiAgICB9LFxuXVxuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlclJlc291cmNlU2VydmljZSBleHRlbmRzIGNvbXBvc2UoSG9va3MpIHtcbiAgICBwcml2YXRlIG9wdGlvbnM6IFJvdXRlclJlc291cmNlT3B0aW9uc1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogUm91dGVyUmVzb3VyY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluZGV4KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGN0eCB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNob3coY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PiAge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGN0eCB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0b3JlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PiAge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGN0eCB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRlc3Ryb3koY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PiAge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGN0eCB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3cmFwKFxuICAgICAgICBtZXRob2ROYW1lOiAnaW5kZXgnIHwgJ3Nob3cnIHwgJ3N0b3JlJyB8ICd1cGRhdGUnIHwgJ2Rlc3Ryb3knLFxuICAgICAgICBiZWZvcmU6IHN0cmluZ1tdLFxuICAgICAgICBhZnRlcjogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoY3R4OiBIdHRwQ29udGV4dCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdiZWZvcmVBbGwnLCBjdHgpXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBiZWZvcmUpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoaG9vaywgY3R4KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzW21ldGhvZE5hbWVdKGN0eClcblxuICAgICAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFmdGVyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGhvb2ssIGN0eCwgcmVzdWx0KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyByZWdpc3Rlcihyb3V0ZXI6IFJvdXRlcikge1xuICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gcm91dGUubWV0aG9kIGFzIFJvdXRlWydtZXRob2QnXVxuICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9IHJvdXRlLmhhbmRsZXIgYXMgUmVzb3VyY2VNZXRob2RcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5leGNlcHQgJiYgdGhpcy5vcHRpb25zLmV4Y2VwdC5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWlkZGxld2FyZSAmJiB0aGlzLm9wdGlvbnMubWlkZGxld2FyZVsnYWxsJ10pIHtcbiAgICAgICAgICAgICAgICByb3V0ZXIudXNlKHRoaXMub3B0aW9ucy5taWRkbGV3YXJlWydhbGwnXSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5taWRkbGV3YXJlICYmIHRoaXMub3B0aW9ucy5taWRkbGV3YXJlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLnVzZSh0aGlzLm9wdGlvbnMubWlkZGxld2FyZVttZXRob2ROYW1lXSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcm91dGVyW21ldGhvZF0oXG4gICAgICAgICAgICAgICAgcm91dGUucGF0aCxcbiAgICAgICAgICAgICAgICB0aGlzLndyYXAoXG4gICAgICAgICAgICAgICAgICAgIHJvdXRlLmhhbmRsZXIgYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICByb3V0ZS5ob29rcz8uYmVmb3JlIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICByb3V0ZS5ob29rcz8uYWZ0ZXIgfHwgW10sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IFJvdXRlclJlc291cmNlU2VydmljZSBmcm9tICcuL1JvdXRlclJlc291cmNlU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgUm91dGVyUmVzb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9Sb3V0ZXJSZXNvdXJjZVNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvSHR0cENvbnRleHRDb250cmFjdC50cydcbmltcG9ydCB0eXBlIHsgQ29uZmlnTW9kZWwgfSBmcm9tICcjc2VydmVyL21peGlucy9Nb2RlbENvbmZpZ01peGluLnRzJ1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlclJlc291cmNlQ29uZmlnIGV4dGVuZHMgUm91dGVyUmVzb3VyY2VTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG1vZGVsOiBDb25maWdNb2RlbFxuXG4gICAgY29uc3RydWN0b3IobW9kZWw6IENvbmZpZ01vZGVsLCBvcHRpb25zOiBSb3V0ZXJSZXNvdXJjZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihvcHRpb25zKVxuXG4gICAgICAgIGlmICghbW9kZWwuX19pc0NvbmZpZ01vZGVsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRlclJlc291cmNlQ29uZmlnU2VydmljZSByZXF1aXJlcyBhIENvbmZpZ01vZGVsJylcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbFxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBXZSBrbm93IHRoaXMgaXMgY29ycmVjdCwgYnV0IFR5cGVTY3JpcHQgY2FuJ3QgaW5mZXIgaXQgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBhc3luYyBpbmRleChjdHg6IEh0dHBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5tb2RlbC5saXN0KClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIHRvdGFsOiBpdGVtcy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbF9wYWdlczogMSxcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNob3coY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5wYXJhbXMuaWQhXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMubW9kZWwuZmluZE9yRmFpbChpZClcblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9yZShjdHg6IEh0dHBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHgucmVxdWVzdC5ib2R5IGFzIGFueVxuXG4gICAgICAgIGF3YWl0IHRoaXMubW9kZWwuY3JlYXRlKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXNvdXJjZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSdcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpZCA9IGN0eC5wYXJhbXMuaWQhXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjdHgucmVxdWVzdC5ib2R5IGFzIGFueVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLm1vZGVsLnVwZGF0ZShpZCwgZGF0YSlcblxuICAgICAgICByZXR1cm4gdXBkYXRlZFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KGN0eDogSHR0cENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBjdHgucGFyYW1zLmlkIVxuXG4gICAgICAgIGF3YWl0IHRoaXMubW9kZWwuZGVzdHJveShpZClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IEpvYiB9IGZyb20gJ25vZGUtc2NoZWR1bGUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGluZUhhbmRsZXIge1xuICAgICgpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRpbmVFbnRpdHlPcHRpb25zIHtcbiAgICBpZDogc3RyaW5nXG4gICAgY3Jvbjogc3RyaW5nXG4gICAgaGFuZGxlcj86IFJvdXRpbmVIYW5kbGVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRpbmVFbnRpdHkge1xuICAgIHB1YmxpYyBpZDogc3RyaW5nXG4gICAgcHVibGljIGNyb246IHN0cmluZ1xuICAgIHB1YmxpYyBqb2I/OiBKb2JcblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKCl7XG4gICAgICAgIHJldHVybiBuZXcgUm91dGluZUVudGl0eSgpXG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZTogUm91dGluZUhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUm91dGluZUVudGl0eSBoYW5kbGVyIG5vdCBpbXBsZW1lbnRlZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHNldElkKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Q3Jvbihjcm9uOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jcm9uID0gY3JvblxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldEhhbmRsZXIoaGFuZGxlcjogUm91dGluZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IG5vZGVTY2hlZHVsZSBmcm9tICdub2RlLXNjaGVkdWxlJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi9mYWNhZGVzL2xvZ2dlci50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnI2NsaWVudC91dGlscy9jcmVhdGVJZC50cydcbmltcG9ydCBSb3V0aW5lRW50aXR5IGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvUm91dGluZUVudGl0eS50cydcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24sIExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEFkZE9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyU2VydmljZU9wdGlvbnMge1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudHMge1xuICAgICdzY2hlZHVsZXI6cmVnaXN0ZXJlZCc6IHtcbiAgICAgICAgc2NoZWR1bGVyOiBTY2hlZHVsZXJTZXJ2aWNlXG4gICAgfVxuICAgICdzY2hlZHVsZXI6bG9hZGVkJzoge1xuICAgICAgICBzY2hlZHVsZXI6IFNjaGVkdWxlclNlcnZpY2VcbiAgICB9XG4gICAgJ3NjaGVkdWxlcjpib290ZWQnOiB7XG4gICAgICAgIHNjaGVkdWxlcjogU2NoZWR1bGVyU2VydmljZVxuICAgIH0sXG4gICAgJ3NjaGVkdWxlcjpzaHV0ZG93bmVkJzoge1xuICAgICAgICBzY2hlZHVsZXI6IFNjaGVkdWxlclNlcnZpY2VcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjaGVkdWxlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1NjaGVkdWxlclNlcnZpY2UnXG4gICAgcHVibGljIHJvdXRpbmVzOiBSb3V0aW5lRW50aXR5W11cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuXG4gICAgcHVibGljIGRpcnM6IHN0cmluZ1tdID0gW11cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBTY2hlZHVsZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLnJvdXRpbmVzID0gW11cbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zPzogU2NoZWR1bGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2hlZHVsZXJTZXJ2aWNlKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG4gICAgfVxuXG4gICAgcHVibGljIGFkZERpcihkaXI6IHN0cmluZykge1xuICAgICAgICB0aGlzLmRpcnMucHVzaChkaXIpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZChyb3V0aW5lOiBPbWl0PFJvdXRpbmVFbnRpdHksICdqb2InPikge1xuICAgICAgICBjb25zdCBpZCA9IHJvdXRpbmU/LmlkIHx8IGNyZWF0ZUlkKClcblxuICAgICAgICB0aGlzLnJvdXRpbmVzLnB1c2gocm91dGluZSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYCR7aWR9IHJvdXRpbmUgYWRkZWRgLCB7XG4gICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgIGNyb246IHJvdXRpbmUuY3JvbixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlKGlkOiBSb3V0aW5lRW50aXR5WydpZCddIHwgUm91dGluZUVudGl0eVsnaWQnXVtdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdXG5cbiAgICAgICAgdGhpcy5yb3V0aW5lcyA9IHRoaXMucm91dGluZXMuZmlsdGVyKHIgPT4gIWlkcy5pbmNsdWRlcyhyLmlkKSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygncm91dGluZXMgcmVtb3ZlZCcsIHtcbiAgICAgICAgICAgICAgICBpZHM6IGlkc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgcHVibGljIGFzeW5jIGxvYWRGaWxlKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgRmlsZSBub3QgZm91bmQ6ICR7ZmlsZW5hbWV9YClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yLCBtb2RdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gaW1wb3J0KGZpbGVuYW1lKSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBmYWlsZWQgdG8gbG9hZCByb3V0aW5lcyBmcm9tICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0ciA9IG1vZD8uZGVmYXVsdCB8fCBtb2RcblxuICAgICAgICBpZiAoIWN0cj8uaXNfcm91dGluZSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgZmlsZSBkb2VzIG5vdCBleHBvcnQgYSByb3V0aW5lOiAke2ZpbGVuYW1lfWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGN0cigpXG5cbiAgICAgICAgaW5zdGFuY2UuaWQgPSBpbnN0YW5jZS5pZCB8fCBmaWxlbmFtZVxuXG4gICAgICAgIHRoaXMuYWRkKGluc3RhbmNlKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZmlsZSBsb2FkZWQnLCB7IGZpbGVuYW1lIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZERpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2RpcmVjdG9yeSBub3QgZm91bmQnLCB7IGRpcmVjdG9yeSB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGRpcmVjdG9yeSkuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLnRzJykpXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRGaWxlKHBhdGguam9pbihkaXJlY3RvcnksIGZpbGUpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGlyIG9mIHRoaXMuZGlycykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRGlyZWN0b3J5KGRpcilcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXMoaWQ6IFJvdXRpbmVFbnRpdHlbJ2lkJ10pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGluZXMuc29tZShyb3V0aW5lID0+IHJvdXRpbmUuaWQgPT09IGlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydFJvdXRpbmUoaWQ6IFJvdXRpbmVFbnRpdHlbJ2lkJ10pIHtcbiAgICAgICAgY29uc3Qgcm91dGluZSA9IHRoaXMucm91dGluZXMuZmluZChyID0+IHIuaWQgPT09IGlkKVxuXG4gICAgICAgIGlmICghcm91dGluZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFJvdXRpbmVFbnRpdHkgbm90IGZvdW5kOiAke2lkfWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm91dGluZS5qb2IpIHtcbiAgICAgICAgICAgIHJvdXRpbmUuam9iLmNhbmNlbCgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2dnZXIgPSB0aGlzLmxvZ2dlci5jaGlsZCh7XG4gICAgICAgICAgICByb3V0aW5lSWQ6IHJvdXRpbmUuaWQsXG4gICAgICAgICAgICByb3V0aW5lQ3Jvbjogcm91dGluZS5jcm9uXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgY2IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gcm91dGluZS5oYW5kbGUoKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yLm1lc3NhZ2UsIGVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgJHtyb3V0aW5lLmlkfSByb3V0aW5lIGV4ZWN1dGVkYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmUuam9iID0gbm9kZVNjaGVkdWxlLnNjaGVkdWxlSm9iKHJvdXRpbmUuY3JvbiwgY2IpXG5cbiAgICAgICAgbG9nZ2VyLmluZm8oYCR7cm91dGluZS5pZH0gcm91dGluZSBzdGFydGVkYClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkQW5kU3RhcnQocm91dGluZTogT21pdDxSb3V0aW5lRW50aXR5LCAnam9iJz4pIHtcbiAgICAgICAgdGhpcy5hZGQocm91dGluZSlcblxuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Um91dGluZShyb3V0aW5lLmlkKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9wUm91dGluZShpZDogUm91dGluZUVudGl0eVsnaWQnXSkge1xuICAgICAgICBjb25zdCByb3V0aW5lID0gdGhpcy5yb3V0aW5lcy5maW5kKHIgPT4gci5pZCA9PT0gaWQpXG5cbiAgICAgICAgaWYgKCFyb3V0aW5lKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignUm91dGluZUVudGl0eSBub3QgZm91bmQnLCA0MDQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJvdXRpbmUuam9iKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRpbmUuam9iLmNhbmNlbCgpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgJHtyb3V0aW5lLmlkfSByb3V0aW5lIHN0b3BwZWRgKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9wQW5kUmVtb3ZlKGlkOiBSb3V0aW5lRW50aXR5WydpZCddKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc3RvcFJvdXRpbmUoaWQpXG5cbiAgICAgICAgdGhpcy5yZW1vdmUoaWQpXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgYm9vdCgpIHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0aW5lIG9mIHRoaXMucm91dGluZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRSb3V0aW5lKHJvdXRpbmUuaWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24oKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm91dGluZSBvZiB0aGlzLnJvdXRpbmVzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3BSb3V0aW5lKHJvdXRpbmUuaWQpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGluZXNcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSBcIiNzaGFyZWQvaW5kZXgudHNcIjtcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSBcImt5c2VseVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlckVudGl5RGF0YSB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWVkZXJFbnRpdHkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgc291cmNlOiBzdHJpbmcgfCBudWxsXG4gICAgcHVibGljIGZpbGVuYW1lOiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFNlZWRlckVudGl5RGF0YSkge1xuICAgICAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWVcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhLnNvdXJjZVxuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZGF0YS5maWxlbmFtZVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW4oZGI6IEt5c2VseTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydCh0aGlzLmZpbGVuYW1lKVxuXG4gICAgICAgIGlmICh0eXBlb2YgbW9kLmRlZmF1bHQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBTZWVkZXIgJHt0aGlzLm5hbWV9IGRvZXMgbm90IGV4cG9ydCBhIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZC5kZWZhdWx0KGRiKVxuICAgIH1cblxufVxuXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IEVtbWl0dGVyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgS3lzZWx5IH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IFNlZWRlckVudGl0eSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1NlZWRlckVudGl0eS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlclNvdXJjZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBkaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RmlsdGVycyB7XG4gICAgc291cmNlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgbmFtZT86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlclJlc3VsdCB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlc3VsdDogJ3N1Y2Nlc3MnIHwgJ2ZhaWxlZCc7XG4gICAgZXJyb3I/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZGVyRXZlbnRzIHtcbiAgICAnc2VlZGVyOmJlZm9yZS1ydW4nOiB7XG4gICAgICAgIHNlZWRlcnM6IHN0cmluZ1tdO1xuICAgIH07XG4gICAgJ3NlZWRlcjphZnRlci1ydW4nOiB7XG4gICAgICAgIHNlZWRlcnM6IHN0cmluZ1tdO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZGVyU2VydmljZU9wdGlvbnMge1xuICAgIGRiOiBLeXNlbHk8YW55PjtcbiAgICBzb3VyY2VzPzogU2VlZGVyU291cmNlW107XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIGVtbWl0dGVyPzogRW1taXR0ZXJTZXJ2aWNlO1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VlZWRlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1NlZWRlclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkYjogS3lzZWx5PGFueT5cbiAgICBwdWJsaWMgc291cmNlczogU2VlZGVyU291cmNlW11cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNlZWRlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5lbW1pdHRlciA9IG9wdGlvbnMuZW1taXR0ZXIgfHwgbmV3IEVtbWl0dGVyU2VydmljZSgpXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmRiID0gb3B0aW9ucy5kYlxuICAgICAgICB0aGlzLnNvdXJjZXMgPSBvcHRpb25zLnNvdXJjZXMgfHwgW11cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU291cmNlKHNvdXJjZTogU2VlZGVyU291cmNlKSB7XG4gICAgICAgIHRoaXMuc291cmNlcy5wdXNoKHNvdXJjZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbGlzdFNvdXJjZShzb3VyY2U6IFNlZWRlclNvdXJjZSkge1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihzb3VyY2UuZGlyZWN0b3J5KVxuICAgICAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBbJy5qcycsICcudHMnLCAnLm1qcycsICcubXRzJ11cblxuXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBTZWVkZXJFbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbnMuaW5jbHVkZXMocGF0aC5leHRuYW1lKGVudHJ5KSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihzb3VyY2UuZGlyZWN0b3J5LCBlbnRyeSlcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBwYXRoLmJhc2VuYW1lKGVudHJ5LCBwYXRoLmV4dG5hbWUoZW50cnkpKVxuXG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSBuZXcgU2VlZGVyRW50aXR5KHtcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLmlkLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmdWxsUGF0aCxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3QoZmlsdGVycz86IExpc3RGaWx0ZXJzKSB7XG4gICAgICAgIGxldCBpdGVtcyA9IFtdIGFzIFNlZWRlckVudGl0eVtdXG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBzb3VyY2Ugb2YgdGhpcy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VTZWVkZXJzID0gYXdhaXQgdGhpcy5saXN0U291cmNlKHNvdXJjZSlcblxuICAgICAgICAgICAgaXRlbXMucHVzaCguLi5zb3VyY2VTZWVkZXJzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcnM/LnNvdXJjZSkge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlcyA9IEFycmF5LmlzQXJyYXkoZmlsdGVycy5zb3VyY2UpID8gZmlsdGVycy5zb3VyY2UgOiBbZmlsdGVycy5zb3VyY2VdXG5cbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKGkgPT4gaS5zb3VyY2UgJiYgc291cmNlcy5pbmNsdWRlcyhpLnNvdXJjZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVycz8ubmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5pc0FycmF5KGZpbHRlcnMubmFtZSkgPyBmaWx0ZXJzLm5hbWUgOiBbZmlsdGVycy5uYW1lXVxuXG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IG5hbWVzLmluY2x1ZGVzKGkubmFtZSkpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IGJ5IG5hbWVcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuU2VlZGVyKHNlZWRlcjogU2VlZGVyRW50aXR5KTogUHJvbWlzZTxTZWVkZXJSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHNlZWRlci5ydW4odGhpcy5kYikpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZmFpbGVkIHRvIHJ1biBzZWVkZXIgJHtzZWVkZXIubmFtZX1gLCBlcnJvcilcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VlZGVyLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IHNlZWRlci5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNlZWRlci5zb3VyY2UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYHNlZWRlciAke3NlZWRlci5uYW1lfSByYW4gc3VjY2Vzc2Z1bGx5YClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogc2VlZGVyLm5hbWUsXG4gICAgICAgICAgICBmaWxlbmFtZTogc2VlZGVyLmZpbGVuYW1lLFxuICAgICAgICAgICAgc291cmNlOiBzZWVkZXIuc291cmNlLFxuICAgICAgICAgICAgcmVzdWx0OiAnc3VjY2VzcycsXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBydW4oZmlsdGVyczogTGlzdEZpbHRlcnMgJiB7IHN0ZXBzPzogbnVtYmVyIH0gPSB7fSk6IFByb21pc2U8U2VlZGVyUmVzdWx0W10+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmxpc3QoZmlsdGVycylcblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdzZWVkZXI6YmVmb3JlLXJ1bicsIHtcbiAgICAgICAgICAgIHNlZWRlcnM6IGl0ZW1zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBTZWVkZXJSZXN1bHRbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBzIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1blNlZWRlcihzKVxuXG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KVxuXG4gICAgICAgICAgICAvLyBTdG9wIG9uIGZpcnN0IGZhaWx1cmVcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdzZWVkZXI6YWZ0ZXItcnVuJywge1xuICAgICAgICAgICAgc2VlZGVyczogcmVzdWx0cy5tYXAobSA9PiBtLm5hbWUpLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgU2hlbGxFeGVjcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL1NoZWxsRXhjZXB0aW9uLnRzJ1xuXG5pbnRlcmZhY2UgQ29tbWFuZE9wdGlvbnMge1xuICAgIGN3ZD86IHN0cmluZ1xuICAgIGVudj86IE5vZGVKUy5Qcm9jZXNzRW52XG4gICAgc2hlbGw/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hlbGxTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTaGVsbFNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ1NoZWxsU2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFNoZWxsU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyBmYWxzZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2luaXRpYWxpemVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBhIHNoZWxsIGNvbW1hbmQgYW5kIHJldHVybiBhIHByb21pc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgY29tbWFuZChiaW46IHN0cmluZywgYXJnczogc3RyaW5nW10sIG9wdGlvbnM6IENvbW1hbmRPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oYmluLCBhcmdzLCB7XG4gICAgICAgICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgICAgICAgIHN0ZGlvOiAncGlwZScsXG4gICAgICAgICAgICAgICAgc2hlbGw6IG9wdGlvbnMuc2hlbGwgPz8gdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnY6IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgZGF0YSA9ICcnXG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCAoZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGEgKz0gZC50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhICs9IGQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29tbWFuZCBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBmdWxsQ29tbWFuZDogYCR7YmlufSAke2FyZ3Muam9pbignICcpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX1gXG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6IGRhdGFcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBTaGVsbEV4ZWNwdGlvbihlcnJvck1lc3NhZ2UsIGRhdGEsIGJpbiwgYXJncykpXG5cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDb21tYW5kIGV4ZWN1dGlvbiBlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBmdWxsQ29tbWFuZDogYCR7YmlufSAke2FyZ3Muam9pbignICcpfWAsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gdGhlIG91dHB1dCBhcyBhIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZFdpdGhPdXRwdXQoYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDb21tYW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdleGVjdXRpbmcgY29tbWFuZCcsIHtcbiAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICBmdWxsQ29tbWFuZDogYCR7YmlufSAke2FyZ3Muam9pbignICcpfWAsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGJpbiwgYXJncywge1xuICAgICAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgICAgICAgIHNoZWxsOiBvcHRpb25zLnNoZWxsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNoZWxsIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnY6IG9wdGlvbnMuZW52IHx8IHByb2Nlc3MuZW52XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBsZXQgb3V0cHV0ID0gJydcbiAgICAgICAgICAgIGxldCBlcnJvck91dHB1dCA9ICcnXG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBkYXRhLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGVycm9yT3V0cHV0ICs9IGRhdGEudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG91dHB1dC50cmltKCkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYENvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICR7Y29kZX06ICR7ZXJyb3JPdXRwdXR9YFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbENvbW1hbmQ6IGAke2Jpbn0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JPdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IFNoZWxsRXhlY3B0aW9uKGVycm9yTWVzc2FnZSwgb3V0cHV0LCBiaW4sIGFyZ3MpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDb21tYW5kIGV4ZWN1dGlvbiBlcnJvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSBDb25maWdTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50cydcbmltcG9ydCB7IGNyZWF0ZUlkIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jcmVhdGVJZC50cydcblxuaW1wb3J0IHR5cGUgeyBQYWdpbmF0aW9uLCBGaW5kTWFueU9wdGlvbnMsIFBhZ2luYXRlT3B0aW9ucywgRGVsZXRlTWFueU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1JlcG9zaXRvcnk8XG4gICAgVEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGNvbmZpZzogQ29uZmlnU2VydmljZSxcbiAgICAgICAgcHJvdGVjdGVkIGtleTogc3RyaW5nLFxuICAgICAgICBwcm90ZWN0ZWQgcHJpbWFyeUtleTogc3RyaW5nID0gJ2lkJ1xuICAgICkge31cblxuICAgIHByb3RlY3RlZCBnZXRJdGVtcygpOiBURW50aXR5W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuZ2V0PFRFbnRpdHlbXT4odGhpcy5rZXksIFtdKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRJdGVtcyhpdGVtczogVEVudGl0eVtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldCh0aGlzLmtleSwgaXRlbXMpXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGFsbG93IHBhc3Npbmcgb3B0aW9ucyBmb3IgZmlsdGVyaW5nIGluIHN1YmNsYXNzZXMgXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogVE9wdGlvbnMpOiBURW50aXR5W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRJdGVtcygpXG4gICAgfVxuXG4gICAgYXN5bmMgY291bnQob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkob3B0aW9ucykubGVuZ3RoXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZE1hbnkob3B0aW9ucz86IEZpbmRNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5xdWVyeShvcHRpb25zKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5vcmRlckJ5KSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJCeSkgPyBvcHRpb25zLm9yZGVyQnkgOiBbb3B0aW9ucy5vcmRlckJ5XVxuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5vcmRlckRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICA/IG9wdGlvbnMub3JkZXJEaXJlY3Rpb25cbiAgICAgICAgICAgICAgICA6IFtvcHRpb25zLm9yZGVyRGlyZWN0aW9uID8/ICdhc2MnXVxuXG4gICAgICAgICAgICBpdGVtcyA9IG9yZGVyQnkoaXRlbXMsIGZpZWxkcywgZGlyZWN0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5vZmZzZXQpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuc2xpY2Uob3B0aW9ucy5vZmZzZXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ubGltaXQpIHtcbiAgICAgICAgICAgIGl0ZW1zID0gaXRlbXMuc2xpY2UoMCwgb3B0aW9ucy5saW1pdClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIGFzeW5jIGZpbmRPbmUob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMucXVlcnkob3B0aW9ucylcblxuICAgICAgICByZXR1cm4gaXRlbXNbMF0gPz8gbnVsbFxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRCeUlkKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbmQoaXRlbSA9PiAoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0gPT09IGlkKSA/PyBudWxsXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEJ5SWRPckZhaWwoaWQ6IHN0cmluZywgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLmZpbmRCeUlkKGlkLCBvcHRpb25zKVxuXG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0l0ZW0gbm90IGZvdW5kJywgNDA0KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9XG5cbiAgICBhc3luYyBwYWdpbmF0ZShvcHRpb25zPzogUGFnaW5hdGVPcHRpb25zICYgVE9wdGlvbnMpOiBQcm9taXNlPFBhZ2luYXRpb248VEVudGl0eT4+IHtcbiAgICAgICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMVxuICAgICAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0ID8/IDEwXG4gICAgICAgIGNvbnN0IG9mZnNldCA9IChwYWdlIC0gMSkgKiBsaW1pdFxuXG4gICAgICAgIGNvbnN0IFtpdGVtcywgdG90YWxdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgICAgdGhpcy5maW5kTWFueSh7IC4uLm9wdGlvbnMsIGxpbWl0LCBvZmZzZXQgfSBhcyBhbnkpLFxuICAgICAgICAgICAgdGhpcy5jb3VudChvcHRpb25zIGFzIGFueSksXG4gICAgICAgIF0pXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIHBlcl9wYWdlOiBsaW1pdCxcbiAgICAgICAgICAgIHRvdGFsLFxuICAgICAgICAgICAgdG90YWxfcGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IHtcbiAgICAgICAgICAgIFt0aGlzLnByaW1hcnlLZXldOiBjcmVhdGVJZCgpLFxuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgfSBhcyBURW50aXR5XG5cbiAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICB0aGlzLnNldEl0ZW1zKGl0ZW1zKVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgY3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10pOiBQcm9taXNlPFRFbnRpdHlbXT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKVxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZWQgPSBkYXRhLm1hcChkID0+ICh7XG4gICAgICAgICAgICBbdGhpcy5wcmltYXJ5S2V5XTogY3JlYXRlSWQoKSxcbiAgICAgICAgICAgIC4uLmQsXG4gICAgICAgIH0gYXMgVEVudGl0eSkpXG5cbiAgICAgICAgdGhpcy5zZXRJdGVtcyhbLi4uaXRlbXMsIC4uLmNyZWF0ZWRdKVxuXG4gICAgICAgIHJldHVybiBjcmVhdGVkXG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlQnlJZChpZDogc3RyaW5nLCBkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gKGl0ZW0gYXMgYW55KVt0aGlzLnByaW1hcnlLZXldID09PSBpZClcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignSXRlbSBub3QgZm91bmQnLCA0MDQpXG4gICAgICAgIH1cblxuICAgICAgICBpdGVtc1tpbmRleF0gPSB7IC4uLml0ZW1zW2luZGV4XSwgLi4uZGF0YSB9XG4gICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXMpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zW2luZGV4XVxuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZUJ5SWQoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbmRCeUlkT3JGYWlsKGlkKVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpLmZpbHRlcihpdGVtID0+IChpdGVtIGFzIGFueSlbdGhpcy5wcmltYXJ5S2V5XSAhPT0gaWQpXG5cbiAgICAgICAgdGhpcy5zZXRJdGVtcyhpdGVtcylcbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRvRGVsZXRlID0gdGhpcy5xdWVyeShvcHRpb25zIGFzIGFueSlcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyB0b0RlbGV0ZS5sZW5ndGhcbiAgICAgICAgY29uc3QgdG9EZWxldGVJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgdG9EZWxldGUuc2xpY2UoMCwgbGltaXQpLm1hcChpdGVtID0+IChpdGVtIGFzIGFueSlbdGhpcy5wcmltYXJ5S2V5XSlcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuZ2V0SXRlbXMoKS5maWx0ZXIoaXRlbSA9PiAhdG9EZWxldGVJZHMuaGFzKChpdGVtIGFzIGFueSlbdGhpcy5wcmltYXJ5S2V5XSkpXG5cbiAgICAgICAgdGhpcy5zZXRJdGVtcyhyZW1haW5pbmcpXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IE1ldGFkYXRhUXVlcnlQYXlsb2FkIH0gZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cydcbmltcG9ydCBNZXRhZGF0YVF1ZXJ5U2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL01ldGFkYXRhUXVlcnlTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgRmlsZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnMge1xuICAgIGlkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBzZWFyY2g/OiBzdHJpbmdcbiAgICBwdXJwb3NlPzogc3RyaW5nW11cbiAgICBjbGllbnRfbmFtZT86IHN0cmluZ1tdXG4gICAgbWV0YXM/OiBNZXRhZGF0YVF1ZXJ5UGF5bG9hZFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlUmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBGaWxlRW50aXR5LFxuICAgIEZpbGVFbnRpdHlbJ2lkJ10sXG4gICAgRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdmaWxlcycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBGaWxlUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucykge1xuICAgICAgICBsZXQgcWIgPSBzdXBlci5xdWVyeShvcHRpb25zIGFzIGFueSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNlYXJjaCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnZi5jbGllbnRfbmFtZScsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnB1cnBvc2U/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnZi5wdXJwb3NlJywgJ2luJywgb3B0aW9ucy5wdXJwb3NlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmNsaWVudF9uYW1lPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2YuY2xpZW50X25hbWUnLCAnaW4nLCBvcHRpb25zLmNsaWVudF9uYW1lKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm1ldGFzKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhc1F1ZXJ5U2VydmljZSA9IG5ldyBNZXRhZGF0YVF1ZXJ5U2VydmljZShvcHRpb25zLm1ldGFzLCAnZmlsZV9tZXRhcycsICdmaWxlX2lkJylcblxuICAgICAgICAgICAgcWIgPSBtZXRhc1F1ZXJ5U2VydmljZS5hcHBseShxYilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cbn1cbiIsImltcG9ydCBTaGVsbFNlcnZpY2UgZnJvbSBcIiNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzXCJcbmltcG9ydCBHaXRCcmFuY2hFbnRpdHkgZnJvbSBcIiNzaGFyZWQvZW50aXRpZXMvR2l0QnJhbmNoRW50aXR5LnRzXCJcblxuZXhwb3J0IGludGVyZmFjZSBHaXRCcmFuY2hSZXBvc2l0b3J5T3B0aW9ucyB7XG4gICAgY3dkOiBzdHJpbmdcbiAgICBzaGVsbD86IFNoZWxsU2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRCcmFuY2hSZXBvc2l0b3J5IHtcbiAgICBwdWJsaWMgY3dkOiBzdHJpbmdcbiAgICBwdWJsaWMgc2hlbGw6IFNoZWxsU2VydmljZVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogR2l0QnJhbmNoUmVwb3NpdG9yeU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jd2QgPSBvcHRpb25zLmN3ZFxuICAgICAgICB0aGlzLnNoZWxsID0gb3B0aW9ucy5zaGVsbCA/PyBuZXcgU2hlbGxTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBhc3luYyBsaXN0KCk6IFByb21pc2U8R2l0QnJhbmNoRW50aXR5W10+IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbC5leGVjdXRlQ29tbWFuZFdpdGhPdXRwdXQoXG4gICAgICAgICAgICAnZ2l0JyxcbiAgICAgICAgICAgIFsnYnJhbmNoJywgJy1hJywgYC0tZm9ybWF0PSclKEhFQUQpfCUocmVmbmFtZTpzaG9ydCl8JShyZWZuYW1lKXwlKHVwc3RyZWFtOnJlbW90ZW5hbWUpJ2BdLFxuICAgICAgICAgICAgeyBjd2Q6IHRoaXMuY3dkIH0sXG4gICAgICAgIClcblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgICAgICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLmluY2x1ZGVzKCd8JykpXG4gICAgICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hlYWQsIHJlZlNob3J0LCByZWZGdWxsLCByZW1vdGVOYW1lXSA9IGxpbmUuc3BsaXQoJ3wnKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZW1vdGUgPSByZWZGdWxsLnN0YXJ0c1dpdGgoJ3JlZnMvcmVtb3Rlcy8nKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHaXRCcmFuY2hFbnRpdHkoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZWZTaG9ydCxcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlOiBpc1JlbW90ZSA/IHJlZlNob3J0LnNwbGl0KCcvJylbMF0gOiByZW1vdGVOYW1lIHx8IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzX2N1cnJlbnQ6IGhlYWQgPT09ICcqJyxcbiAgICAgICAgICAgICAgICAgICAgaXNfcmVtb3RlOiBpc1JlbW90ZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaChvcHRpb25zOiB7IHJlbW90ZTogc3RyaW5nOyBicmFuY2g6IHN0cmluZzsgbG9jYWxOYW1lPzogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyByZW1vdGUsIGJyYW5jaCwgbG9jYWxOYW1lID0gYnJhbmNoIH0gPSBvcHRpb25zXG5cbiAgICAgICAgYXdhaXQgdGhpcy5zaGVsbC5jb21tYW5kKCdnaXQnLCBbJ2ZldGNoJywgcmVtb3RlLCBgJHticmFuY2h9OiR7bG9jYWxOYW1lfWBdLCB7IGN3ZDogdGhpcy5jd2QgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gXCIjc2VydmVyL3NlcnZpY2VzL1NoZWxsU2VydmljZS50c1wiXG5pbXBvcnQgR2l0Q29tbWl0RW50aXR5IGZyb20gXCIjc2hhcmVkL2VudGl0aWVzL0dpdENvbW1pdEVudGl0eS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0UmVwb3NpdG9yeU9wdGlvbnMge1xuICAgIGN3ZDogc3RyaW5nXG4gICAgc2hlbGw/OiBTaGVsbFNlcnZpY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRDb21taXRMaXN0T3B0aW9ucyB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBjdXJzb3I/OiBzdHJpbmdcbiAgICBicmFuY2hlcz86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0TGlzdFJlc3VsdCB7XG4gICAgaXRlbXM6IEdpdENvbW1pdEVudGl0eVtdXG4gICAgY3Vyc29yX3ByZXZpb3VzOiBzdHJpbmcgfCBudWxsXG4gICAgY3Vyc29yX2N1cnJlbnQ6IHN0cmluZyB8IG51bGxcbiAgICBjdXJzb3JfbmV4dDogc3RyaW5nIHwgbnVsbFxufVxuXG4vLyAlSCA9IGZ1bGwgaGFzaCwgJWggPSBzaG9ydCBoYXNoLCAlcyA9IHN1YmplY3QsICVhbiA9IGF1dGhvciBuYW1lLCAlYWUgPSBhdXRob3IgZW1haWwsICVhSSA9IGF1dGhvciBkYXRlIChJU08gODYwMSksICViID0gYm9keVxuY29uc3QgTE9HX0ZPUk1BVCA9IFsnJUgnLCAnJWgnLCAnJXMnLCAnJWFuJywgJyVhZScsICclYUknLCAnJWInXS5qb2luKCcleDA5JylcbmNvbnN0IENPTU1JVF9TRVBBUkFUT1IgPSAnLS0tQ09NTUlULS0tJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRDb21taXRSZXBvc2l0b3J5IHtcbiAgICBwdWJsaWMgY3dkOiBzdHJpbmdcbiAgICBwdWJsaWMgc2hlbGw6IFNoZWxsU2VydmljZVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogR2l0Q29tbWl0UmVwb3NpdG9yeU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jd2QgPSBvcHRpb25zLmN3ZFxuICAgICAgICB0aGlzLnNoZWxsID0gb3B0aW9ucy5zaGVsbCA/PyBuZXcgU2hlbGxTZXJ2aWNlKClcbiAgICB9XG5cbiAgICBhc3luYyBsaXN0KG9wdGlvbnM/OiBHaXRDb21taXRMaXN0T3B0aW9ucyk6IFByb21pc2U8R2l0Q29tbWl0TGlzdFJlc3VsdD4ge1xuICAgICAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0ID8/IDIwXG4gICAgICAgIGNvbnN0IGN1cnNvciA9IG9wdGlvbnM/LmN1cnNvclxuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbJ2xvZycsIGAtLWZvcm1hdD0ke0NPTU1JVF9TRVBBUkFUT1J9JW4ke0xPR19GT1JNQVR9YCwgYC1uYCwgU3RyaW5nKGxpbWl0KV1cblxuICAgICAgICBpZiAoY3Vyc29yKSBhcmdzLnB1c2goYCR7Y3Vyc29yfV5gKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5icmFuY2hlcykge1xuICAgICAgICAgICAgY29uc3QgYnJhbmNoZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYnJhbmNoZXMpID8gb3B0aW9ucy5icmFuY2hlcyA6IFtvcHRpb25zLmJyYW5jaGVzXVxuICAgICAgICAgICAgYXJncy5wdXNoKC4uLmJyYW5jaGVzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zPy5icmFuY2hlcyAmJiAhY3Vyc29yKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goJy0tYWxsJylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwuZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KCdnaXQnLCBhcmdzLCB7IGN3ZDogdGhpcy5jd2QgfSlcblxuICAgICAgICBjb25zdCBpdGVtcyA9IG91dHB1dFxuICAgICAgICAgICAgLnNwbGl0KENPTU1JVF9TRVBBUkFUT1IpXG4gICAgICAgICAgICAubWFwKChibG9jaykgPT4gYmxvY2sudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLm1hcCgoYmxvY2spID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbaGFzaCwgc2hvcnRIYXNoLCBtZXNzYWdlLCBhdXRob3JOYW1lLCBhdXRob3JFbWFpbCwgZGF0ZSwgLi4uYm9keVBhcnRzXSA9XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrLnNwbGl0KCdcXHQnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHaXRDb21taXRFbnRpdHkoe1xuICAgICAgICAgICAgICAgICAgICBoYXNoLFxuICAgICAgICAgICAgICAgICAgICBzaG9ydF9oYXNoOiBzaG9ydEhhc2gsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dGhvcl9uYW1lOiBhdXRob3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICBhdXRob3JfZW1haWw6IGF1dGhvckVtYWlsLFxuICAgICAgICAgICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBib2R5UGFydHMuam9pbignXFx0JykudHJpbSgpLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGN1cnNvcl9jdXJyZW50ID0gaXRlbXNbMF0/Lmhhc2ggPz8gbnVsbFxuICAgICAgICBjb25zdCBjdXJzb3JfbmV4dCA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdPy5oYXNoID8/IG51bGxcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICBjdXJzb3JfcHJldmlvdXM6IGN1cnNvciA/PyBudWxsLFxuICAgICAgICAgICAgY3Vyc29yX2N1cnJlbnQsXG4gICAgICAgICAgICBjdXJzb3JfbmV4dDogaXRlbXMubGVuZ3RoIDwgbGltaXQgPyBudWxsIDogY3Vyc29yX25leHQsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2hlY2tvdXQoaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hlbGwuY29tbWFuZCgnZ2l0JywgWydjaGVja291dCcsIGhhc2hdLCB7IGN3ZDogdGhpcy5jd2QgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbkFzc2lnbm1lbnQgfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgcGVybWlzc2lvbklkPzogbnVtYmVyIHwgbnVtYmVyW11cbiAgICBhc3NpZ25hYmxlSWQ/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgIGFzc2lnbmFibGVUeXBlPzogc3RyaW5nIHwgc3RyaW5nW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5IGV4dGVuZHMgRGF0YWJhc2VSZXBvc2l0b3J5PFxuICAgIFBlcm1pc3Npb25Bc3NpZ25tZW50LFxuICAgIFBlcm1pc3Npb25Bc3NpZ25tZW50WydpZCddLFxuICAgIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVF1ZXJ5T3B0aW9uc1xuPiB7XG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSkge1xuICAgICAgICBzdXBlcihkYiwgJ3Blcm1pc3Npb25zX2Fzc2lnbm1lbnRzJywgJ2lkJylcbiAgICB9XG5cbiAgICBwdWJsaWMgcXVlcnkob3B0aW9ucz86IFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucykge1xuICAgICAgICBsZXQgcWIgPSBzdXBlci5xdWVyeShvcHRpb25zIGFzIGFueSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnBlcm1pc3Npb25JZCkge1xuICAgICAgICAgICAgY29uc3QgcGVybWlzc2lvbklkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5wZXJtaXNzaW9uSWQpID8gb3B0aW9ucy5wZXJtaXNzaW9uSWQgOiBbb3B0aW9ucy5wZXJtaXNzaW9uSWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ3Blcm1pc3Npb25faWQnLCAnaW4nLCBwZXJtaXNzaW9uSWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmFzc2lnbmFibGVJZCkge1xuICAgICAgICAgICAgY29uc3QgYXNzaWduYWJsZUlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5hc3NpZ25hYmxlSWQpID8gb3B0aW9ucy5hc3NpZ25hYmxlSWQgOiBbb3B0aW9ucy5hc3NpZ25hYmxlSWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2Fzc2lnbmFibGVfaWQnLCAnaW4nLCBhc3NpZ25hYmxlSWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmFzc2lnbmFibGVUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCBhc3NpZ25hYmxlVHlwZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXNzaWduYWJsZVR5cGUpID8gb3B0aW9ucy5hc3NpZ25hYmxlVHlwZSA6IFtvcHRpb25zLmFzc2lnbmFibGVUeXBlXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdhc3NpZ25hYmxlX3R5cGUnLCAnaW4nLCBhc3NpZ25hYmxlVHlwZXMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG59XG4iLCJpbXBvcnQgRGF0YWJhc2VSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cydcbmltcG9ydCB0eXBlIHsgUGVybWlzc2lvbiB9IGZyb20gJyNzaGFyZWQvc2NoZW1hcy9wZXJtaXNzaW9uU2NoZW1hLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgc2VhcmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25SZXBvc2l0b3J5IGV4dGVuZHMgRGF0YWJhc2VSZXBvc2l0b3J5PFxuICAgIFBlcm1pc3Npb24sXG4gICAgUGVybWlzc2lvblsnaWQnXSxcbiAgICBQZXJtaXNzaW9uUmVwb3NpdG9yeVF1ZXJ5T3B0aW9uc1xuPiB7XG4gICAgY29uc3RydWN0b3IoZGI6IERhdGFiYXNlUmVwb3NpdG9yeVsnZGInXSkge1xuICAgICAgICBzdXBlcihkYiwgJ3Blcm1pc3Npb25zJywgJ2lkJylcbiAgICB9XG5cbiAgICBwdWJsaWMgcXVlcnkob3B0aW9ucz86IFBlcm1pc3Npb25SZXBvc2l0b3J5UXVlcnlPcHRpb25zKSB7XG4gICAgICAgIGxldCBxYiA9IHN1cGVyLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmlkKSA/IG9wdGlvbnMuaWQgOiBbb3B0aW9ucy5pZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc2VhcmNoKSB7XG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCduYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy5zZWFyY2h9JWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgeyB0bXBQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcbmltcG9ydCBTaGVsbFNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmVwb0luZm8ge1xuICAgIGRpcmVjdG9yeTogc3RyaW5nXG4gICAgaGVhZDogc3RyaW5nIHwgbnVsbFxuICAgIHNob3J0SGFzaDogc3RyaW5nXG4gICAgaXNEZXRhY2hlZEhlYWQ6IGJvb2xlYW5cbiAgICByZW1vdGVzOiBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEdhdGV3YXlPcHRpb25zIHtcbiAgICBjd2Q6IHN0cmluZ1xuICAgIHNzaEtleT86IHN0cmluZ1xuICAgIHNzaEtleUZpbGU/OiBzdHJpbmdcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgc2hlbGw/OiBTaGVsbFNlcnZpY2VcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIEdpdEdhdGV3YXlFeGVjdXRlT3B0aW9ucyB7XG4gICAgYXJnczogc3RyaW5nXG4gICAgY3dkPzogc3RyaW5nXG4gICAgc3NoS2V5Pzogc3RyaW5nXG4gICAgc3NoS2V5RmlsZT86IHN0cmluZ1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2VcbiAgICBzaGVsbD86IFNoZWxsU2VydmljZVxuICAgIGRlYnVnPzogYm9vbGVhblxufVxuXG5leHBvcnQgY2xhc3MgR2l0R2F0ZXdheSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjd2Q6IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3NoS2V5Pzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBzc2hLZXlGaWxlPzogc3RyaW5nXG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlclNlcnZpY2UgPSBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1ZzogYm9vbGVhblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hlbGw6IFNoZWxsU2VydmljZVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogR2l0R2F0ZXdheU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jd2QgPSBvcHRpb25zLmN3ZFxuICAgICAgICB0aGlzLnNzaEtleSA9IG9wdGlvbnMuc3NoS2V5XG4gICAgICAgIHRoaXMuc3NoS2V5RmlsZSA9IG9wdGlvbnMuc3NoS2V5RmlsZVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5zaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gbmV3IFNoZWxsU2VydmljZSh7IGxvZ2dlcjogdGhpcy5sb2dnZXIsIGRlYnVnOiBvcHRpb25zLmRlYnVnIH0pXG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBleGVjdXRlKG9wdGlvbnM6IEdpdEdhdGV3YXlFeGVjdXRlT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IG9wdGlvbnMuY3dkXG4gICAgICAgIGNvbnN0IHNzaEtleSA9IG9wdGlvbnMuc3NoS2V5XG4gICAgICAgIGNvbnN0IHNzaEtleUZpbGUgPSBvcHRpb25zLnNzaEtleUZpbGVcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgPz8gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICBjb25zdCBkZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcbiAgICAgICAgY29uc3QgYXJncyA9IG9wdGlvbnMuYXJnc1xuICAgICAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gbmV3IFNoZWxsU2VydmljZSh7IGxvZ2dlciwgZGVidWcgfSlcblxuICAgICAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IH1cblxuICAgICAgICBpZiAoc3NoS2V5RmlsZSkge1xuICAgICAgICAgICAgZW52LkdJVF9TU0hfQ09NTUFORCA9IGBzc2ggLWkgJHtzc2hLZXlGaWxlfSAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9bm9gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3NoS2V5KSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wRmlsZSA9IHRtcFBhdGgoJ2dpdC1jbG9uZS1zc2gta2V5LScgKyByYW5kb21VVUlEKCkpXG5cbiAgICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZSh0ZW1wRmlsZSwgc3NoS2V5LCB7IG1vZGU6IDBvNjAwIH0pXG5cbiAgICAgICAgICAgIGVudi5HSVRfU1NIX0NPTU1BTkQgPSBgc3NoIC1pICR7dGVtcEZpbGV9IC1vIFN0cmljdEhvc3RLZXlDaGVja2luZz1ub2BcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBgZ2l0ICR7YXJnc31gXG5cbiAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoY29tbWFuZCwge1xuICAgICAgICAgICAgICAgIGN3ZDogY3dkLFxuICAgICAgICAgICAgICAgIHNzaEtleUZpbGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoZWxsLmV4ZWN1dGVDb21tYW5kV2l0aE91dHB1dCgnZ2l0JywgYXJncy5zcGxpdCgnICcpLCB7XG4gICAgICAgICAgICBjd2Q6IGN3ZCxcbiAgICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgICAgICAgIC4uLmVudixcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBjbG9uZShyZXBvVXJsOiBzdHJpbmcsIHRhcmdldERpcjogc3RyaW5nLCBvcHRpb25zOiBPbWl0PEdpdEdhdGV3YXlPcHRpb25zLCAnY3dkJz4pIHtcbiAgICAgICAgYXdhaXQgR2l0R2F0ZXdheS5leGVjdXRlKHtcbiAgICAgICAgICAgIHNzaEtleTogb3B0aW9ucy5zc2hLZXksXG4gICAgICAgICAgICBzc2hLZXlGaWxlOiBvcHRpb25zLnNzaEtleUZpbGUsXG4gICAgICAgICAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyLFxuICAgICAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgICAgICBzaGVsbDogb3B0aW9ucy5zaGVsbCxcbiAgICAgICAgICAgIGFyZ3M6IGBjbG9uZSAnJHtyZXBvVXJsfScgJyR7dGFyZ2V0RGlyfSdgLFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBuZXcgR2l0R2F0ZXdheSh7IC4uLm9wdGlvbnMsIGN3ZDogdGFyZ2V0RGlyIH0pXG4gICAgfVxuXG5cbiAgICBhc3luYyBydW4oYXJnczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IEdpdEdhdGV3YXkuZXhlY3V0ZSh7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuY3dkLFxuICAgICAgICAgICAgc3NoS2V5OiB0aGlzLnNzaEtleSxcbiAgICAgICAgICAgIHNzaEtleUZpbGU6IHRoaXMuc3NoS2V5RmlsZSxcbiAgICAgICAgICAgIGxvZ2dlcjogdGhpcy5sb2dnZXIsXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgICAgICAgIHNoZWxsOiB0aGlzLnNoZWxsLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBhc3luYyB0cnlSdW4oYXJnczogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzcG9uc2VdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gdGhpcy5ydW4oYXJncykpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvcilcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja291dChyZWY6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW4oYGNoZWNrb3V0ICR7cmVmfWApXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ1bignZmV0Y2ggLS1hbGwgLS1wcnVuZScpXG4gICAgfVxuXG4gICAgYXN5bmMgcHVsbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5mZXRjaEFsbCgpXG5cbiAgICAgICAgY29uc3QgdXBzdHJlYW0gPSBhd2FpdCB0aGlzLnRyeVJ1bigncmV2LXBhcnNlIC0tYWJicmV2LXJlZiAtLXN5bWJvbGljLWZ1bGwtbmFtZSBAe3Vwc3RyZWFtfScpXG5cbiAgICAgICAgaWYgKHVwc3RyZWFtKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJ1bihgcHVsbCAtLWZmLW9ubHlgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0SW5mbygpOiBQcm9taXNlPEdpdFJlcG9JbmZvPiB7XG4gICAgICAgIGNvbnN0IGhlYWQgPSBhd2FpdCB0aGlzLnJ1bigncmV2LXBhcnNlIC0tYWJicmV2LXJlZiBIRUFEJylcbiAgICAgICAgY29uc3QgaXNEZXRhY2hlZEhlYWQgPSBoZWFkID09PSAnSEVBRCdcblxuICAgICAgICBjb25zdCBzaG9ydEhhc2ggPSBhd2FpdCB0aGlzLnJ1bigncmV2LXBhcnNlIC0tc2hvcnQgSEVBRCcpXG5cbiAgICAgICAgY29uc3QgcmVtb3Rlc091dHB1dCA9IGF3YWl0IHRoaXMudHJ5UnVuKCdyZW1vdGUnKVxuXG4gICAgICAgIGNvbnN0IHJlbW90ZXMgPSByZW1vdGVzT3V0cHV0XG4gICAgICAgICAgICA/IHJlbW90ZXNPdXRwdXQuc3BsaXQoJ1xcbicpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgOiBbXVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IHRoaXMuY3dkLFxuICAgICAgICAgICAgaGVhZDogaXNEZXRhY2hlZEhlYWQgPyBudWxsIDogaGVhZCxcbiAgICAgICAgICAgIHNob3J0SGFzaCxcbiAgICAgICAgICAgIGlzRGV0YWNoZWRIZWFkLFxuICAgICAgICAgICAgcmVtb3RlcyxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHVwZGF0ZU9yQ3JlYXRlIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL2luZGV4LnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzICBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlVG9TdHJpbmcodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIGBqc29uOiR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgcmV0dXJuIGBib29sOiR7dmFsdWV9YFxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBgbnVtYmVyOiR7dmFsdWV9YFxuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1ldGFkYXRhPFRhYmxlIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+KG1ldGFzVGFibGU6IFRhYmxlLCBmb3JlaWduS2V5OiBrZXlvZiBEYXRhYmFzZVtUYWJsZV0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gTWV0YWRhdGFFeHRlbmQ8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IFQpOiBQcm9taXNlPFQ+XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvciBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gY29uc3RydWN0b3IuX19tb2RlbD8udGFibGVcbiAgICAgICAgICAgICAgICBjb25zdCBwcmltYXJ5S2V5ID0gY29uc3RydWN0b3IuX19tb2RlbD8ucHJpbWFyeUtleVxuXG4gICAgICAgICAgICAgICAgaWYgKCF0YWJsZSB8fCAhcHJpbWFyeUtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCB1c2UgTW9kZWwgbWl4aW4gYmVmb3JlIE1ldGFkYXRhJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSBkYi5zZWxlY3RGcm9tKG1ldGFzVGFibGUpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKClcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlKChmb3JlaWduS2V5IGFzIHN0cmluZyksICc9JywgKHRoaXMgYXMgYW55KVtwcmltYXJ5S2V5XSlcbiAgICAgICAgICAgICAgICAgICAgLndoZXJlKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICAubGltaXQoMSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGVUYWtlRmlyc3QoKSBcblxuICAgICAgICAgICAgICAgIGlmICghcm93IHx8ICFyb3cudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHJvdz8udmFsdWVcblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2pzb246JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBKU09OLnBhcnNlKHZhbHVlLnNsaWNlKDUpKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoJ2Jvb2w6JykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSg1KSA9PT0gJ3RydWUnXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIGFzeW5jIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3IgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnRhYmxlXG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnByaW1hcnlLZXlcblxuICAgICAgICAgICAgICAgIGlmICghdGFibGUgfHwgIXByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgdXNlIE1vZGVsIG1peGluIGJlZm9yZSBNZXRhZGF0YScpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICAgICAgICAgICAgICBbZm9yZWlnbktleV06ICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0sXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFsdWVzLnZhbHVlID0gdmFsdWVUb1N0cmluZyh2YWx1ZSlcblxuICAgICAgICAgICAgICAgIGF3YWl0IHVwZGF0ZU9yQ3JlYXRlKG1ldGFzVGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMgYXMgYW55LFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogKHFiOiBhbnkpID0+IHFiLmFuZChbXG4gICAgICAgICAgICAgICAgICAgICAgICBxYi5lYigoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgcWIuZWIoJ25hbWUnLCAnPScsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IG9taXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBlbWl0SG9vayB9IGZyb20gJyNzaGFyZWQvbWl4aW5zL0hvb2tzTWl4aW4udHMnXG5pbXBvcnQgdHlwZSB7IFVwZGF0ZU9yQ3JlYXRlT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy91cGRhdGVPckNyZWF0ZS50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgKiBhcyBxdWVyaWVzIGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9pbmRleC50cydcblxuaW1wb3J0IHR5cGUgeyBMaXN0T3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9saXN0LnRzJ1xuaW1wb3J0IHR5cGUgeyBQYWdpbmF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvcGFnaW5hdGUudHMnXG5pbXBvcnQgdHlwZSB7IENvdW50T3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9jb3VudC50cydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9jcmVhdGUudHMnXG5pbXBvcnQgdHlwZSB7IFVwZGF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvdXBkYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEZXN0cm95T3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9kZXN0cm95LnRzJ1xuaW1wb3J0IHR5cGUgeyBGaXJzdE9yQ3JlYXRlT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9maXJzdE9yQ3JlYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBGaW5kT25lT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9maW5kT25lLnRzJ1xuaW1wb3J0IHR5cGUgUGFnaW5hdGlvbiBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMnXG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdG9yIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCB0eXBlIHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuXG5leHBvcnQgdHlwZSBNb2RlbExpc3RPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PExpc3RPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz5cbmV4cG9ydCB0eXBlIE1vZGVsRmluZE9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8RmluZE9uZU9wdGlvbnM8VD4sICdzZXJpYWxpemUnIHwgJ29yZGVyQnknPlxuZXhwb3J0IHR5cGUgTW9kZWxQYWdpbmF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8UGFnaW5hdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz5cbmV4cG9ydCB0eXBlIE1vZGVsQ291bnRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBDb3VudE9wdGlvbnM8VD5cbmV4cG9ydCB0eXBlIE1vZGVsQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxDcmVhdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz5cbmV4cG9ydCB0eXBlIE1vZGVsVXBkYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxVcGRhdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz5cbmV4cG9ydCB0eXBlIE1vZGVsRGVzdHJveU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IERlc3Ryb3lPcHRpb25zPFQ+XG5leHBvcnQgdHlwZSBNb2RlbEZpcnN0T3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PEZpcnN0T3JDcmVhdGVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJz5cbmV4cG9ydCB0eXBlIE1vZGVsVXBkYXRlT3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5cbmV4cG9ydCB0eXBlIE1vZGVsRW50aXR5ID0gUmV0dXJuVHlwZTxSZXR1cm5UeXBlPHR5cGVvZiBNb2RlbE1peGluPGFueT4+PlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNb2RlbE1peGluPFRhYmxlIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+KHRhYmxlOiBUYWJsZSwgcHJpbWFyeUtleToga2V5b2YgRGF0YWJhc2VbVGFibGVdID0gJ2lkJyBhcyBhbnkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gTW9kZWxFeHRlbmQ8VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oQmFzZTogVEJhc2UpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgQmFzZSB7XG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIF9fbW9kZWwgPSB7XG4gICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgcHJpbWFyeUtleSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBzZXJpYWxpemU8VD4odGhpczogbmV3ICgpID0+IFQsIHJvdzogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgdGhpcygpIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBzZWxlY3QoKTogU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBUYWJsZSwgYW55PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRiLnNlbGVjdEZyb20odGFibGUpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAndGhpcycgaXMgdGhlIGNvbmNyZXRlIGNvbnN0cnVjdG9yIChlLmcuIEZvb2QpLCBzbyB0aGUgcmV0dXJuIHR5cGUgaXMgaW5mZXJyZWQgY29ycmVjdGx5LlxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBwYWdpbmF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsUGFnaW5hdGVPcHRpb25zPFRhYmxlPik6IFByb21pc2U8UGFnaW5hdGlvbjxUPj4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRpb24gPSBhd2FpdCBxdWVyaWVzLnBhZ2luYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHJvdyBvZiBwYWdpbmF0aW9uLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyUGFnaW5hdGUnLCBwYWdpbmF0aW9uKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2luYXRpb24gYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbGlzdDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsTGlzdE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHF1ZXJpZXMubGlzdCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAuLi5vLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIGl0ZW0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckxpc3QnLCBpdGVtcylcblxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kT25lPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogTW9kZWxGaW5kT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG8/LnF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogbz8ud2hlcmUsXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kT25lT3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvPzogTW9kZWxGaW5kT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmVPckZhaWwodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbz8ubmFtZSA/PyBjb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJGaW5kJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBpZDogYW55KTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZClcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZClcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIERhdGFiYXNlW1RhYmxlXSwgdmFsdWU6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihjb2x1bW4gYXMgc3RyaW5nLCAnPScsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJGaW5kJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kQnlPckZhaWw8VD4odGhpczogbmV3ICgpID0+IFQsIGNvbHVtbjoga2V5b2YgRGF0YWJhc2VbVGFibGVdLCB2YWx1ZTogYW55KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lT3JGYWlsKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbnN0cnVjdG9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogKHFiOiBhbnkpID0+IHFiKGNvbHVtbiBhcyBzdHJpbmcsICc9JywgdmFsdWUpXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4aXN0czxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsTGlzdE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJpZXMuZXhpc3RzKHRhYmxlLCB7IHF1ZXJ5OiBvPy5xdWVyeSB9KSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjb3VudDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsQ291bnRPcHRpb25zPFRhYmxlPik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJpZXMuY291bnQodGFibGUsIG8pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgcGF5bG9hZDogTW9kZWxDcmVhdGVPcHRpb25zPFRhYmxlPlsndmFsdWVzJ10pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB7IC4uLnBheWxvYWQgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVDcmVhdGUnLCB2YWx1ZXMpXG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmNyZWF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyQ3JlYXRlJywgcm93KVxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3dcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGVNYW55PFQ+KHRoaXM6IG5ldyAoKSA9PiBULCB2YWx1ZXM6IEFycmF5PE1vZGVsQ3JlYXRlT3B0aW9uczxUYWJsZT5bJ3ZhbHVlcyddPik6IFByb21pc2U8VFtdPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93cyA9IFtdXG5cbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2JlZm9yZUNyZWF0ZScsIHZhbHVlKVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuY3JlYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckNyZWF0ZScsIHJvdylcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocm93KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiByb3dzIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHVwZGF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogTW9kZWxVcGRhdGVPcHRpb25zPFRhYmxlPik6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHsgLi4uby52YWx1ZXMgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVVcGRhdGUnLCB2YWx1ZXMsIG8ud2hlcmUpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLnVwZGF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Zzogby5kZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IG8ud2hlcmUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lT3JGYWlsKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiBvLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJVcGRhdGUnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdXBkYXRlQnlJZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSwgdmFsdWVzOiBNb2RlbFVwZGF0ZU9wdGlvbnM8VGFibGU+Wyd2YWx1ZXMnXSwgb3B0aW9ucz86IHsgZGVidWc/OiBib29sZWFuIH0pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogKHFiOiBhbnkpID0+IHFiKHByaW1hcnlLZXkgYXMgc3RyaW5nLCAnPScsIGlkKSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXMsXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzdHJveTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRGVzdHJveU9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVEZXN0cm95JywgbylcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJpZXMuZGVzdHJveSh0YWJsZSwgbylcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJEZXN0cm95JywgbylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaXJzdE9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBvOiBNb2RlbEZpcnN0T3JDcmVhdGVPcHRpb25zPFRhYmxlPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLmZpcnN0T3JDcmVhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdXBkYXRlT3JDcmVhdGU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgbzogTW9kZWxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VGFibGU+KTogVCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJpZXMudXBkYXRlT3JDcmVhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWc6IG8uZGVidWcsXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiBvLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IG8uc2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGU6IG8udXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG8udmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXN0cm95QnlJZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogKHFiOiBhbnkpID0+IHFiLndoZXJlKHByaW1hcnlLZXkgYXMgc3RyaW5nLCAnPScsIGlkKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlRGVzdHJveScsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLmRlc3Ryb3kodGFibGUsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRGVzdHJveScsIG9wdGlvbnMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBzYXZlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gKHRoaXMgYXMgYW55KS5jb25zdHJ1Y3RvclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG9taXQodGhpcyBhcyBhbnksIFtwcmltYXJ5S2V5IGFzIHN0cmluZ10pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2JlZm9yZVNhdmUnLCB0aGlzLCB2YWx1ZXMpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLnVwZGF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICB3aGVyZTogKHFiOiBhbnkpID0+IHFiKHByaW1hcnlLZXksICc9JywgKHRoaXMgYXMgYW55KVtwcmltYXJ5S2V5XSksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyU2F2ZScsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gKHRoaXMgYXMgYW55KS5jb25zdHJ1Y3RvclxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVEZXN0cm95JywgdGhpcylcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJpZXMuZGVzdHJveSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBxdWVyeTogcWIgPT4gKHFiIGFzIGFueSkud2hlcmUocHJpbWFyeUtleSwgJz0nLCAodGhpcyBhcyBhbnkpLmlkKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRGVzdHJveScsIHRoaXMpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBzb2Z0RGVsZXRlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gKHRoaXMgYXMgYW55KS5jb25zdHJ1Y3RvclxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVTb2Z0RGVsZXRlJywgdGhpcylcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyaWVzLnNvZnREZWxldGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHFiID0+IChxYiBhcyBhbnkpLndoZXJlKHByaW1hcnlLZXksICc9JywgKHRoaXMgYXMgYW55KS5pZClcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gcm93c1swXVxuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzIGFzIGFueSwgcm93KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlclNvZnREZWxldGUnLCB0aGlzKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuaW50ZXJmYWNlIFJlbGF0aW9uIHtcbiAgICBsb2FkKGVudGl0aWVzOiBhbnlbXSk6IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUmVsYXRpb248UiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFJlbGF0aW9uPj4ocmVsYXRpb25zOiBSKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIFJlbGF0aW9uRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxvYWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGVudGl0aWVzOiBUIHwgVFtdLCBuYW1lczoga2V5b2YgUiB8IChrZXlvZiBSKVtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGVudGl0aWVzKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uTmFtZXMgPSBBcnJheS5pc0FycmF5KG5hbWVzKSA/IG5hbWVzIDogW25hbWVzXVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIHJlbGF0aW9uTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb24gPSByZWxhdGlvbnM/LltuYW1lIGFzIHN0cmluZ10gYXMgUmVsYXRpb25cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlbGF0aW9uICR7U3RyaW5nKG5hbWUpfSBkZWNsYXJlZGApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhd2FpdCByZWxhdGlvbi5sb2FkKGl0ZW1zKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgRG93bmxvYWRTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvRG93bmxvYWRTZXJ2aWNlLnRzJ1xuXG5jb25zdCBkb3dubG9hZCA9IG5ldyBEb3dubG9hZFNlcnZpY2UoKVxuXG5leHBvcnQgZGVmYXVsdCBkb3dubG9hZFxuXG4iLCJpbXBvcnQgRHJpdmVTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvRHJpdmVTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lci50cydcblxuY29uc3QgZHJpdmUgPSBjb250YWluZXIucHJveHk8RHJpdmVTZXJ2aWNlPihEcml2ZVNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGRyaXZlXG5cbiIsImltcG9ydCBFbnZTZXJ2aWNlIGZyb20gXCIjc2VydmVyL3NlcnZpY2VzL0VudlNlcnZpY2UudHNcIlxuaW1wb3J0IGNvbnRhaW5lciBmcm9tIFwiLi9jb250YWluZXJcIlxuXG5jb25zdCBlbnYgPSBjb250YWluZXIucHJveHk8RW52U2VydmljZT4oRW52U2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZW52XG5cbiIsImltcG9ydCBGaWxlUmVwb3NpdG9yeSBmcm9tIFwiI3NlcnZlci9yZXBvc2l0b3JpZXMvRmlsZVJlcG9zaXRvcnkudHNcIjtcbmltcG9ydCBkYXRhYmFzZSBmcm9tIFwiLi9kYXRhYmFzZS50c1wiO1xuXG5jb25zdCBmaWxlUmVwb3NpdG9yeSA9IG5ldyBGaWxlUmVwb3NpdG9yeShkYXRhYmFzZSlcblxuZXhwb3J0IGRlZmF1bHQgZmlsZVJlcG9zaXRvcnlcbiIsImltcG9ydCBIdHRwU2VydmljZSBmcm9tIFwiI3NlcnZlci9zZXJ2aWNlcy9IdHRwU2VydmljZS50c1wiO1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tIFwiLi9jb250YWluZXJcIjtcblxuY29uc3QgaHR0cCA9IGNvbnRhaW5lci5wcm94eTxIdHRwU2VydmljZT4oSHR0cFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGh0dHBcbiIsImltcG9ydCBNaWdyYXRvclNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NaWdyYXRvclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBtaWdyYXRvciA9IGNvbnRhaW5lci5wcm94eTxNaWdyYXRvclNlcnZpY2U+KE1pZ3JhdG9yU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbWlncmF0b3JcbiIsImltcG9ydCBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuY29uc3QgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5ID0gbmV3IFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeShkYiBhcyBhbnkpXG5cbmV4cG9ydCBkZWZhdWx0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVxuIiwiaW1wb3J0IFBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25SZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuY29uc3QgcGVybWlzc2lvblJlcG9zaXRvcnkgPSBuZXcgUGVybWlzc2lvblJlcG9zaXRvcnkoZGIgYXMgYW55KVxuXG5leHBvcnQgZGVmYXVsdCBwZXJtaXNzaW9uUmVwb3NpdG9yeVxuIiwiaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5pbXBvcnQgUm91dGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5cbmNvbnN0IHJvdXRlciA9IGNvbnRhaW5lci5wcm94eTxSb3V0ZXJTZXJ2aWNlPEh0dHBDb250ZXh0Pj4oUm91dGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgcm91dGVyXG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgU2NoZWR1bGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1NjaGVkdWxlclNlcnZpY2UudHMnXG5cbmNvbnN0IHNjaGVkdWxlciA9IGNvbnRhaW5lci5wcm94eTxTY2hlZHVsZXJTZXJ2aWNlPihTY2hlZHVsZXJTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBzY2hlZHVsZXJcbiIsImltcG9ydCBTaGVsbFNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBzaGVsbCA9IGNvbnRhaW5lci5wcm94eTxTaGVsbFNlcnZpY2U+KFNoZWxsU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgc2hlbGxcbiIsImV4cG9ydCBpbnRlcmZhY2UgTG9hZGVyPFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbG9hZChlbnRpdGllczogVFtdKTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRlclJlY29yZDxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIFtrZXk6IHN0cmluZ106IExvYWRlcjxUPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTG9hZGVyPFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pihsb2FkZXI6IExvYWRlcjxUPik6IExvYWRlcjxUPiB7XG4gICAgcmV0dXJuIGxvYWRlclxufVxuIiwiaW1wb3J0IHsgc2V0LCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBkZWZpbmVMb2FkZXIgfSBmcm9tICcjc2VydmVyL3V0aWxzL2RlZmluZUxvYWRlci50cydcblxudHlwZSBLZXlPckZ1bmN0aW9uPFQ+ID0ga2V5b2YgVCB8ICgoZW50aXR5OiBUKSA9PiBhbnkpXG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFxuICAgIFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUGl2b3RFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUVGFyZ2V0RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT5cbj4ge1xuICAgIGtleTogc3RyaW5nIC8vIHRhcmdldCBwcm9wZXJ0eSB0byBzZXQgb24gdGhlIGVudGl0eVxuICAgIHBpdm90OiB7XG4gICAgICAgIHNvdXJjZUtleTogS2V5T3JGdW5jdGlvbjxURW50aXR5PiAvLyBwaXZvdCB0YWJsZSBmb3JlaWduIGtleSB0byByZWxhdGVkIGVudGl0eVxuICAgICAgICB0YXJnZXRLZXk6IEtleU9yRnVuY3Rpb248VFBpdm90RW50aXR5PiAvLyBwaXZvdCB0YWJsZSBmb3JlaWduIGtleSB0byBjdXJyZW50IGVudGl0eVxuICAgICAgICBmaW5kRW50aXRpZXMoaWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTxUUGl2b3RFbnRpdHlbXT4gLy8gZnVuY3Rpb24gdG8gZmV0Y2ggcGl2b3QgdGFibGUgcm93cyBieSByZWxhdGVkIGVudGl0eSBpZHNcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgICBzb3VyY2VLZXk6IEtleU9yRnVuY3Rpb248VFBpdm90RW50aXR5PiAvLyB0YXJnZXQgZW50aXR5IGlkIGtleSwgZGVmYXVsdCAnaWQnXG4gICAgICAgIHRhcmdldEtleTogS2V5T3JGdW5jdGlvbjxUVGFyZ2V0RW50aXR5PiAvLyB0YXJnZXQgZW50aXR5IGZvcmVpZ24ga2V5IHRvIHBpdm90IHRhYmxlXG4gICAgICAgIGZpbmRFbnRpdGllcyhpZHM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPFRUYXJnZXRFbnRpdHlbXT4gLy8gZnVuY3Rpb24gdG8gZmV0Y2ggcmVsYXRlZCBlbnRpdGllcyBieSBpZHNcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkSGFzTWFueVRocm91Z2g8XG4gICAgVEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PlxuPihwYXlsb2FkOiBhbnkgfCBhbnlbXSwgb3B0aW9uczogSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFRFbnRpdHksIFRQaXZvdEVudGl0eSwgVFRhcmdldEVudGl0eT4pIHtcbiAgICBjb25zdCBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG4gICAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgXG4gICAgY29uc3QgcGl2b3QgPSBvcHRpb25zLnBpdm90XG5cbiAgICBmdW5jdGlvbiBmaW5kS2V5KGVudGl0eTogYW55LCBrZXlPckZuOiBLZXlPckZ1bmN0aW9uPGFueT4pOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIGtleU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlPckZuKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXQoZW50aXR5LCBrZXlPckZuKVxuICAgICAgICBcbiAgICB9XG5cbiAgICBjb25zdCBwaXZvSWRzID0gZW50aXRpZXMubWFwKGUgPT4gZmluZEtleShlLCBwaXZvdC5zb3VyY2VLZXkpKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBwaXZvdEVudGl0aWVzID0gYXdhaXQgcGl2b3QuZmluZEVudGl0aWVzKHBpdm9JZHMpXG4gICAgY29uc3QgdGFyZ2V0SWRzID0gcGl2b3RFbnRpdGllcy5tYXAoKHA6IGFueSkgPT4gZmluZEtleShwLCBwaXZvdC50YXJnZXRLZXkpKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9IGF3YWl0IHRhcmdldC5maW5kRW50aXRpZXModGFyZ2V0SWRzKVxuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgcGl2b3RzID0gcGl2b3RFbnRpdGllcy5maWx0ZXIoKHA6IGFueSkgPT4gZmluZEtleShwLCBwaXZvdC5zb3VyY2VLZXkpID09PSBmaW5kS2V5KGVudGl0eSwgcGl2b3Quc291cmNlS2V5KSlcblxuICAgICAgICBpZiAoIXBpdm90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldChlbnRpdHksIG9wdGlvbnMua2V5LCBbXSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGFyZ2V0RW50aXRpZXMuZmlsdGVyKCh0OiBhbnkpID0+IHBpdm90cy5zb21lKChwOiBhbnkpID0+IGZpbmRLZXkocCwgdGFyZ2V0LnNvdXJjZUtleSkgPT09IGZpbmRLZXkodCwgdGFyZ2V0LnRhcmdldEtleSkpKVxuXG4gICAgICAgIHNldChlbnRpdHksIG9wdGlvbnMua2V5LCB0YXJnZXRzKVxuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFzTWFueVRocm91Z2hMb2FkZXI8XG4gICAgVEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PlxuPihvcHRpb25zOiBIYXNNYW55VGhyb3VnaExvYWRlck9wdGlvbnM8VEVudGl0eSwgVFBpdm90RW50aXR5LCBUVGFyZ2V0RW50aXR5Pikge1xuICAgIHJldHVybiBkZWZpbmVMb2FkZXI8VEVudGl0eT4oe1xuICAgICAgICBsb2FkOiBhc3luYyAoZW50aXRpZXM6IFRFbnRpdHlbXSkgPT4gbG9hZEhhc01hbnlUaHJvdWdoKGVudGl0aWVzLCBvcHRpb25zKVxuICAgIH0pXG59XG5cblxuIiwiaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnQHNpZGVraWNrLWNvZGVyL3plbml0aC1raXQvc2hhcmVkJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cydcbmltcG9ydCB7IGRlZmluZUxvYWRlciB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvZGVmaW5lTG9hZGVyLnRzJ1xuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkxvYWRlck9wdGlvbnMge1xuICAgIGFzc2lnbmFibGVUeXBlOiBzdHJpbmcgfCAoKGU6IGFueSkgPT4gc3RyaW5nKVxuICAgIGFzc2lnbmFibGVJZDogc3RyaW5nIHwgKChlOiBhbnkpID0+IHN0cmluZylcbiAgICB0YXJnZXRLZXk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQZXJtaXNzaW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ocGF5bG9hZDogVCB8IFRbXSwgb3B0aW9ucz86IFBlcm1pc3Npb25Mb2FkZXJPcHRpb25zKSB7XG4gICAgY29uc3QgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gb3B0aW9ucz8udGFyZ2V0S2V5IHx8ICdwZXJtaXNzaW9ucydcbiAgICBjb25zdCBhc3NpZ25UeXBlRm4gPSB0eXBlb2Ygb3B0aW9ucz8uYXNzaWduYWJsZVR5cGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFzc2lnbmFibGVUeXBlIDogKCkgPT4gb3B0aW9ucz8uYXNzaWduYWJsZVR5cGUgYXMgc3RyaW5nXG4gICAgY29uc3QgYXNzaWduYWJsZUlkRm4gPSB0eXBlb2Ygb3B0aW9ucz8uYXNzaWduYWJsZUlkID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hc3NpZ25hYmxlSWQgOiAoKSA9PiBvcHRpb25zPy5hc3NpZ25hYmxlSWQgYXMgc3RyaW5nXG5cbiAgICBjb25zdCBhc3NpZ25UeXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgY29uc3QgYXNzaWduYWJsZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCBhc3NpZ25hYmxlVHlwZSA9IGFzc2lnblR5cGVGbihlbnRpdHkpXG4gICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZCA9IGFzc2lnbmFibGVJZEZuKGVudGl0eSlcblxuICAgICAgICBpZiAoYXNzaWduYWJsZVR5cGUgJiYgYXNzaWduYWJsZUlkKSB7XG4gICAgICAgICAgICBhc3NpZ25UeXBlcy5hZGQoYXNzaWduYWJsZVR5cGUpXG4gICAgICAgICAgICBhc3NpZ25hYmxlSWRzLmFkZChhc3NpZ25hYmxlSWQpXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gYXdhaXQgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LmZpbmRNYW55KHtcbiAgICAgICAgYXNzaWduYWJsZUlkOiBBcnJheS5mcm9tKGFzc2lnbmFibGVJZHMudmFsdWVzKCkpLFxuICAgICAgICBhc3NpZ25hYmxlVHlwZTogQXJyYXkuZnJvbShhc3NpZ25UeXBlcy52YWx1ZXMoKSksXG4gICAgfSlcblxuICAgIGNvbnN0IHBlcm1pc3Npb25JZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSkpXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCBwZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kTWFueSh7IGlkOiBwZXJtaXNzaW9uSWRzIH0pXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCBhc3NpZ25hYmxlVHlwZSA9IGFzc2lnblR5cGVGbihlbnRpdHkpXG4gICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZCA9IGFzc2lnbmFibGVJZEZuKGVudGl0eSlcblxuICAgICAgICBpZiAoIWFzc2lnbmFibGVUeXBlIHx8ICFhc3NpZ25hYmxlSWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRpdHlBc3NpZ25tZW50cyA9IGFzc2lnbm1lbnRzLmZpbHRlcihhID0+IGEuYXNzaWduYWJsZV90eXBlID09PSBhc3NpZ25hYmxlVHlwZSAmJiBhLmFzc2lnbmFibGVfaWQgPT09IGFzc2lnbmFibGVJZClcbiAgICAgICAgY29uc3QgZW50aXR5UGVybWlzc2lvbnMgPSBlbnRpdHlBc3NpZ25tZW50cy5tYXAoYSA9PiBwZXJtaXNzaW9ucy5maW5kKHAgPT4gcC5pZCA9PT0gYS5wZXJtaXNzaW9uX2lkKSkuZmlsdGVyKEJvb2xlYW4pIGFzIFBlcm1pc3Npb25bXVxuXG4gICAgICAgIHNldChlbnRpdHksIHRhcmdldEtleSwgZW50aXR5UGVybWlzc2lvbnMpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGVybWlzc2lvbkxvYWRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9ucz86IFBlcm1pc3Npb25Mb2FkZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIGRlZmluZUxvYWRlcjxUPih7IGxvYWQ6IChlbnRpdGllcykgPT4gbG9hZFBlcm1pc3Npb25zKGVudGl0aWVzLCBvcHRpb25zKSwgfSlcbn1cblxuIiwiaW1wb3J0IEJhc2VBY2wgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNsIGV4dGVuZHMgQmFzZUFjbCB7XG4gICAgcHVibGljIGF1dGhvcml6ZShhY3Rpb246IHN0cmluZywgc3ViamVjdDogYW55LCBvYmplY3Q/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGlmICh0aGlzLmNhbm5vdChhY3Rpb24sIHN1YmplY3QsIG9iamVjdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24oJ1VuYXV0aG9yaXplZCcsIDQwMylcblxuICAgICAgICAgICAgbGV0IHN1YmplY3ROYW1lID0gJydcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHN1YmplY3ROYW1lID0gc3ViamVjdFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ViamVjdCAmJiB0eXBlb2Ygc3ViamVjdCA9PT0gJ2Z1bmN0aW9uJyAmJiBzdWJqZWN0Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0TmFtZSA9IHN1YmplY3QubmFtZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3ViamVjdCAmJiB0eXBlb2Ygc3ViamVjdCA9PT0gJ29iamVjdCcgJiYgc3ViamVjdC5jb25zdHJ1Y3RvciAmJiBzdWJqZWN0LmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0TmFtZSA9IHN1YmplY3QuY29uc3RydWN0b3IubmFtZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIHN1YmplY3Q6IHN1YmplY3ROYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBNb2RlbE1peGluIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHMnXG5pbXBvcnQgQmFzZU1ldGEgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2VXaXRoKFxuICAgIEJhc2VNZXRhLFxuICAgIE1vZGVsTWl4aW4oJ2ZpbGVfbWV0YXMnKVxuKSB7XG5cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UudHMnXG5cbmludGVyZmFjZSBIYXNNZXRhc09wdGlvbnMge1xuICAgIHRhYmxlOiBrZXlvZiBEYXRhYmFzZVxuICAgIHRhYmxlS2V5OiBzdHJpbmdcbiAgICBcbiAgICB0YXJnZXRUYWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHJvcGVydHk6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIYXNNZXRhcyB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSGFzTWV0YXNPcHRpb25zKSB7XG4gICAgICAgIHRoaXMudGFibGUgPSBvcHRpb25zLnRhYmxlXG4gICAgICAgIHRoaXMudGFibGVLZXkgPSBvcHRpb25zLnRhYmxlS2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhcmdldFRhYmxlID0gb3B0aW9ucy50YXJnZXRUYWJsZVxuICAgICAgICB0aGlzLnRhcmdldEtleSA9IG9wdGlvbnMudGFyZ2V0S2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnByb3BlcnR5ID0gb3B0aW9ucy5wcm9wZXJ0eVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoKVxuXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiBpZHMuYWRkKGVbdGhpcy50YWJsZUtleV0pKVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpZHMuc2l6ZSkgcmV0dXJuXG5cbiAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0aGlzLnRhcmdldFRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcXVlcnkgPSBxdWVyeS5zZWxlY3RBbGwoKS53aGVyZSh0aGlzLnRhcmdldEtleSwgJ2luJywgQXJyYXkuZnJvbShpZHMpKVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxuICAgICAgICAgICAgXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gcmVzdWx0cy5maWx0ZXIoKHI6IGFueSkgPT4gclt0aGlzLnRhcmdldEtleV0gPT09IGVbdGhpcy50YWJsZUtleV0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNldChlLCB0aGlzLnByb3BlcnR5LCBNZXRhZGF0YVNlcnZpY2UuZmxhdHRlbihyb3dzKSlcbiAgICAgICAgfSlcblxuICAgIH1cbn1cbiIsImltcG9ydCBtcyBmcm9tICdtcydcbmltcG9ydCBGaWxlTWV0YSBmcm9tICcuL0ZpbGVNZXRhRW50aXR5LnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgTWV0YWRhdGEgZnJvbSAnI3NlcnZlci9taXhpbnMvTWV0YWRhdGFNaXhpbi50cydcbmltcG9ydCBkcml2ZSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZHJpdmUudHMnXG5pbXBvcnQgSG9va3NTdGF0aWMgZnJvbSAnI3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cydcbmltcG9ydCB0eXBlIHsgRHJpdmVVcmxPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRHJpdmVDb250cmFjdC50cydcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UudHMnXG5pbXBvcnQgSGFzTWV0YXMgZnJvbSAnI3NlcnZlci9yZWxhdGlvbnMvSGFzTWV0YXNSZWxhdGlvbi50cydcbmltcG9ydCBSZWxhdGlvbiBmcm9tICcjc2VydmVyL21peGlucy9SZWxhdGlvbnNNaXhpbi50cydcbmltcG9ydCBNb2RlbE1peGluIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHMnXG5cbmludGVyZmFjZSBVUkxDYWNoZSB7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBleHBpcmVzOiBudW1iZXJcbn1cblxuY29uc3QgRmlsZVJlbGF0aW9ucyA9IHtcbiAgICBtZXRhczogbmV3IEhhc01ldGFzKHtcbiAgICAgICAgdGFibGU6ICdmaWxlcycsXG4gICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuXG4gICAgICAgIHRhcmdldFRhYmxlOiAnZmlsZV9tZXRhcycsXG4gICAgICAgIHRhcmdldEtleTogJ2ZpbGVfaWQnLFxuXG4gICAgICAgIHByb3BlcnR5OiAnbWV0YXMnLFxuICAgIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGUgZXh0ZW5kcyBjb21wb3NlV2l0aChcbiAgICBCYXNlLFxuICAgIEhvb2tzU3RhdGljLFxuICAgIE1vZGVsTWl4aW4oJ2ZpbGVzJyksXG4gICAgUmVsYXRpb24oRmlsZVJlbGF0aW9ucyksXG4gICAgTWV0YWRhdGEoJ2ZpbGVfbWV0YXMnLCAnZmlsZV9pZCcpXG4pIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVVJMQ2FjaGU+KClcblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaGFzKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5leGlzdHMoe1xuICAgICAgICAgICAgcXVlcnk6IHEgPT4gcS53aGVyZSgnZmlsZW5hbWUnLCAnPScsIGZpbGVuYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBleGlzdHNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRCeUZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE9uZSh7XG4gICAgICAgICAgICB3aGVyZTogcWIgPT4gcWIoJ2ZpbGVuYW1lJywgJz0nLCBmaWxlbmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIGRyaXZlLnVzZSh0aGlzLmRyaXZlKS5yZWFkU3RyZWFtKHRoaXMuZmlsZW5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkcml2ZS51c2UodGhpcy5kcml2ZSkucmVhZCh0aGlzLmZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkVXJsKG9wdGlvbnM6IERyaXZlVXJsT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gRmlsZS5jYWNoZS5nZXQodGhpcy5maWxlbmFtZSlcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIGlmIChjYWNoZSAmJiBub3cgPCBjYWNoZS5leHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLnVybCA9IGNhY2hlLnVybFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuZXhwaXJlcykge1xuICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gJzFoJ1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnVybCA9IGF3YWl0IGRyaXZlLnVzZSh0aGlzLmRyaXZlKS51cmwodGhpcy5maWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwaXJlcyA9IG5vdyArIG1zKG9wdGlvbnMuZXhwaXJlcykgLSAxMDAwIC8vIDEgc2Vjb25kIGVhcmx5XG5cbiAgICAgICAgRmlsZS5jYWNoZS5zZXQodGhpcy5maWxlbmFtZSwge1xuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIGV4cGlyZXNcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkVXJscyhpdGVtczogRmlsZVtdLCBvcHRpb25zOiBEcml2ZVVybE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuXG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGl0ZW0uZmlsZW5hbWUpXG5cbiAgICAgICAgICAgIGlmIChjYWNoZSAmJiBub3cgPCBjYWNoZS5leHBpcmVzKSB7XG4gICAgICAgICAgICAgICAgaXRlbS51cmwgPSBjYWNoZS51cmxcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZW0ubG9hZFVybChvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkTWV0YXMoaXRlbXM6IEZpbGVbXSl7XG4gICAgICAgIGNvbnN0IGlkcyA9IGl0ZW1zLm1hcChpID0+IGkuaWQpXG4gICAgXG4gICAgICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuXG4gICAgXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBGaWxlTWV0YS5saXN0KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxID0+IHEuc2VsZWN0QWxsKCkud2hlcmUoJ2ZpbGVfaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH0pXG4gICAgXG4gICAgICAgIGl0ZW1zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBmLm1ldGFzID0gTWV0YWRhdGFTZXJ2aWNlLmZsYXR0ZW4ocm93cy5maWx0ZXIociA9PiByLmZpbGVfaWQgPT09IGYuaWQpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGVGcm9tRHJpdmUoKSB7XG4gICAgICAgIGF3YWl0IGRyaXZlLnVzZSh0aGlzLmRyaXZlKS5kZWxldGUodGhpcy5maWxlbmFtZSlcbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IEdpdEdhdGV3YXkgfSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0dpdEdhdGV3YXkudHMnXG5pbXBvcnQgeyB0bXBQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgc2hlbGwgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3NoZWxsLnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICAgcHVibGljIGdldCBnaXQoKXtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRHYXRld2F5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzc2hLZXk6IGNvbmZpZy5nZXQoYG1vZHVsZXMuJHt0aGlzLmlkfS5zc2hfa2V5YCksXG4gICAgICAgICAgICBzc2hLZXlUbXBGaWxlTmFtZTogdG1wUGF0aChgc3NoX2tleV8ke3RoaXMuaWR9LnBlbWApLFxuICAgICAgICAgICAgbG9nZ2VyOiBsb2dnZXIuY2hpbGQoeyBsYWJlbDogJ2dpdCcgfSksXG4gICAgICAgICAgICBkZWJ1ZzogY29uZmlnLmdldCgnZ2l0LmRlYnVnJywgZmFsc2UpLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBtYWtlUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3RvcnksIC4uLnBhcnRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWNQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbignL3N0YXRpYycsICdtb2R1bGVzJywgdGhpcy5pZCwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIGNvbW1hbmQ6IHR5cGVvZiBzaGVsbC5jb21tYW5kID0gKGJpbiwgYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gc2hlbGwuY29tbWFuZChiaW4sIGFyZ3MsIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKCl7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHRoaXMubWFrZVBhdGgoJ21vZHVsZS5qc29uJylcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JylcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoY29udGVudClcblxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGpzb24uZGVwZW5kZW5jaWVzIHx8IHt9XG4gICAgICAgIHRoaXMuYnVpbGQgPSBqc29uLmJ1aWxkIHx8IHt9ICAgICAgXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRDbGllbnRFbnRyeXBvaW50RmlsZW5hbWUoY29udGV4dDogJ2RldicgfCAnbm9kZScgfCAnYnJvd3NlcicgPSAnZGV2Jyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ2RldicpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQnLCAnbW9kdWxlLmNsaWVudC50cycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdtb2R1bGUuY2xpZW50LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ2NsaWVudC50cycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdjbGllbnQuanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ2luZGV4LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3Qvbm9kZScsICdpbmRleC5tanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ21vZHVsZS5jbGllbnQubWpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ2Jyb3dzZXInKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdpbmRleC5qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L2Jyb3dzZXInLCAnaW5kZXgubWpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdtb2R1bGUuY2xpZW50LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdtb2R1bGUuY2xpZW50Lm1qcycpLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29va2llTWFwRW50aXR5IGZyb20gXCIjc2VydmVyL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50c1wiXG5pbXBvcnQgQ29udGFpbmVyU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzXCJcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlSGVhZCB9IGZyb20gJ0B1bmhlYWQvdnVlJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5T3B0aW9ucyB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcmVxdWVzdDogUmVxdWVzdDtcbiAgICByZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgICBzdGF0ZT86IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIG5vZGVDb250YWluZXI/OiBDb250YWluZXJTZXJ2aWNlXG4gICAgbm9kZUNvbmZpZz86IENvbmZpZ1NlcnZpY2VcbiAgICBub2RlU3RhdGU/OiBNYXA8c3RyaW5nLCBhbnk+XG5cbiAgICBicm93c2VyQ29udGFpbmVyPzogQ29udGFpbmVyU2VydmljZVxuICAgIGJyb3dzZXJDb25maWc/OiBDb25maWdTZXJ2aWNlXG4gICAgYnJvd3NlclN0YXRlPzogTWFwPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHkge1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVxdWVzdDogUmVxdWVzdDtcbiAgICBwdWJsaWMgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHB1YmxpYyBjb29raWVzOiBDb29raWVNYXBFbnRpdHlcbiAgICBwdWJsaWMgaGVhZDogUmVzb2x2YWJsZUhlYWRbXVxuXG4gICAgcHVibGljIG5vZGVDb250YWluZXI6IENvbnRhaW5lclNlcnZpY2VcbiAgICBwdWJsaWMgbm9kZUNvbmZpZzogQ29uZmlnU2VydmljZVxuICAgIHB1YmxpYyBub2RlU3RhdGU6IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBicm93c2VyQ29udGFpbmVyOiBDb250YWluZXJTZXJ2aWNlXG4gICAgcHVibGljIGJyb3dzZXJDb25maWc6IENvbmZpZ1NlcnZpY2VcbiAgICBwdWJsaWMgYnJvd3NlclN0YXRlOiBNYXA8c3RyaW5nLCBhbnk+XG5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybFxuICAgICAgICB0aGlzLnJlcXVlc3QgPSBkYXRhLnJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IGRhdGEucmVzcG9uc2VcbiAgICAgICAgdGhpcy5jb29raWVzID0gbmV3IENvb2tpZU1hcEVudGl0eSh0aGlzLnJlcXVlc3QsIHRoaXMucmVzcG9uc2UpXG5cbiAgICAgICAgdGhpcy5oZWFkID0gW11cblxuICAgICAgICB0aGlzLm5vZGVDb250YWluZXIgPSBkYXRhLm5vZGVDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuICAgICAgICB0aGlzLm5vZGVDb25maWcgPSBkYXRhLm5vZGVDb25maWcgfHwgbmV3IENvbmZpZ1NlcnZpY2UoKVxuICAgICAgICB0aGlzLm5vZGVTdGF0ZSA9IGRhdGEubm9kZVN0YXRlIHx8IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25maWcgPSBkYXRhLmJyb3dzZXJDb25maWcgfHwgbmV3IENvbmZpZ1NlcnZpY2UoKVxuICAgICAgICB0aGlzLmJyb3dzZXJDb250YWluZXIgPSBkYXRhLmJyb3dzZXJDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmJyb3dzZXJTdGF0ZSA9IGRhdGEuYnJvd3NlclN0YXRlIHx8IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlclN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlclN0YXRlLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXROb2RlU3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ub2RlU3RhdGUuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldFN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlclN0YXRlKGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEJyb3dzZXJDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb250YWluZXIuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVDb250YWluZXIuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZUNvbnRhaW5lclZhbHVlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlckNvbnRhaW5lclZhbHVlKGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEJyb3dzZXJDb25maWdWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25maWcuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVDb25maWdWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVDb25maWcuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZUNvbmZpZ1ZhbHVlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlckNvbmZpZ1ZhbHVlKGtleSwgdmFsdWUpXG4gICAgfVxuXG59XG4iLCJpbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBHaXRHYXRld2F5IH0gZnJvbSAnI3NlcnZlci9nYXRld2F5cy9HaXRHYXRld2F5LnRzJ1xuaW1wb3J0IEdpdEJyYW5jaFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvR2l0QnJhbmNoUmVwb3NpdG9yeS50cydcbmltcG9ydCBHaXRDb21taXRSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0dpdENvbW1pdFJlcG9zaXRvcnkudHMnXG5pbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudHJ5RW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIG1ha2VQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeSwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldDogdHlwZW9mIGNvbmZpZy5zZXQgPSAoa2V5LCB2YWx1ZSwgc291cmNlKSA9PiB7XG4gICAgICAgIGNvbmZpZy5zZXQoYHBsdWdpbnMucmVnaXN0cnkuJHt0aGlzLmlkfS4ke2tleX1gLCB2YWx1ZSwgc291cmNlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ6IHR5cGVvZiBjb25maWcuZ2V0ID0gKGtleSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25maWcuZ2V0KGBwbHVnaW5zLnJlZ2lzdHJ5LiR7dGhpcy5pZH0uJHtrZXl9YCwgZGVmYXVsdFZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2l0KCl7XG4gICAgICAgIHJldHVybiBuZXcgR2l0R2F0ZXdheSh7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgc2hlbGw6IGNvbnRhaW5lci5oYXMoU2hlbGxTZXJ2aWNlKSA/IGNvbnRhaW5lci5nZXQoU2hlbGxTZXJ2aWNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzaEtleTogY29uZmlnLmdldChgcGx1Z2lucy5yZWdpc3RyeS4ke3RoaXMuaWR9LnNzaF9rZXlgKSxcbiAgICAgICAgICAgIHNzaEtleUZpbGU6IGNvbmZpZy5nZXQoYHBsdWdpbnMucmVnaXN0cnkuJHt0aGlzLmlkfS5zc2hfa2V5X2ZpbGVgKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29tbWl0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRDb21taXRSZXBvc2l0b3J5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzaGVsbDogY29udGFpbmVyLmhhcyhTaGVsbFNlcnZpY2UpID8gY29udGFpbmVyLmdldChTaGVsbFNlcnZpY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBicmFuY2hlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRCcmFuY2hSZXBvc2l0b3J5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzaGVsbDogY29udGFpbmVyLmhhcyhTaGVsbFNlcnZpY2UpID8gY29udGFpbmVyLmdldChTaGVsbFNlcnZpY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMnXG5pbXBvcnQgUGx1Z2luRW50cnlFbnRpdHkgZnJvbSAnLi9QbHVnaW5FbnRyeUVudGl0eS50cydcbmltcG9ydCBlbW1pdHRlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlckV2ZW50cyB9IGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIFJvdXRlclJlZ2lzdGVyIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVnaXN0ZXJTZXJ2aWNlLnRzJ1xuXG5pbnRlcmZhY2UgQWRkQXBpRm9sZGVyT3B0aW9ucyB7XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIFBsdWdpbkVudHJ5RW50aXR5IHtcbiAgICBwdWJsaWMgYXBpRm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBZGRBcGlGb2xkZXJPcHRpb25zPigpXG4gICAgcHVibGljIGFwaURpcmVjdG9yaWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgZW1taXR0ZXIub24oJ3JvdXRlcjpyZWdpc3RlcmVkJywgdGhpcy5vblJvdXRlclJlZ2lzdGVyZWQuYmluZCh0aGlzKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oJy9zdGF0aWMnLCAnbW9kdWxlcycsIHRoaXMuaWQsIC4uLnBhcnRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUm91dGVyUmVnaXN0ZXJlZChjdHg6IFJvdXRlckV2ZW50c1sncm91dGVyOnJlZ2lzdGVyZWQnXSkge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSBjdHgucm91dGVyIGFzIFJvdXRlclJlZ2lzdGVyXG5cbiAgICAgICAgZm9yIChjb25zdCBbZGlyZWN0b3J5LCBvcHRpb25zXSBvZiB0aGlzLmFwaUZvbGRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IGAvYXBpL2BcblxuICAgICAgICAgICAgYXdhaXQgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZVxuICAgICAgICAgICAgICAgIC5jcmVhdGUoZGlyZWN0b3J5KVxuICAgICAgICAgICAgICAgIC5zZXRQcmVmaXgocHJlZml4KVxuICAgICAgICAgICAgICAgIC5zZXRSb3V0ZXIocm91dGVyKVxuICAgICAgICAgICAgICAgIC5zZXRNb2R1bGUodGhpcy5pZClcbiAgICAgICAgICAgICAgICAubG9hZCgpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFwaURpciBvZiB0aGlzLmFwaURpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICByb3V0ZXIuYWRkRGlyKGFwaURpciwge1xuICAgICAgICAgICAgICAgIG1vZHVsZTogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQXBpRm9sZGVyKGRpcmVjdG9yeTogc3RyaW5nLCBvcHRpb25zOiBBZGRBcGlGb2xkZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlGb2xkZXJzLnNldChkaXJlY3RvcnksIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFJvdXRlckZvbGRlcihkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFwaURpcmVjdG9yaWVzLmFkZChkaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tUGx1Z2luRGlzY292ZXJFbnRpdHk8VD4odGhpczogbmV3ICgpID0+IFQsIGVudGl0eTogUGx1Z2luRW50cnlFbnRpdHkpOiBUIHtcbiAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBQbHVnaW5FbnRpdHkpIGFzIGFueVxuXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICBuYW1lOiBlbnRpdHkubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IGVudGl0eS52ZXJzaW9uLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBlbnRpdHkuZGlyZWN0b3J5LFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG5cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VSZWxhdGlvbiB7XG5cbiAgICBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGVudGl0aWVzIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VSZWxhdGlvbiBmcm9tICcuL0Jhc2VSZWxhdGlvbi50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmludGVyZmFjZSBCZWxvbmdzVG9PcHRpb25zIHtcbiAgICB0YWJsZTogc3RyaW5nXG4gICAgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHRhcmdldFRhYmxlOiBzdHJpbmdcbiAgICB0YXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHJvcGVydHk6IHN0cmluZ1xuICAgIHNlcmlhbGl6ZT86IChyb3c6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlbG9uZ3NUbyBleHRlbmRzIEJhc2VSZWxhdGlvbiB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuICAgIHB1YmxpYyBzZXJpYWxpemU6IChyb3c6IGFueSkgPT4gYW55XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCZWxvbmdzVG9PcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy50YWJsZSA9IG9wdGlvbnMudGFibGVcbiAgICAgICAgdGhpcy50YWJsZUtleSA9IG9wdGlvbnMudGFibGVLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGFyZ2V0VGFibGUgPSBvcHRpb25zLnRhcmdldFRhYmxlXG4gICAgICAgIHRoaXMudGFyZ2V0S2V5ID0gb3B0aW9ucy50YXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IFsuLi5uZXcgU2V0KGVudGl0aWVzLm1hcChlID0+IGVbdGhpcy50YXJnZXRLZXldKS5maWx0ZXIoQm9vbGVhbikpXVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUodGhpcy50YWJsZUtleSwgJ2luJywgaWRzKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzLm1hcCgocjogYW55KSA9PiB0aGlzLnNlcmlhbGl6ZShyKSlcblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKHJvd3MubWFwKChyOiBhbnkpID0+IFtyW3RoaXMudGFibGVLZXldLCByXSkpXG4gICAgICAgIFxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZVt0aGlzLnByb3BlcnR5XSA9IG1hcC5nZXQoZVt0aGlzLnRhcmdldEtleV0pIHx8IG51bGxcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgQmVsb25nc1RvIGZyb20gJy4vQmVsb25nc1RvUmVsYXRpb24udHMnXG5pbXBvcnQgQmFzZVJlbGF0aW9uIGZyb20gJy4vQmFzZVJlbGF0aW9uLnRzJ1xuaW1wb3J0IEZpbGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9GaWxlRW50aXR5LnRzJ1xuXG5leHBvcnQgY2xhc3MgTG9hZEZpbGVNZXRhcyBleHRlbmRzIEJhc2VSZWxhdGlvbiB7XG4gICAgcHVibGljIGZpbGVLZXk6IHN0cmluZ1xuICAgIHB1YmxpYyBwcm9wZXJ0eTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihmaWxlS2V5OiBzdHJpbmcgPSAnZmlsZScsIHByb3BlcnR5OiBzdHJpbmcgPSAndXJsJykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuZmlsZUtleSA9IGZpbGVLZXlcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBlbnRpdGllcy5tYXAoZSA9PiBlW3RoaXMuZmlsZUtleV0pLmZpbHRlcigoZik6IGYgaXMgRmlsZSA9PiBmIGluc3RhbmNlb2YgRmlsZSlcblxuICAgICAgICBhd2FpdCBGaWxlLmxvYWQoZmlsZXMsICdtZXRhcycpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9hZEZpbGVVcmwgZXh0ZW5kcyBCYXNlUmVsYXRpb24ge1xuICAgIHB1YmxpYyBmaWxlS2V5OiBzdHJpbmdcbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZmlsZUtleTogc3RyaW5nID0gJ2ZpbGUnLCBwcm9wZXJ0eTogc3RyaW5nID0gJ3VybCcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmZpbGVLZXkgPSBmaWxlS2V5XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZTogRmlsZSB8IG51bGwgPSBlbnRpdHlbdGhpcy5maWxlS2V5XVxuXG4gICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGUubG9hZFVybCgpXG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBzZXQoZW50aXR5LCB0aGlzLnByb3BlcnR5LCBmaWxlID8gZmlsZS51cmwgOiBudWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWxvbmdzVG9GaWxlIGV4dGVuZHMgQmVsb25nc1RvIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogc3RyaW5nID0gJ2ZpbGUnLCB0YXJnZXRLZXk6IHN0cmluZyA9ICdmaWxlX2lkJykge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0YWJsZTogJ2ZpbGVzJyxcbiAgICAgICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YXJnZXRUYWJsZTogJ2ZpbGVzJyxcbiAgICAgICAgICAgIHRhcmdldEtleTogdGFyZ2V0S2V5LFxuXG4gICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBGaWxlLmZyb20ocm93KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cmwocHJvcGVydHk6IHN0cmluZyA9ICd1cmwnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG9hZEZpbGVVcmwodGhpcy5wcm9wZXJ0eSwgcHJvcGVydHkpXG4gICAgfVxuXG4gICAgcHVibGljIG1ldGFzKHByb3BlcnR5OiBzdHJpbmcgPSAnbWV0YXMnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG9hZEZpbGVNZXRhcyh0aGlzLnByb3BlcnR5LCBwcm9wZXJ0eSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQmVsb25nc1RvIGZyb20gJy4vQmVsb25nc1RvUmVsYXRpb24udHMnXG5pbXBvcnQgVXNlciBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlbG9uZ3NUb1VzZXIgZXh0ZW5kcyBCZWxvbmdzVG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0YWJsZTogJ3VzZXJzJyxcbiAgICAgICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YXJnZXRUYWJsZTogJ3VzZXJzJyxcbiAgICAgICAgICAgIHRhcmdldEtleTogJ3VzZXJfaWQnLFxuXG4gICAgICAgICAgICBwcm9wZXJ0eTogJ3VzZXInLFxuICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gVXNlci5mcm9tKHJvdylcbiAgICAgICAgfSlcblxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuaW50ZXJmYWNlIEhhc01hbnlPcHRpb25zIHtcbiAgICB0YWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgdGFyZ2V0VGFibGU6IGtleW9mIERhdGFiYXNlXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmdcblxuICAgIHByb3BlcnR5OiBzdHJpbmdcbiAgICBzZXJpYWxpemU/OiAocm93OiBhbnkpID0+IGFueVxuICAgIGFmdGVyPzogKHJvd3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGFzTWFueSB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuICAgIHB1YmxpYyBzZXJpYWxpemU6IChyb3c6IGFueSkgPT4gYW55XG4gICAgcHVibGljIGFmdGVyOiAocm93czogYW55W10pID0+IFByb21pc2U8YW55PlxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSGFzTWFueU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50YWJsZSA9IG9wdGlvbnMudGFibGVcbiAgICAgICAgdGhpcy50YWJsZUtleSA9IG9wdGlvbnMudGFibGVLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGFyZ2V0VGFibGUgPSBvcHRpb25zLnRhcmdldFRhYmxlXG4gICAgICAgIHRoaXMudGFyZ2V0S2V5ID0gb3B0aW9ucy50YXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgICAgICB0aGlzLmFmdGVyID0gb3B0aW9ucy5hZnRlciB8fCAoYXN5bmMgKHJvd3M6IGFueVtdKSA9PiByb3dzKVxuXG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZChlbnRpdGllczogYW55W10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCgpXG5cbiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChlID0+IGlkcy5hZGQoZVt0aGlzLnRhYmxlS2V5XSkpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWlkcy5zaXplKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUodGhpcy50YXJnZXRLZXksICdpbicsIEFycmF5LmZyb20oaWRzKSlcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICBjb25zdCByb3dzID0gcmVzdWx0cy5tYXAoKHI6IGFueSkgPT4gdGhpcy5zZXJpYWxpemUocikpXG4gICAgICAgIFxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZVt0aGlzLnByb3BlcnR5XSA9IHJvd3MuZmlsdGVyKChyOiBhbnkpID0+IHJbdGhpcy50YXJnZXRLZXldID09PSBlW3RoaXMudGFibGVLZXldKVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXIocm93cylcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZVJlbGF0aW9uIGZyb20gJy4vQmFzZVJlbGF0aW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzICBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5pbnRlcmZhY2UgSGFzTWFueVRocm91Z2hPcHRpb25zIHtcbiAgICB0YWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgdGFyZ2V0VGFibGU6IGtleW9mIERhdGFiYXNlXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmdcbiAgICBcbiAgICBwaXZvdFRhYmxlOiBrZXlvZiBEYXRhYmFzZVxuICAgIHBpdm90U291cmNlS2V5OiBzdHJpbmdcbiAgICBwaXZvdFRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwcm9wZXJ0eTogc3RyaW5nXG4gICAgc2VyaWFsaXplPzogKHJvdzogYW55KSA9PiBhbnlcbiAgICBhZnRlcj86IChyb3dzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhc01hbnlUaHJvdWdoIGV4dGVuZHMgQmFzZVJlbGF0aW9uIHtcbiAgICBwdWJsaWMgdGFibGU6IHN0cmluZ1xuICAgIHB1YmxpYyB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgcHVibGljIHRhcmdldFRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFyZ2V0S2V5OiBzdHJpbmdcbiAgICBcbiAgICBwdWJsaWMgcGl2b3RUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHBpdm90U291cmNlS2V5OiBzdHJpbmdcbiAgICBwdWJsaWMgcGl2b3RUYXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHVibGljIHByb3BlcnR5OiBzdHJpbmdcbiAgICBwdWJsaWMgc2VyaWFsaXplOiAocm93OiBhbnkpID0+IGFueVxuICAgIHB1YmxpYyBhZnRlcjogKHJvd3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEhhc01hbnlUaHJvdWdoT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMudGFibGUgPSBvcHRpb25zLnRhYmxlXG4gICAgICAgIHRoaXMudGFibGVLZXkgPSBvcHRpb25zLnRhYmxlS2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhcmdldFRhYmxlID0gb3B0aW9ucy50YXJnZXRUYWJsZVxuICAgICAgICB0aGlzLnRhcmdldEtleSA9IG9wdGlvbnMudGFyZ2V0S2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnBpdm90VGFibGUgPSBvcHRpb25zLnBpdm90VGFibGVcbiAgICAgICAgdGhpcy5waXZvdFNvdXJjZUtleSA9IG9wdGlvbnMucGl2b3RTb3VyY2VLZXlcbiAgICAgICAgdGhpcy5waXZvdFRhcmdldEtleSA9IG9wdGlvbnMucGl2b3RUYXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgICAgICB0aGlzLmFmdGVyID0gb3B0aW9ucy5hZnRlciB8fCAoYXN5bmMgKHJvd3M6IGFueSkgPT4gcm93cylcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgU2V0KClcblxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4gaWRzLmFkZChlW3RoaXMudGFibGVLZXldKSlcblxuICAgICAgICBpZiAoIWlkcy5zaXplKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeVxuICAgICAgICAgICAgLnNlbGVjdEFsbCh0aGlzLnRhcmdldFRhYmxlKVxuICAgICAgICAgICAgLmlubmVySm9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBpdm90VGFibGUgYXMgYW55LFxuICAgICAgICAgICAgICAgIGAke3RoaXMudGFyZ2V0VGFibGV9LiR7dGhpcy50YXJnZXRLZXl9YCxcbiAgICAgICAgICAgICAgICBgJHt0aGlzLnBpdm90VGFibGV9LiR7dGhpcy5waXZvdFRhcmdldEtleX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAud2hlcmUoYCR7dGhpcy5waXZvdFRhYmxlfS4ke3RoaXMucGl2b3RTb3VyY2VLZXl9YCwgJ2luJywgQXJyYXkuZnJvbShpZHMpKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzLm1hcCgocjogYW55KSA9PiB0aGlzLnNlcmlhbGl6ZShyKSlcbiAgICAgICAgXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBlW3RoaXMucHJvcGVydHldID0gcm93cy5maWx0ZXIoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByW3RoaXMucGl2b3RTb3VyY2VLZXldID09PSBlW3RoaXMudGFibGVLZXldXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXIoZW50aXRpZXMpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUb2tlbiwgVXNlckVudGl0eSB9IGZyb20gJ0BzaWRla2ljay1jb2Rlci96ZW5pdGgta2l0L3NoYXJlZCdcbmltcG9ydCB0eXBlIHsgIE1pZGRsZXdhcmUsIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuZXhwb3J0IHR5cGUgQXV0aE1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI6IFVzZXJFbnRpdHlcbiAgICB0b2tlbjogVG9rZW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aE1pZGRsZXdhcmUgaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKGN0eDogYW55KTogUHJvbWlzZTxBdXRoTWlkZGxld2FyZUNvbnRleHQ+IHtcbiAgICAgICAgaWYgKCFjdHgudXNlciB8fCAhY3R4LnRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0b2tlbicsIDQwMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VyOiBjdHgudXNlciEsXG4gICAgICAgICAgICB0b2tlbjogY3R4LnRva2VuISxcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gJ0BzaWRla2ljay1jb2Rlci96ZW5pdGgta2l0L3NoYXJlZCdcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSwgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcbmltcG9ydCB0eXBlIFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuaW1wb3J0IHRva2VuUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvdG9rZW5SZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHVzZXJSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy91c2VyUmVwb3NpdG9yeS50cydcbmltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBBdXRoU2lsZW5jZU1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI/OiBVc2VyXG4gICAgdG9rZW4/OiBUb2tlblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRoU2lsZW5jZU1pZGRsZXdhcmUgaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQ+IHtcbiAgICAgICAgLy8gRXhhbXBsZSBhdXRoZW50aWNhdGlvbiBsb2dpY1xuICAgICAgICBsZXQgdG9rZW4gPSBjdHguY29va2llLmdldCgnQXV0aG9yaXphdGlvbicpXG5cbiAgICAgICAgaWYgKGN0eC5yZXF1ZXN0ICYmIGN0eC5yZXF1ZXN0LmhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSkge1xuICAgICAgICAgICAgdG9rZW4gPSBjdHgucmVxdWVzdC5oZWFkZXJzWydhdXRob3JpemF0aW9uJ11cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi5zdGFydHNXaXRoKCdCZWFyZXIgJykpIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc2xpY2UoNykgLy8gUmVtb3ZlICdCZWFyZXIgJyBwcmVmaXhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0b2tlbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW5Sb3cgPSBhd2FpdCB0b2tlblJlcG9zaXRvcnkuZmluZEJ5VG9rZW4odG9rZW4pXG4gICAgICAgIGxldCB1c2VyOiBVc2VyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHRva2VuUm93KSB7XG4gICAgICAgICAgICB1c2VyID0gYXdhaXQgdXNlclJlcG9zaXRvcnkuZmluZE9yRmFpbCh0b2tlblJvdy51c2VyX2lkKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgdG9rZW46IHRva2VuUm93IHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXV0aFNpbGVuY2VNaWRkbGV3YXJlQ29udGV4dCB9IGZyb20gJy4vQXV0aFNpbGVuY2VNaWRkbGV3YXJlLnRzJ1xuaW1wb3J0IHR5cGUge1xuICAgIE1pZGRsZXdhcmUsIFxuICAgIE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQgXG59IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuXG5pbXBvcnQgQWNsIGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvQWNsRW50aXR5LnRzJ1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuaW1wb3J0IHBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cydcbmltcG9ydCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cydcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvbkNvbnRleHQgPSBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0PFtBdXRob3JpemF0aW9uTWlkZGxld2FyZV0+XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWQge1xuICAgIGFjdGlvbjogc3RyaW5nXG4gICAgcmVzb3VyY2U6IHN0cmluZ1xuICAgIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRob3JpemVQZXJtaXNzaW9uIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWRbXVxuXG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWQgfCBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZFtdKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUoY3R4OiBBdXRob3JpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgY3R4LmFjbC5hdXRob3JpemUoXG4gICAgICAgICAgICAgICAgcC5hY3Rpb24sXG4gICAgICAgICAgICAgICAgcC5yZXNvdXJjZSxcbiAgICAgICAgICAgICAgICBwLmNvbmRpdGlvbnMgfHwge30sXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhvcml6YXRpb25NaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShjdHg6IEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQpe1xuICAgICAgICBjb25zdCB0b2tlbiA9IGN0eC50b2tlblxuICAgICAgICBsZXQgY3VycmVudFBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10gPSBbXVxuICAgICAgICBjb25zdCBwZXJtaXNzaW9uQ29udGV4dCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgICAgICAvLyBpZiBhdXRoIHRva2VuIGxvYWQgcGVybWlzc2lvbnMgZm9yIHVzZXJcbiAgICAgICAgaWYgKGN0eC51c2VyICYmIHRva2VuPy50eXBlID09PSAnYXV0aCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gYXdhaXQgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LmZpbmRNYW55KHtcbiAgICAgICAgICAgICAgICBhc3NpZ25hYmxlSWQ6IFN0cmluZyhjdHgudXNlci5pZCksXG4gICAgICAgICAgICAgICAgYXNzaWduYWJsZVR5cGU6ICd1c2VyJ1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY3VycmVudFBlcm1pc3Npb25zID0gYXdhaXQgcGVybWlzc2lvblJlcG9zaXRvcnkuZmluZE1hbnkoeyBpZDogYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSB9KVxuXG4gICAgICAgICAgICBwZXJtaXNzaW9uQ29udGV4dC5hdXRoID0ge1xuICAgICAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGN0eC51c2VyLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjdHgudXNlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogY3R4LnVzZXIuZW1haWwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAnYXBpJykge1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudHMgPSBhd2FpdCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkuZmluZE1hbnkoe1xuICAgICAgICAgICAgICAgIGFzc2lnbmFibGVJZDogU3RyaW5nKHRva2VuLmlkKSxcbiAgICAgICAgICAgICAgICBhc3NpZ25hYmxlVHlwZTogJ3Rva2VuJ1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY3VycmVudFBlcm1pc3Npb25zID0gYXdhaXQgcGVybWlzc2lvblJlcG9zaXRvcnkuZmluZE1hbnkoeyBpZDogYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSB9KVxuXG4gICAgICAgICAgICBwZXJtaXNzaW9uQ29udGV4dC5hcGkgPSB7XG4gICAgICAgICAgICAgICAgdG9rZW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFBlcm1pc3Npb24uYXBwbHlDb250ZXh0KGN1cnJlbnRQZXJtaXNzaW9ucywgcGVybWlzc2lvbkNvbnRleHQpXG5cbiAgICAgICAgY29uc3QgYWNsID0gbmV3IEFjbCh7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIGRlYnVnOiBjb25maWcuZ2V0KCdhY2wuZGVidWcnKSB8fCBjb25maWcuZ2V0KCdhcHAuZGVidWcnKSxcbiAgICAgICAgICAgIGxvZ2dlcjogbG9nZ2VyLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pLFxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgYWNsIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShwYXlsb2FkOiBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZCB8IEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemVQZXJtaXNzaW9uKHBheWxvYWQpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IExvYWRlciwgTG9hZGVyUmVjb3JkIH0gZnJvbSAnLi9kZWZpbmVMb2FkZXIudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2FkZXJGYWN0b3J5PEUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PiwgUiBleHRlbmRzIExvYWRlclJlY29yZDxFPiA9IExvYWRlclJlY29yZDxFPj4obG9hZGVyczogUikge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoZW50aXRpZXM6IEUgfCBFW10sIG5hbWVzOiBrZXlvZiBSIHwgKGtleW9mIFIpW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGVudGl0aWVzKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXVxuICAgICAgICBjb25zdCByZWxhdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IFtuYW1lc11cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVsYXRpb25OYW1lcykge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbG9hZGVycz8uW25hbWUgYXMgc3RyaW5nXSBhcyBMb2FkZXJcblxuICAgICAgICAgICAgaWYgKCFsb2FkZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTG9hZGVyICR7U3RyaW5nKG5hbWUpfSBub3QgZGVjbGFyZWRgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBsb2FkZXIubG9hZChpdGVtcylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5czogT2JqZWN0LmtleXMobG9hZGVycykgYXMgKGtleW9mIFIpW10sXG4gICAgICAgIGxvYWRlcnMsXG4gICAgICAgIGxvYWQgXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcblxuZXhwb3J0IGZ1bmN0aW9uIGN1aWQoKXtcbiAgICBjb25zdCByYW5kb21CeXRlcyA9IG5ldyBVaW50OEFycmF5KDgpXG4gICAgXG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CeXRlcylcbiAgICBcbiAgICBjb25zdCByYW5kb20gPSBBcnJheS5mcm9tKHJhbmRvbUJ5dGVzLCBiID0+IGIudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpXG4gIFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCkudG9TdHJpbmcoMzYpXG5cbiAgICByZXR1cm4gYGMke3RpbWVzdGFtcH0ke3JhbmRvbS5zbGljZSgwLCAxMil9YFxufVxuXG4iLCJpbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSBcIiNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyIHtcbiAgICAoY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PiB8ICgoKSA9PiBhbnkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVIYW5kbGVyKGhhbmRsZXI6IEhhbmRsZXIpOiBIYW5kbGVyIHtcbiAgICByZXR1cm4gaGFuZGxlclxufVxuIiwiaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYidcbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbi8vIGdlbmVyYXRlIGluZGV4ZXMgZm9yIGZvbGRlcnMgXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleEZpbGUob3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgZm9sZGVycyA9IG9wdGlvbnMuZm9sZGVyc1xuICAgIGNvbnN0IGZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZVxuICAgIGNvbnN0IHBhdHRlcm5zID0gb3B0aW9ucy5wYXR0ZXJucyB8fCBbXVxuICAgIGNvbnN0IGRlZmF1bHRJZ25vcmUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiKiovKi5zcGVjLnRzXCIsXG4gICAgICAgIFwiKiovKi5zcGVjLWQudHNcIixcbiAgICAgICAgXCIqKi8qLnRlc3QudHNcIixcbiAgICAgICAgXCIqKi8qLnRlc3QtZC50c1wiLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLmZvbGRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChgJHtmb2xkZXJ9LyoqLyoudHNgLCBgJHtmb2xkZXJ9LyoqLyouanNgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaWdub3JlID0gb3B0aW9ucy5pZ25vcmUgfHwgW11cblxuICAgIGxldCBjb250ZW50ID0gJydcblxuICAgIGNvbnN0IGZpbGVzID0gZmcuc3luYyhwYXR0ZXJucywge1xuICAgICAgICBpZ25vcmU6IFsuLi5kZWZhdWx0SWdub3JlLCAuLi5pZ25vcmVdLFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlbmFtZSksIGZpbGUpXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpXG5cbiAgICAgICAgbGV0IHNob3VsZEV4cG9ydERlZmF1bHQgPSBmaWxlQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IGRlZmF1bHQnKSAmJiAhZmlsZVBhdGguaW5jbHVkZXMoJ2dlbmVyYXRlSW5kZXhGaWxlLnRzJylcblxuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnZ1ZScpKSB7XG4gICAgICAgICAgICBzaG91bGRFeHBvcnREZWZhdWx0ID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudCArPSBgZXhwb3J0ICogZnJvbSAnLi8ke2ZpbGVQYXRofSdcXG5gXG5cbiAgICAgICAgLy8gZGVmYXVsdCBleHBvcnQgXG4gICAgICAgIGlmIChzaG91bGRFeHBvcnREZWZhdWx0KSB7XG4gICAgICAgICAgICBjb250ZW50ICs9IGBleHBvcnQgeyBkZWZhdWx0IGFzICR7cGF0aC5iYXNlbmFtZShmaWxlLCBleHRlbnNpb24pfSB9IGZyb20gJy4vJHtmaWxlUGF0aH0nXFxuYFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGVudCA9IGNvbnRlbnQudHJpbSgpXG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCBjb250ZW50KVxufVxuIiwiaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRPbmUoZmlsZW5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlbmFtZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVVybCA9IHBhdGhUb0ZpbGVVUkwoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChmaWxlVXJsLnRvU3RyaW5nKCkpXG5cbiAgICAgICAgcmV0dXJuIG1vZFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiJnbURBYUEsU0FBZ0IsR0FBWSxFQUFjLEVBQUUsQ0FBRSxFQUF5QixFQUFFLENBQUUsQ0FDdkUsSUFBTSxFQUFjLFFBQVEsT0FBTyxTQUFXLEdBSXhDLEVBQVEsSUFBSSxFQUFNLENBQ3BCLFNBQVUsR0FDVixtQkFBb0IsR0FDcEIsVUFBVyxDQU5FLEVBQVEsVUFBWSxLQUFLLE1BQU0sRUFBYyxHQUFJLENBQy9DLEtBQUssTUFBTSxFQUFjLEdBQUksQ0FLWCxDQUNwQyxDQUFDLENBRUYsSUFBSyxJQUFNLEtBQU8sT0FBTyxLQUFLLEVBQU8sQ0FDakMsRUFBTSxLQUFLLENBQUMsRUFBSyxPQUFPLEVBQU8sR0FBSyxDQUFDLENBQUMsQ0FHMUMsUUFBUSxJQUFJLEVBQU0sVUFBVSxDQUFDLENBR2pDLFNBQWdCLEdBQVcsRUFBYyxFQUF5QixDQUM5RCxJQUFNLEdBQWUsUUFBUSxPQUFPLFNBQVcsSUFBTSxFQUMvQyxFQUFPLEVBQUUsQ0FD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
|
|
1
|
+
import{Command as e}from"commander";import t from"chalk";import n from"cli-table3";import r,{dirname as i,join as a,relative as o}from"path";import s from"fs";import{pathToFileURL as c}from"url";import l from"fast-glob";import{debounce as ee,get as u,has as te,join as ne,omit as re,orderBy as ie,set as d,unset as ae}from"lodash-es";import*as f from"valibot";import{format as p}from"date-fns";import oe from"qs";import{defineAbility as se,subject as ce}from"@casl/ability";import*as le from"@inquirer/prompts";import ue,{spawn as de}from"child_process";import m from"js-yaml";import{Readable as fe}from"stream";import h from"ms";import{DeleteObjectCommand as pe,DeleteObjectsCommand as me,GetObjectCommand as he,HeadObjectCommand as ge,ListObjectsV2Command as _e,PutObjectCommand as ve,S3Client as ye}from"@aws-sdk/client-s3";import{getSignedUrl as be}from"@aws-sdk/s3-request-presigner";import{Upload as xe}from"@aws-sdk/lib-storage";import Se from"mime";import{ProxyAgent as Ce,fetch as we}from"undici";import g,{randomBytes as Te}from"crypto";import Ee from"dotenv";import De from"bcrypt";import Oe from"express";import ke from"cors";import Ae from"cookie-parser";import{CreateTableBuilder as _,Kysely as je,sql as Me}from"kysely";import Ne from"supertest";import Pe from"node-schedule";import{writeFile as Fe}from"node:fs/promises";import{randomUUID as Ie}from"node:crypto";import{join as Le}from"node:path";import{pathToFileURL as Re}from"node:url";import ze from"node:fs";var Be=Object.defineProperty,Ve=(e,t)=>{let n={};for(var r in e)Be(n,r,{get:e[r],enumerable:!0});return t||Be(n,Symbol.toStringTag,{value:`Module`}),n};function He(e={},t={}){let r=process.stdout.columns||80,i=new n({wordWrap:!0,wrapOnWordBoundary:!1,colWidths:[t.keyWidth||Math.floor(r*.2),Math.floor(r*.7)]});for(let t of Object.keys(e))i.push([t,String(e[t])]);console.log(i.toString())}function Ue(e,t){let r=(process.stdout.columns||80)-6,i=[],a=[];t&&a.push(...t),t||e.map(e=>Object.keys(e)).flat().filter((e,t,n)=>n.indexOf(e)===t).forEach(e=>{a.push({label:e,value:e})}),e.forEach(e=>{let t=[];a.forEach(n=>{let r=``;typeof n.value==`function`&&(r=n.value(e)),typeof n.value==`string`&&(r=e[n.value]),r??=``,(typeof r==`object`||Array.isArray(r))&&(r=JSON.stringify(r)),t.push(r)}),i.push(t)}),a.forEach(e=>{e.width&&=Number(e.width),e.label||=String(e.value)});let o=100-a.filter(e=>!!e.width).reduce((e,t)=>e+t.width,0),s=a.filter(e=>!e.width).length;a.forEach(e=>{e.width||=Math.floor(o/s)}),a.forEach(e=>{e.width&&(e.realWidth=Math.floor(r*(e.width/100)))});let c=new n({head:a.map(e=>e.label),style:{head:[],border:[]},wordWrap:!0,wrapOnWordBoundary:!1,colWidths:a.map(e=>e.realWidth)});c.push(...i),console.log(c.toString())}async function v(e){try{return[null,await e()]}catch(e){return[e,null]}}v.sync=function(e){try{return[null,e()]}catch(e){return[e,null]}};var y=class e{static __container_entry_key=`LoggerService`;info(e,t){}debug(e,t){}warn(e,t){}error(e,t){}child(t){return new e}},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)}},We=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())}};const x=globalThis.serverContainer||new We;globalThis.serverContainer=x;const S=x.proxy(y);async function Ge(e,t={}){let n={},i=e=>{Object.assign(e.error,{filename:e.filename}),S.error(`Failed to import ${e.filename}`,e.error)};t.onError&&(i=t.onError);for(let a of e){if(t.exclude&&t.exclude.some(e=>a.includes(e)))continue;let e={filename:a};t.onBeforeImport&&await t.onBeforeImport(e);let o=e.filename.split(`?`)[0];if(/\.(mts|ts|js)$/.test(o)){let o=c(r.resolve(e.filename));t.cache===!1&&o.searchParams.set(`t`,Date.now().toString());let[s,l]=await v(()=>import(o.toString()));if(s){Object.assign(s,{filename:e.filename,url:o}),i({filename:e.filename,error:s});continue}n[a]=l}if(/\.json$/.test(o)){let[t,r]=await v(async()=>{let t=await s.promises.readFile(e.filename,`utf8`);return JSON.parse(t)});if(t){i({filename:e.filename,error:t});continue}n[a]=r}t.onAfterImport&&await t.onAfterImport({...e,module:n[a]})}return n}async function Ke(e,t={}){return Ge(await l(e),t)}async function qe(e,t={}){return Ge((await s.promises.readdir(e,{withFileTypes:!0})).filter(e=>e.isFile()).map(t=>r.join(e,t.name)),t)}function C(...e){return e.reduce((e,t)=>t(e),class{})}function w(e,...t){return t.reduce((e,t)=>t(e),e)}function Je(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 T(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`){T(i,e,n);continue}n[e]=i}return n}function Ye(e){let t={};for(let[n,r]of Object.entries(e))d(t,n,r);return t}function Xe(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():typeof self<`u`&&self.crypto&&self.crypto.randomUUID?self.crypto.randomUUID():typeof window<`u`&&window.crypto&&window.crypto.randomUUID?window.crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function E(e=``){return e+Xe()}var D=class{static __container_entry_key=`ConfigService`;entries;constructor(){this.entries=new Map}list(){return Array.from(this.entries.values())}parseValue(e){return typeof e==`string`&&e.endsWith(`:boolean`)?e.replace(`:boolean`,``).trim()===`true`:e}loadFromRecord(e,t=`unknow`){for(let[n,r]of Object.entries(e))this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}loadFromEntries(e,t=`unknow`){for(let[n,r]of e)this.entries.set(n,{key:n,value:this.parseValue(r),source:t})}toRecord(){let e={};for(let[t,n]of this.entries.entries())e[t]=n.value;return e}has(e){if(this.entries.get(e))return!0;if(!e.includes(`.`))return!1;let t=e.split(`.`)[0],n=this.entries.get(t);if(!n)return!!this.entries.get(e);let r=n.value;return typeof r!=`object`||Array.isArray(r)?!1:te(r,e.substring(t.length+1))}get(e,t){let n=this.entries.get(e);if(n)return n.value;if(!e.includes(`.`))return t;let r=e.split(`.`)[0],i=this.entries.get(r);if(!i){let n=this.entries.get(e);return n?n.value:t}let a=i.value;return typeof a!=`object`||Array.isArray(a)?t:u(a,e.substring(r.length+1),t)}getOne(e,t){for(let t of e)if(this.has(t))return this.get(t);return t}set(e,t,n=`runtime`){if(!e.includes(`.`)){this.entries.set(e,{key:e,source:n,value:t});return}let r=e.split(`.`)[0],i=this.get(r,{});(typeof i!=`object`||Array.isArray(i))&&(i={}),d(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)||(ae(n,e.substring(t.length+1)),this.entries.set(t,{key:t,source:`runtime`,value:n})))}clear(){this.entries.clear()}dump(){return T(this.toRecord())}},O=class e{static __container_entry_key=`EmmitterService`;handlers=[];debug;logger;constructor(e){this.debug=e?.debug||!1,this.logger=e?.logger||new y,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||E();if(n?.unique&&this.handlers.some(n=>n.event===e&&n.listener===t||n.id===r))return;let i={id:r,event:e,listener:t};return this.handlers.push(i),this.debug&&this.logger.debug(`handler added`,i),i}once(e,t,n){let r=(n,i)=>{t(n,i),this.off(e,r)};return this.on(e,r,n)}onDebounce(e,t,n){let r=ee(t,n?.debounce||300),i=this.on(e,r,n);return i&&(i.originalListener=t),i}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)v.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}},Ze=class{hook_id;hook_aliases;order;subhooks;async register(){}async load(){}async boot(){}async shutdown(){}async onRegister(){}async onLoad(){}async onBoot(){}async onShutdown(){}},Qe=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 y,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=ie(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 v(()=>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 Ze;n.hook_id=`custom:${e}:${Date.now()}`,n[e]=t,this.add(n)}async register(e){return this.emit(`register`,e)}async load(e){return this.emit(`load`,e)}async boot(e){return this.emit(`boot`,e)}async shutdown(e){await this.emit(`shutdown`,e)}clear(){this.hooks.clear()}};const $e=()=>f.pipe(f.union([f.string(),f.number()]),f.transform(Number),f.integer()),et=()=>f.pipe(f.union([f.string(),f.boolean()]),f.transform(e=>e===!0||e===`true`)),tt=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e instanceof Date?e:new Date(e)),f.transform(e=>e&&p(e,`yyyy-MM-dd`))),nt=()=>f.pipe(f.union([f.string(),f.date()]),f.transform(e=>e&&(e===`null`?null:(typeof e==`string`&&(e=new Date(e)),p(e,`yyyy-MM-dd HH:mm`))))),k=(e=f.any())=>f.pipe(f.union([f.string(),f.array(f.string())]),f.transform(e=>Array.isArray(e)?e:e.split(`,`)),f.array(e)),rt=()=>f.pipe(k(),f.transform(e=>e.map(Number))),it=()=>f.pipe(f.union([f.string(),f.record(f.string(),f.any())]),f.transform(e=>typeof e==`string`?oe.parse(e):e),f.transform(e=>{let t={};for(let n in e)d(t,n,u(e,n));return t}));function A(){return it()}A.number=$e,A.boolean=et,A.date=tt,A.datetime=nt,A.array=k,A.arrayNumber=rt,A.object=it;const at=()=>f.pipe(f.string(),f.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`),d(r,e,n)}return r})),ot=(e={})=>f.object({page:f.optional($e(),1),limit:f.optional($e(),e.maxLimit||100),orderBy:f.nullish(e.orderFields?k(f.picklist(e.orderFields)):k(f.string()),[]),orderDirection:f.nullish(k(f.union([f.literal(`asc`),f.literal(`desc`)])),[])});function st(e={}){return ot(e)}st.base=ot;var ct=Ve({array:()=>k,arrayNumber:()=>rt,base:()=>ot,boolean:()=>et,date:()=>tt,datetime:()=>nt,keyValue:()=>at,number:()=>$e,object:()=>it,pagination:()=>st,url:()=>A}),lt=class{static __container_entry_key=`ValidatorService`;v={...f,extras:ct};create(e){return e(this.v)}validate(e,t){let n=typeof t==`function`?t(this.v):t,{output:r,issues:i,success:a}=f.safeParse(n,e);if(!a){let e=f.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 f.safeParseAsync(n,e);if(!a){let e=Error(`Validation failed`),t=f.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}=f.safeParse(n,e);return r}};function ut(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)}const j=new lt;function dt(){return j.create(e=>e.object({id:e.number(),dashboard_id:e.number(),name:e.string(),value:e.nullable(e.string())}))}dt.create=j.create(e=>e.pick(dt(),[`dashboard_id`,`name`,`value`])),dt.update=j.create(e=>e.partial(dt.create));function ft(){return j.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()))}))}ft.create=j.create(e=>e.pick(ft(),[`name`,`description`])),ft.update=j.create(e=>e.partial(ft.create)),f.object({id:f.number(),permission_id:f.number(),assignable_type:f.string(),assignable_id:f.string(),created_at:f.string(),updated_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),description:f.nullable(f.string()),action:f.string(),subject:f.string(),conditions:f.nullable(f.string()),created_at:f.string(),updated_at:f.string(),expires_at:f.string()}),f.object({id:f.number(),name:f.nullable(f.string()),type:f.string(),user_id:f.number(),token:f.string(),created_at:f.string(),updated_at:f.string(),expires_at:f.string()});function pt(){return f.object({id:f.number(),name:f.optional(f.string()),email:f.pipe(f.string(),f.email()),password:f.pipe(f.string(),f.minLength(6)),username:f.pipe(f.string(),f.regex(/^[a-zA-Z0-9_-]+$/)),verified_at:f.nullable(f.string()),created_at:f.string(),updated_at:f.string(),deleted_at:f.nullable(f.string())})}pt.create=()=>f.omit(pt(),[`id`,`verified_at`,`created_at`,`updated_at`,`deleted_at`]),pt.update=()=>f.partial(pt.create());var mt=class extends b{output;bin;args;constructor(e,t,n,r){super(e,501),this.output=t,this.bin=n,this.args=r}};function M(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 N(e,t,...n){let r=e.listeners||[];for await(let e of r.filter(e=>e.event===t))await e.listener(...n)}function ht(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 P(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 ht(this,e,t)}static async emit(e,...t){return N(this,e,...t)}}}function gt(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)}}}P.emit=N,P.on=ht;function F(e){return class extends e{deleted_at=null}}function I(e){return class extends e{created_at;updated_at}}var _t=class extends C(M){id;name;description=null;origin;subject;action;conditions=null;get editable(){return this.origin===`custom`}get parsedConditions(){if(!this.conditions)return{};let[e,t]=v.sync(()=>typeof this.conditions==`string`?JSON.parse(this.conditions):this.conditions);return e?{}:t}},vt=class{static __container_entry_key=`AclEntity`;ability;permissions;debug=!1;logger;constructor(e={}){let t=(e.permissions||[]).map(e=>_t.from(e));this.permissions=t,this.debug=e.debug||!1,this.logger=e.logger||new y().child({label:`acl`}),this.ability=se(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=ce(t,n);return this.ability.can(e,r)}cannot(e,t,n){if(!n)return this.ability.cannot(e,t);let r=ce(t,n);return this.ability.cannot(e,r)}subject(e,t){return ce(e,t)}},yt=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 bt=()=>[{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 xt=class e{static get TYPES(){return bt()}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:{}}},St=class{name;path;type;metas={};constructor(e){Object.assign(this,e)}},Ct=class extends C(M,I,F){id;drive;mimetype;purpose;client_name;filename;public;url;metas;isImage(){return this.mimetype.startsWith(`image/`)}},wt=class extends C(M,I,F){id;file_id;name;value};C(M,I,F);var Tt=class{name;remote;is_current;is_remote;constructor(e){Object.assign(this,e)}},Et=class{hash;short_hash;message;body;author_name;author_email;date;constructor(e){Object.assign(this,e)}},Dt=class extends C(M,Je(Ze)){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}`}};C(M);var Ot=class e{items;total;page;per_page;total_pages;constructor(e){Object.assign(this,e)}static from(t){return new e(t)}},kt=class extends C(M){id;name;version;enabled;aliases;version_channel;version_available_channels};C(M,I,F);var At=class extends C(M,I,F){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()}},jt=class n extends e{__is_cli_command=!0;table=Ue;object=He;colors=t;inquirer=le;needs=new Set;need(...e){return e.forEach(e=>this.needs.add(e)),this}createCommand(e){return new n(e)}},Mt=class e extends jt{static __container_entry_key=`CliService`;dirs=new Set;logger=new y;emmitter=new O;debug=!1;static create(t=`cli`){return new e(t)}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}setEmmitter(e){return this.emmitter=e,this}createCommand(t){return new e(t)}addDir(e){return this.dirs.add(e),this}async loadDir(e){let t=await qe(e,{exclude:[`.test.ts`,`.spec.ts`,`.test.js`,`.spec.js`],onError:({error:e,filename:t})=>{Object.assign(e,{filename:t}),this.logger.error(e.message,e)}});for(let[n,r]of Object.entries(t)){if(this.debug&&this.logger.debug(`imported file ${n} from ${e}`),!r.default||Object.keys(r.default).length===0)continue;if(!r.default.__is_cli_command){this.logger.warn(`default export of file ${r.filename} is not a CliCommand, skipping`);continue}let[t]=v.sync(()=>this.addCommand(r.default));if(t){Object.assign(t,{filename:r.filename}),this.logger.error(t.message,t);continue}this.debug&&this.logger.debug(`added command from file ${n} to cli`)}}async load(){for(let e of this.dirs)await this.loadDir(e);return this}},Nt=class extends Mt{constructor(){super(),this.exitOverride(),this.configureOutput({writeOut:()=>{},writeErr:()=>{}}),x.set(Mt,this)}async add(e){await import(e)}async execute(e){await this.parseAsync([`node`,`arte`,...e])}},Pt=class e{process=null;appBasePath;env=new Map;args=[];configArguments=new Map;configFiles=[];debug=!1;logger=new y;static create(){return new e}setBasePath(e){return this.appBasePath=e,this}setDebug(e){return this.debug=e,this}setLogger(e){return this.logger=e,this}addConfigArgument(e,t){return this.configArguments.set(e,t),this}addConfigFile(...e){return this.configFiles.push(...e),this}addEnv(e,t){return this.env.set(e,t),this}loadConfigArguments(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config:`));for(let t of e){let[e,n]=t.slice(8).split(`=`).map(e=>e.trim());this.configArguments.set(e,n)}}loadConfigFiles(){let e=process.argv.slice(2).filter(e=>e.startsWith(`@config-file:`)).map(e=>e.slice(13));if(this.addConfigFile(...e),process.env.CONFIG_FILES){let e=process.env.CONFIG_FILES.split(`,`).map(e=>e.trim()).filter(Boolean);this.addConfigFile(...e)}}loadEnvironment(){let e=Array.from(this.configArguments.entries()).map(([e,t])=>`${e}=${t}`).join(`;`);this.addEnv(`ZENITH_CONFIG_ARGUMENTS`,e),this.addEnv(`ZENITH_CONFIG_FILES`,this.configFiles.join(`,`))}loadArguments(e=[]){let t=[`@config:`,`@config-file:`],n=e.filter(e=>!t.some(t=>e.startsWith(t)));this.args=[`--no-warnings`,`--experimental-strip-types`,`--enable-source-maps`,r.join(this.appBasePath,`server`,`cli.ts`),...n]}kill(e=0){this.process&&!this.process.killed&&this.process.kill(`SIGTERM`),process.exit(e)}async run(e){if(!this.appBasePath)throw Error(`Base path not set. Please call setBasePath() before run().`);this.loadConfigArguments(),this.loadConfigFiles(),this.loadArguments(e||process.argv.slice(2)),this.loadEnvironment(),this.debug&&this.logger.debug(`run`,{args:this.args,env:this.env}),this.process=ue.spawn(`node`,this.args,{stdio:`inherit`,env:{...process.env,...Object.fromEntries(this.env.entries())}}),process.on(`SIGINT`,()=>this.kill()),process.on(`SIGTERM`,()=>this.kill()),process.on(`exit`,()=>this.kill())}};function L(...e){let t=process.env.ZENITH_BASE_PATH;if(!t)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.resolve(t,...e)}function Ft(...e){let t=process.env.ZENITH_BASE_PATH,n=process.env.ZENITH_STORAGE_PATH||r.join(t||``,`storage`);return r.resolve(n,...e)}function It(...e){let t=process.env.ZENITH_BASE_PATH;if(!t)throw Error(`ZENITH_BASE_PATH environment variable is not set`);return r.relative(process.cwd(),r.resolve(t,...e))}function Lt(...e){return L(`tmp`,...e)}var Rt=class extends D{logger;debug=!1;format=`json`;formatOptions={};directory;constructor(e={}){super(),this.debug=e.debug??!1,this.directory=e.directory??L(`config`),this.logger=e.logger??S.child({label:`config`}),this.format=e.format??`json`,this.formatOptions=e.formatOptions??{},this.debug&&this.logger.debug(`service initialized in debug mode`)}async write(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=JSON.stringify(t,null,this.formatOptions.indent||4);this.format===`yml`&&(a=m.dump(t,this.formatOptions)),await s.promises.writeFile(i,a,`utf-8`)}writeSync(e,t){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${e}.${n}`),a=JSON.stringify(t,null,4);this.format===`yml`&&(a=m.dump(t,this.formatOptions)),s.writeFileSync(i,a,`utf-8`)}async load(){this.clear(),s.existsSync(this.directory)||(this.debug&&this.logger.debug(`config directory does not exist, creating: ${this.directory}`),s.mkdirSync(this.directory,{recursive:!0}));let e=await s.promises.readdir(this.directory);for(let t of e){let e=r.extname(t);if(this.format===`json`&&e!==`.json`||this.format===`yml`&&e!==`.yml`)continue;let n=r.join(this.directory,t),[i,a]=await v(async()=>{let e=await s.promises.readFile(n,`utf-8`);return r.extname(t)===`.yml`?m.load(e):JSON.parse(e)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=r.basename(t,r.extname(t));super.set(o,a,`filesystem`),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{entry:t,key:n.join(`.`)}}set(e,t,n=`filesystem`){if(super.set(e,t,n),n!==`filesystem`)return;let{entry:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&d(a,i,t),this.writeSync(r,a)}unset(e){let{entry:t,key:n}=this.parseKey(e);if(!n){let n=this.format===`yml`?`yml`:`json`,i=r.join(this.directory,`${t}.${n}`);s.unlinkSync(i),super.unset(e);return}let i=this.get(t);d(i,n,void 0),this.writeSync(t,i),super.unset(e)}},zt=class{id;name;description;config={};constructor(e){this.id=e.id,this.name=e.name,this.description=e.description,this.config=e.config}list(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{folder:e}),t}find(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}exists(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}read(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}readStream(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}write(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,data:t}),n}writeStream(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,stream:t}),n}delete(e){let t=Error(`Method not implemented.`);throw Object.assign(t,{filename:e}),t}url(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}uploadUrl(e,t){let n=Error(`Method not implemented.`);throw Object.assign(n,{filename:e,options:t}),n}};const Bt=j.create(e=>e.object({bucket:e.pipe(e.string(),e.minLength(1)),region:e.optional(e.string()),accessKeyId:e.pipe(e.string(),e.minLength(1)),secretAccessKey:e.pipe(e.string(),e.minLength(1)),sessionToken:e.optional(e.string()),endpoint:e.optional(e.string()),prefix:e.optional(e.string())}));function Vt(e){return!e||typeof e!=`object`||typeof e.on!=`function`?Promise.resolve(new Uint8Array):new Promise((t,n)=>{let r=[];e.on(`data`,e=>r.push(Buffer.from(e))),e.on(`end`,()=>t(new Uint8Array(Buffer.concat(r)))),e.on(`error`,n)})}var Ht=class extends zt{schema=Bt;_client;constructor(e){super(e)}get valid(){return j.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new b($t(`Invalid drive configuration`))}get bucket(){return this.config.bucket}get prefix(){return this.config?.prefix?this.config?.prefix.endsWith(`/`)?this.config.prefix:this.config.prefix+`/`:``}getKey(e){let t=e.startsWith(`/`)?e.slice(1):e;return this.prefix?`${this.prefix.endsWith(`/`)?this.prefix:`${this.prefix}/`}${t}`:t}get client(){if(this._client)return this._client;let e=this.config;return this._client=new ye({region:e.region,endpoint:e.endpoint,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken}}),this._client}exists=async e=>{this.checkValid();let t=this.getKey(e);return this.client.send(new ge({Bucket:this.bucket,Key:t})).then(()=>!0).catch(()=>!1)};list=async e=>{this.checkValid();let t=e?this.getKey(e):this.prefix||void 0;t&&!t.endsWith(`/`)&&(t+=`/`);let n=new _e({Bucket:this.bucket,Prefix:t,Delimiter:`/`}),r=await this.client.send(n),i=[],a=r.CommonPrefixes||[];for(let e of a){let t=e.Prefix||``;t=t.replace(this.prefix,``),t.endsWith(`/`)&&(t=t.slice(0,-1));let n=new St({name:t.split(`/`).pop()||t,path:`/`+t,type:`directory`,metas:{size:0,mimetype:`application/x-directory`}});i.push(n)}let o=r.Contents||[];for(let e of o){let t=e.Key||``;if(t=t.replace(this.prefix,``),t.endsWith(`/`))continue;let n=new St({name:t.split(`/`).pop()||t,path:`/`+t,type:`file`,metas:{size:e.Size,mimetype:Se.getType(t)||`application/octet-stream`}});i.push(n)}return i};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=i(t),r=(await this.list(n)).find(e=>e.path===t);if(!r)throw Error(`File "${t}" not found`);return r};async mkdir(e){return this.checkValid(),Promise.resolve()}read=async e=>{this.checkValid();let t=this.getKey(e),n=(await this.client.send(new he({Bucket:this.bucket,Key:t}))).Body;return Vt(n)};async readStream(e){this.checkValid();let t=this.getKey(e),n=new he({Bucket:this.bucket,Key:t}),r=(await this.client.send(n)).Body;return Promise.resolve(r)}write=async(e,t)=>{this.checkValid();let n=this.getKey(e);await this.client.send(new ve({Bucket:this.bucket,Key:n,Body:Buffer.from(t)}))};async writeStream(e,t){this.checkValid();let n=this.getKey(e);await new xe({client:this.client,params:{Bucket:this.bucket,Key:n,Body:fe.from(t)}}).done()}delete=async e=>{this.checkValid();let t=this.getKey(e);if((await this.find(e)).type===`file`){let e=new pe({Bucket:this.bucket,Key:t});await this.client.send(e);return}let n=await this.client.send(new _e({Bucket:this.bucket,Prefix:t})),r=(n.Contents||[]).map(e=>({Key:e.Key}));r.length!==0&&(await this.client.send(new me({Bucket:this.bucket,Delete:{Objects:r}})),n.IsTruncated&&this.delete(e))};url=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=h(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3));return be(this.client,new he({Bucket:this.bucket,Key:n}),{expiresIn:i})};uploadUrl=async(e,t)=>{this.checkValid();let n=this.getKey(e),r=h(t?.expires||`30m`)||1800*1e3,i=Math.max(1,Math.round(r/1e3)),a=new ve({Bucket:this.bucket,Key:n});return be(this.client,a,{expiresIn:i})}},Ut=class extends D{prefix=``;logger;debug=!1;drive;bucket;region;endpoint;constructor(e){super(),this.debug=e.debug??!1,this.prefix=e.prefix??``,this.bucket=e.bucket,this.region=e.region||``,this.endpoint=e.endpoint,this.logger=e.logger??new y,this.drive=new Ht({id:`config-s3`,name:`config-s3`,config:{bucket:e.bucket,region:e.region,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey,sessionToken:e.sessionToken,endpoint:e.endpoint}}),this.debug&&this.logger.debug(`service initialized in debug mode`)}parseKey(e){let[t,...n]=e.split(`.`);return{filename:t,key:n.join(`.`)}}async load(){this.clear();let e=this.prefix.replace(/^\/|\/$/g,``),t=await this.drive.list(e||void 0);for(let n of t){if(!n.name.endsWith(`.json`))continue;let t=n.name,r=e?`${e}/${t}`:t,[i,a]=await v(async()=>{let e=await this.drive.read(r),t=Buffer.from(e).toString(`utf-8`);return JSON.parse(t)});if(i){this.logger.error(`failed to load config file ${t}`,i);continue}let o=t.replace(/\.json$/,``);super.set(o,a),this.debug&&this.logger.debug(`loaded config file: ${t}`)}this.debug&&this.logger.debug(`config loaded in debug mode`)}set(e,t,n=`s3`){if(super.set(e,t,n),n!==`s3`)return;let{filename:r,key:i}=this.parseKey(e),a=this.get(r);i||(a=t),i&&a&&d(a,i,t);let o=this.prefix.replace(/^\/|\/$/g,``),s=o?`${o}/${r}.json`:`${r}.json`,c=Buffer.from(JSON.stringify(a,null,4));this.drive.write(s,c).catch(e=>{this.logger.error(`failed to write config to s3`,e)})}unset(e){let t=this.prefix.replace(/^\/|\/$/g,``);if(!e.includes(`.`)){let n=t?`${t}/${e}.json`:`${e}.json`;this.drive.delete(n).catch(e=>{this.logger.error(`failed to delete config from s3`,e)});return}let{filename:n,key:r}=this.parseKey(e),i=this.get(n);d(i,r,void 0);let a=t?`${t}/${n}.json`:`${n}.json`;this.drive.write(a,Buffer.from(JSON.stringify(i,null,4))).catch(e=>{this.logger.error(`failed to write config to s3`,e)}),super.unset(e)}},Wt=class e{env;logger;silent;constructor(e){this.env=e.env,this.logger=e.logger,this.silent=e.silent??!1}static create(t){return new e(t)}async loadS3Config(){let e=new Ut({bucket:this.env.get(`ZENITH_CONFIG_S3_BUCKET`),region:this.env.get(`ZENITH_CONFIG_S3_REGION`),accessKeyId:this.env.get(`ZENITH_CONFIG_S3_ACCESS_KEY_ID`),secretAccessKey:this.env.get(`ZENITH_CONFIG_S3_SECRET_ACCESS_KEY`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),endpoint:this.env.get(`ZENITH_CONFIG_S3_ENDPOINT`),prefix:this.env.get(`ZENITH_CONFIG_S3_PREFIX`),sessionToken:this.env.get(`ZENITH_CONFIG_S3_SESSION_TOKEN`),logger:this.logger});return await e.load(),this.silent||this.logger.info(`using S3 configuration service`,{bucket:e.bucket,region:e.region,prefix:e.prefix}),e}async loadFSConfig(){let e=new Rt({directory:this.env.get(`ZENITH_CONFIG_FS_PATH`),debug:this.env.get(`ZENITH_CONFIG_DEBUG`),format:this.env.get(`ZENITH_CONFIG_FS_FORMAT`),formatOptions:this.env.get(`ZENITH_CONFIG_FS_FORMAT_OPTIONS`)||{},logger:this.logger});return await e.load(),this.silent||this.logger.info(`using filesystem configuration service`,{path:e.directory}),e}loadConfigFromEnv(e){for(let[t,n]of Object.entries(T(this.env.get(`ZENITH_CONFIG`)||{})))e.set(t,n,`env`);for(let[t,n]of Object.entries(T(this.env.get(`ZENITH_CONFIG_ARGUMENTS`)||{})))e.set(t,n,`argument`)}loadConfigFromFile(e,t){if(!s.existsSync(t)){this.logger.warn(`configuration file not found: ${t}`);return}let n=s.readFileSync(t,`utf-8`),r=null;if((t.endsWith(`.yml`)||t.endsWith(`.yaml`))&&(r=m.load(n)),!r)throw new b(`unsupported configuration file format: ${t}`);for(let[n,i]of Object.entries(T(r)))e.set(n,i,t)}loadConfigFromFiles(e,t){for(let n of t)this.loadConfigFromFile(e,n)}async load(){let e=null;if(this.env.get(`ZENITH_CONFIG_DRIVER`)===`s3`&&(e=await this.loadS3Config()),(!e||this.env.get(`ZENITH_CONFIG_DRIVER`)===`fs`)&&(e=await this.loadFSConfig()),!e)throw new b(`Failed to initialize configuration service: No valid driver found`);if(!e)throw new b(`Failed to initialize configuration service`);return this.loadConfigFromFiles(e,this.env.get(`ZENITH_CONFIG_FILES`)),this.loadConfigFromEnv(e),e}},Gt=class{async fetch(e,t){let n=t||{};return t?.proxy&&(n.dispatcher=new Ce(t.proxy)),console.log(`Downloading from URL:`,e,`with options:`,n),await we(e,n)}async stream(e,t){let n=await this.fetch(e,t);if(!n.ok){let e=new b(`Failed to download`,400);throw Object.assign(e,{status:n.status,statusText:n.statusText}),e}if(!n.body)throw new b(`No body`,400);let r=n.headers.get(`content-type`)||`application/octet-stream`;return{stream:n.body,contentType:r}}};const R=x.proxy(D);function Kt(e,t={}){return function(n){return class extends n{static __isConfigModel=!0;static serialize(e){let t=new this;return Object.assign(t,e),t}static async list(){let t=this,n=R.get(e)||{},r=[];for(let[e,i]of Object.entries(n)){let n=t.serialize(JSON.parse(JSON.stringify({...i,id:e})));r.push(n)}return await P.emit(this,`afterList`,r),r}static async find(e){let t=(await this.list()).find(t=>t.id===e);if(!t)return null;let n=JSON.parse(JSON.stringify(t));return await P.emit(this,`afterFind`,n),n||null}static async findOrFail(e){let t=await this.find(e);if(!t)throw Error(`Entity item not found`);return t}static async create(n){if(t.readonly)throw new b(`Readonly config model`);if(!n.id)throw Error(`Entity item requires an id`);let r=this,i=R.get(e)||{};if(i[n.id])throw Error(`Entity item already exists`);return await P.emit(this,`beforeCreate`,n),i[n.id]={...n},delete i[n.id].id,await R.set(e,i),r.findOrFail(n.id)}static async update(n,r){if(t.readonly)throw new b(`Readonly config model`);let i=this,a=R.get(e)||{};if(!a[n])throw Error(`Entity item not found`);return await P.emit(this,`beforeUpdate`,r),Object.assign(a[n],r),await R.set(e,a),i.findOrFail(n)}static async updateOrCreate(e,t){let n=this;return await n.find(e)?n.update(e,t):n.create({...t,id:e})}static async destroy(n){if(t.readonly)throw new b(`Readonly config model`);let r=R.get(e)||{};if(!r[n])throw Error(`Entity item not found`);delete r[n],await R.set(e,r)}}}}var qt=class extends w(xt,Kt(`drive.disks`)){static serialize(e){let t=new this;return t.id=e.id,t.name=e.name||e.id,t.type=e.type,t.config=e.config||{},t.is_default=R.get(`drive.default`)===e.id,t}};const Jt=f.pipe(f.union([f.literal(`true`),f.literal(`false`),f.literal(`1`),f.literal(`0`)]),f.transform(e=>e===`true`||e===`1`),f.boolean()),z=f.pipe(f.string(),f.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`),d(r,e,n)}return r})),Yt=f.pipe(f.string(),f.transform(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean))),Xt=f.looseObject({NODE_ENV:f.optional(f.union([f.literal(`development`),f.literal(`production`),f.literal(`test`)]),`development`),ZENITH_BASE_PATH:f.string(),ZENITH_STORAGE_PATH:f.optional(f.string()),ZENITH_APP_URL:f.optional(f.string(),`http://localhost:3000`),ZENITH_PORT:f.optional(f.pipe(f.string(),f.transform(e=>parseInt(e))),`3000`),ZENITH_HOST:f.optional(f.string(),`0.0.0.0`),ZENITH_LOG_LEVEL:f.optional(f.picklist([`error`,`warn`,`info`,`debug`]),`info`),ZENITH_LIFECYCLE_DEBUG:f.optional(Jt,`false`),ZENITH_CLIENT_CONFIG:f.optional(z,``),ZENITH_CONFIG:f.optional(z,``),ZENITH_CONFIG_ARGUMENTS:f.optional(z,``),ZENITH_CONFIG_FILES:f.optional(Yt,``),ZENITH_CONFIG_DEBUG:f.optional(Jt,`false`),ZENITH_CONFIG_DRIVER:f.optional(f.picklist([`fs`,`s3`]),`fs`),ZENITH_CONFIG_FS_PATH:f.optional(f.string()),ZENITH_CONFIG_FS_FORMAT:f.optional(f.picklist([`json`,`yml`]),`json`),ZENITH_CONFIG_FS_FORMAT_OPTIONS:f.optional(z,``),ZENITH_CONFIG_S3_BUCKET:f.optional(f.string()),ZENITH_CONFIG_S3_REGION:f.optional(f.string()),ZENITH_CONFIG_S3_ACCESS_KEY_ID:f.optional(f.string()),ZENITH_CONFIG_S3_SECRET_ACCESS_KEY:f.optional(f.string()),ZENITH_CONFIG_S3_SESSION_TOKEN:f.optional(f.string()),ZENITH_CONFIG_S3_ENDPOINT:f.optional(f.string()),ZENITH_CONFIG_S3_PREFIX:f.optional(f.string(),``),ZENITH_PLUGINS_DIRS:f.optional(Yt,``)});var B=class e{static __container_entry_key=`EnvService`;env=null;files=[];static create(){return new e}static dotEnvConfig(e){return Ee.config(e)}setFiles(e){return this.files=e,this}addFile(e){return this.files.push(e),this}load(){return e.dotEnvConfig({path:this.files,override:!0,quiet:!0}),this.env=f.parse(Xt,process.env),this}get production(){return this.get(`NODE_ENV`)===`production`}get development(){return this.get(`NODE_ENV`)===`development`}get test(){return this.get(`NODE_ENV`)===`test`}has(e){if(!this.env)throw new b(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]!==void 0}get(e,t){if(!this.env)throw new b(`Environment variables not loaded. Call load() before accessing environment variables.`);return this.env[e]===void 0?t:this.env[e]}set(e,t){if(!this.env)throw new b(`Environment variables not loaded. Call load() before accessing environment variables.`);this.env[e]=t}},Zt=class e{static __container_entry_key=`EncryptService`;debug=!1;env;logger;algorithm=`aes-256-cbc`;key=null;constructor(e){this.env=e.env||new B,this.logger=e.logger||new y,this.debug=e.debug||!1,e.key&&(this.key=g.scryptSync(e.key,`salt`,32))}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}setEnv(e){this.env=e}setKey(e){this.key=g.scryptSync(e,`salt`,32)}encrypt(e){if(!this.key)throw Error(`Encryption key not set`);let t=g.randomBytes(16),n=g.createCipheriv(this.algorithm,this.key,t),r=n.update(e,`utf8`,`hex`);return r+=n.final(`hex`),`${t.toString(`hex`)}:${r}`}decrypt(e){if(!this.key)throw Error(`Encryption key not set`);let[t,n]=e.split(`:`),r=Buffer.from(t,`hex`),i=g.createDecipheriv(this.algorithm,this.key,r),a=i.update(n,`hex`,`utf8`);return a+=i.final(`utf8`),a}encryptObject(e){let t=JSON.stringify(e);return this.encrypt(t)}decryptObject(e){let t=this.decrypt(e);return JSON.parse(t)}url(e,t){let n=t?.expireAt;if(t?.expires){let e=h(t.expires);n=Date.now()+e}n||=Date.now()+h(`15 minutes`),n instanceof Date&&(n=n.getTime());let r={data:t?.data||{},expireAt:n,expireAtReadable:p(new Date(n),`yyyy-MM-dd HH:mm:ss`)},i=this.encrypt(JSON.stringify(r)),a=this.env.get(`ZENITH_APP_URL`);if(!a)throw new b(`APP_URL not set in environment variables`);let o=new URL(e,a);return o.searchParams.append(`key`,encodeURIComponent(i)),o.toString()}verifyUrl(e){let t=this.decrypt(decodeURIComponent(e)),n=JSON.parse(t);if(n.expireAt&&Date.now()>n.expireAt){let e=new b(`URL has expired`,403);throw Object.assign(e,{expireAt:n.expireAt,expireAtReadable:n.expireAtReadable}),e}return n.data}};const Qt=x.proxy(Zt);var en=class extends zt{schema=j.create(e=>e.object({directory:e.pipe(e.string(),e.minLength(1))}));constructor(e){super(e)}get valid(){return j.isValid(this.config,this.schema)}checkValid(){if(!this.valid)throw new b($t(`Invalid drive configuration`));if(!s.existsSync(this.rootPath))throw new b($t(`Drive root path does not exist`))}get rootPath(){return L(this.config.directory)}exists=async e=>(this.checkValid(),s.promises.access(a(this.rootPath,e)).then(()=>!0).catch(()=>!1));list=async e=>{this.checkValid();let t=e?a(this.rootPath,e):this.rootPath;if(!await this.exists(o(this.rootPath,t)))return[];let n=await s.promises.readdir(t),r=[];for(let e of n){let n=a(t,e),i=await s.promises.stat(n),c={};i.isFile()&&(c.size=i.size,c.mimetype=Se.getType(e)||`application/octet-stream`);let l=new St({name:e,path:`/`+o(this.rootPath,n),type:i.isDirectory()?`directory`:`file`,metas:c});r.push(l)}return r};find=async e=>{this.checkValid();let t=e.startsWith(`/`)?e:`/`+e,n=(await this.list(r.dirname(t))).find(e=>e.path===t);if(!n)throw Error(`File "${t}" not found`);return n};async mkdir(e){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let t=a(this.rootPath,e);await s.promises.mkdir(t,{recursive:!0})}read=async e=>{this.checkValid();let t=a(this.rootPath,e),n=await s.promises.readFile(t);return new Uint8Array(n)};async readStream(e){this.checkValid();let t=a(this.rootPath,e),n=s.createReadStream(t);return Promise.resolve(n)}write=async(e,t)=>{this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);await s.promises.writeFile(n,t)};async writeStream(e,t){this.checkValid(),await this.exists(r.dirname(e))||await this.mkdir(r.dirname(e));let n=a(this.rootPath,e);return new Promise((e,r)=>{let i=s.createWriteStream(n);t.pipe(i),i.on(`finish`,e),i.on(`error`,r)})}delete=async e=>{this.checkValid();let t=a(this.rootPath,e);if(await s.promises.stat(t).then(e=>e.isDirectory()).catch(()=>!1)){await s.promises.rmdir(t,{recursive:!0});return}await s.promises.unlink(t)};url=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return Qt.url(`/api/drives/${this.id}/stream${n}`,{expires:t?.expires||`30m`})};uploadUrl=async(e,t)=>{this.checkValid();let n=e.startsWith(`/`)?e:`/${e}`;return Qt.url(`/api/drives/${this.id}/upload${n}`,{expires:t?.expires||`30m`,data:{mime_types:t?.mime_types,max_size:t?.max_size}})}},tn=class e{static __container_entry_key=`DriveService`;gateways;drives=new Map;selected;defaultDrive;debug=!1;logger;get current(){if(!this.selected)return;let e=this.drives.get(this.selected);if(e)return e}constructor(e={}){this.selected=e.selected||this.selected,this.debug=e.debug||this.debug,this.drives=e.drives||this.drives,this.logger=e.logger||S.child({label:`drive`}),this.gateways=new Map,this.gateways.set(`s3`,Ht),this.gateways.set(`fs`,en)}listDrives(){return Array.from(this.drives.values()).map(e=>({...e,default:e.id===this.defaultDrive}))}get(e){if(!e||!this.drives.has(e||``))throw new b(`Drive not found`);let t=this.drives.get(e);if(!t)throw new b(`Drive not found`);return t}use(t){if(!this.drives.has(t||``))throw new b(`Drive not found`);return new e({selected:t,drives:this.drives,debug:this.debug})}list(e){if(!this.current)throw new b(`No drive selected`);return this.current.list(e)}find(e){if(!this.current)throw new b(`No drive selected`);return this.current.find(e)}exists(e){if(!this.current)throw new b(`No drive selected`);return this.current.exists(e)}read(e){if(!this.current)throw new b(`No drive selected`);return this.current.read(e)}readStream(e){if(!this.current)throw new b(`No drive selected`);return this.current.readStream(e)}async readAsText(e){let t=await this.read(e);return new TextDecoder().decode(t)}write(e,t){if(!this.current)throw new b(`No drive selected`);let n=t;return typeof t==`object`&&!(t instanceof Uint8Array)&&(n=JSON.stringify(t,null,4)),typeof n==`string`&&(n=new TextEncoder().encode(n)),this.current.write(e,n)}writeStream(e,t){if(!this.current)throw new b(`No drive selected`);return this.current.writeStream(e,t)}async url(e,t={}){if(!this.current)throw new b(`No drive selected`);return this.current.url(e,t)}async uploadUrl(e,t={}){if(!this.current)throw new b(`No drive selected`);return this.current.uploadUrl(e,t)}async upload(e,t){let n=await s.promises.readFile(e),r=new Uint8Array(n);return this.write(t,r)}async download(e,t){let n=await this.read(e);await s.promises.writeFile(t,n)}delete(e){if(!this.current)throw new b(`No drive selected`);return this.current.delete(e)}async load(){this.drives.clear();let e=await qt.list();for(let t of e){let e=this.gateways.get(t.type);if(!e){this.logger.warn(`Drive gateway for type "${t.type}" not found`);continue}let n=new e(t);this.drives.set(t.id,n),this.debug&&this.logger.debug(`drive loaded ${t.id} (${t.type})`)}this.selected=R.get(`drive.default`),this.defaultDrive=R.get(`drive.default`)}async createDefaultDrives(){await qt.updateOrCreate(`uploads`,{name:`Uploads`,type:`fs`,config:{directory:Ft(`uploads`)}}),R.get(`drive.default`)||R.set(`drive.default`,`uploads`),await this.load()}validateUpload(e,t){if(!e.mime_types.split(`,`).map(e=>e.trim()).some(e=>{if(!e.endsWith(`/*`))return e===t.mimetype;let n=e.slice(0,-2);return t.mimetype.startsWith(n+`/`)}))throw new b(`MIME type not allowed`,403);if(e.maxSize&&t.size>e.maxSize)throw new b(`File size exceeds the maximum allowed`,403)}},nn=class extends O{},rn=class{static __container_entry_key=`ExceptionService`;ignoreCodeErrors=[400,401,403,404,422];logger;env;constructor(e={}){this.logger=e.logger||new y,this.env=e.env||new B,e.ignoreCodeErrors&&(this.ignoreCodeErrors=e.ignoreCodeErrors)}handle(e,t){let n=e.name||`Internal Server Error`,r=e.message||`An unexpected error occurred`,i=e.status||500;return this.ignoreCodeErrors.includes(i)||this.logger.error(e),t.status(i).json({error:n,message:r,status:i})}},an=class{static __container_entry_key=`HasherService`;hash(e){return De.hash(e,12)}async compare(e,t){return De.compare(e,t)}},on=class{path=``;method=`get`;handler=null;middlewares=[];metadata={};constructor(e={}){this.path=e.path||``,this.method=e.method||`get`,this.handler=e.handler||null,this.middlewares=e.middlewares||[],this.metadata=e.metadata||{}}static params(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}static query(e){let t={},n=e.split(`?`)[1];return n?oe.parse(n):t}toJSON(){return{path:this.path,method:this.method,middlewares:this.middlewares.map(e=>e.constructor.name),metadata:this.metadata}}},sn=class e extends C(gt){static __container_entry_key=`RouterService`;routes=[];middlewares=[];prefixes=[];groups=[];groupPrefixes=[];debug=!1;logger=new y;metadata={};constructor(e={}){super(),this.routes=e.routes||[],this.middlewares=e.middlewares||[],this.prefixes=e.prefixes||[],this.groups=e.groups||[],this.groupPrefixes=e.groupPrefixes||[],this.debug=e.debug||!1,this.metadata=e.metadata||{},this.listeners=e.listeners||[],this.logger=e.logger||new y}use(e,t=`route`){return this.middlewares.push({middleware:e,context:t}),this}prefix(e){return this.prefixes.push(e),this}makePath(e){let t=ne([...this.groupPrefixes,...this.prefixes,e],`/`);return t=t.replace(/\/+/g,`/`),t}add(e){let t=new on({method:e.method,path:this.makePath(e.path),handler:e.handler,middlewares:this.middlewares.map(e=>e.middleware)});this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],this.routes.push(t),this.debug&&this.logger.debug(`added route`,t),this.emit(`added`,t)}get(e,t){this.add({path:e,method:`GET`,handler:t})}post(e,t){this.add({path:e,method:`POST`,handler:t})}put(e,t){this.add({path:e,method:`PUT`,handler:t})}patch(e,t){this.add({path:e,method:`PATCH`,handler:t})}many(e,t,n){e.forEach(e=>{this.add({path:t,method:e,handler:n})})}delete(e,t){this.add({path:e,method:`DELETE`,handler:t})}group(){let t=new e({listeners:this.listeners,debug:this.debug});return t.groupPrefixes=this.prefixes,t.middlewares=this.middlewares.map(e=>({middleware:e.middleware,context:`group`})),this.groups.push(t),this.middlewares=this.middlewares.filter(e=>e.context!==`route`),this.prefixes=[],t}resolve(e,t){return this.list().find(n=>n.method.toUpperCase()===e.toUpperCase()?ut(n.path,t):!1)||null}async execute(e,t){if(!e.handler)throw Error(`Route handler not found for ${e.method} ${e.path}`);let n={...t};for await(let t of e.middlewares){let e=await t.handle(n);if(e&&`redirect`in e)return e;Object.assign(n,e)}return e.handler(n)}clear(){this.debug&&this.logger.debug(`clear`,{count:this.routes.length}),this.routes=[],this.groups=[]}list(){return this.routes.concat(...this.groups.map(e=>e.routes))}async load(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}loadSync(e={}){this.debug=e.debug??this.debug,this.debug&&this.logger.debug(`service loaded in debug mode`)}},cn=class extends yt{request;response;constructor(e,t){super({cookies:new Map(Object.entries(e.cookies)),prefix:R.get(`cookie.prefix`,``)}),this.request=e,this.response=t}set(e,t,n){let r=this.prefix+e,i={httpOnly:!0,...n};this.response.cookie(r,t,i),super.set(r,t,n)}},ln=class{static __container_entry_key=`HttpService`;app;server=null;router;exception;logger;emmitter;env;debug=!1;onUnhandlerRouted=null;constructor(e){this.debug=e.debug||!1,this.logger=e.logger||new y,this.router=e.router||new sn,this.emmitter=e.emmitter||new O,this.env=e.env||new B,this.exception=e.exception||new rn({logger:this.logger,env:this.env}),this.app=Oe(),this.app.use(Ae()),this.app.use(this.parser)}getExpressApp(){return this.app}cors(e){this.app.use(ke(e))}use=(...e)=>(this.app.use(...e),this.app);routes(){this.app.use(`*all`,(e,t)=>{let n=new URL(e.originalUrl,`http://${e.headers.host}`),r=e.method.toLowerCase(),i=this.router.resolve(r,n.pathname);if(this.router.debug&&this.router.logger.debug(`${r.toUpperCase()} ${n.pathname}`),i)return this.execute(n,e,t,i);if(n.pathname.startsWith(`/api/`))return t.status(404).json({error:`Not Found`,message:`No API route found for ${r.toUpperCase()} ${n}`});if(this.onUnhandlerRouted)return this.onUnhandlerRouted(e,t)})}parser(e,t,n){if((e.headers[`content-type`]||``).startsWith(`multipart/form-data`))return n();Oe.json()(e,t,r=>{if(r)return n(r);Oe.urlencoded({extended:!0})(e,t,n)})}async execute(e,t,n,r){let i={response:n,request:t,url:e.pathname,method:t.method.toLowerCase(),params:on.params(r.path,e.pathname),query:on.query(e.href),body:t.body||{},cookie:new cn(t,n)},[a,o]=await v(()=>this.router.execute(r,i));if(a){this.exception.handle(a,n);return}if(!n.headersSent){if(o&&o.redirect){n.redirect(o.redirect);return}n.status(200),(typeof o==`object`||Array.isArray(o))&&n.setHeader(`Content-Type`,`application/json`),n.send(o)}}start(){let e=this.env.get(`ZENITH_PORT`),t=this.env.get(`ZENITH_HOST`),n=`http://${t}:${e}`;this.server=this.app.listen(e,t,()=>{this.logger.info(`server started`,{url:n,env:this.env.get(`NODE_ENV`)}),this.emmitter.emit(`http:started`)})}stop(){return new Promise(e=>{if(!this.server)return this.logger.warn(`server is not running`),e();this.server.on(`close`,()=>{e(),this.logger.info(`server stopped`,{pid:process.pid,env:this.env.get(`NODE_ENV`)})}),this.server.close()})}},un=class extends je{static __container_entry_key=`DatabaseGateway`};const V=x.proxy(un);function dn(){return function(e){class t extends e{}return t}}const H=()=>Me`CURRENT_TIMESTAMP`;async function fn(e,t){let n=V.selectFrom(e);t?.query&&(n=t.query(V.selectFrom(e))),n=n.clearSelect().clearOrderBy().select(e=>e.fn.countAll().as(`count`)),t?.debug&&console.log(n.compile());let r=await n.executeTakeFirst();return Number(r?.count??0)}var pn=Ve({fromDb:()=>hn,toDb:()=>mn});function mn(e){if(e===null)return null;let t=V.currentConnectionDialectName;return t===`sqlite`||t===`mysql`?p(new Date(e),`yyyy-MM-dd HH:mm:ss`):new Date(e).toISOString()}function hn(e){return e===null?null:new Date(e)}function gn(e){return e===null?null:JSON.stringify(e)}const _n=V;function vn(e){return e===null?null:_n.currentConnectionDialectName===`sqlite`?+!!e:!!e}var yn=Ve({fromDb:()=>xn,toDb:()=>bn});function bn(e){let t={...e};for(let e in t)t[e]instanceof Date&&(t[e]=mn(t[e])),typeof t[e]==`object`&&(t[e]=gn(t[e])),typeof t[e]==`boolean`&&(t[e]=vn(t[e])),Array.isArray(t[e])&&(t[e]=gn(t[e]));return t}function xn(e){let t={...e};for(let e in t)t[e]=parseValue(t[e]);return t}const Sn={all:yn,datetime:pn};async function Cn(e,t){let n=t?.values||{},r=await V.insertInto(e).values(n).returningAll().executeTakeFirst();return t?.serialize&&(r=t.serialize(r)),r}async function wn(e,t){let n=t?.values||{},r=V.insertInto(e).values(n),i=t?.primaryKey||`id`,a=(await r.executeTakeFirst()).insertId,o=await V.selectFrom(e).selectAll().where(i,`=`,a).executeTakeFirst();return t?.serialize&&(o=t.serialize(o)),o}async function U(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:Sn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return V.driver===`mysql`?wn(e,i):Cn(e,i)}async function Tn(e,t){let n=t?.query?t.query(V.deleteFrom(e)):V.deleteFrom(e);t?.where&&(n=n.where(e=>t.where(e))),await n.execute()}async function W(e,t){let n=t?.query||V.selectFrom(e).selectAll();t?.query&&(n=t.query(V.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),t?.limit&&(n=n.limit(t.limit)),t?.offset&&(n=n.offset(t.offset)),t?.debug&&console.log(n.compile());let r=await n.execute();return t?.serialize&&(r=r.map(t.serialize)),r}async function En(e,t){return!!(await W(e,t))[0]}async function G(e,t){let n=V.selectFrom(e).selectAll();t?.query&&(n=t.query(n)),t?.where&&(n=n.where(e=>t.where(e)));let r=await n.limit(1).executeTakeFirst();return r?t?.serialize?t.serialize(r):r:null}async function K(e,t){let n=await G(e,t);if(!n)throw new b(`${t?.name??`Record`} not found`,404);return n}async function Dn(e,t){let n=await W(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where,query:()=>{let n=t?.select?t.select(V.selectFrom(e)):V.selectFrom(e).selectAll();return t?.where&&(n=n.where(e=>t.where(e))),n.limit(1)}});return n.length>0?n[0]:await U(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}async function On(e,t){let n=t?.page&&t.page>0?t.page:1,r=t?.limit&&t.limit>0?t.limit:10,i=(n-1)*r,a=t?.orderBy&&(Array.isArray(t.orderBy)?t.orderBy:[t.orderBy]),o=t?.orderDesc&&(Array.isArray(t.orderDesc)?t.orderDesc:[t.orderDesc]),s=await W(e,{serialize:t?.serialize,query:()=>{let n=V.selectFrom(e).selectAll();return t?.query&&(n=t.query(V.selectFrom(e))),t?.where&&(n=n.where(e=>t.where(e))),a&&a.map((e,t)=>[e,o&&o[t]?o[t]:`asc`]).forEach(([e,t])=>{n=n.orderBy(e,t)}),r>0&&(n=n.limit(r).offset(i)),t?.debug&&console.log(n.compile()),n}}),c=await fn(e,{query:()=>{let n=V.selectFrom(e).selectAll();return t?.query&&(n=t.query(V.selectFrom(e))),t?.debug&&console.log(n.compile()),n}});return Ot.from({items:s,total:c,page:n,per_page:r,total_pages:Math.ceil(c/r)})}function kn(e){return e.where(`deleted_at`,`is`,null)}function An(e){return e.eb(e.ref(`deleted_at`),`is`,null)}An.column=e=>t=>t.eb(e,`is`,null);const jn=e=>e.eb(`deleted_at`,`is not`,null),Mn=e=>e.addColumn(`deleted_at`,`timestamp`);async function Nn(e,t){let n=t?.query?t.query(V.updateTable(e)):V.updateTable(e);n=n.set({deleted_at:H()}).where(An);let r=await n.returningAll().execute();return t?.serialize&&(r=r.map(t.serialize)),r}_.prototype.addSoftDeleteColumn=function(){return this.addColumn(`deleted_at`,`timestamp`)};const Pn=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(H()).notNull()),Fn=e=>e.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(H()).notNull()),In=e=>e.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(H()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(H()).notNull());_.prototype.addTimestampColumns=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(H()).notNull()).addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(H()).notNull())},_.prototype.addCreatedColumn=function(){return this.addColumn(`created_at`,`timestamp`,e=>e.defaultTo(H()).notNull())},_.prototype.addUpdatedColumn=function(){return this.addColumn(`updated_at`,`timestamp`,e=>e.defaultTo(H()).notNull())};async function Ln(e,t){let n=t?.values||[],r=V.updateTable(e);r=r.set(n).returningAll(),t?.query&&(r=t.query(r)),t?.where&&(r=r.where(e=>t.where(e))),t?.debug&&console.log(r.compile());let i=await r.execute();return t?.serialize&&(i=i.map(t.serialize)),i}async function Rn(e,t){let n=t?.values||[],r=V.updateTable(e);t?.where&&r.where(e=>t.where(e)),await r.set(n).execute();let i=V.selectFrom(e).selectAll();t?.where&&i.where(e=>t.where(e)),t?.debug&&console.log(i.compile());let a=await i.execute();return t?.serialize&&(a=a.map(t.serialize)),a}async function zn(e,t){let n=t?.values||{},r=typeof t?.normalize==`function`?t?.normalize:Sn.all.toDb;t?.normalize!==!1&&(n=r(n));let i={...t,values:n};return V.driver===`mysql`?Rn(e,i):Ln(e,i)}async function Bn(e,t){return await G(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})?(await zn(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values,where:t?.where}),G(e,{debug:t?.debug,serialize:t?.serialize,where:t?.where})):await U(e,{debug:t?.debug,serialize:t?.serialize,values:t?.values})}_.prototype.addIdColumn=function(e=`id`){return V.driver===`postgresql`?this.addColumn(e,`serial`,e=>e.primaryKey()):V.driver===`mysql`?this.addColumn(e,`integer`,e=>e.primaryKey().autoIncrement()):this.addColumn(e,`integer`,e=>e.primaryKey())};var q=class{autoCreatedAt=!1;autoUpdatedAt=!1;constructor(e,t,n){this.db=e,this.table=t,this.primaryKey=n}query(e){return e?.qb||this.db.selectFrom(this.table)}async count(e){let t=this.query(e);t=t.select(e=>e.fn.countAll().as(`count`));let n=await t.executeTakeFirstOrThrow();return Number(n.count)}async findMany(e){let t=this.query(e);if(t=t.selectAll(),e?.limit!==void 0&&(t=t.limit(e.limit)),e?.offset!==void 0&&(t=t.offset(e.offset)),e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];n.forEach((e,n)=>{t=t.orderBy(e,r[n]||`asc`)})}return await t.execute()}async findOne(e){let t=this.query(e);return t=t.selectAll(),await t.executeTakeFirst()}async findById(e,t){let n=this.query(t);return n=n.selectAll(),n=n.where(this.primaryKey,`=`,e),await n.executeTakeFirst()}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new b(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=(t-1)*(e?.limit??10),r=e?.limit??10,i={...e,limit:r,offset:n},a={...e},[o,s]=await Promise.all([this.findMany(i),this.count(a)]);return{items:o,page:t,per_page:r,total:s,total_pages:Math.ceil(s/r)}}async beforeCreate(e){return e}async afterCreate(e){}async create(e){this.autoCreatedAt&&d(e,`created_at`,H()),this.autoUpdatedAt&&d(e,`updated_at`,H()),e=await this.beforeCreate(e);let t=this.db.insertInto(this.table);t=t.values(e).returningAll();let n=await t.executeTakeFirst();return await this.afterCreate(n),n}async beforeCreateMany(e){return e}async afterCreateMany(e){return e}async createMany(e){this.autoCreatedAt&&(e=e.map(e=>(d(e,`created_at`,H()),e))),e=await this.beforeCreateMany(e);let t=this.db.insertInto(this.table);t=t.values(e).returningAll();let n=await t.execute();return await this.afterCreateMany(n),n}async beforeUpdate(e,t){return e}async afterUpdate(e){return e}async updateById(e,t){this.autoUpdatedAt&&d(t,`updated_at`,H()),t=await this.beforeUpdate(t,e);let n=await this.findByIdOrFail(e),r=this.db.updateTable(this.table);r=r.set(t).where(this.primaryKey,`=`,n[this.primaryKey]).returningAll();let i=await r.executeTakeFirst();await this.afterUpdate(i)}async beforeDelete(e){}async afterDelete(e){}async deleteById(e){await this.beforeDelete(e);let t=await this.findByIdOrFail(e),n=this.db.deleteFrom(this.table);n=n.where(this.primaryKey,`=`,t[this.primaryKey]),await n.executeTakeFirst(),await this.afterDelete(e)}beforeDeleteMany(e){return e}afterDeleteMany(e){}async deleteMany(e){e=this.beforeDeleteMany(e);let t={...e,qb:this.db.deleteFrom(this.table)},n=this.query(t);e?.limit&&(n=n.limit(e.limit)),await n.execute(),await this.afterDeleteMany(e)}},Vn=class extends C(Je(q),dn()){autoCreatedAt=!0;autoUpdatedAt=!1;constructor(e){super(e,`tokens`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),e?.type){let n=Array.isArray(e.type)?e.type:[e.type];t=t.where(`type`,`in`,n)}return t}async findByToken(e){let t=this.query();return t=t.selectAll(),t=t.where(`token`,`=`,e),await t.executeTakeFirst()||null}async generate(e){let t=Te(64).toString(`hex`),n=e.expires_in_hours?new Date(Date.now()+e.expires_in_hours*60*60*1e3):null;return await this.create({user_id:e.user_id,token:t,type:e.type||`auth`,expires_at:n})}};const Hn=new Vn(V),Un=x.proxy(O),Wn=x.proxy(an);var Gn=class extends q{static __container_entry_key=`UserRepository`;autoCreatedAt=!0;autoUpdatedAt=!0;constructor(e){super(e,`users`,`id`)}async hashUserPasswordIfDefined(e){e.password&&=await Wn.hash(e.password)}async beforeCreate(e){return await this.hashUserPasswordIfDefined(e),e}async beforeCreateMany(e){for(let t of e)await this.hashUserPasswordIfDefined(t);return e}async beforeUpdate(e){return await this.hashUserPasswordIfDefined(e),e}async afterCreate(e){Un.emit(`user:created`,{user:e})}query(e={}){let t=super.query(e);if(e.showDeleted||(t=t.where(`deleted_at`,`is`,null)),e.search&&(t=t.where(t=>t.or([t(`name`,`like`,`%${e.search}%`),t(`username`,`like`,`%${e.search}%`),t(`email`,`like`,`%${e.search}%`)]))),e?.email&&(t=t.where(`email`,`=`,e.email)),e?.username&&(t=t.where(`username`,`like`,`%${e.username}%`)),e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return t}};const J=new Gn(V);var Kn=class{static __container_entry_key=`HttpTesterService`;http;request;headers={};cookies={};constructor(e){this.http=e.http,this.request=Ne(this.http.getExpressApp())}create(e){for(let[t,n]of Object.entries(this.headers))e.set(t,n);for(let[t,n]of Object.entries(this.cookies))e.set(`Cookie`,`${t}=${n}`);return e}get(e){return this.create(this.request.get(e))}post(e,t){return this.create(this.request.post(e).send(t))}async loginByUser(e){let t=await Hn.generate({user_id:e.id});this.cookies.Authorization=t.token}async loginByUsername(e){let t=await J.findOne({username:e});if(!t)throw new b(`User not found`);return this.loginByUser(t)}},qn=class extends Qe{async addDirectory(e){let t=await qe(e),n=[];for(let[e,r]of Object.entries(t)){let t=new(r.default||r);t.hook_id=t.hook_id||e,n.push(t)}n.forEach(e=>this.add(e))}},Jn=class{payload;table;foreignKey;parentKey=`id`;constructor(e,t,n,r){this.payload=e,this.table=t,this.foreignKey=n,r&&(this.parentKey=r)}get needWhereIn(){for(let e of Object.values(this.payload))if(typeof e==`string`||e.eq!==void 0||e.neq!==void 0||e.like!==void 0||e.nlike!==void 0||e.in!==void 0||e.nin!==void 0||e.gt!==void 0||e.gte!==void 0||e.lt!==void 0||e.lte!==void 0||e.is_null!==void 0||e.exists===!0)return!0;return!1}get needWhereNotIn(){for(let e of Object.values(this.payload))if(typeof e!=`string`&&e.exists===!1)return!0;return!1}apply(e){let t=e;return this.needWhereIn&&(t=t.where(this.parentKey,`in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereIn(e)))),this.needWhereNotIn&&(t=t.where(this.parentKey,`not in`,e=>e.selectFrom(this.table).select(this.foreignKey).where(this.whereNotIn(e)))),t}buildRowConditions(e,t,n){if(typeof n==`string`)return[e.eb(`name`,`=`,t),e.eb(`value`,`=`,n)];let r=[e.eb(`name`,`=`,t)];return n.eq!==void 0&&r.push(e.eb(`value`,`=`,n.eq)),n.neq!==void 0&&r.push(e.eb(`value`,`!=`,n.neq)),n.like!==void 0&&r.push(e.eb(`value`,`like`,n.like)),n.nlike!==void 0&&r.push(e.eb(`value`,`not like`,n.nlike)),n.in&&r.push(e.eb(`value`,`in`,n.in)),n.nin&&r.push(e.eb(`value`,`not in`,n.nin)),n.gt!==void 0&&r.push(e.eb(`value`,`>`,n.gt)),n.gte!==void 0&&r.push(e.eb(`value`,`>=`,n.gte)),n.lt!==void 0&&r.push(e.eb(`value`,`<`,n.lt)),n.lte!==void 0&&r.push(e.eb(`value`,`<=`,n.lte)),n.is_null!==void 0&&r.push(e.eb(`value`,n.is_null?`is`:`is not`,null)),r}whereIn=e=>{let t=e;for(let[n,r]of Object.entries(this.payload))typeof r!=`string`&&r.exists===!1||(t=t.and(this.buildRowConditions(e,n,r)));return t};whereNotIn=e=>{let t=e;for(let[e,n]of Object.entries(this.payload))typeof n!=`string`&&n.exists===!1&&(t=t(`name`,`=`,e));return t}},Yn=class e{id;table;foreignKey;constructor(e){this.id=e.id,this.table=e.table,this.foreignKey=e.foreignKey}static parse(e){return typeof e==`string`&&e.startsWith(`json:`)?JSON.parse(e.slice(5)):typeof e==`string`&&e.startsWith(`bool:`)?e.slice(5)===`true`:typeof e==`string`&&e.startsWith(`number:`)?Number(e.slice(7)):typeof e==`string`&&e.startsWith(`string:`)?e.slice(7):e}static flatten(t){let n={};for(let r of t)n[r.name]=e.parse(r.value);return n}async get(t,n){let r=V.selectFrom(this.table);r=r.selectAll().where(this.foreignKey,`=`,this.id).where(`name`,`=`,t).limit(1);let i=await r.executeTakeFirst();return!i||!i.value?n:e.parse(i.value)}async set(e,t){let n=this.foreignKey,r=this.table,i={[n]:this.id,name:e,value:t};if(typeof t==`object`&&(i.value=`json:${JSON.stringify(t)}`),await V.selectFrom(r).where(n,`=`,this.id).where(`name`,`=`,e).executeTakeFirst()){await V.updateTable(r).set(i).where(n,`=`,this.id).where(`name`,`=`,e).execute();return}await V.insertInto(r).values(i).execute()}async list(){let t=this.foreignKey,n=this.table,r=V.selectFrom(n);return r=r.selectAll().where(t,`=`,this.id),(await r.execute()).map(t=>({name:t.name,value:e.parse(t.value)}))}async all(){let e=await this.list(),t={};for(let n of e)t[n.name]=n.value;return t}},Xn=class{name;source;filename;executedAt;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename,this.executedAt=e.executedAt}async up(e){let t=await import(this.filename);if(typeof t.up!=`function`)throw new b(`Migration ${this.name} does not export an up function`);await t.up(e)}async down(e){let t=await import(this.filename);if(typeof t.down!=`function`)throw new b(`Migration ${this.name} does not export a down function`);await t.down(e)}},Zn=class{static __container_entry_key=`MigratorService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new O,this.logger=e.logger||new y,this.db=e.db,this.sources=e.sources}addSource(e){this.sources.push(e)}async ensureMigrationsTable(){await this.db.schema.createTable(`migrations`).ifNotExists().addColumn(`name`,`varchar(255)`,e=>e.primaryKey()).addColumn(`module`,`varchar(255)`).addColumn(`executed_at`,`timestamp`,e=>e.notNull()).execute()}async listSource(e){if(!s.existsSync(e.directory))return this.logger.warn(`Migration source directory does not exist: ${e.directory}`),[];let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.some(e=>a.endsWith(e)))continue;let t=r.join(e.directory,a),o=new Xn({name:r.basename(a,r.extname(a)),source:e.id,filename:t,executedAt:null});i.push(o)}return i}async list(e){await this.ensureMigrationsTable();let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}let n=await this.db.selectFrom(`migrations`).selectAll().execute();for(let e of n){e.source||=`root`;let n=t.find(t=>t.name===e.name);n&&(n.executedAt=new Date(e.executed_at))}if(e?.source&&(t=t.filter(t=>t.source===e.source)),e?.name){let n=Array.isArray(e.name)?e.name:[e.name];t=t.filter(e=>n.includes(e.name))}return t=ie(t,[`source`,`name`],[`asc`,`asc`]),t}async migrateUp(e){await e.up(this.db),await this.db.insertInto(`migrations`).values({name:e.name,module:e.source,executed_at:p(new Date,`yyyy-MM-dd HH:mm:ss`)}).execute(),this.logger.info(`${e.name} migrated successfully`)}async migrateDown(e){await e.down(this.db),await this.db.deleteFrom(`migrations`).where(`name`,`=`,e.name).where(`module`,`=`,e.source).execute(),this.logger.info(`${e.name} rolled back successfully`)}async migrateFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:Error(`Migration ${e} not found`)};if(t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await v(()=>this.migrateUp(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async rollbackFile(e){await this.ensureMigrationsTable();let t=(await this.list()).find(t=>t.filename===e);if(!t)return{name:r.basename(e,r.extname(e)),filename:e,source:null,result:`failed`,error:`Migration ${e} not found`};if(!t.executedAt)return{name:t.name,filename:t.filename,source:t.source,result:`success`};let[n]=await v(()=>this.migrateDown(t));return n?{name:t.name,filename:t.filename,source:t.source,result:`failed`,error:n}:{name:t.name,filename:t.filename,source:t.source,result:`success`}}async migrate(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>!e.executedAt),t.sort((e,t)=>e.name.localeCompare(t.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-migrate`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.migrateFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-migrate`,{migrations:t,results:n}),n}async rollback(e={}){await this.ensureMigrationsTable();let t=await this.list(e);if(t=t.filter(e=>e.executedAt),t.sort((e,t)=>t.name.localeCompare(e.name)),e.steps!==void 0&&(t=t.slice(0,e.steps)),t.length===0)return[];await this.emmitter.emitAndWait(`migrator:before-rollback`,{migrations:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.rollbackFile(e.filename);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`migrator:after-rollback`,{migrations:t.map(e=>e.name)}),n}async up(e=1,t={}){return this.migrate({...t,steps:e})}async down(e=1,t={}){return this.rollback({...t,steps:e})}async latest(e={}){return this.migrate(e)}async latestOrFail(e={}){let t=await this.latest(e),n=t.find(e=>e.result===`failed`);if(n)throw n.error||new b(`Migration failed: ${n.name}`);return t}async fresh(e={}){let t=await this.rollback(e);return t.some(e=>e.result===`failed`)?t:await this.migrate(e)}},Qn=class{listeners=new Map;constructor(){process.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!process.send)throw Error(`PluginIpcClient.emit: process.send is not available — process was not spawned with IPC channel`);let n=E(),r={id:n,event:e,data:t};return process.send(r),n}},$n=class{listeners=new Map;constructor(e){this.child=e,this.child.on(`message`,e=>{let t=this.listeners.get(e.event);if(t)for(let n of t)n(e.data)})}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){this.listeners.get(e)?.delete(t)}emit(e,t){if(!this.child.send)throw Error(`PluginIpcHost.emit: child process was not spawned with an IPC channel`);let n=E(),r={id:n,event:e,data:t};return this.child.send(r),n}};function er(e){let t=[],n=e.replace(/:[a-zA-Z_][a-zA-Z0-9_]*/g,e=>(t.push(e.slice(1)),`([^/]+)`)).replace(/\//g,`\\/`);return{pattern:RegExp(`^${n}$`),paramNames:t}}var tr=class{routes=[];constructor(e){this.client=e,this.client.on(`router:request`,e=>this.dispatch(e))}async dispatch(e){for(let t of this.routes){if(t.method!==e.method)continue;let n=t.pattern.exec(e.path);if(!n)continue;let r={};t.paramNames.forEach((e,t)=>{r[e]=n[t+1]});let i=200,a={},o={status(e){return i=e,this},send:t=>{let n={requestId:e.requestId,status:i,body:t,headers:a};this.client.emit(`router:response`,n)}};await t.handler({...e,params:r},o);return}this.client.emit(`router:response`,{requestId:e.requestId,status:404,body:{message:`Not Found`}})}register(e,t,n){let{pattern:r,paramNames:i}=er(t);this.routes.push({method:e,path:t,handler:n,pattern:r,paramNames:i}),this.client.emit(`router:register`,{method:e,path:t})}get(e,t){this.register(`GET`,e,t)}post(e,t){this.register(`POST`,e,t)}put(e,t){this.register(`PUT`,e,t)}patch(e,t){this.register(`PATCH`,e,t)}delete(e,t){this.register(`DELETE`,e,t)}},nr=class e{directory;prefix;module;router;logger=new y;routes=[];debug=!1;setDirectory(e){return this.directory=e,this}setPrefix(e){return this.prefix=e,this}setRouter(e){return this.router=e,this}setModule(e){return this.module=e,this}setLogger(e){return this.logger=e,this}setDebug(e){return this.debug=e,this}static create(t){return new e().setDirectory(t)}async loadFiles(){let e=l.sync(`**/*.(ts|js|mjs)`,{cwd:this.directory});this.debug&&this.logger.debug(`Found ${e.length} route files in ${this.directory}`,{files:e});let t=[];for(let n of e){let e=n.replace(/\.(ts|js|mjs)$/,``),r=`get`;for(let t of[`.post`,`.patch`,`.delete`,`.put`])if(e.endsWith(t)){r=t.substring(1),e=e.replace(t,``);break}e=e.replace(/\/index$/,``),e=e.replace(/^index$/,``),e=e.replace(/\[\.\.\.([^\]]+)]/g,`*$1`),e=e.replace(/\[([^\]]+)]/g,`:$1`),e.startsWith(`/`)||(e=`/`+e),e===`/`&&(e=`/`),this.prefix&&(e=(this.prefix.startsWith(`/`)?this.prefix:`/`+this.prefix)+e);let i=0;e.includes(`*`)&&(i+=1e6);let a=(e.match(/:/g)||[]).length;i+=a*1e4;let o=e.split(`/`).filter(e=>e).length;i-=o*100,t.push({file:n,routePath:e,method:r,sortKey:i,module:this.module})}t.sort((e,t)=>e.sortKey-t.sortKey),this.routes=t}async registerRoutes(){if(!this.router)throw new b(`Router instance not set`);let e=this.module||`unknown`,t=function(t){t.metadata={...t.metadata,module:e}};this.router.on(`added`,t);for(let e of this.routes){let t=(await import(`${this.directory}/${e.file}`)).default;if(typeof t!=`function`){this.logger.warn(`Route file ${e.file} does not export a default function`);continue}this.router[e.method](e.routePath,t)}this.router.off(`added`,t)}async load(){await this.loadFiles(),await this.registerRoutes()}},rr=class extends sn{files=new Map;dirs=new Map;constructor(e={}){super(e)}addFile(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.files.set(e,n)}addDir(e,t){let n={filepath:e,metadata:t||{}};this.emit(`addEntry`,n),this.dirs.set(e,n)}async loadFile(e){if(!s.existsSync(e.filepath))return this.logger.warn(`File not found: ${e.filepath}`),!1;let t=function(t){t.metadata={...t.metadata,...e.metadata,filename:e.filepath}},n=`${e.filepath}?t=${Date.now()}`;this.on(`added`,t);let[r]=await v(()=>import(n));return this.off(`added`,t),r?(Object.assign(r,e),this.logger.error(`failed to load file`,r),!1):!0}async loadDir(e){let t=new Set;if(!s.existsSync(e.filepath))return this.logger.warn(`Directory not found: ${e.filepath}`),Array.from(t);let n=s.readdirSync(e.filepath);for(let i of n){if(i.endsWith(`.test.ts`)||i.endsWith(`.spec.ts`)||i.endsWith(`.test.js`)||i.endsWith(`.spec.js`))continue;let n=r.join(e.filepath,i),a={filepath:n,metadata:e.metadata};await this.loadFile(a)&&t.add(n)}return Array.from(t)}async load(){let e=new Set;for(let t of this.files.values())await this.loadFile(t)&&e.add(t.filepath);for(let t of this.dirs.values())(await this.loadDir(t)).forEach(t=>e.add(t));this.debug&&this.logger.debug(`load files`,{files:Array.from(e).map(e=>r.relative(process.cwd(),e))})}};const ir=[{method:`get`,path:`/`,handler:`index`,hooks:{before:[`beforeIndex`],after:[`afterIndex`]}},{method:`get`,path:`/:id`,handler:`show`,hooks:{before:[`beforeShow`],after:[`afterShow`]}},{method:`post`,path:`/`,handler:`store`,hooks:{before:[`beforeStore`,`beforeSave`],after:[`afterStore`,`afterSave`]}},{method:`put`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`patch`,path:`/:id`,handler:`update`,hooks:{before:[`beforeUpdate`,`beforeSave`],after:[`afterUpdate`,`afterSave`]}},{method:`delete`,path:`/:id`,handler:`destroy`,hooks:{before:[`beforeDestroy`],after:[`afterDestroy`]}}];var ar=class extends C(gt){options;constructor(e={}){super(),this.options=e}async index(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async show(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async store(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async update(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}async destroy(e){let t=Error(`Not implemented`);throw Object.assign(t,{ctx:e}),t}wrap(e,t,n){return async r=>{await this.emit(`beforeAll`,r);for(let e of t)await this.emit(e,r);let i=await this[e](r);for(let e of n)await this.emit(e,r,i);return i}}register(e){for(let t of ir){let n=t.method,r=t.handler;this.options.except&&this.options.except.includes(r)||(this.options.middleware&&this.options.middleware.all&&e.use(this.options.middleware.all),this.options.middleware&&this.options.middleware[r]&&e.use(this.options.middleware[r]),e[n](t.path,this.wrap(t.handler,t.hooks?.before||[],t.hooks?.after||[])))}}},or=class extends ar{model;constructor(e,t={}){if(super(t),!e.__isConfigModel)throw Error(`RouterResourceConfigService requires a ConfigModel`);this.model=e}async index(e){let t=await this.model.list();return{page:1,total:t.length,total_pages:1,items:t}}async show(e){let t=e.params.id;return await this.model.findOrFail(t)}async store(e){let t=e.request.body;return await this.model.create(t),{message:`Resource created successfully`}}async update(e){let t=e.params.id,n=e.request.body;return await this.model.update(t,n)}async destroy(e){let t=e.params.id;return await this.model.destroy(t),{success:!0}}},sr=class e{id;cron;job;static create(){return new e}handle=()=>{throw Error(`RoutineEntity handler not implemented`)};setId(e){return this.id=e,this}setCron(e){return this.cron=e,this}setHandler(e){return this.handle=e,this}},cr=class e{static __container_entry_key=`SchedulerService`;routines;logger;debug;dirs=[];constructor(e){this.routines=[],this.logger=e?.logger||new y,this.debug=e?.debug||!1}static create(t){return new e(t)}setLogger(e){this.logger=e}setDebug(e){this.debug=e}addDir(e){this.dirs.push(e)}add(e){let t=e?.id||E();this.routines.push(e),this.debug&&this.logger.debug(`${t} routine added`,{id:t,cron:e.cron})}remove(e){let t=Array.isArray(e)?e:[e];this.routines=this.routines.filter(e=>!t.includes(e.id)),this.debug&&this.logger.info(`routines removed`,{ids:t})}async loadFile(e){if(!s.existsSync(e)){this.logger.warn(`File not found: ${e}`);return}let[t,n]=await v(()=>import(e));if(t){this.logger.error(`failed to load routines from ${e}`,t);return}let r=n?.default||n;if(!r?.is_routine){this.logger.warn(`file does not export a routine: ${e}`);return}let i=new r;i.id=i.id||e,this.add(i),this.debug&&this.logger.debug(`file loaded`,{filename:e})}async loadDirectory(e){if(!s.existsSync(e)){S.warn(`directory not found`,{directory:e});return}let t=s.readdirSync(e).filter(e=>e.endsWith(`.ts`));for(let n of t)await this.loadFile(r.join(e,n))}async load(){for(let e of this.dirs)await this.loadDirectory(e)}has(e){return this.routines.some(t=>t.id===e)}async startRoutine(e){let t=this.routines.find(t=>t.id===e);if(!t)throw new b(`RoutineEntity not found: ${e}`);t.job&&t.job.cancel();let n=this.logger.child({routineId:t.id,routineCron:t.cron});t.job=Pe.scheduleJob(t.cron,async()=>{let[e]=await v(()=>t.handle());if(e){n.error(e.message,e);return}n.info(`${t.id} routine executed`)}),n.info(`${t.id} routine started`)}async addAndStart(e){this.add(e),await this.startRoutine(e.id)}async stopRoutine(e){let t=this.routines.find(t=>t.id===e);if(!t)throw new b(`RoutineEntity not found`,404);t.job&&(t.job.cancel(),this.logger.info(`${t.id} routine stopped`))}async stopAndRemove(e){await this.stopRoutine(e),this.remove(e)}async boot(){for(let e of this.routines)await this.startRoutine(e.id)}async shutdown(){for(let e of this.routines)await this.stopRoutine(e.id)}list(){return this.routines}},lr=class{name;source;filename;constructor(e){this.name=e.name,this.source=e.source,this.filename=e.filename}async run(e){let t=await import(this.filename);if(typeof t.default!=`function`)throw new b(`Seeder ${this.name} does not export a function`);await t.default(e)}},ur=class{static __container_entry_key=`SeederService`;debug=!1;emmitter;logger;db;sources;constructor(e){this.debug=e.debug??this.debug,this.emmitter=e.emmitter||new O,this.logger=e.logger||new y,this.db=e.db,this.sources=e.sources||[]}addSource(e){this.sources.push(e)}async listSource(e){let t=await s.promises.readdir(e.directory),n=[`.js`,`.ts`,`.mjs`,`.mts`],i=[];for(let a of t){if(!n.includes(r.extname(a)))continue;let t=r.join(e.directory,a),o=new lr({name:r.basename(a,r.extname(a)),source:e.id,filename:t});i.push(o)}return i}async list(e){let t=[];for await(let e of this.sources){let n=await this.listSource(e);t.push(...n)}if(e?.source){let n=Array.isArray(e.source)?e.source:[e.source];t=t.filter(e=>e.source&&n.includes(e.source))}if(e?.name){let n=Array.isArray(e.name)?e.name:[e.name];t=t.filter(e=>n.includes(e.name))}return t.sort((e,t)=>e.name.localeCompare(t.name)),t}async runSeeder(e){let[t]=await v(()=>e.run(this.db));return t?(this.logger.error(`failed to run seeder ${e.name}`,t),{name:e.name,filename:e.filename,source:e.source,result:`failed`,error:t}):(this.logger.info(`seeder ${e.name} ran successfully`),{name:e.name,filename:e.filename,source:e.source,result:`success`})}async run(e={}){let t=await this.list(e);await this.emmitter.emitAndWait(`seeder:before-run`,{seeders:t.map(e=>e.name)});let n=[];for(let e of t){let t=await this.runSeeder(e);if(n.push(t),t.result===`failed`)break}return await this.emmitter.emitAndWait(`seeder:after-run`,{seeders:n.map(e=>e.name)}),n}},Y=class{static __container_entry_key=`ShellService`;debug;logger;constructor(e={}){this.debug=e.debug??!1,this.logger=e.logger||new y,this.debug&&this.logger.debug(`initialized in debug mode`)}async command(e,t,n={}){return new Promise((r,i)=>{let a=de(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell??!0,env:n.env||process.env}),o=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{o+=e.toString()}),a.on(`close`,n=>{if(this.debug&&this.logger.debug(`command executed`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`,output:o}),n===0)return r();let a=`Command failed with exit code ${n}`;this.logger.error(a,{bin:e,args:t,code:n,output:o}),i(new mt(a,o,e,t))}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`,error:n?.message||n}),i(n)})})}async executeCommandWithOutput(e,t,n={}){return this.debug&&this.logger.debug(`executing command`,{bin:e,args:t,fullCommand:`${e} ${t.join(` `)}`}),new Promise((r,i)=>{let a=de(e,t,{cwd:n.cwd||process.cwd(),stdio:`pipe`,shell:n.shell===void 0?!0:n.shell,env:n.env||process.env}),o=``,s=``;a.stdout?.on(`data`,e=>{o+=e.toString()}),a.stderr?.on(`data`,e=>{s+=e.toString()}),a.on(`close`,n=>{if(n===0)r(o.trim());else{let r=`Command failed with exit code ${n}: ${s}`;this.logger.error(r,{bin:e,args:t,code:n,fullCommand:`${e} ${t.join(` `)}`,errorOutput:s}),i(new mt(r,o,e,t))}}),a.on(`error`,n=>{this.logger.error(`Command execution error`,{bin:e,args:t,error:n.message}),i(n)})})}},dr=class{constructor(e,t,n=`id`){this.config=e,this.key=t,this.primaryKey=n}getItems(){return this.config.get(this.key,[])}setItems(e){this.config.set(this.key,e)}query(e){return this.getItems()}async count(e){return this.query(e).length}async findMany(e){let t=this.query(e);if(e?.orderBy){let n=Array.isArray(e.orderBy)?e.orderBy:[e.orderBy],r=Array.isArray(e.orderDirection)?e.orderDirection:[e.orderDirection??`asc`];t=ie(t,n,r)}return e?.offset&&(t=t.slice(e.offset)),e?.limit&&(t=t.slice(0,e.limit)),t}async findOne(e){return this.query(e)[0]??null}async findById(e,t){return this.query(t).find(t=>t[this.primaryKey]===e)??null}async findByIdOrFail(e,t){let n=await this.findById(e,t);if(!n)throw new b(`Item not found`,404);return n}async paginate(e){let t=e?.page??1,n=e?.limit??10,r=(t-1)*n,[i,a]=await Promise.all([this.findMany({...e,limit:n,offset:r}),this.count(e)]);return{items:i,page:t,per_page:n,total:a,total_pages:Math.ceil(a/n)}}async create(e){let t=this.getItems(),n={[this.primaryKey]:E(),...e};return t.push(n),this.setItems(t),n}async createMany(e){let t=this.getItems(),n=e.map(e=>({[this.primaryKey]:E(),...e}));return this.setItems([...t,...n]),n}async updateById(e,t){let n=this.getItems(),r=n.findIndex(t=>t[this.primaryKey]===e);if(r===-1)throw new b(`Item not found`,404);return n[r]={...n[r],...t},this.setItems(n),n[r]}async deleteById(e){await this.findByIdOrFail(e);let t=this.getItems().filter(t=>t[this.primaryKey]!==e);this.setItems(t)}async deleteMany(e){let t=this.query(e),n=e?.limit??t.length,r=new Set(t.slice(0,n).map(e=>e[this.primaryKey])),i=this.getItems().filter(e=>!r.has(e[this.primaryKey]));this.setItems(i)}},fr=class extends q{constructor(e){super(e,`files`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`f.client_name`,`like`,`%${e.search}%`)),e?.purpose?.length&&(t=t.where(`f.purpose`,`in`,e.purpose)),e?.client_name?.length&&(t=t.where(`f.client_name`,`in`,e.client_name)),e?.metas&&(t=new Jn(e.metas,`file_metas`,`file_id`).apply(t)),t}},pr=class{cwd;shell;constructor(e){this.cwd=e.cwd,this.shell=e.shell??new Y}async list(){return(await this.shell.executeCommandWithOutput(`git`,[`branch`,`-a`,`--format='%(HEAD)|%(refname:short)|%(refname)|%(upstream:remotename)'`],{cwd:this.cwd})).split(`
|
|
2
|
+
`).filter(Boolean).filter(e=>e.includes(`|`)).map(e=>{let[t,n,r,i]=e.split(`|`),a=r.startsWith(`refs/remotes/`);return new Tt({name:n,remote:a?n.split(`/`)[0]:i||null,is_current:t===`*`,is_remote:a})})}async fetch(e){let{remote:t,branch:n,localName:r=n}=e;await this.shell.command(`git`,[`fetch`,t,`${n}:${r}`],{cwd:this.cwd})}};const mr=[`%H`,`%h`,`%s`,`%an`,`%ae`,`%aI`,`%b`].join(`%x09`),hr=`---COMMIT---`;var gr=class{cwd;shell;constructor(e){this.cwd=e.cwd,this.shell=e.shell??new Y}async list(e){let t=e?.limit??20,n=e?.cursor,r=[`log`,`--format=${hr}%n${mr}`,`-n`,String(t)];if(n&&r.push(`${n}^`),e?.branches){let t=Array.isArray(e.branches)?e.branches:[e.branches];r.push(...t)}!e?.branches&&!n&&r.push(`--all`);let i=(await this.shell.executeCommandWithOutput(`git`,r,{cwd:this.cwd})).split(hr).map(e=>e.trim()).filter(Boolean).map(e=>{let[t,n,r,i,a,o,...s]=e.split(` `);return new Et({hash:t,short_hash:n,message:r,author_name:i,author_email:a,date:o,body:s.join(` `).trim()})}),a=i[0]?.hash??null,o=i[i.length-1]?.hash??null;return{items:i,cursor_previous:n??null,cursor_current:a,cursor_next:i.length<t?null:o}}async checkout(e){await this.shell.command(`git`,[`checkout`,e],{cwd:this.cwd})}},_r=class extends q{constructor(e){super(e,`permissions_assignments`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}if(e?.permissionId){let n=Array.isArray(e.permissionId)?e.permissionId:[e.permissionId];t=t.where(`permission_id`,`in`,n)}if(e?.assignableId){let n=Array.isArray(e.assignableId)?e.assignableId:[e.assignableId];t=t.where(`assignable_id`,`in`,n)}if(e?.assignableType){let n=Array.isArray(e.assignableType)?e.assignableType:[e.assignableType];t=t.where(`assignable_type`,`in`,n)}return t}},vr=class extends q{constructor(e){super(e,`permissions`,`id`)}query(e){let t=super.query(e);if(e?.id){let n=Array.isArray(e.id)?e.id:[e.id];t=t.where(`id`,`in`,n)}return e?.search&&(t=t.where(`name`,`like`,`%${e.search}%`)),t}},yr=class e{cwd;sshKey;sshKeyFile;logger=new y;debug;shell;constructor(e){this.cwd=e.cwd,this.sshKey=e.sshKey,this.sshKeyFile=e.sshKeyFile,this.logger=e.logger??new y,this.shell=e.shell??new Y({logger:this.logger,debug:e.debug}),this.debug=e.debug??!1}static async execute(e){let t=e.cwd,n=e.sshKey,r=e.sshKeyFile,i=e.logger??new y,a=e.debug??!1,o=e.args,s=e.shell??new Y({logger:i,debug:a}),c={};if(r&&(c.GIT_SSH_COMMAND=`ssh -i ${r} -o StrictHostKeyChecking=no`),n){let e=Lt(`git-clone-ssh-key-`+Ie());await Fe(e,n,{mode:384}),c.GIT_SSH_COMMAND=`ssh -i ${e} -o StrictHostKeyChecking=no`}let l=`git ${o}`;return a&&i.debug(l,{cwd:t,sshKeyFile:r}),s.executeCommandWithOutput(`git`,o.split(` `),{cwd:t,env:{...process.env,...c}})}static async clone(t,n,r){return await e.execute({sshKey:r.sshKey,sshKeyFile:r.sshKeyFile,logger:r.logger,debug:r.debug,shell:r.shell,args:`clone '${t}' '${n}'`}),new e({...r,cwd:n})}async run(t){return await e.execute({cwd:this.cwd,sshKey:this.sshKey,sshKeyFile:this.sshKeyFile,logger:this.logger,debug:this.debug,shell:this.shell,args:t})}async tryRun(e){let[t,n]=await v(()=>this.run(e));return t?(this.logger.error(t),null):n}async checkout(e){return this.run(`checkout ${e}`)}async fetchAll(){return this.run(`fetch --all --prune`)}async pull(){await this.fetchAll(),await this.tryRun(`rev-parse --abbrev-ref --symbolic-full-name @{upstream}`)&&await this.run(`pull --ff-only`)}async getInfo(){let e=await this.run(`rev-parse --abbrev-ref HEAD`),t=e===`HEAD`,n=await this.run(`rev-parse --short HEAD`),r=await this.tryRun(`remote`),i=r?r.split(`
|
|
3
|
+
`).filter(Boolean):[];return{directory:this.cwd,head:t?null:e,shortHash:n,isDetachedHead:t,remotes:i}}};function br(e){return typeof e==`object`?`json:${JSON.stringify(e)}`:typeof e==`boolean`?`bool:${e}`:typeof e==`number`?`number:${e}`:String(e)}function xr(e,t){return function(n){return class extends n{async get(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s=V.selectFrom(e);s=s.selectAll().where(t,`=`,this[o]).where(`name`,`=`,n).limit(1);let c=await s.executeTakeFirst();if(!c||!c.value)return r;let l=c?.value;return typeof l==`string`&&l.startsWith(`json:`)&&(l=JSON.parse(l.slice(5))),typeof l==`string`&&l.startsWith(`bool:`)&&(l=l.slice(5)===`true`),l}async set(n,r){let i=this.constructor,a=i.__model?.table,o=i.__model?.primaryKey;if(!a||!o)throw Error(`Should use Model mixin before Metadata`);let s={[t]:this[o],name:n,value:r};s.value=br(r),await Bn(e,{values:s,where:e=>e.and([e.eb(t,`=`,this[o]),e.eb(`name`,`=`,n)])})}}}}function Sr(e,t=`id`){return function(n){return class extends n{static __model={table:e,primaryKey:t};static serialize(e){let t=new this;return Object.assign(t,e),t}static select(){return V.selectFrom(e)}static async paginate(t){let n=this,r=await On(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r.items)await N(n,`serialized`,e);return await N(n,`afterPaginate`,r),r}static async list(t){let n=this,r=await W(e,{...t,serialize:e=>n.serialize(e)});for await(let e of r)await N(n,`serialized`,e);return await N(n,`afterList`,r),r}static async findOne(t){let n=this,r=await G(e,{query:t?.query,where:t?.where,serialize:e=>n.serialize(e)});return r&&await N(n,`serialized`,r),await N(n,`afterFind`,r),r}static async findOneOrFail(t){let n=this,r=await K(e,{...t,name:t?.name??n.name,serialize:e=>n.serialize(e)});return await N(n,`serialized`,r),await N(n,`afterFind`,r),r}static async find(n){let r=this,i=await G(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return i&&(await N(r,`serialized`,i),await N(r,`afterFind`,i)),i}static async findOrFail(n){let r=this,i=await K(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static async findBy(t,n){let r=this,i=await K(e,{serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static async findByOrFail(t,n){let r=this,i=await K(e,{name:r.name,serialize:e=>r.serialize(e),where:e=>e(t,`=`,n)});return await N(r,`serialized`,i),await N(r,`afterFind`,i),i}static exists(t){return En(e,{query:t?.query})}static count(t){return fn(e,t)}static async create(t){let n=this,r={...t};await N(n,`beforeCreate`,r);let i=await U(e,{serialize:e=>n.serialize(e),values:r});return await N(n,`afterCreate`,i),await N(n,`serialized`,i),await N(n,`afterFind`,i),i}static async createMany(t){let n=this,r=[];for await(let i of t){await N(n,`beforeCreate`,i);let t=await U(e,{values:i,serialize:e=>n.serialize(e)});await N(n,`afterCreate`,t),await N(n,`serialized`,t),await N(n,`afterFind`,t),r.push(t)}return r}static async update(t){let n=this,r={...t.values};await N(n,`beforeUpdate`,r,t.where),await zn(e,{debug:t.debug,where:t.where,values:r,serialize:e=>n.serialize(e)});let i=await K(e,{where:t.where,serialize:e=>n.serialize(e)});return await N(n,`afterUpdate`,i),i}static updateById(e,n,r){return this.update({debug:r?.debug,where:n=>n(t,`=`,e),values:n})}static async destroy(t){let n=this;await N(n,`beforeDestroy`,t),await Tn(e,t),await N(n,`afterDestroy`,t)}static firstOrCreate(t){let n=this;return Dn(e,{...t,serialize:e=>n.serialize(e)})}static updateOrCreate(t){let n=this;return Bn(e,{debug:t.debug,where:t.where,select:t.select,update:t.update,values:t.values,serialize:e=>n.serialize(e)})}static async destroyById(n){let r=this,i={query:e=>e.where(t,`=`,n)};await N(r,`beforeDestroy`,i),await Tn(e,i),await N(r,`afterDestroy`,i)}async save(){let n=this.constructor,r=re(this,[t]);await N(n,`beforeSave`,this,r),await zn(e,{where:e=>e(t,`=`,this[t]),values:r}),await N(n,`afterSave`,this)}async destroy(){let n=this.constructor;await N(n,`beforeDestroy`,this),await Tn(e,{query:e=>e.where(t,`=`,this.id)}),await N(n,`afterDestroy`,this)}async softDelete(){let n=this.constructor;await N(n,`beforeSoftDelete`,this);let r=(await Nn(e,{query:e=>e.where(t,`=`,this.id)}))[0];Object.assign(this,r),await N(n,`afterSoftDelete`,this)}}}}function Cr(e){return function(t){return class extends t{static async load(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw Error(`Relation ${String(t)} declared`);await n.load(r)}}}}}const wr=new Gt,X=x.proxy(tn),Tr=x.proxy(B),Er=new fr(V),Dr=x.proxy(ln),Or=x.proxy(Zn),kr=new _r(V),Ar=new vr(V),jr=x.proxy(sn),Mr=x.proxy(cr),Nr=x.proxy(Y);function Z(e){return e}var Pr=class extends w(wt,Sr(`file_metas`)){},Fr=class{table;tableKey;targetTable;targetKey;property;constructor(e){this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=V.selectFrom(this.targetTable);n=n.selectAll().where(this.targetKey,`in`,Array.from(t));let r=await n.execute();e.forEach(e=>{let t=r.filter(t=>t[this.targetKey]===e[this.tableKey]);d(e,this.property,Yn.flatten(t))})}};const Ir={metas:new Fr({table:`files`,tableKey:`id`,targetTable:`file_metas`,targetKey:`file_id`,property:`metas`})};var Q=class e extends w(Ct,gt,Sr(`files`),Cr(Ir),xr(`file_metas`,`file_id`)){static cache=new Map;static async has(e){return await this.exists({query:t=>t.where(`filename`,`=`,e)})}static async findByFilename(e){return await this.findOne({where:t=>t(`filename`,`=`,e)})}readStream(){return X.use(this.drive).readStream(this.filename)}async read(){return await X.use(this.drive).read(this.filename)}async loadUrl(t={}){let n=e.cache.get(this.filename),r=Date.now();if(n&&r<n.expires){this.url=n.url;return}if(t.expires||=`1h`,this.url=await X.use(this.drive).url(this.filename,t),!this.url)return;let i=r+h(t.expires)-1e3;e.cache.set(this.filename,{url:this.url,expires:i})}static async loadUrls(e,t={}){let n=Date.now();for(let r of e){let e=this.cache.get(r.filename);if(e&&n<e.expires){r.url=e.url;continue}await r.loadUrl(t)}}static async loadMetas(e){let t=e.map(e=>e.id);if(!t.length)return;let n=await Pr.list({query:e=>e.selectAll().where(`file_id`,`in`,t)});e.forEach(e=>{e.metas=Yn.flatten(n.filter(t=>t.file_id===e.id))})}async deleteFromDrive(){await X.use(this.drive).delete(this.filename)}};function Lr(e){return Z({async load(t){let{fileIdProperty:n,fileProperty:r}=e,i=t.map(e=>e[n]).filter(Boolean);if(!i.length)return;let a=await Q.list({where:e=>e(`id`,`in`,i)});for(let e of t){let t=a.find(t=>t.id===e[n]);t&&d(e,r,t)}}})}async function Rr(e,t){let n=t?.fileIdProperty||`file_id`,r=t?.fileUrlProperty||`url`,i=e.map(e=>e[n]).filter(Boolean);if(!i.length)return;let a=await Q.list({where:e=>e(`id`,`in`,i)});await Promise.all(a.map(async e=>e.loadUrl()));for(let t of e){let e=a.find(e=>e.id===t[n]);e&&d(t,r,e.url)}}function zr(e){return Z({load:t=>Rr(t,e)})}async function Br(e,t){let n=Array.isArray(e)?e:[e],r=t.target,i=t.pivot;function a(e,t){return typeof t==`function`?t(e):u(e,t)}let o=n.map(e=>a(e,i.sourceKey)).filter(Boolean),s=await i.findEntities(o),c=s.map(e=>a(e,i.targetKey)).filter(Boolean),l=await r.findEntities(c);for(let e of n){let n=s.filter(t=>a(t,i.sourceKey)===a(e,i.sourceKey));if(!n.length){d(e,t.key,[]);continue}let o=l.filter(e=>n.some(t=>a(t,r.sourceKey)===a(e,r.targetKey)));d(e,t.key,o)}}function Vr(e){return Z({load:async t=>Br(t,e)})}async function Hr(e,t){let n=t?.entityIdKey||`id`,r=t?.foreignKey||`id`,i=t?.targetKey||`metas`,a=t.findMany,o=Array.isArray(e)?e:[e],s=new Set;o.forEach(e=>s.add(u(e,n)));let c=await a(Array.from(s.values()));for(let e of o){let t=u(e,n),a=c.filter(e=>u(e,r)===t),o=Object.fromEntries(a.map(e=>[e.name,e.value]));Object.keys(o).forEach(e=>{let t=o[e];t&&t.startsWith(`number:`)&&(o[e]=Number(t.slice(7)))}),o=Ye(o),d(e,i,o)}}function Ur(e){return Z({load:t=>Hr(t,e)})}async function Wr(e,t){let n=Array.isArray(e)?e:[e],r=t?.targetKey||`permissions`,i=typeof t?.assignableType==`function`?t.assignableType:()=>t?.assignableType,a=typeof t?.assignableId==`function`?t.assignableId:()=>t?.assignableId,o=new Set,s=new Set;for(let e of n){let t=i(e),n=a(e);t&&n&&(o.add(t),s.add(n))}let c=await kr.findMany({assignableId:Array.from(s.values()),assignableType:Array.from(o.values())}),l=Array.from(new Set(c.map(e=>e.permission_id))),ee=await Ar.findMany({id:l});for(let e of n){let t=i(e),n=a(e);!t||!n||d(e,r,c.filter(e=>e.assignable_type===t&&e.assignable_id===n).map(e=>ee.find(t=>t.id===e.permission_id)).filter(Boolean))}}function Gr(e){return Z({load:t=>Wr(t,e)})}async function Kr(e,t){let n=t?.idKey||`user_id`,r=t?.targetKey||`user`,i=e.map(e=>u(e,n)).filter(Boolean);if(!i.length)return;let a=await J.findMany({id:i}),o=new Map(a.map(e=>[e.id,e]));for(let t of e){let e=o.get(u(t,n));e&&d(t,r,e)}}function qr(e){return Z({load:t=>Kr(t,e)})}var Jr=class extends vt{authorize(e,t,n){if(this.cannot(e,t,n)){let n=new b(`Unauthorized`,403),r=``;throw typeof t==`string`&&(r=t),t&&typeof t==`function`&&t.name&&(r=t.name),t&&typeof t==`object`&&t.constructor&&t.constructor.name&&(r=t.constructor.name),Object.assign(n,{action:e,subject:r}),n}}},Yr=class extends w(Dt){get git(){return new yr({cwd:this.directory,sshKey:R.get(`modules.${this.id}.ssh_key`),sshKeyTmpFileName:Lt(`ssh_key_${this.id}.pem`),logger:S.child({label:`git`}),debug:R.get(`git.debug`,!1)})}makePath(...e){return a(this.directory,...e)}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}command=(e,t,n)=>Nr.command(e,t,{cwd:this.directory,...n});load(){let e=this.makePath(`module.json`);if(!s.existsSync(e))return;let t=s.readFileSync(e,`utf-8`),n=JSON.parse(t);this.dependencies=n.dependencies||{},this.build=n.build||{}}findClientEntrypointFilename(e=`dev`){let t=[];e===`dev`&&t.push(this.makePath(`client`,`module.client.ts`),this.makePath(`client`,`module.client.js`),this.makePath(`client`,`client.ts`),this.makePath(`client`,`client.js`)),e===`node`&&t.push(this.makePath(`client-dist/node`,`index.js`),this.makePath(`client-dist/node`,`index.mjs`),this.makePath(`client-dist/node`,`module.client.js`),this.makePath(`client-dist/node`,`module.client.mjs`)),e===`browser`&&t.push(this.makePath(`client-dist/browser`,`index.js`),this.makePath(`client-dist/browser`,`index.mjs`),this.makePath(`client-dist/browser`,`module.client.js`),this.makePath(`client-dist/browser`,`module.client.mjs`));for(let e of t)if(s.existsSync(e))return e;return null}},Xr=class{url;request;response;cookies;head;nodeContainer;nodeConfig;nodeState;browserContainer;browserConfig;browserState;constructor(e){this.url=e.url,this.request=e.request,this.response=e.response,this.cookies=new cn(this.request,this.response),this.head=[],this.nodeContainer=e.nodeContainer||new We,this.nodeConfig=e.nodeConfig||new D,this.nodeState=e.nodeState||new Map,this.browserConfig=e.browserConfig||new D,this.browserContainer=e.browserContainer||new We,this.browserState=e.browserState||new Map}setBrowserState(e,t){this.browserState.set(e,t)}setNodeState(e,t){this.nodeState.set(e,t)}setState(e,t){this.setNodeState(e,t),this.setBrowserState(e,t)}setBrowserContainerValue(e,t){this.browserContainer.set(e,t)}setNodeContainerValue(e,t){this.nodeContainer.set(e,t)}setContainerValue(e,t){this.setNodeContainerValue(e,t),this.setBrowserContainerValue(e,t)}setBrowserConfigValue(e,t){this.browserConfig.set(e,t)}setNodeConfigValue(e,t){this.nodeConfig.set(e,t)}setConfigValue(e,t){this.setNodeConfigValue(e,t),this.setBrowserConfigValue(e,t)}},Zr=class extends w(kt){directory;makePath(...e){return Le(this.directory,...e)}set=(e,t,n)=>{R.set(`plugins.registry.${this.id}.${e}`,t,n)};get=(e,t)=>R.get(`plugins.registry.${this.id}.${e}`,t);get git(){return new yr({cwd:this.directory,shell:x.has(Y)?x.get(Y):void 0,sshKey:R.get(`plugins.registry.${this.id}.ssh_key`),sshKeyFile:R.get(`plugins.registry.${this.id}.ssh_key_file`)})}get commits(){return new gr({cwd:this.directory,shell:x.has(Y)?x.get(Y):void 0})}get branches(){return new pr({cwd:this.directory,shell:x.has(Y)?x.get(Y):void 0})}},Qr=class e extends Zr{apiFolders=new Map;apiDirectories=new Set;constructor(){super(),Un.on(`router:registered`,this.onRouterRegistered.bind(this))}staticPath(...e){return a(`/static`,`modules`,this.id,...e)}async load(){}async onRouterRegistered(e){let t=e.router;for(let[e,n]of this.apiFolders){let r=n.prefix||`/api/`;await nr.create(e).setPrefix(r).setRouter(t).setModule(this.id).load()}for(let e of this.apiDirectories)t.addDir(e,{module:this.id})}addApiFolder(e,t={}){this.apiFolders.set(e,t)}addRouterFolder(e){this.apiDirectories.add(e)}static fromPluginDiscoverEntity(t){let n=typeof this==`function`?this:e,r=new n,i={id:t.id,name:t.name,version:t.version,directory:t.directory};return typeof n?.parse==`function`&&(i=n.parse(t)),typeof this?.parse==`function`&&(i=this.parse(t)),Object.assign(r,i),r}},$=class{async load(e){let t=Error(`Not implemented`);throw Object.assign(t,{entities:e}),t}},$r=class extends ${table;tableKey;targetTable;targetKey;property;serialize;constructor(e){super(),this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property,this.serialize=e.serialize||(e=>e)}async load(e){let t=[...new Set(e.map(e=>e[this.targetKey]).filter(Boolean))];if(!t.length)return;let n=(await V.selectFrom(this.targetTable).selectAll().where(this.tableKey,`in`,t).execute()).map(e=>this.serialize(e)),r=new Map(n.map(e=>[e[this.tableKey],e]));e.forEach(e=>{e[this.property]=r.get(e[this.targetKey])||null})}},ei=class extends ${fileKey;property;constructor(e=`file`,t=`url`){super(),this.fileKey=e,this.property=t}async load(e){let t=e.map(e=>e[this.fileKey]).filter(e=>e instanceof Q);await Q.load(t,`metas`)}},ti=class extends ${fileKey;property;constructor(e=`file`,t=`url`){super(),this.fileKey=e,this.property=t}async load(e){for(let t of e){let e=t[this.fileKey];e&&await e.loadUrl(),d(t,this.property,e?e.url:null)}}},ni=class extends $r{constructor(e=`file`,t=`file_id`){super({table:`files`,tableKey:`id`,targetTable:`files`,targetKey:t,property:e,serialize:e=>Q.from(e)})}url(e=`url`){return new ti(this.property,e)}metas(e=`metas`){return new ei(this.property,e)}},ri=class extends $r{constructor(){super({table:`users`,tableKey:`id`,targetTable:`users`,targetKey:`user_id`,property:`user`,serialize:e=>At.from(e)})}},ii=class{table;tableKey;targetTable;targetKey;property;serialize;after;constructor(e){this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.property=e.property,this.serialize=e.serialize||(e=>e),this.after=e.after||(async e=>e)}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=(await V.selectFrom(this.targetTable).selectAll().where(this.targetKey,`in`,Array.from(t)).execute()).map(e=>this.serialize(e));e.forEach(e=>{e[this.property]=n.filter(t=>t[this.targetKey]===e[this.tableKey])}),await this.after(n)}},ai=class extends ${table;tableKey;targetTable;targetKey;pivotTable;pivotSourceKey;pivotTargetKey;property;serialize;after;constructor(e){super(),this.table=e.table,this.tableKey=e.tableKey,this.targetTable=e.targetTable,this.targetKey=e.targetKey,this.pivotTable=e.pivotTable,this.pivotSourceKey=e.pivotSourceKey,this.pivotTargetKey=e.pivotTargetKey,this.property=e.property,this.serialize=e.serialize||(e=>e),this.after=e.after||(async e=>e)}async load(e){let t=new Set;if(e.forEach(e=>t.add(e[this.tableKey])),!t.size)return;let n=(await V.selectFrom(this.targetTable).selectAll(this.targetTable).innerJoin(this.pivotTable,`${this.targetTable}.${this.targetKey}`,`${this.pivotTable}.${this.pivotTargetKey}`).where(`${this.pivotTable}.${this.pivotSourceKey}`,`in`,Array.from(t)).execute()).map(e=>this.serialize(e));e.forEach(e=>{e[this.property]=n.filter(t=>t[this.pivotSourceKey]===e[this.tableKey])}),await this.after(e)}},oi=class{async handle(e){if(!e.user||!e.token)throw new b(`Invalid authentication token`,401);return{user:e.user,token:e.token}}},si=class{async handle(e){let t=e.cookie.get(`Authorization`);if(e.request&&e.request.headers.authorization&&(t=e.request.headers.authorization),t&&t.startsWith(`Bearer `)&&(t=t.slice(7)),!t)return{user:void 0,token:void 0};let n=await Hn.findByToken(t),r;return n&&(r=await J.findOrFail(n.user_id)),{user:r,token:n||void 0}}},ci=class{permissions;constructor(e){this.permissions=Array.isArray(e)?e:[e]}async handle(e){for(let t of this.permissions)e.acl.authorize(t.action,t.resource,t.conditions||{})}},li=class{async handle(e){let t=e.token,n=[],r={};if(e.user&&t?.type===`auth`){let t=await kr.findMany({assignableId:String(e.user.id),assignableType:`user`});n=await Ar.findMany({id:t.map(e=>e.permission_id)}),r.auth={user:{id:e.user.id,name:e.user.name,email:e.user.email}}}if(t&&t.type===`api`){let e=await kr.findMany({assignableId:String(t.id),assignableType:`token`});n=await Ar.findMany({id:e.map(e=>e.permission_id)}),r.api={token:{id:t.id,name:t.name}}}return{acl:new Jr({permissions:_t.applyContext(n,r),debug:R.get(`acl.debug`)||R.get(`app.debug`),logger:S.child({label:`acl`})})}}static create(e){return new ci(e)}};function ui(e){async function t(t,n){let r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];for(let t of i){let n=e?.[t];if(!n)throw new b(`Loader ${String(t)} not declared`);await n.load(r)}}return{keys:Object.keys(e),loaders:e,load:t}}function di(){let e=new Uint8Array(8);g.getRandomValues(e);let t=Array.from(e,e=>e.toString(36).padStart(2,`0`)).join(``);return`c${Date.now().toString(36)}${t.slice(0,12)}`}function fi(e){return e}function pi(e){let t=e.folders,n=e.filename,i=e.patterns||[],a=[`**/node_modules`,`**/*.spec.ts`,`**/*.spec-d.ts`,`**/*.test.ts`,`**/*.test-d.ts`];if(e.folders)for(let e of t)i.push(`${e}/**/*.ts`,`${e}/**/*.js`);let o=e.ignore||[],c=``,ee=l.sync(i,{ignore:[...a,...o]});for(let e of ee){let t=r.relative(r.dirname(n),e),i=r.extname(e),a=s.readFileSync(e,`utf-8`).includes(`export default`)&&!t.includes(`generateIndexFile.ts`);e.endsWith(`.vue`)&&(a=!0),c+=`export * from './${t}'\n`,a&&(c+=`export { default as ${r.basename(e,i)} } from './${t}'\n`)}c=c.trim(),s.writeFileSync(n,c)}async function mi(e){for(let t of e){let e=Re(t);if(ze.existsSync(t))return await import(e.toString())}return null}export{Jr as AclEntity,oi as AuthMiddleware,si as AuthSilenceMiddleware,li as AuthorizationMiddleware,ci as AuthorizePermission,$ as BaseRelation,ni as BelongsToFileRelation,$r as BelongsToRelation,ri as BelongsToUserRelation,jt as CliCommand,Mt as CliService,Nt as CliTesterService,Pt as CliWrapperService,Rt as ConfigFSService,Wt as ConfigManagerService,dr as ConfigRepository,Ut as ConfigS3Service,cn as CookieMapEntity,un as DatabaseGateway,q as DatabaseRepository,dn as DatabaseRepositoryInferMixin,Gt as DownloadService,zt as DriveBaseGateway,qt as DriveConfigEntity,en as DriveFSGateway,Ht as DriveS3Gateway,tn as DriveService,nn as EmmitterService,Zt as EncryptService,B as EnvService,rn as ExceptionService,Q as FileEntity,Pr as FileMetaEntity,fr as FileRepository,pr as GitBranchRepository,gr as GitCommitRepository,yr as GitGateway,ii as HasManyRelation,Fr as HasMetasRelation,an as HasherService,ln as HttpService,Kn as HttpTesterService,qn as LifecycleService,ei as LoadFileMetas,ti as LoadFileUrl,xr as MetadataMixin,Jn as MetadataQueryService,Yn as MetadataService,Xn as MigrationEntity,Zn as MigratorService,Kt as ModelConfigMixin,Sr as ModelMixin,Yr as ModuleEntity,Xr as PageRequestContextEntity,_r as PermissionAssignmentRepository,vr as PermissionRepository,Qr as PluginEntity,Zr as PluginEntryEntity,Qn as PluginIpcClient,$n as PluginIpcHost,tr as PluginRouter,Cr as RelationsMixin,on as RouteEntity,nr as RouterFileBaseRoutingService,rr as RouterRegisterService,or as RouterResourceConfigService,ar as RouterResourceService,sn as RouterService,sr as RoutineEntity,cr as SchedulerService,lr as SeederEntity,ur as SeederService,Y as ShellService,Vn as TokenRepository,Gn as UserRepository,Pn as addCreatedColumn,Mn as addSoftDeleteColumn,In as addTimestampColumns,Fn as addUpdatedColumn,L as basePath,R as config,x as container,fn as count,U as create,Cn as createDefault,Lr as createFileLoader,zr as createFileUrlLoader,Vr as createHasManyThroughLoader,ui as createLoaderFactory,Ur as createMetasLoader,wn as createMysql,Gr as createPermissionLoader,qr as createUserLoader,di as cuid,V as database,fi as defineHandler,Z as defineLoader,jn as deleted,Tn as destroy,wr as download,X as drive,Un as emmitter,Qt as encrypt,Tr as env,En as exists,Er as filesRepository,G as findOne,K as findOneOrFail,Dn as firstOrCreate,pi as generateIndexFile,ai as hasManyThroughRelation,Wn as hasher,Dr as http,qe as importAll,Ge as importFiles,Ke as importGlob,mi as importOne,W as list,Rr as loadFileUrl,Br as loadHasManyThrough,Hr as loadMetas,Wr as loadPermissions,Kr as loadUser,S as logger,Or as migrator,H as now,On as paginate,kr as permissionAssignmentRepository,Ar as permissionRepository,He as printObject,Ue as printTable,It as relativeToBasePath,jr as router,Mr as scheduler,Nr as shell,Nn as softDelete,Ft as storagePath,Lt as tmpPath,Hn as tokenRepository,An as undeleted,zn as update,Ln as updateDefault,Rn as updateMysql,Bn as updateOrCreate,J as userRepository,br as valueToString,kn as whereNotDeleted};
|
|
4
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiRW1taXR0ZXJTZXJ2aWNlIiwiTGlmZWN5Y2xlU2VydmljZSIsImJvb2xlYW4iLCJrZXlWYWx1ZSIsIlBlcm1pc3Npb24iLCJzdWJqZWN0IiwiY3JlYXRlU3ViamVjdCIsIkNvb2tpZU1hcEVudGl0eSIsIkRyaXZlQ29uZmlnIiwiQmFzZUVudGl0eU1peGluIiwiRmlsZU1ldGEiLCJCYXNlRW50aXR5TWl4aW4iLCJCYXNlRW50aXR5TWl4aW4iLCJNb2R1bGUiLCJQbHVnaW5FbnRpdHkiLCJDb21tYW5kZXJDb21tYW5kIiwiRW1taXR0ZXJTZXJ2aWNlIiwiQmFzZURyaXZlIiwiRHJpdmVFbnRpdHkiLCJTM0RyaXZlIiwiQmFzZSIsImNyeXB0byIsIkJhc2VEcml2ZSIsIkRyaXZlRW50aXR5IiwiQmFzZUVtbWl0dGVyU2VydmljZSIsImpvaW4iLCJCYXNlIiwiUm91dGVyIiwiRW1taXR0ZXJTZXJ2aWNlIiwiZGIiLCJ0b0RiIiwiZGIiLCJmcm9tRGIiLCJ0b0RiIiwidG9EYiIsImRhdGV0aW1lLnRvRGIiLCJqc29uLnRvRGIiLCJib29sZWFuLnRvRGIiLCJkYiIsImRiIiwiZGIiLCJkYiIsImRiIiwiZGIiLCJQYWdpbmF0aW9uIiwiZGIiLCJkYiIsImRiIiwiRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXIiLCJkYiIsIkVtbWl0dGVyU2VydmljZSIsImRiIiwiQmFzZUxpZmVjeWNsZVNlcnZpY2UiLCJkYiIsIkVtbWl0dGVyU2VydmljZSIsIkVtbWl0dGVyU2VydmljZSIsIlNoZWxsRXhlY3B0aW9uIiwiZGIiLCJkYiIsInF1ZXJpZXMucGFnaW5hdGUiLCJxdWVyaWVzLmxpc3QiLCJxdWVyaWVzLmZpbmRPbmUiLCJxdWVyaWVzLmZpbmRPbmVPckZhaWwiLCJxdWVyaWVzLmV4aXN0cyIsInF1ZXJpZXMuY291bnQiLCJxdWVyaWVzLmNyZWF0ZSIsInF1ZXJpZXMudXBkYXRlIiwicXVlcmllcy5kZXN0cm95IiwicXVlcmllcy5maXJzdE9yQ3JlYXRlIiwicXVlcmllcy51cGRhdGVPckNyZWF0ZSIsInF1ZXJpZXMuc29mdERlbGV0ZSIsImRiIiwiZGIiLCJCYXNlTWV0YSIsImRiIiwiQmFzZSIsIkhvb2tzU3RhdGljIiwiQmFzZUFjbCIsIkJhc2UiLCJCYXNlIiwiam9pbiIsImRiIiwiVXNlciIsImRiIiwiZGIiLCJQZXJtaXNzaW9uIiwicGF0aFRvRmlsZVVSTCIsImZzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZlci91dGlscy9wcmludFRhYmxlLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC91dGlscy90cnlDYXRjaC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2NvbnRhaW5lci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2ltcG9ydEFsbC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY29tcG9zZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvZmxhdHRlbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTGlmZWN5Y2xlSG9vay50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy91cmxWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMva2V5VmFsdWVWYWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3ZhbGlkYXRvcnMvcGFnaW5hdGlvblZhbGlkYXRvci50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdmFsaWRhdG9ycy9pbmRleC50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvdXRpbHMvbWF0Y2hQYXRocy50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZmFjYWRlcy92YWxpZGF0b3IudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvZGFzaGJvYXJkTWV0YVNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy9kYXNoYm9hcmRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvbkFzc2lnbm1lbnRTY2hlbWEudHMiLCIuLi8uLi9zcmMvc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy90b2tlblNjaGVtYS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvc2NoZW1hcy91c2VyU2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9leGNlcHRpb25zL1NoZWxsRXhjZXB0aW9uLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1NvZnREZWxldGVNaXhpbi50cyIsIi4uLy4uL3NyYy9zaGFyZWQvbWl4aW5zL1RpbWVzdGFtcE1peGluLnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9BY2xFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvRHJpdmVDb25maWdFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL0ZpbGVNZXRhRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9GaWxlVXBsb2FkU2Vzc2lvbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvR2l0QnJhbmNoRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NoYXJlZC9lbnRpdGllcy9HaXRDb21taXRFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL01vZHVsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvTW9kdWxlTWFuaWZlc3RFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2hhcmVkL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvUm9sZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zaGFyZWQvZW50aXRpZXMvVXNlckVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpVGVzdGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvQ2xpV3JhcHBlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdGU1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlQmFzZUdhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2dhdGV3YXlzL0RyaXZlUzNHYXRld2F5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0NvbmZpZ01hbmFnZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Eb3dubG9hZFNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvTW9kZWxDb25maWdNaXhpbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvRHJpdmVDb25maWdFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NjaGVtYXMvZW52U2NoZW1hLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbnZTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbmNyeXB0U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9lbmNyeXB0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9Ecml2ZUZTR2F0ZXdheS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvRHJpdmVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0V4Y2VwdGlvblNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0hhc2hlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRlRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Db29raWVNYXBFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0h0dHBTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9nYXRld2F5cy9EYXRhYmFzZUdhdGV3YXkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2NvbW1vbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9jb3VudC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvZGF0ZXRpbWUudHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2pzb24udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2Jvb2xlYW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL25vcm1hbGl6ZXJzL2FsbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvY3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL2Rlc3Ryb3kudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvbGlzdC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9leGlzdHMudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9maXJzdE9yQ3JlYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3NvZnREZWxldGUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3F1ZXJpZXMvdGltZXN0YW1wLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy91cGRhdGVPckNyZWF0ZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcXVlcmllcy9pbmNyZW1lbnRhbC50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0RhdGFiYXNlUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL1Rva2VuUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy90b2tlblJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvaGFzaGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvVXNlclJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvdXNlclJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL0h0dHBUZXN0ZXJTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9MaWZlY3ljbGVTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL01pZ3JhdG9yU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUGx1Z2luSXBjQ2xpZW50LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5JcGNIb3N0LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9QbHVnaW5Sb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1JvdXRlclJlZ2lzdGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVzb3VyY2VTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJSZXNvdXJjZUNvbmZpZ1NlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1JvdXRpbmVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3NlcnZpY2VzL1NjaGVkdWxlclNlcnZpY2UudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1NlZWRlckVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvU2VlZGVyU2VydmljZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvQ29uZmlnUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0ZpbGVSZXBvc2l0b3J5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZXBvc2l0b3JpZXMvR2l0QnJhbmNoUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVwb3NpdG9yaWVzL0dpdENvbW1pdFJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZ2F0ZXdheXMvR2l0R2F0ZXdheS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWl4aW5zL01ldGFkYXRhTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL21peGlucy9Nb2RlbE1peGluLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9taXhpbnMvUmVsYXRpb25zTWl4aW4udHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZG93bmxvYWQudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZHJpdmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvZW52LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL2ZpbGVzUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9odHRwLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL21pZ3JhdG9yLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZmFjYWRlcy9yb3V0ZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2ZhY2FkZXMvc2NoZWR1bGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9mYWNhZGVzL3NoZWxsLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL0ZpbGVNZXRhRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvSGFzTWV0YXNSZWxhdGlvbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvRmlsZUVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbG9hZGVycy9maWxlTG9hZGVyLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9sb2FkZXJzL2ZpbGVVcmxMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvaGFzTWFueVRocm91Z2hMb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvbG9hZE1ldGFzLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9sb2FkZXJzL3Blcm1pc3Npb25Mb2FkZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL2xvYWRlcnMvdXNlckxvYWRlci50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvQWNsRW50aXR5LnRzIiwiLi4vLi4vc3JjL3NlcnZlci9lbnRpdGllcy9Nb2R1bGVFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1BhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvZW50aXRpZXMvUGx1Z2luRW50cnlFbnRpdHkudHMiLCIuLi8uLi9zcmMvc2VydmVyL2VudGl0aWVzL1BsdWdpbkVudGl0eS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVsYXRpb25zL0Jhc2VSZWxhdGlvbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvcmVsYXRpb25zL0JlbG9uZ3NUb1JlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvQmVsb25nc1RvRmlsZVJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvQmVsb25nc1RvVXNlclJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvSGFzTWFueVJlbGF0aW9uLnRzIiwiLi4vLi4vc3JjL3NlcnZlci9yZWxhdGlvbnMvaGFzTWFueVRocm91Z2hSZWxhdGlvbi50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aE1pZGRsZXdhcmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL21pZGRsZXdhcmVzL0F1dGhTaWxlbmNlTWlkZGxld2FyZS50cyIsIi4uLy4uL3NyYy9zZXJ2ZXIvbWlkZGxld2FyZXMvQXV0aG9yaXphdGlvbk1pZGRsZXdhcmUudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2NyZWF0ZUxvYWRlckZhY3RvcnkudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2N1aWQudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2RlZmluZUhhbmRsZXIudHMiLCIuLi8uLi9zcmMvc2VydmVyL3V0aWxzL2dlbmVyYXRlSW5kZXhGaWxlLnRzIiwiLi4vLi4vc3JjL3NlcnZlci91dGlscy9pbXBvcnRPbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFRhYmxlIGZyb20gJ2NsaS10YWJsZTMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVDb2x1bW4ge1xuICAgIGxhYmVsOiBzdHJpbmdcbiAgICB2YWx1ZTogc3RyaW5nIHwgKChpdGVtOiBhbnkpID0+IHN0cmluZylcbiAgICB3aWR0aD86IG51bWJlclxuICAgIHJlYWxXaWR0aD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdE9wdGlvbnMge1xuICAgIGtleVdpZHRoPzogbnVtYmVyXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludE9iamVjdChvdXRwdXQ6IGFueSA9IHt9LCBvcHRpb25zOiBPYmplY3RPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODBcbiAgICBjb25zdCBrZXlXaWR0aCA9IG9wdGlvbnMua2V5V2lkdGggfHwgTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIDAuMilcbiAgICBjb25zdCB2YWx1ZVdpZHRoID0gTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIDAuNylcblxuICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHtcbiAgICAgICAgd29yZFdyYXA6IHRydWUsXG4gICAgICAgIHdyYXBPbldvcmRCb3VuZGFyeTogZmFsc2UsXG4gICAgICAgIGNvbFdpZHRoczogW2tleVdpZHRoLCB2YWx1ZVdpZHRoXSxcbiAgICB9KVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3V0cHV0KSkge1xuICAgICAgICB0YWJsZS5wdXNoKFtrZXksIFN0cmluZyhvdXRwdXRba2V5XSldKVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKHRhYmxlLnRvU3RyaW5nKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFRhYmxlKGl0ZW1zOiBhbnlbXSwgY29sdW1ucz86IFRhYmxlQ29sdW1uW10pIHtcbiAgICBjb25zdCBzY3JlZW5XaWR0aCA9IChwcm9jZXNzLnN0ZG91dC5jb2x1bW5zIHx8IDgwKSAtIDZcbiAgICBjb25zdCByb3dzID0gW10gYXMgc3RyaW5nW11bXVxuICAgIGNvbnN0IGhlYWQ6IFRhYmxlQ29sdW1uW10gPSBbXVxuXG4gICAgaWYgKGNvbHVtbnMpIHtcbiAgICAgICAgaGVhZC5wdXNoKC4uLmNvbHVtbnMpXG4gICAgfVxuXG4gICAgaWYgKCFjb2x1bW5zKSB7XG4gICAgICAgIGl0ZW1zLm1hcCgoaXRlbTogYW55KSA9PiBPYmplY3Qua2V5cyhpdGVtKSlcbiAgICAgICAgICAgIC5mbGF0KClcbiAgICAgICAgICAgIC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaGVhZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICB9XG5cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9ICcnXG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgaC52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gaC52YWx1ZShpdGVtKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGgudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtW2gudmFsdWVdXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnJ1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJvdy5wdXNoKHZhbHVlKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJvd3MucHVzaChyb3cpXG4gICAgfSlcblxuICAgIGhlYWQuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBpZiAoaC53aWR0aCkge1xuICAgICAgICAgICAgaC53aWR0aCA9IE51bWJlcihoLndpZHRoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoLmxhYmVsKSB7XG4gICAgICAgICAgICBoLmxhYmVsID0gU3RyaW5nKGgudmFsdWUpXG4gICAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgdXNlZFdpZHRoID0gaGVhZC5maWx0ZXIoKGgpID0+ICEhaC53aWR0aCkucmVkdWNlKChhY2MsIGgpID0+IGFjYyArIGgud2lkdGghLCAwKVxuICAgIGNvbnN0IHJlbWFpbmluZ1dpZHRoID0gMTAwIC0gdXNlZFdpZHRoXG4gICAgY29uc3Qgd2l0aE5vV2lkdGggPSBoZWFkLmZpbHRlcigoaCkgPT4gIWgud2lkdGgpLmxlbmd0aFxuXG4gICAgaGVhZC5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGlmICghaC53aWR0aCkge1xuICAgICAgICAgICAgaC53aWR0aCA9IE1hdGguZmxvb3IocmVtYWluaW5nV2lkdGggLyB3aXRoTm9XaWR0aClcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBoZWFkLmZvckVhY2goKGgpID0+IHtcbiAgICAgICAgaWYgKGgud2lkdGgpIHtcbiAgICAgICAgICAgIGgucmVhbFdpZHRoID0gTWF0aC5mbG9vcihzY3JlZW5XaWR0aCAqIChoLndpZHRoIC8gMTAwKSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSh7XG4gICAgICAgIGhlYWQ6IGhlYWQubWFwKChoKSA9PiBoLmxhYmVsKSxcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGhlYWQ6IFtdLCAvL2Rpc2FibGUgY29sb3JzIGluIGhlYWRlciBjZWxsc1xuICAgICAgICAgICAgYm9yZGVyOiBbXSwgLy9kaXNhYmxlIGNvbG9ycyBmb3IgdGhlIGJvcmRlclxuICAgICAgICB9LFxuICAgICAgICB3b3JkV3JhcDogdHJ1ZSxcbiAgICAgICAgd3JhcE9uV29yZEJvdW5kYXJ5OiBmYWxzZSxcbiAgICAgICAgY29sV2lkdGhzOiBoZWFkLm1hcCgoaCkgPT4gaC5yZWFsV2lkdGgpIGFzIG51bWJlcltdLFxuICAgIH0pXG5cbiAgICB0YWJsZS5wdXNoKC4uLnJvd3MpXG5cbiAgICBjb25zb2xlLmxvZyh0YWJsZS50b1N0cmluZygpKVxufVxuIiwiaW50ZXJmYWNlIFRyeWVyIHtcbiAgICAoLi4uYXJnczogYW55W10pOiBhbnlcbn1cblxuaW50ZXJmYWNlIFRyeWVyQXN5bmMge1xuICAgICguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8YW55PiB8IGFueVxufVxuXG50eXBlIFRyeUNhdGNoUmVzdWx0PFQgZXh0ZW5kcyBUcnllcj4gPSBbbnVsbCwgUmV0dXJuVHlwZTxUPl0gfCBbRXJyb3IsIG51bGxdXG5cbnR5cGUgVHJ5Q2F0Y2hBc3luY1Jlc3VsdDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4gPSBbbnVsbCwgQXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pl0gfCBbRXJyb3IsIG51bGxdXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cnlDYXRjaDxUIGV4dGVuZHMgVHJ5ZXJBc3luYz4odHJ5ZXI6IFQpOiBQcm9taXNlPFRyeUNhdGNoQXN5bmNSZXN1bHQ8VD4+IHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnllcigpXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0XVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBbZXJyb3IgYXMgYW55LCBudWxsXVxuICAgIH1cbn1cblxudHJ5Q2F0Y2guc3luYyA9IGZ1bmN0aW9uIDxUIGV4dGVuZHMgVHJ5ZXI+KHRyeWVyOiBUKTogVHJ5Q2F0Y2hSZXN1bHQ8VD4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRyeWVyKClcbiAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHRdXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIFtlcnJvciBhcyBhbnksIG51bGxdXG4gICAgfVxufVxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnQgKi9cbi8vIEB0cy1ub2NoZWNrXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExvZ2dlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0xvZ2dlclNlcnZpY2UnIFxuXG4gICAgcHVibGljIGluZm8obWVzc2FnZTogc3RyaW5nLCBtZXRhPzogYW55KTogdm9pZCB7XG4gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGhlcmVcbiAgICB9XG4gICAgXG4gICAgcHVibGljIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyB3YXJuKG1lc3NhZ2U6IHN0cmluZywgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuICAgIFxuICAgIHB1YmxpYyBlcnJvcihtZXNzYWdlOiBzdHJpbmcgfCBFcnJvciwgbWV0YT86IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgfVxuXG4gICAgcHVibGljIGNoaWxkKG9wdGlvbnM6IGFueSk6IExvZ2dlclNlcnZpY2Uge1xuICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbiBoZXJlXG4gICAgICAgIHJldHVybiBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUV4Y2VwdGlvbiBleHRlbmRzIEVycm9yIHtcbiAgICBwdWJsaWMgc3RhdHVzOiBudW1iZXIgPSA1MDBcblxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIgPSA1MDApIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSlcbiAgICAgICAgdGhpcy5uYW1lID0gJ0Jhc2VFeGNlcHRpb24nXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tRXJyb3IoZXJyb3I6IEVycm9yKTogQmFzZUV4Y2VwdGlvbiB7XG4gICAgICAgIHJldHVybiBuZXcgQmFzZUV4Y2VwdGlvbihlcnJvci5tZXNzYWdlLCA1MDApXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSBcIiNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzXCJcblxudHlwZSBDb25zdHJ1Y3RvcjxUID0gb2JqZWN0PiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFRcblxudHlwZSBFbnRyeUtleSA9IHN0cmluZyB8IHN5bWJvbCB8IENvbnN0cnVjdG9yXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhaW5lclNlcnZpY2Uge1xuICAgIHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8RW50cnlLZXksIGFueT4oKVxuXG4gICAgcHVibGljIGxvYWRGcm9tUmVjb3JkKHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55Pik6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9SZWNvcmQoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgcmVjb3JkW1N0cmluZyhrZXkpXSA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVjb3JkXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRLZXkocGF5bG9hZDogRW50cnlLZXkpOiBFbnRyeUtleSB7XG4gICAgICAgIGxldCBrZXkgPSBwYXlsb2FkXG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gcGF5bG9hZC5uYW1lXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbnN0cnVjdG9yID0gdHlwZW9mIHBheWxvYWQgIT09ICdzdHJpbmcnICYmIHR5cGVvZiBwYXlsb2FkICE9PSAnc3ltYm9sJ1xuXG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yICYmICEocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBXYXJuaW5nOiBUaGUgY29uc3RydWN0b3IgJHtwYXlsb2FkLm5hbWV9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllci4gQ29uc2lkZXIgYWRkaW5nIGEgc3RhdGljIHByb3BlcnR5IF9fY29udGFpbmVyX2VudHJ5X2tleSB0byBhdm9pZCBwb3RlbnRpYWwgY29uZmxpY3RzLmApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb25zdHJ1Y3RvciAmJiAocGF5bG9hZCBhcyBhbnkpLl9fY29udGFpbmVyX2VudHJ5X2tleSkge1xuICAgICAgICAgICAga2V5ID0gKHBheWxvYWQgYXMgYW55KS5fX2NvbnRhaW5lcl9lbnRyeV9rZXlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBrZXlcblxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQocGF5bG9hZDogRW50cnlLZXksIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgdmFsdWUpXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKHBheWxvYWQ6IEVudHJ5S2V5KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0S2V5KHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5oYXMoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4ocGF5bG9hZDogRW50cnlLZXkpOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRLZXkocGF5bG9hZClcblxuICAgICAgICBpZiAoIXRoaXMuZW50cmllcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEVudHJ5IHdpdGgga2V5IFwiJHtTdHJpbmcoa2V5KX1cIiBub3QgZm91bmQgaW4gY29udGFpbmVyLmApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChwYXlsb2FkOiBFbnRyeUtleSk6IHZvaWQge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmdldEtleShwYXlsb2FkKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgIH1cblxuICAgIHB1YmxpYyBzaW5nbGV0b248VD4oY2xhc3NDb25zdHJ1Y3RvcjogQ29uc3RydWN0b3I8VD4pOiBUIHtcbiAgICAgICAgY29uc3Qga2V5ID0gY2xhc3NDb25zdHJ1Y3Rvci5uYW1lXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSlcblxuICAgICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gbmV3IGNsYXNzQ29uc3RydWN0b3IoKVxuICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgbmV3SW5zdGFuY2UpXG4gICAgICAgIHJldHVybiBuZXdJbnN0YW5jZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKGVudHJpZXM6IFJlY29yZDxhbnksIGFueT4pOiB2b2lkIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoZW50cmllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwcm94eTxUID0gdW5rbm93bj4oa2V5OiBFbnRyeUtleSk6IFQge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCB7XG4gICAgICAgICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSB0aGlzLmdldDxUPihrZXkpIGFzIGFueVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW50cnlbcHJvcF1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmJpbmQoZW50cnkpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5W3Byb3BdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0OiAoX3RhcmdldCwgcHJvcCwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZ2V0PFQ+KGtleSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBlbnRyeVtwcm9wXSA9IHZhbHVlXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIGtleXMoKTogRW50cnlLZXlbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5rZXlzKCkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbnRhaW5lclNlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29udGFpbmVyU2VydmljZS50c1wiO1xuXG5jb25zdCBjb250YWluZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnNlcnZlckNvbnRhaW5lciB8fCBuZXcgQ29udGFpbmVyU2VydmljZSgpXG5cbmdsb2JhbFRoaXMuc2VydmVyQ29udGFpbmVyID0gY29udGFpbmVyXG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lciBhcyBDb250YWluZXJTZXJ2aWNlXG4iLCJpbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuXG5jb25zdCBsb2dnZXIgPSBjb250YWluZXIucHJveHk8TG9nZ2VyU2VydmljZT4oTG9nZ2VyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgbG9nZ2VyXG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ3VybCdcbmltcG9ydCBmZyBmcm9tICdmYXN0LWdsb2InXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgbG9nZ2VyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9sb2dnZXIudHMnXG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgICBjYWNoZT86IGJvb2xlYW47XG4gICAgb25CZWZvcmVJbXBvcnQ/OiAoY3R4OiB7IGZpbGVuYW1lOiBzdHJpbmcgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgb25BZnRlckltcG9ydD86IChjdHg6IHsgZmlsZW5hbWU6IHN0cmluZywgbW9kdWxlOiBhbnkgfSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gICAgb25FcnJvcj86IChjdHg6IHsgZmlsZW5hbWU6IHN0cmluZywgZXJyb3I6IEVycm9yIH0pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEZpbGVzKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgY29uc3QgbW9kdWxlczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgbGV0IG9uRXJyb3I6IFJlcXVpcmVkPE9wdGlvbnM+WydvbkVycm9yJ10gPSBjdHggPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKGN0eC5lcnJvciwgeyBmaWxlbmFtZTogY3R4LmZpbGVuYW1lIH0pIFxuXG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGltcG9ydCAke2N0eC5maWxlbmFtZX1gLCBjdHguZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub25FcnJvcikge1xuICAgICAgICBvbkVycm9yID0gb3B0aW9ucy5vbkVycm9yXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xuICAgICAgICBpZiAob3B0aW9ucy5leGNsdWRlICYmIG9wdGlvbnMuZXhjbHVkZS5zb21lKHBhdHRlcm4gPT4gZmlsZW5hbWUuaW5jbHVkZXMocGF0dGVybikpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3R4ID0geyBmaWxlbmFtZSB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMub25CZWZvcmVJbXBvcnQpIHtcbiAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25CZWZvcmVJbXBvcnQoY3R4KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5GaWxlbmFtZSA9IGN0eC5maWxlbmFtZS5zcGxpdCgnPycpWzBdXG5cbiAgICAgICAgaWYgKC9cXC4obXRzfHRzfGpzKSQvLnRlc3QoY2xlYW5GaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGFicyA9IHBhdGgucmVzb2x2ZShjdHguZmlsZW5hbWUpXG4gICAgICAgICAgICBjb25zdCBmaWxlVXJsID0gcGF0aFRvRmlsZVVSTChhYnMpXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNhY2hlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGZpbGVVcmwuc2VhcmNoUGFyYW1zLnNldCgndCcsIERhdGUubm93KCkudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBtb2RdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gaW1wb3J0KGZpbGVVcmwudG9TdHJpbmcoKSkpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGN0eC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBmaWxlVXJsLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBjdHguZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kdWxlc1tmaWxlbmFtZV0gPSBtb2RcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKC9cXC5qc29uJC8udGVzdChjbGVhbkZpbGVuYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IGF3YWl0IHRyeUNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoY3R4LmZpbGVuYW1lLCAndXRmOCcpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgb25FcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBjdHguZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kdWxlc1tmaWxlbmFtZV0gPSBqc29uXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5vbkFmdGVySW1wb3J0KSB7XG4gICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQWZ0ZXJJbXBvcnQoe1xuICAgICAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgICAgICBtb2R1bGU6IG1vZHVsZXNbZmlsZW5hbWVdXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vZHVsZXNcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEdsb2IocGF0dGVybjogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zID0ge30pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZnKHBhdHRlcm4pXG5cbiAgICByZXR1cm4gaW1wb3J0RmlsZXMoZmlsZXMgYXMgc3RyaW5nW10sIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRBbGwoZGlyZWN0b3J5OiBzdHJpbmcsIG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pXG5cbiAgICBjb25zdCBmaWxlcyA9IGRpcmVudHNcbiAgICAgICAgLmZpbHRlcihkaXJlbnQgPT4gZGlyZW50LmlzRmlsZSgpKVxuICAgICAgICAubWFwKGRpcmVudCA9PiBwYXRoLmpvaW4oZGlyZWN0b3J5LCBkaXJlbnQubmFtZSkpXG5cbiAgICByZXR1cm4gaW1wb3J0RmlsZXMoZmlsZXMsIG9wdGlvbnMpXG59XG5cblxuXG4iLCJpbXBvcnQgdHlwZSB7IFVuaW9uVG9JbnRlcnNlY3Rpb24gfSBmcm9tICcuL3R5cGluZy50cydcblxuZXhwb3J0IHR5cGUgQW55Q2xhc3MgPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSB7fT4gPSBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUXG5leHBvcnQgdHlwZSBNaXhpbjxUPiA9IChiYXNlOiBDb25zdHJ1Y3RvcikgPT4gQ29uc3RydWN0b3I8VD5cblxuLyoqXG4gKiBDb21wb3NlcyBtdWx0aXBsZSBtaXhpbnMgaW50byBhIHNpbmdsZSBjbGFzcyB0aGF0IGNhbiBiZSBleHRlbmRlZC5cbiAqIEFsbG93cyBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UtbGlrZSBiZWhhdmlvciBieSBhcHBseWluZyBtaXhpbnMgc2VxdWVudGlhbGx5LlxuICogXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGNvbXBvc2VcbiAqIEByZXR1cm5zIEEgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBpbmNsdWRlcyBhbGwgbWl4aW4gZnVuY3Rpb25hbGl0eVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlciBleHRlbmRzIGNvbXBvc2UoVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZTxcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yPGFueT4pID0+IENvbnN0cnVjdG9yPGFueT4+XG4+KC4uLm1peGluczogTSk6IFVuaW9uVG9JbnRlcnNlY3Rpb248UmV0dXJuVHlwZTxNW251bWJlcl0+PiB7XG4gICAgcmV0dXJuIG1peGlucy5yZWR1Y2UoKGJhc2UsIG1peGluKSA9PiBtaXhpbihiYXNlKSwgY2xhc3Mge30gYXMgYW55KSBhcyBhbnlcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBjb21wb3NlIGZ1bmN0aW9uIHRoYXQgc3RhcnRzIHdpdGggYSBiYXNlIGNsYXNzXG4gKiBcbiAqIEBwYXJhbSBiYXNlQ2xhc3MgLSBUaGUgYmFzZSBjbGFzcyB0byBzdGFydCB3aXRoXG4gKiBAcGFyYW0gbWl4aW5zIC0gQXJyYXkgb2YgbWl4aW4gZnVuY3Rpb25zIHRvIGFwcGx5XG4gKiBAcmV0dXJucyBBIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgZXh0ZW5kcyB0aGUgYmFzZSBjbGFzcyB3aXRoIGFsbCBtaXhpbiBmdW5jdGlvbmFsaXR5XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBVc2VyIGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZUVudGl0eSwgVGltZXN0YW1wLCBTb2Z0RGVsZXRlKSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHtcbiAqICAgICBzdXBlcigpXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZVdpdGg8XG4gICAgVEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3RvcixcbiAgICBNIGV4dGVuZHMgQXJyYXk8KGJhc2U6IENvbnN0cnVjdG9yKSA9PiBDb25zdHJ1Y3Rvcjxhbnk+PlxuPihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlLFxuICAgIC4uLm1peGluczogTVxuKTogVEJhc2UgJiBVbmlvblRvSW50ZXJzZWN0aW9uPFJldHVyblR5cGU8TVtudW1iZXJdPj4ge1xuICAgIHJldHVybiBtaXhpbnMucmVkdWNlKChiYXNlLCBtaXhpbikgPT4gbWl4aW4oYmFzZSksIGJhc2VDbGFzcyBhcyBhbnkpIGFzIGFueVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VEJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3Rvcj4oU291cmNlOiBUQmFzZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiA8VFRhcmdldCBleHRlbmRzIENvbnN0cnVjdG9yPihUYXJnZXQ6IFRUYXJnZXQpIHtcbiAgICAgICAgY2xhc3MgTWl4ZWQgZXh0ZW5kcyBUYXJnZXQge1xuICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IG5ldyBTb3VyY2UoLi4uYXJncylcbiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHNvdXJjZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvcHkgbWV0aG9kc1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoU291cmNlLnByb3RvdHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgIE1peGVkLnByb3RvdHlwZSxcbiAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFNvdXJjZS5wcm90b3R5cGUsIGtleSkhXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE1peGVkIGFzIFRUYXJnZXQgJiBUQmFzZVxuICAgIH1cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4ob2JqOiBhbnksIHByZWZpeCA9ICcnLCByZXM6IGFueSA9IHt9KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBpc0luZGV4ID0gL15cXGQrJC8udGVzdChrZXkpXG4gICAgICAgIGNvbnN0IG5ld0tleSA9IGlzSW5kZXggPyBgJHtwcmVmaXh9WyR7a2V5fV1gIDogcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGZsYXR0ZW4odmFsdWUsIG5ld0tleSwgcmVzKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc1tuZXdLZXldID0gdmFsdWVcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmZsYXR0ZW4ob2JqOiBhbnkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7fVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCB2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxufVxuIiwiZnVuY3Rpb24gdXVpZCgpe1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuY3J5cHRvICYmIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY3J5cHRvLnJhbmRvbVVVSUQoKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGVudmlyb25tZW50cyB3aXRob3V0IGNyeXB0by5yYW5kb21VVUlEXG4gICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMFxuICAgICAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OFxuICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNilcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSWQocHJlZml4ID0gJycpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgdXVpZCgpXG59IiwiaW1wb3J0IHsgZ2V0LCBzZXQsIGhhcywgdW5zZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmludGVyZmFjZSBFbnRyeSB7XG4gICAga2V5OiBzdHJpbmdcbiAgICB2YWx1ZTogYW55XG4gICAgc291cmNlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlnU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnQ29uZmlnU2VydmljZSdcblxuICAgIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFbnRyeT5cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKClcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5lbmRzV2l0aCgnOmJvb2xlYW4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoJzpib29sZWFuJywgJycpLnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21SZWNvcmQocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2UgPSAndW5rbm93Jyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5wYXJzZVZhbHVlKHZhbHVlKSxcbiAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZEZyb21FbnRyaWVzKGVudHJpZXM6IFtzdHJpbmcsIGFueV1bXSwgc291cmNlID0gJ3Vua25vdycpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcykge1xuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChrZXksIHtcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucGFyc2VWYWx1ZSh2YWx1ZSksXG4gICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHRvUmVjb3JkKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgIHJlY29yZFtrZXldID0gZW50cnkudmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWNvcmRcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChwcmltYXJ5KVxuXG4gICAgICAgIGlmICghcHJpbWFyeUVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgICAgICByZXR1cm4gZW50cnkgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcHJpbWFyeUVudHJ5LnZhbHVlXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhcyh2YWx1ZSwga2V5LnN1YnN0cmluZyhwcmltYXJ5Lmxlbmd0aCArIDEpKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VCA9IGFueSB8IHVuZGVmaW5lZD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IFQge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoa2V5KVxuXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnZhbHVlIGFzIFRcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBrZXkuc3BsaXQoJy4nKVswXVxuICAgICAgICBjb25zdCBwcmltYXJ5RW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KHByaW1hcnkpXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5RW50cnkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpXG5cbiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LnZhbHVlIDogZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHByaW1hcnlFbnRyeS52YWx1ZVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXQodmFsdWUsIGtleS5zdWJzdHJpbmcocHJpbWFyeS5sZW5ndGggKyAxKSwgZGVmYXVsdFZhbHVlKVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T25lPFQgPSBhbnkgfCB1bmRlZmluZWQ+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBUIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXQ8VD4oa2V5KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdydW50aW1lJyk6IHZvaWQge1xuICAgICAgICBpZiAoIWtleS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwge1xuICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgbGV0IHByaW1hcnlWYWx1ZSA9IHRoaXMuZ2V0KHByaW1hcnksIHt9KVxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHByaW1hcnlWYWx1ZSA9IHt9XG4gICAgICAgIH1cblxuICAgICAgICBzZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSksIHZhbHVlKVxuXG4gICAgICAgIHRoaXMuZW50cmllcy5zZXQocHJpbWFyeSwge1xuICAgICAgICAgICAga2V5OiBwcmltYXJ5LFxuICAgICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgICB2YWx1ZTogcHJpbWFyeVZhbHVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICgha2V5LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmltYXJ5ID0ga2V5LnNwbGl0KCcuJylbMF1cbiAgICAgICAgY29uc3QgcHJpbWFyeVZhbHVlID0gdGhpcy5nZXQocHJpbWFyeSwge30pXG5cbiAgICAgICAgaWYgKCFwcmltYXJ5VmFsdWUpIHJldHVyblxuXG4gICAgICAgIGlmICh0eXBlb2YgcHJpbWFyeVZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHByaW1hcnlWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgdW5zZXQocHJpbWFyeVZhbHVlLCBrZXkuc3Vic3RyaW5nKHByaW1hcnkubGVuZ3RoICsgMSkpXG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLnNldChwcmltYXJ5LCB7XG4gICAgICAgICAgICBrZXk6IHByaW1hcnksXG4gICAgICAgICAgICBzb3VyY2U6ICdydW50aW1lJyxcbiAgICAgICAgICAgIHZhbHVlOiBwcmltYXJ5VmFsdWVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpXG4gICAgfVxuXG4gICAgcHVibGljIGR1bXAoKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgICAgIHJldHVybiBmbGF0dGVuKHRoaXMudG9SZWNvcmQoKSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB7IGNyZWF0ZUlkLCB0cnlDYXRjaCB9IGZyb20gJy4uL3V0aWxzL2luZGV4LnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zIHtcbiAgICBldmVudDogc3RyaW5nXG59XG5leHBvcnQgaW50ZXJmYWNlIEVtbWl0dGVyTGlzdGVuZXIge1xuICAgIChkYXRhOiBhbnksIG9wdGlvbnM6IEVtbWl0dGVyTGlzdGVuZXJPcHRpb25zKTogdm9pZFxufVxuXG5pbnRlcmZhY2UgRW1taXR0ZXJIYW5kbGVyIHtcbiAgICBpZDogc3RyaW5nXG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGxpc3RlbmVyOiBFbW1pdHRlckxpc3RlbmVyXG4gICAgb3JpZ2luYWxMaXN0ZW5lcj86IEVtbWl0dGVyTGlzdGVuZXJcbn1cblxuaW50ZXJmYWNlIE9uT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICB1bmlxdWU/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBPbkRlYm91bmNlT3B0aW9ucyBleHRlbmRzIE9uT3B0aW9ucyB7XG4gICAgZGVib3VuY2U/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbW1pdHRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtbWl0dGVyU2VydmljZTxFdmVudHMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VtbWl0dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyBoYW5kbGVyczogRW1taXR0ZXJIYW5kbGVyW10gPSBbXVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yIChvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucz8uZGVidWcgfHwgZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zPy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZW1taXR0ZXIgbG9hZGVkIHdpdGggZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlPEV2ZW50cyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihvcHRpb25zPzogRW1taXR0ZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICByZXR1cm4gbmV3IEVtbWl0dGVyU2VydmljZTxFdmVudHM+KG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZGVidWcgbW9kZSBlbmFibGVkJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50OiBLLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlclxuICAgIHB1YmxpYyBvbihldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGlkID0gb3B0aW9ucz8uaWQgfHwgY3JlYXRlSWQoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy51bmlxdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuaGFuZGxlcnMuc29tZShoID0+IChoLmV2ZW50ID09PSBldmVudCAmJiBoLmxpc3RlbmVyID09PSBsaXN0ZW5lcikgfHwgaC5pZCA9PT0gaWQpXG5cbiAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXI6IEVtbWl0dGVySGFuZGxlciA9IHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycy5wdXNoKGhhbmRsZXIpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdoYW5kbGVyIGFkZGVkJywgaGFuZGxlcilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYW5kbGVyXG4gICAgfVxuXG4gICAgcHVibGljIG9uY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25PcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRW1taXR0ZXJIYW5kbGVyWydsaXN0ZW5lciddLCBvcHRpb25zPzogT25PcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoYXJnczogYW55LCBvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGFyZ3MsIG9wdGlvbnMpXG5cbiAgICAgICAgICAgIHRoaXMub2ZmKGV2ZW50LCB3cmFwcGVyKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub24oZXZlbnQsIHdyYXBwZXIgYXMgYW55LCBvcHRpb25zKVxuICAgIH1cblxuXG4gICAgcHVibGljIG9uRGVib3VuY2U8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGxpc3RlbmVyOiAoYXJnczogRXZlbnRzW0tdKSA9PiB2b2lkLCBvcHRpb25zPzogT25EZWJvdW5jZU9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJcbiAgICBwdWJsaWMgb25EZWJvdW5jZShldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogKGFyZ3M6IGFueSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKTogRW1taXR0ZXJIYW5kbGVyXG4gICAgcHVibGljIG9uRGVib3VuY2UoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6IEVtbWl0dGVySGFuZGxlclsnbGlzdGVuZXInXSwgb3B0aW9ucz86IE9uRGVib3VuY2VPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKGxpc3RlbmVyLCBvcHRpb25zPy5kZWJvdW5jZSB8fCAzMDApXG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGRlYm91bmNlZCBhcyBhbnksIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIub3JpZ2luYWxMaXN0ZW5lciA9IGxpc3RlbmVyXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlclxuICAgIH1cblxuICAgIHB1YmxpYyBvbkFueU9mPEsgZXh0ZW5kcyBrZXlvZiBFdmVudHM+KGV2ZW50czogS1tdLCBsaXN0ZW5lcjogKGFyZ3M6IEV2ZW50c1tLXSkgPT4gdm9pZCwgb3B0aW9ucz86IE9uT3B0aW9ucyk6IEVtbWl0dGVySGFuZGxlcltdXG4gICAgcHVibGljIG9uQW55T2YoZXZlbnRzOiBzdHJpbmdbXSwgbGlzdGVuZXI6IChhcmdzOiBhbnkpID0+IHZvaWQsIG9wdGlvbnM/OiBPbk9wdGlvbnMpOiBFbW1pdHRlckhhbmRsZXJbXVxuICAgIHB1YmxpYyBvbkFueU9mKGV2ZW50czogc3RyaW5nW10sIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10sIG9wdGlvbnM/OiBPbk9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnM6IEVtbWl0dGVySGFuZGxlcltdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMub24oZXZlbnQsIGxpc3RlbmVyIGFzIGFueSwgb3B0aW9ucylcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGFuZGxlcnNcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBFbW1pdHRlckhhbmRsZXJbJ2xpc3RlbmVyJ10pIHtcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4ge1xuICAgICAgICAgICAgaWYgKGguZXZlbnQgPT09IGV2ZW50ICYmIChoLmxpc3RlbmVyID09PSBsaXN0ZW5lciB8fCBoLm9yaWdpbmFsTGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlciByZW1vdmVkJywgeyBldmVudCB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8SyBleHRlbmRzIGtleW9mIEV2ZW50cz4oZXZlbnQ6IEssIGFyZ3M6IEV2ZW50c1tLXSk6IHZvaWRcbiAgICBwdWJsaWMgZW1pdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogdm9pZFxuICAgIHB1YmxpYyBlbWl0KGV2ZW50OiBzdHJpbmcsIGFyZ3M/OiBhbnkpIHtcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50Jywge1xuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGFyZ3NcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnMuZmlsdGVyKGggPT4gaC5ldmVudCA9PT0gZXZlbnQpXG5cbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICAgICAgICB0cnlDYXRjaC5zeW5jKCgpID0+IGhhbmRsZXIubGlzdGVuZXIoYXJncywgeyBldmVudCB9KSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRzPihldmVudDogSywgYXJnczogRXZlbnRzW0tdKTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KTogUHJvbWlzZTx2b2lkPlxuICAgIHB1YmxpYyBhc3luYyBlbWl0QW5kV2FpdChldmVudDogc3RyaW5nLCBhcmdzPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiBoLmV2ZW50ID09PSBldmVudClcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2VtaXR0aW5nIGV2ZW50IGFuZCB3YWl0Jywge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzOiBoYW5kbGVycy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgYXJnc1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlci5saXN0ZW5lcihhcmdzLCB7IGV2ZW50IH0pXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBsaXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVyc1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0QnlFdmVudChldmVudDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmZpbHRlcihoID0+IGguZXZlbnQgPT09IGV2ZW50KVxuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUocGF5bG9hZDogc3RyaW5nIHwgc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKSA/IHBheWxvYWQgOiBbcGF5bG9hZF1cblxuICAgICAgICB0aGlzLmhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5maWx0ZXIoaCA9PiAhaWRzLmluY2x1ZGVzKGguaWQpKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnaGFuZGxlcnMgcmVtb3ZlZCcsIHsgaWRzIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWxsIGhhbmRsZXJzIGNsZWFyZWQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0hhbmRsZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5sZW5ndGggPiAwXG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlSG9vayB7XG4gICAgcHVibGljIGhvb2tfaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBob29rX2FsaWFzZXM/OiBzdHJpbmdbXVxuICAgIHB1YmxpYyBvcmRlcj86IG51bWJlclxuICAgIHB1YmxpYyBzdWJob29rcz86IExpZmVjeWNsZUhvb2tbXVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICBwdWJsaWMgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIHB1YmxpYyBhc3luYyBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHsgfVxuXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSByZWdpc3RlciAqL1xuICAgIHB1YmxpYyBhc3luYyBvblJlZ2lzdGVyKCk6IFByb21pc2U8dm9pZD4geyB9XG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSBsb2FkICovXG4gICAgcHVibGljIGFzeW5jIG9uTG9hZCgpOiBQcm9taXNlPHZvaWQ+IHsgfVxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgYm9vdCAqL1xuICAgIHB1YmxpYyBhc3luYyBvbkJvb3QoKTogUHJvbWlzZTx2b2lkPiB7IH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHNodXRkb3duICovXG4gICAgcHVibGljIGFzeW5jIG9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7IH1cblxufVxuIiwiaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnLi9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnLi4vdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG50eXBlIExpZmVjeWNsZU1ldGhvZCA9ICdyZWdpc3RlcicgfCAnbG9hZCcgfCAnYm9vdCcgfCAnc2h1dGRvd24nXG5cbmludGVyZmFjZSBMaXN0T3B0aW9ucyB7XG4gICAgaW5jbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgZXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGhvb2tzPzogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgb25FcnJvcj86IChlcnJvcjogRXJyb3IsIGNvbnRleHQ6IHsgaG9va0lkOiBzdHJpbmc7IG1ldGhvZDogTGlmZWN5Y2xlTWV0aG9kIH0pID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnTGlmZWN5Y2xlU2VydmljZSdcblxuICAgIHB1YmxpYyBob29rczogTWFwPHN0cmluZywgTGlmZWN5Y2xlSG9vaz5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IExpZmVjeWNsZVNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRhdGEuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmhvb2tzID0gZGF0YS5ob29rcyA/PyBuZXcgTWFwKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBkYXRhLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIFxuICAgICAgICBpZiAoZGF0YS5vbkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLm9uRXJyb3IgPSBkYXRhLm9uRXJyb3JcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRPbkVycm9yKGhhbmRsZXI6IFJlcXVpcmVkPExpZmVjeWNsZVNlcnZpY2VPcHRpb25zPlsnb25FcnJvciddKSB7XG4gICAgICAgIHRoaXMub25FcnJvciA9IGhhbmRsZXJcbiAgICB9XG5cblxuICAgIHB1YmxpYyBvbkVycm9yKGVycm9yOiBFcnJvciwgY29udGV4dDogeyBob29rSWQ6IHN0cmluZzsgbWV0aG9kOiBMaWZlY3ljbGVNZXRob2QgfSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGNvbnRleHQgfSlcblxuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaG9vayAke2NvbnRleHQubWV0aG9kfSAoJHtjb250ZXh0Lmhvb2tJZH0pOmAsIGVycm9yKVxuICAgIH1cblxuICAgIHB1YmxpYyBtYXBBbGlhc2VzKGFyZ3M6IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXVxuICAgICAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIGFsbCkge1xuICAgICAgICAgICAgaWYgKGFyZ3MuaW5jbHVkZXMoaG9vay5ob29rX2lkKSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGhvb2suaG9va19pZClcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5ob29rX2FsaWFzZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVkQWxpYXMgPSBob29rLmhvb2tfYWxpYXNlcy5maW5kKGFsaWFzID0+IGFyZ3MuaW5jbHVkZXMoYWxpYXMpKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRBbGlhcykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChob29rLmhvb2tfaWQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0KG9wdGlvbnM/OiBMaXN0T3B0aW9ucykge1xuICAgICAgICBsZXQgaG9va3MgPSBBcnJheS5mcm9tKHRoaXMuaG9va3MudmFsdWVzKCkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmV4Y2x1ZGUpIHtcbiAgICAgICAgICAgIGxldCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuZXhjbHVkZSkgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbb3B0aW9ucy5leGNsdWRlXVxuXG4gICAgICAgICAgICBpZHMgPSB0aGlzLm1hcEFsaWFzZXMoaWRzKVxuXG4gICAgICAgICAgICBob29rcyA9IGhvb2tzLmZpbHRlcihob29rID0+ICFpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBsZXQgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmluY2x1ZGUpID8gb3B0aW9ucy5pbmNsdWRlIDogW29wdGlvbnMuaW5jbHVkZV1cblxuICAgICAgICAgICAgaWRzID0gdGhpcy5tYXBBbGlhc2VzKGlkcylcblxuICAgICAgICAgICAgaG9va3MgPSBob29rcy5maWx0ZXIoaG9vayA9PiBpZHMuaW5jbHVkZXMoaG9vay5ob29rX2lkKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGhvb2tzID0gb3JkZXJCeShob29rcywgWydvcmRlciddLCBbJ2FzYyddKVxuXG4gICAgICAgIHJldHVybiBob29rc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGQoLi4ucGF5bG9hZDogKExpZmVjeWNsZUhvb2sgfCBDb25zdHJ1Y3RvcjxMaWZlY3ljbGVIb29rPilbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnN0YW5jZXM6IExpZmVjeWNsZUhvb2tbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBheWxvYWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5ldyBpdGVtKCkpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5zdGFuY2VzLnB1c2goaXRlbSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGlmICghaG9vay5ob29rX2lkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignU2tpcHBpbmcgaG9vayB3aXRob3V0IGhvb2tfaWQ6JywgaG9vaylcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmhvb2tzLnNldChob29rLmhvb2tfaWQsIGhvb2spXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2FkZCAnICsgaG9vay5ob29rX2lkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG9vay5zdWJob29rcykge1xuICAgICAgICAgICAgICAgIGhvb2suc3ViaG9va3MuZm9yRWFjaChzdWJob29rID0+IHRoaXMuYWRkKHN1Ymhvb2spKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRNZXRob2QobWV0aG9kOiBMaWZlY3ljbGVNZXRob2QsIG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBob29rcyA9IHRoaXMubGlzdChvcHRpb25zKSBcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGVtaXR0aW5nICR7bWV0aG9kfSBmb3IgaG9va3M6YCwge1xuICAgICAgICAgICAgICAgIGhvb2tzOiBob29rcy5tYXAoaG9vayA9PiBob29rLmhvb2tfaWQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBob29rIG9mIHRoaXMubGlzdChvcHRpb25zKSkge1xuICAgICAgICAgICAgY29uc3QgbWFwID0ge1xuICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5yZWdpc3RlcigpLCBob29rLm9uUmVnaXN0ZXIoKV0pLFxuICAgICAgICAgICAgICAgIGxvYWQ6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmxvYWQoKSwgaG9vay5vbkxvYWQoKV0pLFxuICAgICAgICAgICAgICAgIGJvb3Q6ICgpID0+IFByb21pc2UuYWxsKFtob29rLmJvb3QoKSwgaG9vay5vbkJvb3QoKV0pLFxuICAgICAgICAgICAgICAgIHNodXRkb3duOiAoKSA9PiBQcm9taXNlLmFsbChbaG9vay5zaHV0ZG93bigpLCBob29rLm9uU2h1dGRvd24oKV0pLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3JdID0gYXdhaXQgdHJ5Q2F0Y2goKCkgPT4gbWFwW21ldGhvZF0oKSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yLCB7IGhvb2tJZDogaG9vay5ob29rX2lkLCBtZXRob2QgfSlcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke21ldGhvZH0gYCArIGhvb2suaG9va19pZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0KHBheWxvYWQ6IExpZmVjeWNsZU1ldGhvZCB8IExpZmVjeWNsZU1ldGhvZFtdLCBvcHRpb25zPzogTGlzdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG5cbiAgICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0TWV0aG9kKG1ldGhvZCwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvbihtZXRob2Q6IExpZmVjeWNsZU1ldGhvZCwgaGFuZGxlcjogKCkgPT4gUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgICAgICBjb25zdCBoID0gbmV3IExpZmVjeWNsZUhvb2soKVxuXG4gICAgICAgIGguaG9va19pZCA9IGBjdXN0b206JHttZXRob2R9OiR7RGF0ZS5ub3coKX1gXG5cbiAgICAgICAgaFttZXRob2RdID0gaGFuZGxlclxuXG4gICAgICAgIHRoaXMuYWRkKGgpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdyZWdpc3RlcicsIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVtaXQoJ2xvYWQnLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBib290KG9wdGlvbnM/OiBMaXN0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbWl0KCdib290Jywgb3B0aW9ucylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IExpc3RPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnc2h1dGRvd24nLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob29rcy5jbGVhcigpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgeyBnZXQsIHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCBxcyBmcm9tICdxcydcblxuZXhwb3J0IGNvbnN0IG51bWJlciA9ICgpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2Lm51bWJlcigpXSksXG4gICAgdi50cmFuc2Zvcm0oTnVtYmVyKSxcbiAgICB2LmludGVnZXIoKSxcbilcblxuZXhwb3J0IGNvbnN0IGJvb2xlYW4gPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5ib29sZWFuKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPT09IHRydWUgfHwgdiA9PT0gJ3RydWUnKSxcbilcblxuZXhwb3J0IGNvbnN0IGRhdGUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgaW5zdGFuY2VvZiBEYXRlID8gdiA6IG5ldyBEYXRlKHYpKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHYgPyBmb3JtYXQodiwgJ3l5eXktTU0tZGQnKSA6IHYpLFxuKVxuXG5leHBvcnQgY29uc3QgZGF0ZXRpbWUgPSAoKSA9PiB2LnBpcGUoXG4gICAgdi51bmlvbihbdi5zdHJpbmcoKSwgdi5kYXRlKCldKSxcbiAgICB2LnRyYW5zZm9ybSh2ID0+IHtcbiAgICAgICAgaWYgKCF2KSByZXR1cm4gdlxuXG4gICAgICAgIGlmICh2ID09PSAnbnVsbCcpIHJldHVybiBudWxsXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHYpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0KHYsICd5eXl5LU1NLWRkIEhIOm1tJylcbiAgICB9KSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5ID0gPFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+KHNjaGVtYTogVCA9IHYuYW55KCkgYXMgYW55IGFzIFQpID0+IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LnN0cmluZygpLCB2LmFycmF5KHYuc3RyaW5nKCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlLnNwbGl0KCcsJykpLFxuICAgIHYuYXJyYXkoc2NoZW1hKSxcbilcblxuZXhwb3J0IGNvbnN0IGFycmF5TnVtYmVyID0gKCkgPT4gdi5waXBlKFxuICAgIGFycmF5KCksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdmFsdWUubWFwKE51bWJlcikpLFxuKVxuXG5leHBvcnQgY29uc3Qgb2JqZWN0ID0gKCkgPT4gdi5waXBlKFxuICAgIHYudW5pb24oW3Yuc3RyaW5nKCksIHYucmVjb3JkKHYuc3RyaW5nKCksIHYuYW55KCkpXSksXG4gICAgdi50cmFuc2Zvcm0odmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHFzLnBhcnNlKHZhbHVlKSA6IHZhbHVlKSxcbiAgICB2LnRyYW5zZm9ybSh2YWx1ZSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIHNldChyZXN1bHQsIGtleSwgZ2V0KHZhbHVlLCBrZXkpKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pLFxuKVxuXG5leHBvcnQgZnVuY3Rpb24gdXJsKCkge1xuICAgIHJldHVybiBvYmplY3QoKVxufVxuXG51cmwubnVtYmVyID0gbnVtYmVyXG51cmwuYm9vbGVhbiA9IGJvb2xlYW4gXG51cmwuZGF0ZSA9IGRhdGUgXG51cmwuZGF0ZXRpbWUgPSBkYXRldGltZVxudXJsLmFycmF5ID0gYXJyYXlcbnVybC5hcnJheU51bWJlciA9IGFycmF5TnVtYmVyXG51cmwub2JqZWN0ID0gb2JqZWN0XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnIFxuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuXG5leHBvcnQgY29uc3Qga2V5VmFsdWUgPSAoKSA9PiB2LnBpcGUodi5zdHJpbmcoKSwgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlLnNwbGl0KC9bO1xcbl0vKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCc9JykpXG4gICAgICAgIC5tYXAobCA9PiBsLnRyaW0oKS5zcGxpdCgnPScpKVxuXG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGxldCBwYXJzZWRWYWx1ZTogYW55ID0gdmFsdWVcblxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnYm9vbDonKSkge1xuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdib29sOicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBwYXJzZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59KSlcbiIsImltcG9ydCB7IG51bWJlciwgYXJyYXkgfSBmcm9tICcuL3VybFZhbGlkYXRvci50cydcbmltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uUGFyYW1zIHtcbiAgICBtYXhMaW1pdD86IG51bWJlclxuICAgIG9yZGVyRmllbGRzPzogc3RyaW5nW11cbn1cblxuXG5leHBvcnQgY29uc3QgYmFzZSA9IChvcHRpb25zOiBQYWdpbmF0aW9uUGFyYW1zID0ge30pID0+IHYub2JqZWN0KHtcbiAgICBwYWdlOiB2Lm9wdGlvbmFsKG51bWJlcigpLCAxKSxcbiAgICBsaW1pdDogdi5vcHRpb25hbChudW1iZXIoKSwgb3B0aW9ucy5tYXhMaW1pdCB8fCAxMDApLFxuICAgIG9yZGVyQnk6IHYubnVsbGlzaChvcHRpb25zLm9yZGVyRmllbGRzID8gYXJyYXkodi5waWNrbGlzdChvcHRpb25zLm9yZGVyRmllbGRzKSkgOiBhcnJheSh2LnN0cmluZygpKSwgW10pLFxuICAgIG9yZGVyRGlyZWN0aW9uOiB2Lm51bGxpc2goYXJyYXkodi51bmlvbihbdi5saXRlcmFsKCdhc2MnKSwgdi5saXRlcmFsKCdkZXNjJyldKSksIFtdKSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBwYWdpbmF0aW9uKG9wdGlvbnM6IFBhZ2luYXRpb25QYXJhbXMgPSB7fSkge1xuICAgIHJldHVybiBiYXNlKG9wdGlvbnMpXG59XG5cbnBhZ2luYXRpb24uYmFzZSA9IGJhc2VcbiIsImV4cG9ydCAqIGZyb20gJy4vdXJsVmFsaWRhdG9yLnRzJ1xuZXhwb3J0ICogZnJvbSAnLi9rZXlWYWx1ZVZhbGlkYXRvci50cydcbmV4cG9ydCAqIGZyb20gJy4vcGFnaW5hdGlvblZhbGlkYXRvci50cydcbiIsImltcG9ydCAqIGFzIHYgZnJvbSAndmFsaWJvdCdcbmltcG9ydCAqIGFzIGV4dHJhcyBmcm9tICcjc2hhcmVkL3ZhbGlkYXRvcnMvaW5kZXgudHMnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCB0eXBlIFZhbGlib3QgPSB0eXBlb2YgdiAmIHsgZXh0cmFzOiB0eXBlb2YgZXh0cmFzIH1cblxuZXhwb3J0IHR5cGUgVmFsaWJvdFNjaGVtYSA9IHYuQmFzZVNjaGVtYTx1bmtub3duLCB1bmtub3duLCB2LkJhc2VJc3N1ZTx1bmtub3duPj5cbmV4cG9ydCB0eXBlIFZhbGlib3RPYmplY3RTY2hlbWEgPSB2Lk9iamVjdFNjaGVtYTxhbnksIGFueT5cbmV4cG9ydCB0eXBlIFZhbGlib3RTY2hlbWFBc3luYyA9IHYuQmFzZVNjaGVtYUFzeW5jPHVua25vd24sIHVua25vd24sIHYuQmFzZUlzc3VlPHVua25vd24+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvckNhbGxiYWNrPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPiB7XG4gICAgKF92OiBWYWxpYm90KTogVFxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hQXN5bmM+ID0ge1xuICAgIChfdjogVmFsaWJvdCk6IFRcbn1cblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yUmVzdWx0PFQgZXh0ZW5kcyB2LkJhc2VTY2hlbWE8YW55LCBhbnksIGFueT4+ID0gdi5JbmZlck91dHB1dDxUPlxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVBheWxvYWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPSBWYWxpYm90U2NoZW1hPiA9IFZhbGlkYXRvckNhbGxiYWNrPFQ+IHwgVFxuXG5leHBvcnQgdHlwZSBWYWxpZGF0ZVJlc3VsdDxUIGV4dGVuZHMgVmFsaWRhdGVQYXlsb2FkPiA9XG4gICAgVCBleHRlbmRzIFZhbGlib3RTY2hlbWEgPyB2LkluZmVyT3V0cHV0PFQ+IDpcbiAgICBUIGV4dGVuZHMgVmFsaWRhdG9yQ2FsbGJhY2s8aW5mZXIgVT4gPyB2LkluZmVyT3V0cHV0PFU+IDpcbiAgICB1bmtub3duXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmFsaWRhdG9yU2VydmljZSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnVmFsaWRhdG9yU2VydmljZSdcblxuICAgIHB1YmxpYyB2OiBWYWxpYm90ID0ge1xuICAgICAgICAuLi52LFxuICAgICAgICBleHRyYXMsXG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZTxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYT4oY2I6IFZhbGlkYXRvckNhbGxiYWNrPFQ+KSB7XG4gICAgICAgIHJldHVybiBjYih0aGlzLnYpXG4gICAgfVxuXG4gICAgcHVibGljIHZhbGlkYXRlPFQgZXh0ZW5kcyBWYWxpYm90U2NoZW1hPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0ZVBheWxvYWQ8VD4pIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hOiBUID0gdHlwZW9mIGNiID09PSAnZnVuY3Rpb24nID8gY2IodGhpcy52KSA6IGNiXG5cbiAgICAgICAgY29uc3QgeyBvdXRwdXQsIGlzc3Vlcywgc3VjY2VzcyB9ID0gdi5zYWZlUGFyc2Uoc2NoZW1hLCBwYXlsb2FkKVxuXG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgICAgY29uc3QgZmxhdHRlbiA9IHYuZmxhdHRlbihpc3N1ZXMpXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IFtdIGFzIHN0cmluZ1tdXG5cbiAgICAgICAgICAgIGlmIChmbGF0dGVuLnJvb3QpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoKC4uLmZsYXR0ZW4ucm9vdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGZsYXR0ZW4ubmVzdGVkKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZmxhdHRlbi5uZXN0ZWQpLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5IGFzIFtzdHJpbmcsIHN0cmluZ1tdXVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goLi4udmFsdWUubWFwKCh2KSA9PiBgJHtrZXl9OiAke3Z9YCkpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VzLmxlbmd0aCA/IG1lc3NhZ2VzLmpvaW4oJywgJykgOiAnVmFsaWRhdGlvbiBmYWlsZWQnXG5cbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEJhc2VFeGNlcHRpb24obWVzc2FnZSwgNDIyKVxuXG4gICAgICAgICAgICBlcnJvci5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcidcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBtZXNzYWdlcywgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBc3luYzxUIGV4dGVuZHMgVmFsaWJvdFNjaGVtYUFzeW5jPihwYXlsb2FkOiBhbnksIGNiOiBWYWxpZGF0b3JDYWxsYmFja0FzeW5jPFQ+IHwgVCkge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IG91dHB1dCwgaXNzdWVzLCBzdWNjZXNzIH0gPSBhd2FpdCB2LnNhZmVQYXJzZUFzeW5jKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZCcpXG4gICAgICAgICAgICBjb25zdCBmbGF0dGVuID0gdi5mbGF0dGVuKGlzc3VlcylcbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgICAgICAgICAgLi4uZmxhdHRlbi5yb290LFxuICAgICAgICAgICAgICAgIC4uLmZsYXR0ZW4ubmVzdGVkLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGRldGFpbHMsIH0pXG5cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQ8VCBleHRlbmRzIFZhbGlib3RTY2hlbWE+KHBheWxvYWQ6IGFueSwgY2I6IFZhbGlkYXRlUGF5bG9hZDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBzY2hlbWE6IFQgPSB0eXBlb2YgY2IgPT09ICdmdW5jdGlvbicgPyBjYih0aGlzLnYpIDogY2JcblxuICAgICAgICBjb25zdCB7IHN1Y2Nlc3MgfSA9IHYuc2FmZVBhcnNlKHNjaGVtYSwgcGF5bG9hZClcblxuICAgICAgICByZXR1cm4gc3VjY2Vzc1xuICAgIH1cbn1cblxuIiwiZXhwb3J0IGZ1bmN0aW9uIG1hdGNoUGF0aChwYXR0ZXJuOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFNwbGl0IHBhdGhzIGludG8gc2VnbWVudHNcbiAgICBjb25zdCBwYXR0ZXJuU2VnbWVudHMgPSBwYXR0ZXJuLnNwbGl0KCcvJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgY29uc3QgcGF0aFNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgLy8gQ2hlY2sgZWFjaCBzZWdtZW50XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXR0ZXJuU2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcGF0dGVyblNlZ21lbnRzW2ldXG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZWdtZW50ID0gcGF0aFNlZ21lbnRzW2ldXG5cbiAgICAgICAgLy8gSWYgcm91dGUgc2VnbWVudCBpcyBhIHdpbGRjYXJkICgqKSwgaXQgbWF0Y2hlcyBldmVyeXRoaW5nIGZyb20gdGhpcyBwb2ludFxuICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSd2ZSBydW4gb3V0IG9mIHJlcXVlc3Qgc2VnbWVudHMgYnV0IHN0aWxsIGhhdmUgcm91dGUgc2VnbWVudHMsIG5vIG1hdGNoXG4gICAgICAgIGlmIChpID49IHBhdGhTZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgcm91dGUgc2VnbWVudCBpcyBhIHBhcmFtZXRlciAoc3RhcnRzIHdpdGggOiksIGl0IG1hdGNoZXMgYW55IHZhbHVlXG4gICAgICAgIGlmIChyb3V0ZVNlZ21lbnQuc3RhcnRzV2l0aCgnOicpKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWdtZW50cyBtdXN0IG1hdGNoIGV4YWN0bHlcbiAgICAgICAgaWYgKHJvdXRlU2VnbWVudCAhPT0gcmVxdWVzdFNlZ21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBtb3JlIHJlcXVlc3Qgc2VnbWVudHMgdGhhbiByb3V0ZSBzZWdtZW50cyAoYW5kIG5vIHdpbGRjYXJkKSwgbm8gbWF0Y2hcbiAgICBpZiAocGF0aFNlZ21lbnRzLmxlbmd0aCA+IHBhdHRlcm5TZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbn1cbiIsImltcG9ydCBWYWxpZGF0b3JTZXJ2aWNlIGZyb20gXCIuLi9zZXJ2aWNlcy9WYWxpZGF0b3JTZXJ2aWNlXCJcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3JTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdG9yXG4iLCJpbXBvcnQgdHlwZSB7IFZhbGlkYXRvclJlc3VsdCB9IGZyb20gJyNzaGFyZWQvc2VydmljZXMvVmFsaWRhdG9yU2VydmljZS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcblxuXG5leHBvcnQgdHlwZSBEYXNoYm9hcmRNZXRhU2NoZW1hID0gVmFsaWRhdG9yUmVzdWx0PFJldHVyblR5cGU8dHlwZW9mIGRhc2hib2FyZE1ldGFTY2hlbWE+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/OiBzdHJpbmdcblxuICAgIHB1YmxpYyBnZXRQYXJzZWRNaW1lVHlwZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5taW1lX3R5cGVzLnNwbGl0KCcsJykubWFwKHR5cGUgPT4gdHlwZS50cmltKCkpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZE1pbWVUeXBlKG1pbWVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgYWxsb3dlZFR5cGVzID0gdGhpcy5nZXRQYXJzZWRNaW1lVHlwZXMoKVxuICAgICAgICByZXR1cm4gYWxsb3dlZFR5cGVzLmluY2x1ZGVzKG1pbWVUeXBlKSB8fCBhbGxvd2VkVHlwZXMuaW5jbHVkZXMoJyovKicpXG4gICAgfVxuXG4gICAgcHVibGljIGlzQWxsb3dlZFNpemUoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBzaXplIDw9IHRoaXMubWF4X3NpemVcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBHaXRCcmFuY2hFbnRpdHkge1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgcmVtb3RlOiBzdHJpbmcgfCBudWxsXG4gICAgcHVibGljIGlzX2N1cnJlbnQ6IGJvb2xlYW5cbiAgICBwdWJsaWMgaXNfcmVtb3RlOiBib29sZWFuXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBHaXRCcmFuY2hFbnRpdHkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBkYXRhKVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEdpdENvbW1pdEVudGl0eSB7XG4gICAgcHVibGljIGhhc2g6IHN0cmluZ1xuICAgIHB1YmxpYyBzaG9ydF9oYXNoOiBzdHJpbmdcbiAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nXG4gICAgcHVibGljIGJvZHk6IHN0cmluZ1xuICAgIHB1YmxpYyBhdXRob3JfbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGF1dGhvcl9lbWFpbDogc3RyaW5nXG4gICAgcHVibGljIGRhdGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZGF0YTogR2l0Q29tbWl0RW50aXR5KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgZGF0YSlcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSBNb2R1bGVNYW5pZmVzdCBmcm9tICcuL01vZHVsZU1hbmlmZXN0RW50aXR5LnRzJ1xuaW1wb3J0IExpZmVjeWNsZUhvb2sgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9MaWZlY3ljbGVIb29rLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSwgbWl4aW4gfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgQmFzZUVudGl0eSBmcm9tICcjc2hhcmVkL21peGlucy9CYXNlRW50aXR5TWl4aW4udHMnXG5cbmludGVyZmFjZSBNb2R1bGVVcGdyYWRlSW5mbyB7XG4gICAgc291cmNlOiAnZ2l0JyB8ICd6aXAnXG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZSBleHRlbmRzIGNvbXBvc2UoQmFzZUVudGl0eSwgbWl4aW4oTGlmZWN5Y2xlSG9vaykpIHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmdcbiAgICBwdWJsaWMgZW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gICAgcHVibGljIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgcHVibGljIGJ1aWxkOiBNb2R1bGVNYW5pZmVzdFsnYnVpbGQnXSA9IHt9XG4gICAgcHVibGljIGRpcmVjdG9yeTogc3RyaW5nXG5cbiAgICBwdWJsaWMgdXBncmFkZV9pbmZvPzogTW9kdWxlVXBncmFkZUluZm9cblxuICAgIHB1YmxpYyBzZXREYXRhKGRhdGE6IFBhcnRpYWw8TW9kdWxlIHwgTW9kdWxlTWFuaWZlc3Q+KSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZGF0YSkuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICApXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBmaWx0ZXJlZClcblxuICAgICAgICB0aGlzLmhvb2tfaWQgPSBgbW9kdWxlOiR7dGhpcy5pZH1gXG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkSW1wb3J0IHtcbiAgICBmcm9tOiBzdHJpbmdcbiAgICB0bz86IHN0cmluZ1xuICAgIHR5cGU6ICdnbG9iYWxfaW1wb3J0J1xufVxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdEJ1aWxkIHtcbiAgICBpbXBvcnRzPzogTW9kdWxlTWFuaWZlc3RCdWlsZEltcG9ydFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZHVsZU1hbmlmZXN0IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGF1dGhvcj86IHN0cmluZ1xuICAgIHB1YmxpYyBkZXBlbmRlbmNpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcHVibGljIGJ1aWxkPzogTW9kdWxlTWFuaWZlc3RCdWlsZFxuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnaW5hdGlvbkVudGl0eTxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIHB1YmxpYyBpdGVtczogVFtdXG4gICAgcHVibGljIHRvdGFsOiBudW1iZXJcbiAgICBwdWJsaWMgcGFnZTogbnVtYmVyXG4gICAgcHVibGljIHBlcl9wYWdlOiBudW1iZXJcbiAgICBwdWJsaWMgdG90YWxfcGFnZXM6IG51bWJlclxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5Pikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tPFQgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID4ocGF5bG9hZDogUGFydGlhbDxQYWdpbmF0aW9uRW50aXR5PFQ+Pik6IFBhZ2luYXRpb25FbnRpdHk8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhZ2luYXRpb25FbnRpdHkocGF5bG9hZCBhcyBhbnkpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGx1Z2luRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5KSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmFibGVkOiBib29sZWFuXG4gICAgcHVibGljIGFsaWFzZXM6IHN0cmluZ1tdXG4gICAgcHVibGljIHZlcnNpb25fY2hhbm5lbDogc3RyaW5nXG4gICAgcHVibGljIHZlcnNpb25fYXZhaWxhYmxlX2NoYW5uZWxzOiBzdHJpbmdbXVxufVxuIiwiaW1wb3J0IEJhc2VFbnRpdHkgZnJvbSAnI3NoYXJlZC9taXhpbnMvQmFzZUVudGl0eU1peGluLnRzJ1xuaW1wb3J0IFNvZnREZWxldGVNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9Tb2Z0RGVsZXRlTWl4aW4udHMnXG5pbXBvcnQgVGltZXN0YW1wTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvVGltZXN0YW1wTWl4aW4udHMnXG5pbXBvcnQgeyBjb21wb3NlIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb2xlIGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG59XG4iLCJpbXBvcnQgdHlwZSBQZXJtaXNzaW9uIGZyb20gJy4vUGVybWlzc2lvbkVudGl0eS50cydcbmltcG9ydCB0eXBlIFJvbGUgZnJvbSAnLi9Sb2xlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBCYXNlRW50aXR5IGZyb20gJyNzaGFyZWQvbWl4aW5zL0Jhc2VFbnRpdHlNaXhpbi50cydcbmltcG9ydCBUaW1lc3RhbXBNaXhpbiBmcm9tICcjc2hhcmVkL21peGlucy9UaW1lc3RhbXBNaXhpbi50cydcbmltcG9ydCBTb2Z0RGVsZXRlTWl4aW4gZnJvbSAnI3NoYXJlZC9taXhpbnMvU29mdERlbGV0ZU1peGluLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVc2VyRW50aXR5IGV4dGVuZHMgY29tcG9zZShCYXNlRW50aXR5LCBUaW1lc3RhbXBNaXhpbiwgU29mdERlbGV0ZU1peGluKSB7ICBcbiAgICBwdWJsaWMgaWQ6IG51bWJlclxuICAgIHB1YmxpYyBlbWFpbDogc3RyaW5nXG4gICAgcHVibGljIG5hbWU6IHN0cmluZ1xuICAgIHB1YmxpYyB1c2VybmFtZTogc3RyaW5nXG4gICAgcHVibGljIHBhc3N3b3JkPzogc3RyaW5nXG4gICAgcHVibGljIHZlcmlmaWVkX2F0PzogRGF0ZSB8IHN0cmluZyB8IG51bGxcblxuICAgIHB1YmxpYyBwZXJtaXNzaW9ucz86IFBlcm1pc3Npb25bXVxuICAgIHB1YmxpYyByb2xlcz86IFJvbGVbXVxuXG4gICAgcHVibGljIGdldCBpbml0aWFscygpe1xuICAgICAgICBjb25zdCBbZmlyc3ROYW1lLCBzZWNvbmROYW1lXSA9IHRoaXMubmFtZS5zcGxpdCgnICcpXG5cbiAgICAgICAgaWYgKCFzZWNvbmROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3ROYW1lWzBdLnRvVXBwZXJDYXNlKClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGEgPSBmaXJzdE5hbWVbMF0udG9VcHBlckNhc2UoKVxuICAgICAgICBjb25zdCBiID0gc2Vjb25kTmFtZVswXS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgcmV0dXJuIGEgKyBiXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCBhcyBDb21tYW5kZXJDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgcHJpbnRUYWJsZSwgcHJpbnRPYmplY3QgfSBmcm9tICcuLi91dGlscy9wcmludFRhYmxlLnRzJ1xuaW1wb3J0IHsgaW1wb3J0QWxsIH0gZnJvbSAnI3NlcnZlci91dGlscy9pbXBvcnRBbGwudHMnXG5pbXBvcnQgeyBFbW1pdHRlclNlcnZpY2UsIExvZ2dlclNlcnZpY2UsIHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcbmltcG9ydCAqIGFzIGlucXVpcmVyIGZyb20gJ0BpbnF1aXJlci9wcm9tcHRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaUV2ZW50cyB7XG4gICAgJ2NsaTpyZWdpc3RlcmVkJzoge1xuICAgICAgICBjbGk6IENsaVNlcnZpY2VcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlDb21tYW5kIGV4dGVuZHMgQ29tbWFuZGVyQ29tbWFuZCB7XG4gICAgcHVibGljIF9faXNfY2xpX2NvbW1hbmQgPSB0cnVlXG4gICAgcHVibGljIHRhYmxlID0gcHJpbnRUYWJsZVxuICAgIHB1YmxpYyBvYmplY3QgPSBwcmludE9iamVjdFxuICAgIHB1YmxpYyBjb2xvcnMgPSBjaGFsa1xuICAgIHB1YmxpYyBpbnF1aXJlciA9IGlucXVpcmVyXG5cbiAgICBwdWJsaWMgbmVlZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXG4gICAgcHVibGljIG5lZWQoLi4uYXJnczogc3RyaW5nW10pOiB0aGlzIHtcbiAgICAgICAgYXJncy5mb3JFYWNoKGFyZyA9PiB0aGlzLm5lZWRzLmFkZChhcmcpKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgY3JlYXRlQ29tbWFuZChuYW1lPzogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpQ29tbWFuZChuYW1lKVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpU2VydmljZSBleHRlbmRzIENsaUNvbW1hbmQge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0NsaVNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgZW1taXR0ZXIgPSBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUobmFtZSA9ICdjbGknKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ2xpU2VydmljZShuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RW1taXR0ZXIoZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gZW1taXR0ZXJcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGNyZWF0ZUNvbW1hbmQobmFtZT86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IENsaVNlcnZpY2UobmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGlyKGRpcjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGlycy5hZGQoZGlyKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWREaXIoZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbW9kcyA9IGF3YWl0IGltcG9ydEFsbChkaXIsIHtcbiAgICAgICAgICAgIGV4Y2x1ZGU6IFsnLnRlc3QudHMnLCAnLnNwZWMudHMnLCAnLnRlc3QuanMnLCAnLnNwZWMuanMnXSxcbiAgICAgICAgICAgIG9uRXJyb3I6ICh7IGVycm9yLCBmaWxlbmFtZSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IubWVzc2FnZSwgZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIG1vZF0gb2YgT2JqZWN0LmVudHJpZXMobW9kcykpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGltcG9ydGVkIGZpbGUgJHtmaWxlbmFtZX0gZnJvbSAke2Rpcn1gKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW1vZC5kZWZhdWx0IHx8IE9iamVjdC5rZXlzKG1vZC5kZWZhdWx0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW1vZC5kZWZhdWx0Ll9faXNfY2xpX2NvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBkZWZhdWx0IGV4cG9ydCBvZiBmaWxlICR7bW9kLmZpbGVuYW1lfSBpcyBub3QgYSBDbGlDb21tYW5kLCBza2lwcGluZ2ApXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IHRyeUNhdGNoLnN5bmMoKCkgPT4gdGhpcy5hZGRDb21tYW5kKG1vZC5kZWZhdWx0KSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZTogbW9kLmZpbGVuYW1lIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcilcblxuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGFkZGVkIGNvbW1hbmQgZnJvbSBmaWxlICR7ZmlsZW5hbWV9IHRvIGNsaWApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiB0aGlzLmRpcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERpcihkaXIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiIsImltcG9ydCBDbGlTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvQ2xpU2VydmljZS50cydcbmltcG9ydCBkaSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcnRlVGVzdGVyU2VydmljZSBleHRlbmRzIENsaVNlcnZpY2Uge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpIFxuXG4gICAgICAgIHRoaXMuZXhpdE92ZXJyaWRlKClcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyZU91dHB1dCh7XG4gICAgICAgICAgICB3cml0ZU91dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbW1hbmQgb3V0cHV0IGR1cmluZyB0ZXN0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRlRXJyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcHJlc3MgZXJyb3Igb3V0cHV0IGR1cmluZyB0ZXN0c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcblxuICAgICAgICBkaS5zZXQoQ2xpU2VydmljZSwgdGhpcylcblxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYWRkKHBhdGg6IHN0cmluZykge1xuICAgICAgICBhd2FpdCBpbXBvcnQocGF0aClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShhcmdzOiBzdHJpbmdbXSkge1xuICAgICAgICBhd2FpdCB0aGlzLnBhcnNlQXN5bmMoWydub2RlJywgJ2FydGUnLCAuLi5hcmdzXSlcbiAgICB9XG59XG4iLCJpbXBvcnQgY3AgZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2xpV3JhcHBlclNlcnZpY2Uge1xuICAgIHB1YmxpYyBwcm9jZXNzOiBjcC5DaGlsZFByb2Nlc3MgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgYXBwQmFzZVBhdGg6IHN0cmluZztcbiAgICBwdWJsaWMgZW52ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBwdWJsaWMgYXJnczogc3RyaW5nW10gPSBbXTtcbiAgICBwdWJsaWMgY29uZmlnQXJndW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBwdWJsaWMgY29uZmlnRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgcHVibGljIGRlYnVnOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKCk7XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBDbGlXcmFwcGVyU2VydmljZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRCYXNlUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hcHBCYXNlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWc7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29uZmlnQXJndW1lbnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jb25maWdBcmd1bWVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ29uZmlnRmlsZSguLi5maWxlUGF0aHM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuY29uZmlnRmlsZXMucHVzaCguLi5maWxlUGF0aHMpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRW52KGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZW52LnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdBcmd1bWVudHMoKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0FyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMikuZmlsdGVyKGFyZyA9PiBhcmcuc3RhcnRzV2l0aCgnQGNvbmZpZzonKSlcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGNvbmZpZ0FyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGVudHJ5LnNsaWNlKCdAY29uZmlnOicubGVuZ3RoKS5zcGxpdCgnPScpLm1hcChzID0+IHMudHJpbSgpKTtcblxuICAgICAgICAgICAgdGhpcy5jb25maWdBcmd1bWVudHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGaWxlcygpIHtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZUFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilcbiAgICAgICAgICAgIC5maWx0ZXIoYXJnID0+IGFyZy5zdGFydHNXaXRoKCdAY29uZmlnLWZpbGU6JykpXG4gICAgICAgICAgICAubWFwKGFyZyA9PiBhcmcuc2xpY2UoJ0Bjb25maWctZmlsZTonLmxlbmd0aCkpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29uZmlnRmlsZSguLi5jb25maWdGaWxlQXJncyk7XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LkNPTkZJR19GSUxFUykge1xuICAgICAgICAgICAgY29uc3QgZW52RmlsZXMgPSBwcm9jZXNzLmVudi5DT05GSUdfRklMRVMuc3BsaXQoJywnKS5tYXAoZiA9PiBmLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICB0aGlzLmFkZENvbmZpZ0ZpbGUoLi4uZW52RmlsZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRFbnZpcm9ubWVudCgpIHtcbiAgICAgICAgY29uc3QgY29uZmlnQXJndW1lbnRzID0gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ0FyZ3VtZW50cy5lbnRyaWVzKCkpXG4gICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX09JHt2YWx1ZX1gKS5qb2luKCc7Jyk7XG5cbiAgICAgICAgdGhpcy5hZGRFbnYoJ1pFTklUSF9DT05GSUdfQVJHVU1FTlRTJywgY29uZmlnQXJndW1lbnRzKTsgXG4gICAgICAgIHRoaXMuYWRkRW52KCdaRU5JVEhfQ09ORklHX0ZJTEVTJywgdGhpcy5jb25maWdGaWxlcy5qb2luKCcsJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQXJndW1lbnRzKGFyZ3M6IHN0cmluZ1tdID0gW10pIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlcyA9IFsnQGNvbmZpZzonLCAnQGNvbmZpZy1maWxlOiddO1xuXG4gICAgICAgIGNvbnN0IGZvcndhcmRBcmdzID0gYXJncy5maWx0ZXIoYXJnID0+ICFuYW1lc3BhY2VzLnNvbWUobnMgPT4gYXJnLnN0YXJ0c1dpdGgobnMpKSk7XG5cbiAgICAgICAgdGhpcy5hcmdzID0gW1xuICAgICAgICAgICAgJy0tbm8td2FybmluZ3MnLFxuICAgICAgICAgICAgJy0tZXhwZXJpbWVudGFsLXN0cmlwLXR5cGVzJyxcbiAgICAgICAgICAgICctLWVuYWJsZS1zb3VyY2UtbWFwcycsXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy5hcHBCYXNlUGF0aCwgJ3NlcnZlcicsICdjbGkudHMnKSxcbiAgICAgICAgICAgIC4uLmZvcndhcmRBcmdzLFxuICAgICAgICBdO1xuXG4gICAgfVxuXG4gICAgcHVibGljIGtpbGwoY29kZTogbnVtYmVyID0gMCkge1xuICAgICAgICBpZiAodGhpcy5wcm9jZXNzICYmICF0aGlzLnByb2Nlc3Mua2lsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3Mua2lsbCgnU0lHVEVSTScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW4oYXJncz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghdGhpcy5hcHBCYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYXNlIHBhdGggbm90IHNldC4gUGxlYXNlIGNhbGwgc2V0QmFzZVBhdGgoKSBiZWZvcmUgcnVuKCkuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRDb25maWdBcmd1bWVudHMoKTtcbiAgICAgICAgdGhpcy5sb2FkQ29uZmlnRmlsZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkQXJndW1lbnRzKGFyZ3MgfHwgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpKTtcblxuICAgICAgICB0aGlzLmxvYWRFbnZpcm9ubWVudCgpO1xuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncnVuJywge1xuICAgICAgICAgICAgICAgIGFyZ3M6IHRoaXMuYXJncyxcbiAgICAgICAgICAgICAgICBlbnY6IHRoaXMuZW52LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJvY2VzcyA9IGNwLnNwYXduKCdub2RlJywgdGhpcy5hcmdzLCB7XG4gICAgICAgICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgICAgICAgZW52OiB7XG4gICAgICAgICAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgICAgICAgICAgLi4uT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuZW52LmVudHJpZXMoKSksXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICAgICAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICAgICAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHRoaXMua2lsbCgpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlUGF0aCguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgQkFTRV9QQVRIID0gcHJvY2Vzcy5lbnYuWkVOSVRIX0JBU0VfUEFUSCFcblxuICAgIGlmICghQkFTRV9QQVRIKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWkVOSVRIX0JBU0VfUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0JylcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5yZXNvbHZlKEJBU0VfUEFUSCwgLi4uYXJncylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JhZ2VQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBCQVNFX1BBVEggPSBwcm9jZXNzLmVudi5aRU5JVEhfQkFTRV9QQVRIIVxuICAgIGNvbnN0IFNUT1JBR0VfUEFUSCA9IHByb2Nlc3MuZW52LlpFTklUSF9TVE9SQUdFX1BBVEggfHwgcGF0aC5qb2luKEJBU0VfUEFUSCB8fCAnJywgJ3N0b3JhZ2UnKVxuXG4gICAgcmV0dXJuIHBhdGgucmVzb2x2ZShTVE9SQUdFX1BBVEgsIC4uLmFyZ3MpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZVRvQmFzZVBhdGgoLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IEJBU0VfUEFUSCA9IHByb2Nlc3MuZW52LlpFTklUSF9CQVNFX1BBVEghXG5cbiAgICBpZiAoIUJBU0VfUEFUSCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pFTklUSF9CQVNFX1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgcGF0aC5yZXNvbHZlKEJBU0VfUEFUSCwgLi4uYXJncykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0bXBQYXRoKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmFzZVBhdGgoJ3RtcCcsIC4uLmFyZ3MpXG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgYmFzZVBhdGggfSBmcm9tICcjc2VydmVyL3V0aWxzL2Jhc2VQYXRoLnRzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcbmltcG9ydCBsb2dnZXIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2xvZ2dlci50cydcbmltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZ0ZTU2VydmljZU9wdGlvbnMge1xuICAgIGRpcmVjdG9yeT86IHN0cmluZ1xuICAgIGZvcm1hdD86ICdqc29uJyB8ICd5bWwnXG4gICAgZm9ybWF0T3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ0ZTU2VydmljZSBleHRlbmRzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBmb3JtYXQ6ICdqc29uJyB8ICd5bWwnID0gJ2pzb24nXG4gICAgcHVibGljIGZvcm1hdE9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25maWdGU1NlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyBmYWxzZVxuICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IG9wdGlvbnMuZGlyZWN0b3J5ID8/IGJhc2VQYXRoKCdjb25maWcnKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnY29uZmlnJyB9KVxuICAgICAgICB0aGlzLmZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0ID8/ICdqc29uJ1xuICAgICAgICB0aGlzLmZvcm1hdE9wdGlvbnMgPSBvcHRpb25zLmZvcm1hdE9wdGlvbnMgPz8ge31cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgaW5pdGlhbGl6ZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGUoZW50cnk6IHN0cmluZywgZGF0YTogYW55KSB7XG4gICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcblxuICAgICAgICBsZXQgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIHRoaXMuZm9ybWF0T3B0aW9ucy5pbmRlbnQgfHwgNClcblxuICAgICAgICBpZiAodGhpcy5mb3JtYXQgPT09ICd5bWwnKSB7XG4gICAgICAgICAgICBjb250ZW50ID0geWFtbC5kdW1wKGRhdGEsIHRoaXMuZm9ybWF0T3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IGZzLnByb21pc2VzLndyaXRlRmlsZShmaWxlbmFtZSwgY29udGVudCwgJ3V0Zi04JylcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTeW5jKGVudHJ5OiBzdHJpbmcsIGRhdGE6IGFueSkge1xuICAgICAgICBjb25zdCBleHQgPSB0aGlzLmZvcm1hdCA9PT0gJ3ltbCcgPyAneW1sJyA6ICdqc29uJ1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguam9pbih0aGlzLmRpcmVjdG9yeSwgYCR7ZW50cnl9LiR7ZXh0fWApXG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCA0KVxuXG4gICAgICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gJ3ltbCcpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSB5YW1sLmR1bXAoZGF0YSwgdGhpcy5mb3JtYXRPcHRpb25zKVxuICAgICAgICB9XG5cbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmaWxlbmFtZSwgY29udGVudCwgJ3V0Zi04JylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZGlyZWN0b3J5KSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgY29uZmlnIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgY3JlYXRpbmc6ICR7dGhpcy5kaXJlY3Rvcnl9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZnMubWtkaXJTeW5jKHRoaXMuZGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRoaXMuZGlyZWN0b3J5KVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlbmFtZSlcblxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSAnanNvbicgJiYgZXh0ICE9PSAnLmpzb24nKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ID09PSAneW1sJyAmJiBleHQgIT09ICcueW1sJykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBmaWxlbmFtZSlcblxuICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBqc29uXSA9IGF3YWl0IHRyeUNhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpXG5cbiAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGVuYW1lKSA9PT0gJy55bWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB5YW1sLmxvYWQodGV4dClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSwgcGF0aC5leHRuYW1lKGZpbGVuYW1lKSlcblxuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwganNvbiwgJ2ZpbGVzeXN0ZW0nKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBsb2FkZWQgY29uZmlnIGZpbGU6ICR7ZmlsZW5hbWV9YClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnY29uZmlnIGxvYWRlZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VLZXkoZnVsbEtleTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IFtlbnRyeSwgLi4ucmVzdF0gPSBmdWxsS2V5LnNwbGl0KCcuJylcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZW50cnksXG4gICAgICAgICAgICBrZXk6IHJlc3Quam9pbignLicpIFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldChmdWxsS2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHNvdXJjZSA9ICdmaWxlc3lzdGVtJyk6IHZvaWQge1xuICAgICAgICBzdXBlci5zZXQoZnVsbEtleSwgdmFsdWUsIHNvdXJjZSlcblxuICAgICAgICBpZiAoc291cmNlICE9PSAnZmlsZXN5c3RlbScpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBlbnRyeSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG4gICAgICAgIFxuICAgICAgICBsZXQgdmFsdWVzID0gdGhpcy5nZXQoZW50cnkpXG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5ICYmIHZhbHVlcykge1xuICAgICAgICAgICAgc2V0KHZhbHVlcywga2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud3JpdGVTeW5jKGVudHJ5LCB2YWx1ZXMpXG4gICAgICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyB1bnNldChmdWxsS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyBlbnRyeSwga2V5IH0gPSB0aGlzLnBhcnNlS2V5KGZ1bGxLZXkpXG5cbiAgICAgICAgaWYgKCFrZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZm9ybWF0ID09PSAneW1sJyA/ICd5bWwnIDogJ2pzb24nXG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5qb2luKHRoaXMuZGlyZWN0b3J5LCBgJHtlbnRyeX0uJHtleHR9YClcblxuICAgICAgICAgICAgZnMudW5saW5rU3luYyhmaWxlbmFtZSlcblxuICAgICAgICAgICAgc3VwZXIudW5zZXQoZnVsbEtleSlcblxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0KGVudHJ5KVxuXG4gICAgICAgIHNldCh2YWx1ZXMsIGtleSwgdW5kZWZpbmVkKVxuXG4gICAgICAgIHRoaXMud3JpdGVTeW5jKGVudHJ5LCB2YWx1ZXMpXG5cbiAgICAgICAgc3VwZXIudW5zZXQoZnVsbEtleSlcbiAgICB9XG59XG5cbiIsImltcG9ydCBtcyBmcm9tICdtcydcbmltcG9ydCB0eXBlIERyaXZlRW50cnkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTsgLy8gbXMgZm9ybWF0LCBlLmcuICcxaCcsICczMG0nLCAnMTVzJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFVybE9wdGlvbnMge1xuICAgIGV4cGlyZXM/OiBtcy5TdHJpbmdWYWx1ZTsgLy8gbXMgZm9ybWF0LCBlLmcuICcxaCcsICczMG0nLCAnMTVzJ1xuICAgIG1pbWVfdHlwZXM/OiBzdHJpbmdbXTtcbiAgICBtYXhfc2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVCYXNlR2F0ZXdheSB7XG4gICAgcHVibGljIGlkOiBzdHJpbmdcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgcHVibGljIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPERyaXZlQmFzZUdhdGV3YXksICdpZCcgfCAnbmFtZScgfCAnZGVzY3JpcHRpb24nIHwgJ2NvbmZpZyc+KSB7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkXG4gICAgICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZVxuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvblxuICAgICAgICB0aGlzLmNvbmZpZyA9IGRhdGEuY29uZmlnXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoZm9sZGVyPzogc3RyaW5nKTogUHJvbWlzZTxEcml2ZUVudHJ5W10+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZvbGRlciB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICAgIHB1YmxpYyBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGZpbGVuYW1lIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRTdHJlYW0oZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Tm9kZUpTLlJlYWRhYmxlU3RyZWFtPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVuYW1lOiBzdHJpbmcsIGRhdGE6IFVpbnQ4QXJyYXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICBkYXRhIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgc3RyZWFtIFxuICAgICAgICB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZShmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBmaWxlbmFtZSB9KVxuXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgfVxuXG4gICAgcHVibGljIHVybChmaWxlbmFtZTogc3RyaW5nLCBvcHRpb25zPzogVXJsT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBcbiAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgb3B0aW9ucyBcbiAgICAgICAgfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9ucz86IFVwbG9hZFVybE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgXG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIG9wdGlvbnMgXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gICAgXG59XG4iLCJpbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSdcbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IG1zIGZyb20gJ21zJ1xuaW1wb3J0IHtcbiAgICBTM0NsaWVudCxcbiAgICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgICBHZXRPYmplY3RDb21tYW5kLFxuICAgIFB1dE9iamVjdENvbW1hbmQsXG4gICAgRGVsZXRlT2JqZWN0Q29tbWFuZCxcbiAgICBEZWxldGVPYmplY3RzQ29tbWFuZCxcbiAgICBIZWFkT2JqZWN0Q29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJ1xuaW1wb3J0IHsgZ2V0U2lnbmVkVXJsIH0gZnJvbSAnQGF3cy1zZGsvczMtcmVxdWVzdC1wcmVzaWduZXInXG5pbXBvcnQgeyBVcGxvYWQgfSBmcm9tICdAYXdzLXNkay9saWItc3RvcmFnZSdcbmltcG9ydCB0eXBlIHsgSW5mZXJPdXRwdXQgfSBmcm9tICd2YWxpYm90J1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSdcbmltcG9ydCBEcml2ZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5jb25zdCBzY2hlbWEgPSB2YWxpZGF0b3IuY3JlYXRlKCh2KSA9PiB2Lm9iamVjdCh7XG4gICAgYnVja2V0OiB2LnBpcGUodi5zdHJpbmcoKSwgdi5taW5MZW5ndGgoMSkpLFxuICAgIHJlZ2lvbjogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBhY2Nlc3NLZXlJZDogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICBzZWNyZXRBY2Nlc3NLZXk6IHYucGlwZSh2LnN0cmluZygpLCB2Lm1pbkxlbmd0aCgxKSksXG4gICAgc2Vzc2lvblRva2VuOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIGVuZHBvaW50OiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIHByZWZpeDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbn0pKVxuXG5leHBvcnQgdHlwZSBTM0RyaXZlQ29uZmlnID0gSW5mZXJPdXRwdXQ8dHlwZW9mIHNjaGVtYT5cblxuZnVuY3Rpb24gc3RyZWFtVG9VaW50OEFycmF5KHN0cmVhbTogYW55KTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgaWYgKCFzdHJlYW0gfHwgdHlwZW9mIHN0cmVhbSAhPT0gJ29iamVjdCcgfHwgdHlwZW9mIHN0cmVhbS5vbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBVaW50OEFycmF5KCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdXG4gICAgICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChCdWZmZXIuZnJvbShjaHVuaykpKVxuICAgICAgICBzdHJlYW0ub24oJ2VuZCcsICgpID0+IHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmNvbmNhdChjaHVua3MpKSkpXG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpXG4gICAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVTMyBleHRlbmRzIEJhc2VEcml2ZSB7XG4gICAgcHJpdmF0ZSBzY2hlbWEgPSBzY2hlbWFcblxuICAgIHByaXZhdGUgX2NsaWVudD86IFMzQ2xpZW50XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBQaWNrPEJhc2VEcml2ZSwgJ2lkJyB8ICduYW1lJyB8ICdkZXNjcmlwdGlvbicgfCAnY29uZmlnJz4pIHtcbiAgICAgICAgc3VwZXIoZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQodGhpcy5jb25maWcsIHRoaXMuc2NoZW1hKVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tWYWxpZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigkdCgnSW52YWxpZCBkcml2ZSBjb25maWd1cmF0aW9uJykpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IGJ1Y2tldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKHRoaXMuY29uZmlnIGFzIFMzRHJpdmVDb25maWcpLmJ1Y2tldFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgcHJlZml4KCk6IHN0cmluZyB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWc/LnByZWZpeCkgcmV0dXJuICcnXG5cbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZz8ucHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVmaXggKyAnLydcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVmaXhcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEtleShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgY2xlYW5GaWxlbmFtZSA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lLnNsaWNlKDEpIDogZmlsZW5hbWVcbiAgICAgICAgaWYgKCF0aGlzLnByZWZpeCkge1xuICAgICAgICAgICAgcmV0dXJuIGNsZWFuRmlsZW5hbWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGVhblByZWZpeCA9IHRoaXMucHJlZml4LmVuZHNXaXRoKCcvJykgPyB0aGlzLnByZWZpeCA6IGAke3RoaXMucHJlZml4fS9gXG4gICAgICAgIHJldHVybiBgJHtjbGVhblByZWZpeH0ke2NsZWFuRmlsZW5hbWV9YFxuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgY2xpZW50KCk6IFMzQ2xpZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2NsaWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWcgYXMgUzNEcml2ZUNvbmZpZ1xuXG4gICAgICAgIHRoaXMuX2NsaWVudCA9IG5ldyBTM0NsaWVudCh7XG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgICBlbmRwb2ludDogY29uZmlnLmVuZHBvaW50LFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXlJZDogY29uZmlnLmFjY2Vzc0tleUlkLFxuICAgICAgICAgICAgICAgIHNlY3JldEFjY2Vzc0tleTogY29uZmlnLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uVG9rZW46IGNvbmZpZy5zZXNzaW9uVG9rZW4sXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudFxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHM6IEJhc2VEcml2ZVsnZXhpc3RzJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VuZChuZXcgSGVhZE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Q6IEJhc2VEcml2ZVsnbGlzdCddID0gYXN5bmMgKGZvbGRlcikgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuXG4gICAgICAgIGxldCBQcmVmaXggPSBmb2xkZXIgPyB0aGlzLmdldEtleShmb2xkZXIpIDogdGhpcy5wcmVmaXggfHwgdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKFByZWZpeCAmJiAhUHJlZml4LmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgIFByZWZpeCArPSAnLydcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIFByZWZpeCxcbiAgICAgICAgICAgIERlbGltaXRlcjogJy8nLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKGNvbW1hbmQpXG5cbiAgICAgICAgY29uc3QgZW50cmllczogRHJpdmVFbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgY29uc3QgY29tbW9uUHJlZml4ZXMgPSByZXNwLkNvbW1vblByZWZpeGVzIHx8IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBwcmVmaXggb2YgY29tbW9uUHJlZml4ZXMpIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSBwcmVmaXguUHJlZml4IHx8ICcnXG5cbiAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKHRoaXMucHJlZml4LCAnJylcblxuICAgICAgICAgICAgaWYgKGtleS5lbmRzV2l0aCgnLycpKSB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5LnNsaWNlKDAsIC0xKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IG5ldyBEcml2ZUVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZToga2V5LnNwbGl0KCcvJykucG9wKCkgfHwga2V5LFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIGtleSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlyZWN0b3J5JyxcbiAgICAgICAgICAgICAgICBtZXRhczoge1xuICAgICAgICAgICAgICAgICAgICBzaXplOiAwLFxuICAgICAgICAgICAgICAgICAgICBtaW1ldHlwZTogJ2FwcGxpY2F0aW9uL3gtZGlyZWN0b3J5J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRzID0gcmVzcC5Db250ZW50cyB8fCBbXVxuXG4gICAgICAgIGZvciAoY29uc3Qgb2JqIG9mIGNvbnRlbnRzKSB7XG4gICAgICAgICAgICBsZXQga2V5ID0gb2JqLktleSB8fCAnJ1xuXG4gICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSh0aGlzLnByZWZpeCwgJycpXG5cbiAgICAgICAgICAgIGlmIChrZXkuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gbmV3IERyaXZlRW50aXR5KHtcbiAgICAgICAgICAgICAgICBuYW1lOiBrZXkuc3BsaXQoJy8nKS5wb3AoKSB8fCBrZXksXG4gICAgICAgICAgICAgICAgcGF0aDogJy8nICsga2V5LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdmaWxlJyxcbiAgICAgICAgICAgICAgICBtZXRhczoge1xuICAgICAgICAgICAgICAgICAgICBzaXplOiBvYmouU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IG1pbWUuZ2V0VHlwZShrZXkpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJpZXNcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZDogQmFzZURyaXZlWydmaW5kJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lIDogJy8nICsgZmlsZW5hbWVcbiAgICAgICAgY29uc3QgZm9sZGVyID0gZGlybmFtZShmaWxlcGF0aClcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5saXN0KGZvbGRlcilcblxuICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXMuZmluZChlID0+IGUucGF0aCA9PT0gZmlsZXBhdGgpXG5cbiAgICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIFwiJHtmaWxlcGF0aH1cIiBub3QgZm91bmRgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudHJ5XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG1rZGlyKF9maWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgLy8gUzMgaXMgb2JqZWN0IHN0b3JhZ2U7IGRpcmVjdG9yaWVzIGFyZSBpbXBsaWNpdC4gQ3JlYXRlIGEgemVyby1ieXRlIG9iamVjdCB3aXRoIHRyYWlsaW5nIHNsYXNoIHRvIGVtdWxhdGUgZGlyZWN0b3J5IGlmIG5lZWRlZC5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHJlYWQ6IEJhc2VEcml2ZVsncmVhZCddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KSlcblxuICAgICAgICBjb25zdCBib2R5ID0gcmVzcC5Cb2R5IGFzIFJlYWRhYmxlXG5cbiAgICAgICAgcmV0dXJuIHN0cmVhbVRvVWludDhBcnJheShib2R5KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gbmV3IEdldE9iamVjdENvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIEtleVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKGNvbW1hbmQpXG5cbiAgICAgICAgY29uc3QgYm9keSA9IHJlc3AuQm9keSBhcyBhbnlcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGJvZHkpXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlOiBCYXNlRHJpdmVbJ3dyaXRlJ10gPSBhc3luYyAoZmlsZW5hbWUsIGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXksXG4gICAgICAgICAgICBCb2R5OiBCdWZmZXIuZnJvbShkYXRhKVxuICAgICAgICB9KSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCB1cGxvYWQgPSBuZXcgVXBsb2FkKHtcbiAgICAgICAgICAgIGNsaWVudDogdGhpcy5jbGllbnQsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgICAgIEtleSxcbiAgICAgICAgICAgICAgICBCb2R5OiBSZWFkYWJsZS5mcm9tKHN0cmVhbSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHVwbG9hZC5kb25lKClcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlOiBCYXNlRHJpdmVbJ2RlbGV0ZSddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmZpbmQoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKGVudHJ5LnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBEZWxldGVPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICAgICAgICAgIEtleVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChjb21tYW5kKVxuXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoe1xuICAgICAgICAgICAgQnVja2V0OiB0aGlzLmJ1Y2tldCxcbiAgICAgICAgICAgIFByZWZpeDogS2V5XG4gICAgICAgIH0pKVxuXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlID0gKGxpc3RSZXNwb25zZS5Db250ZW50cyB8fCBbXSkubWFwKGMgPT4gKHsgS2V5OiBjLktleSB9KSlcblxuICAgICAgICBpZiAodG9EZWxldGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQobmV3IERlbGV0ZU9iamVjdHNDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBEZWxldGU6IHsgT2JqZWN0czogdG9EZWxldGUgfVxuICAgICAgICB9KSlcblxuICAgICAgICBpZiAobGlzdFJlc3BvbnNlLklzVHJ1bmNhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShmaWxlbmFtZSkgLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGlmIHRoZXJlIGFyZSBtb3JlIG9iamVjdHMgdG8gZGVsZXRlZFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgdXJsOiBCYXNlRHJpdmVbJ3VybCddID0gYXN5bmMgKGZpbGVuYW1lLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG5cbiAgICAgICAgY29uc3QgS2V5ID0gdGhpcy5nZXRLZXkoZmlsZW5hbWUpXG5cbiAgICAgICAgY29uc3QgZXhwaXJlc01zID0gbXMob3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJykgfHwgMzAgKiA2MCAqIDEwMDBcbiAgICAgICAgY29uc3QgZXhwaXJlc1NlY29uZHMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGV4cGlyZXNNcyAvIDEwMDApKVxuXG4gICAgICAgIHJldHVybiBnZXRTaWduZWRVcmwodGhpcy5jbGllbnQsIG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXlcbiAgICAgICAgfSksIHsgZXhwaXJlc0luOiBleHBpcmVzU2Vjb25kcyB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmw6IEJhc2VEcml2ZVsndXBsb2FkVXJsJ10gPSBhc3luYyAoZmlsZW5hbWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcblxuICAgICAgICBjb25zdCBLZXkgPSB0aGlzLmdldEtleShmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBleHBpcmVzTXMgPSBtcyhvcHRpb25zPy5leHBpcmVzIHx8ICczMG0nKSB8fCAzMCAqIDYwICogMTAwMFxuICAgICAgICBjb25zdCBleHBpcmVzU2Vjb25kcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoZXhwaXJlc01zIC8gMTAwMCkpXG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IG5ldyBQdXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICAgICAgICBLZXksXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIGdldFNpZ25lZFVybCh0aGlzLmNsaWVudCwgY29tbWFuZCwgeyBleHBpcmVzSW46IGV4cGlyZXNTZWNvbmRzIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IFMzRHJpdmUgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZVMzR2F0ZXdheS50cydcbmltcG9ydCB0eXBlIHsgUzNEcml2ZUNvbmZpZyB9IGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5cbmludGVyZmFjZSBJbml0aU9wdGlvbnMgZXh0ZW5kcyBPbWl0PFMzRHJpdmVDb25maWcsICduYW1lJyB8ICdkZXNjcmlwdGlvbic+IHtcbiAgICBwcmVmaXg/OiBzdHJpbmdcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ1MzU2VydmljZSBleHRlbmRzIENvbmZpZ1NlcnZpY2Uge1xuICAgIHB1YmxpYyBwcmVmaXggPSAnJ1xuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBkcml2ZTogUzNEcml2ZVxuICAgIHB1YmxpYyBidWNrZXQ6IHN0cmluZ1xuICAgIHB1YmxpYyByZWdpb246IHN0cmluZ1xuICAgIHB1YmxpYyBlbmRwb2ludD86IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSW5pdGlPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKClcblxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyBmYWxzZVxuICAgICAgICB0aGlzLnByZWZpeCA9IG9wdGlvbnMucHJlZml4ID8/ICcnXG4gICAgICAgIHRoaXMuYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcbiAgICAgICAgdGhpcy5yZWdpb24gPSBvcHRpb25zLnJlZ2lvbiB8fCAnJ1xuICAgICAgICB0aGlzLmVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludFxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcblxuICAgICAgICB0aGlzLmRyaXZlID0gbmV3IFMzRHJpdmUoe1xuICAgICAgICAgICAgaWQ6ICdjb25maWctczMnLFxuICAgICAgICAgICAgbmFtZTogJ2NvbmZpZy1zMycsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IG9wdGlvbnMuYnVja2V0LFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgICAgICAgICAgYWNjZXNzS2V5SWQ6IG9wdGlvbnMuYWNjZXNzS2V5SWQsXG4gICAgICAgICAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiBvcHRpb25zLnNlY3JldEFjY2Vzc0tleSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uVG9rZW46IG9wdGlvbnMuc2Vzc2lvblRva2VuLFxuICAgICAgICAgICAgICAgIGVuZHBvaW50OiBvcHRpb25zLmVuZHBvaW50LFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1Zygnc2VydmljZSBpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VLZXkoZnVsbEtleTogc3RyaW5nKTogeyBmaWxlbmFtZTogc3RyaW5nOyBrZXk6IHN0cmluZyB9IHtcbiAgICAgICAgY29uc3QgW2ZpbGVuYW1lLCAuLi5yZXN0XSA9IGZ1bGxLZXkuc3BsaXQoJy4nKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgICAgIGtleTogcmVzdC5qb2luKCcuJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICB0aGlzLmNsZWFyKClcblxuICAgICAgICBjb25zdCBwcmVmaXggPSB0aGlzLnByZWZpeC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpXG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZHJpdmUubGlzdChwcmVmaXggfHwgdW5kZWZpbmVkKVxuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBlbnRyeS5uYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVwYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZVxuXG4gICAgICAgICAgICBjb25zdCBbZXJyb3IsIGRhdGFdID0gYXdhaXQgdHJ5Q2F0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZiA9IGF3YWl0IHRoaXMuZHJpdmUucmVhZChmaWxlcGF0aClcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBCdWZmZXIuZnJvbShidWYpLnRvU3RyaW5nKCd1dGYtOCcpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBsb2FkIGNvbmZpZyBmaWxlICR7ZmlsZW5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qga2V5ID0gZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCAnJylcblxuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgZGF0YSlcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgbG9hZGVkIGNvbmZpZyBmaWxlOiAke2ZpbGVuYW1lfWApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbmZpZyBsb2FkZWQgaW4gZGVidWcgbW9kZScpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0KGZ1bGxLZXk6IHN0cmluZywgdmFsdWU6IGFueSwgc291cmNlID0gJ3MzJyk6IHZvaWQge1xuICAgICAgICBzdXBlci5zZXQoZnVsbEtleSwgdmFsdWUsIHNvdXJjZSlcblxuICAgICAgICBpZiAoc291cmNlICE9PSAnczMnKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGtleSB9ID0gdGhpcy5wYXJzZUtleShmdWxsS2V5KVxuXG4gICAgICAgIGxldCB2YWx1ZXMgPSB0aGlzLmdldChmaWxlbmFtZSlcblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgdmFsdWVzID0gdmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXkgJiYgdmFsdWVzKSB7XG4gICAgICAgICAgICBzZXQodmFsdWVzLCBrZXksIHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xlYW5QcmVmaXggPSB0aGlzLnByZWZpeC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgJycpXG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2ZpbGVuYW1lfS5qc29uYCA6IGAke2ZpbGVuYW1lfS5qc29uYFxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh2YWx1ZXMsIG51bGwsIDQpKVxuXG4gICAgICAgIHRoaXMuZHJpdmUud3JpdGUoZmlsZVBhdGgsIGJvZHkgYXMgdW5rbm93biBhcyBVaW50OEFycmF5KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2ZhaWxlZCB0byB3cml0ZSBjb25maWcgdG8gczMnLCBlcnIpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHVuc2V0KGZ1bGxLZXk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGVhblByZWZpeCA9IHRoaXMucHJlZml4LnJlcGxhY2UoL15cXC98XFwvJC9nLCAnJylcblxuICAgICAgICBpZiAoIWZ1bGxLZXkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2Z1bGxLZXl9Lmpzb25gIDogYCR7ZnVsbEtleX0uanNvbmBcblxuICAgICAgICAgICAgdGhpcy5kcml2ZS5kZWxldGUoZmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gZGVsZXRlIGNvbmZpZyBmcm9tIHMzJywgZXJyKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZmlsZW5hbWUsIGtleSB9ID0gdGhpcy5wYXJzZUtleShmdWxsS2V5KVxuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuZ2V0KGZpbGVuYW1lKVxuXG4gICAgICAgIHNldCh2YWx1ZXMsIGtleSwgdW5kZWZpbmVkKVxuXG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBjbGVhblByZWZpeCA/IGAke2NsZWFuUHJlZml4fS8ke2ZpbGVuYW1lfS5qc29uYCA6IGAke2ZpbGVuYW1lfS5qc29uYFxuXG4gICAgICAgIHRoaXMuZHJpdmUud3JpdGUoZmlsZVBhdGgsIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHZhbHVlcywgbnVsbCwgNCkpIGFzIHVua25vd24gYXMgVWludDhBcnJheSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdmYWlsZWQgdG8gd3JpdGUgY29uZmlnIHRvIHMzJywgZXJyKVxuICAgICAgICB9KVxuXG4gICAgICAgIHN1cGVyLnVuc2V0KGZ1bGxLZXkpXG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ0ZTU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0NvbmZpZ0ZTU2VydmljZS50cydcbmltcG9ydCBDb25maWdTM1NlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Db25maWdTM1NlcnZpY2UudHMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCB0eXBlIExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgZmxhdHRlbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvZmxhdHRlbi50cydcbmltcG9ydCB0eXBlIEVudlNlcnZpY2UgZnJvbSAnLi9FbnZTZXJ2aWNlLnRzJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHlhbWwgZnJvbSAnanMteWFtbCdcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdNYW5hZ2VyT3B0aW9ucyB7XG4gICAgZW52OiBFbnZTZXJ2aWNlXG4gICAgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgc2lsZW50PzogYm9vbGVhblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdNYW5hZ2VyU2VydmljZSB7XG4gICAgcHVibGljIGVudjogRW52U2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgc2lsZW50OiBib29sZWFuXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25maWdNYW5hZ2VyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmVudiA9IG9wdGlvbnMuZW52XG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXJcbiAgICAgICAgdGhpcy5zaWxlbnQgPSBvcHRpb25zLnNpbGVudCA/PyBmYWxzZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlKG9wdGlvbnM6IENvbmZpZ01hbmFnZXJPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSBuZXcgQ29uZmlnTWFuYWdlclNlcnZpY2Uob3B0aW9ucylcblxuICAgICAgICByZXR1cm4gc2VydmljZVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZFMzQ29uZmlnKCkge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gbmV3IENvbmZpZ1MzU2VydmljZSh7XG4gICAgICAgICAgICBidWNrZXQ6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19CVUNLRVQnKSEsXG4gICAgICAgICAgICByZWdpb246IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19SRUdJT04nKSEsXG4gICAgICAgICAgICBhY2Nlc3NLZXlJZDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX0FDQ0VTU19LRVlfSUQnKSEsXG4gICAgICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19TM19TRUNSRVRfQUNDRVNTX0tFWScpISxcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfREVCVUcnKSxcbiAgICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfRU5EUE9JTlQnKSxcbiAgICAgICAgICAgIHByZWZpeDogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX1MzX1BSRUZJWCcpLFxuICAgICAgICAgICAgc2Vzc2lvblRva2VuOiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfUzNfU0VTU0lPTl9UT0tFTicpLFxuICAgICAgICAgICAgbG9nZ2VyOiB0aGlzLmxvZ2dlcixcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXJ2aWNlLmxvYWQoKVxuXG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3VzaW5nIFMzIGNvbmZpZ3VyYXRpb24gc2VydmljZScsIHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IHNlcnZpY2UuYnVja2V0LFxuICAgICAgICAgICAgICAgIHJlZ2lvbjogc2VydmljZS5yZWdpb24sXG4gICAgICAgICAgICAgICAgcHJlZml4OiBzZXJ2aWNlLnByZWZpeFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIHNlcnZpY2VcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRGU0NvbmZpZygpIHtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9IG5ldyBDb25maWdGU1NlcnZpY2Uoe1xuICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRlNfUEFUSCcpLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19ERUJVRycpLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLmVudi5nZXQoJ1pFTklUSF9DT05GSUdfRlNfRk9STUFUJykhLFxuICAgICAgICAgICAgZm9ybWF0T3B0aW9uczogdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0ZTX0ZPUk1BVF9PUFRJT05TJykgfHwge30sXG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNlcnZpY2UubG9hZCgpXG5cbiAgICAgICAgaWYgKCF0aGlzLnNpbGVudCkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbygndXNpbmcgZmlsZXN5c3RlbSBjb25maWd1cmF0aW9uIHNlcnZpY2UnLCB7IHBhdGg6IHNlcnZpY2UuZGlyZWN0b3J5IH0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VydmljZVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkQ29uZmlnRnJvbUVudihzZXJ2aWNlOiBDb25maWdTZXJ2aWNlKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZsYXR0ZW4odGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHJykgfHwge30pKSkge1xuICAgICAgICAgICAgc2VydmljZS5zZXQoa2V5LCB2YWx1ZSwgJ2VudicpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmbGF0dGVuKHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19BUkdVTUVOVFMnKSB8fCB7fSkpKSB7XG4gICAgICAgICAgICBzZXJ2aWNlLnNldChrZXksIHZhbHVlLCAnYXJndW1lbnQnKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRDb25maWdGcm9tRmlsZShzZXJ2aWNlOiBDb25maWdTZXJ2aWNlLCBmaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGUpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBjb25maWd1cmF0aW9uIGZpbGUgbm90IGZvdW5kOiAke2ZpbGV9YClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGV4dCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKVxuICAgICAgICBsZXQgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsXG5cbiAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoJy55bWwnKSB8fCBmaWxlLmVuZHNXaXRoKCcueWFtbCcpKSB7XG4gICAgICAgICAgICBkYXRhID0geWFtbC5sb2FkKHRleHQpIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYHVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3JtYXQ6ICR7ZmlsZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmxhdHRlbihkYXRhKSkpIHtcbiAgICAgICAgICAgIHNlcnZpY2Uuc2V0KGtleSwgdmFsdWUsIGZpbGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZENvbmZpZ0Zyb21GaWxlcyhzZXJ2aWNlOiBDb25maWdTZXJ2aWNlLCBmaWxlczogc3RyaW5nW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRDb25maWdGcm9tRmlsZShzZXJ2aWNlLCBmaWxlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxDb25maWdTZXJ2aWNlPiB7XG4gICAgICAgIGxldCBzZXJ2aWNlOiBDb25maWdTZXJ2aWNlIHwgbnVsbCA9IG51bGxcblxuICAgICAgICBpZiAodGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0RSSVZFUicpID09PSAnczMnKSB7XG4gICAgICAgICAgICBzZXJ2aWNlID0gYXdhaXQgdGhpcy5sb2FkUzNDb25maWcoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzZXJ2aWNlIHx8IHRoaXMuZW52LmdldCgnWkVOSVRIX0NPTkZJR19EUklWRVInKSA9PT0gJ2ZzJykge1xuICAgICAgICAgICAgc2VydmljZSA9IGF3YWl0IHRoaXMubG9hZEZTQ29uZmlnKClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc2VydmljZTogTm8gdmFsaWQgZHJpdmVyIGZvdW5kJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0ZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc2VydmljZScpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRDb25maWdGcm9tRmlsZXMoc2VydmljZSwgdGhpcy5lbnYuZ2V0KCdaRU5JVEhfQ09ORklHX0ZJTEVTJykpXG5cbiAgICAgICAgdGhpcy5sb2FkQ29uZmlnRnJvbUVudihzZXJ2aWNlKVxuXG4gICAgICAgIHJldHVybiBzZXJ2aWNlXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgdHlwZSB7IFJlcXVlc3RJbml0IH0gZnJvbSAndW5kaWNpJ1xuaW1wb3J0IHsgZmV0Y2gsIFByb3h5QWdlbnQgfSBmcm9tICd1bmRpY2knXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcblxuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZGVkRmV0Y2hPcHRpb25zIGV4dGVuZHMgUmVxdWVzdEluaXQge1xuICAgIHByb3h5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25sb2FkU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGZldGNoKHVybDogc3RyaW5nLCBvcHRpb25zPzogRG93bmxvYWRlZEZldGNoT3B0aW9ucykge1xuICAgICAgICBjb25zdCBmZXRjaE9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnByb3h5KSB7XG4gICAgICAgICAgICBmZXRjaE9wdGlvbnMuZGlzcGF0Y2hlciAgPSBuZXcgUHJveHlBZ2VudChvcHRpb25zLnByb3h5KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ0Rvd25sb2FkaW5nIGZyb20gVVJMOicsIHVybCwgJ3dpdGggb3B0aW9uczonLCBmZXRjaE9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKVxuXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0cmVhbSh1cmw6IHN0cmluZywgb3B0aW9ucz86IERvd25sb2FkZWRGZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKHVybCwgb3B0aW9ucylcbiAgICBcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbignRmFpbGVkIHRvIGRvd25sb2FkJywgNDAwKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IFxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBcbiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0IFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAoIXJlc3BvbnNlLmJvZHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBib2R5JywgNDAwKVxuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXG4gICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdHJlYW06IHJlc3BvbnNlLmJvZHkgYXMgdW5rbm93biBhcyBOb2RlSlMuUmVhZGFibGVTdHJlYW0sXG4gICAgICAgICAgICBjb250ZW50VHlwZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Db25maWdTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgY29uZmlnID0gY29udGFpbmVyLnByb3h5PENvbmZpZ1NlcnZpY2U+KENvbmZpZ1NlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGNvbmZpZ1xuIiwiaW1wb3J0IHsgSG9va3NTdGF0aWMgfSBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBjb25maWcgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuXG5leHBvcnQgdHlwZSBDb25maWdNb2RlbCA9IFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgTW9kZWxDb25maWc+PlxuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgcmVhZG9ubHk/OiBib29sZWFuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1vZGVsQ29uZmlnKGtleTogc3RyaW5nLCBvcHRpb25zOiBPcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gQ29uZmlnTW9kZWxNaXhpbkV4dGVuZDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgX19pc0NvbmZpZ01vZGVsID0gdHJ1ZVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgbGlzdDxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKTogUHJvbWlzZTxUW10+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb25maWcuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KGtleSkgfHwge31cblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gW11cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2lkLCBrXSBvZiBPYmplY3QuZW50cmllcyhtYXApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb25zdHJ1Y3Rvci5zZXJpYWxpemUoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5rLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkIFxuICAgICAgICAgICAgICAgICAgICB9KSkpXG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IEhvb2tzU3RhdGljLmVtaXQodGhpcywgJ2FmdGVyTGlzdCcsIGl0ZW1zKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmQ8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55IGFzIENvbmZpZ01vZGVsXG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbGwgPSBhd2FpdCBjb25zdHJ1Y3Rvci5saXN0KClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhbGwuZmluZChpID0+IChpIGFzIGFueSkuaWQgPT09IGlkKVxuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBIb29rc1N0YXRpYy5lbWl0KHRoaXMsICdhZnRlckZpbmQnLCBpdGVtKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChpdGVtIHx8IG51bGwpIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRPckZhaWw8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnkgYXMgQ29uZmlnTW9kZWxcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBjb25zdHJ1Y3Rvci5maW5kKGlkKVxuXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGl0ZW0gbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaXRlbTogVCAmIHsgaWQ6IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1JlYWRvbmx5IGNvbmZpZyBtb2RlbCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGl0ZW0gcmVxdWlyZXMgYW4gaWQnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnkgYXMgQ29uZmlnTW9kZWxcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IGNvbmZpZy5nZXQ8UmVjb3JkPHN0cmluZywgYW55Pj4oa2V5KSB8fCB7fVxuXG4gICAgICAgICAgICAgICAgaWYgKG1hcFtpdGVtLmlkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGl0eSBpdGVtIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBIb29rc1N0YXRpYy5lbWl0KHRoaXMsICdiZWZvcmVDcmVhdGUnLCBpdGVtKVxuXG4gICAgICAgICAgICAgICAgbWFwW2l0ZW0uaWRdID0geyAuLi5pdGVtIH0gYXMgYW55XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgbWFwW2l0ZW0uaWRdLmlkXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBjb25maWcuc2V0KGtleSwgbWFwKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmZpbmRPckZhaWwoaXRlbS5pZCkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgdXBkYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcsIGRhdGE6IFQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignUmVhZG9ubHkgY29uZmlnIG1vZGVsJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55IGFzIENvbmZpZ01vZGVsXG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb25maWcuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KGtleSkgfHwge31cblxuICAgICAgICAgICAgICAgIGlmICghbWFwW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGl0eSBpdGVtIG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgSG9va3NTdGF0aWMuZW1pdCh0aGlzLCAnYmVmb3JlVXBkYXRlJywgZGF0YSlcblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFwW2lkXSwgZGF0YSlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbmZpZy5zZXQoa2V5LCBtYXApXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZmluZE9yRmFpbChpZCkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgdXBkYXRlT3JDcmVhdGU8VD4odGhpczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCwgaWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxUPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnkgYXMgQ29uZmlnTW9kZWxcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgY29uc3RydWN0b3IuZmluZChpZClcblxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IudXBkYXRlKGlkLCBkYXRhIGFzIGFueSkgYXMgYW55XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmNyZWF0ZSh7IFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGF0YSBhcyBhbnkpLFxuICAgICAgICAgICAgICAgICAgICBpZCBcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBkZXN0cm95PFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5yZWFkb25seSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignUmVhZG9ubHkgY29uZmlnIG1vZGVsJylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXAgPSBjb25maWcuZ2V0PFJlY29yZDxzdHJpbmcsIGFueT4+KGtleSkgfHwge31cblxuICAgICAgICAgICAgICAgIGlmICghbWFwW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VudGl0eSBpdGVtIG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtpZF1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGNvbmZpZy5zZXQoa2V5LCBtYXApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgTW9kZWxDb25maWcgZnJvbSAnI3NlcnZlci9taXhpbnMvTW9kZWxDb25maWdNaXhpbi50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cydcbmltcG9ydCBjb25maWcgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cydcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVDb25maWcgZXh0ZW5kcyBjb21wb3NlV2l0aChcbiAgICBCYXNlLFxuICAgIE1vZGVsQ29uZmlnKCdkcml2ZS5kaXNrcycpXG4pIHtcbiAgICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZTxUPih0aGlzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKCkgYXMgRHJpdmVDb25maWdcblxuICAgICAgICBpbnN0YW5jZS5pZCA9IHJvdy5pZFxuICAgICAgICBpbnN0YW5jZS5uYW1lID0gcm93Lm5hbWUgfHwgcm93LmlkXG4gICAgICAgIGluc3RhbmNlLnR5cGUgPSByb3cudHlwZVxuICAgICAgICBpbnN0YW5jZS5jb25maWcgPSByb3cuY29uZmlnIHx8IHt9XG4gICAgICAgIGluc3RhbmNlLmlzX2RlZmF1bHQgPSBjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JykgPT09IHJvdy5pZFxuXG4gICAgICAgIHJldHVybiBpbnN0YW5jZSBhcyBhbnlcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCB0eXBlIEVudlNjaGVtYSA9IHYuSW5mZXJPdXRwdXQ8dHlwZW9mIGVudlNjaGVtYT5cblxuY29uc3QgYm9vbGVhbiA9IHYucGlwZShcbiAgICB2LnVuaW9uKFt2LmxpdGVyYWwoJ3RydWUnKSwgdi5saXRlcmFsKCdmYWxzZScpLCB2LmxpdGVyYWwoJzEnKSwgdi5saXRlcmFsKCcwJyldKSxcbiAgICB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICcxJyksXG4gICAgdi5ib29sZWFuKClcbilcblxuY29uc3Qga2V5VmFsdWUgPSB2LnBpcGUodi5zdHJpbmcoKSwgdi50cmFuc2Zvcm0oKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgZW50cmllcyA9IHZhbHVlLnNwbGl0KC9bO1xcbl0vKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5maWx0ZXIobCA9PiBsLmluY2x1ZGVzKCc9JykpXG4gICAgICAgIC5tYXAobCA9PiBsLnRyaW0oKS5zcGxpdCgnPScpKVxuXG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz5cblxuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGxldCBwYXJzZWRWYWx1ZTogYW55ID0gdmFsdWVcblxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnYm9vbDonKSkge1xuICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdib29sOicsICcnKS50cmltKCkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0KHJlc3VsdCwga2V5LCBwYXJzZWRWYWx1ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG59KSlcblxuY29uc3Qgc3RyaW5nQXJyYXkgPSB2LnBpcGUoXG4gICAgdi5zdHJpbmcoKSxcbiAgICB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHZhbHVlXG4gICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgIClcbilcblxuZXhwb3J0IGNvbnN0IGVudlNjaGVtYSA9IHYubG9vc2VPYmplY3Qoe1xuICAgIE5PREVfRU5WOiB2Lm9wdGlvbmFsKHYudW5pb24oW3YubGl0ZXJhbCgnZGV2ZWxvcG1lbnQnKSwgdi5saXRlcmFsKCdwcm9kdWN0aW9uJyksIHYubGl0ZXJhbCgndGVzdCcpXSksICdkZXZlbG9wbWVudCcpLFxuXG4gICAgWkVOSVRIX0JBU0VfUEFUSDogdi5zdHJpbmcoKSxcbiAgICBaRU5JVEhfU1RPUkFHRV9QQVRIOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuXG4gICAgWkVOSVRIX0FQUF9VUkw6IHYub3B0aW9uYWwodi5zdHJpbmcoKSwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcpLFxuICAgIFpFTklUSF9QT1JUOiB2Lm9wdGlvbmFsKHYucGlwZSh2LnN0cmluZygpLCB2LnRyYW5zZm9ybSgodmFsdWUpID0+IHBhcnNlSW50KHZhbHVlKSkpLCAnMzAwMCcpLFxuICAgIFpFTklUSF9IT1NUOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCksICcwLjAuMC4wJyksXG5cbiAgICBaRU5JVEhfTE9HX0xFVkVMOiB2Lm9wdGlvbmFsKHYucGlja2xpc3QoWydlcnJvcicsICd3YXJuJywgJ2luZm8nLCAnZGVidWcnXSksICdpbmZvJyksXG4gICAgWkVOSVRIX0xJRkVDWUNMRV9ERUJVRzogdi5vcHRpb25hbChib29sZWFuLCAnZmFsc2UnKSxcbiAgICBaRU5JVEhfQ0xJRU5UX0NPTkZJRzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuXG4gICAgWkVOSVRIX0NPTkZJRzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuICAgIFpFTklUSF9DT05GSUdfQVJHVU1FTlRTOiB2Lm9wdGlvbmFsKGtleVZhbHVlLCAnJyksXG4gICAgWkVOSVRIX0NPTkZJR19GSUxFUzogdi5vcHRpb25hbChzdHJpbmdBcnJheSwgJycpLFxuXG4gICAgWkVOSVRIX0NPTkZJR19ERUJVRzogdi5vcHRpb25hbChib29sZWFuLCAnZmFsc2UnKSxcbiAgICBaRU5JVEhfQ09ORklHX0RSSVZFUjogdi5vcHRpb25hbCh2LnBpY2tsaXN0KFsnZnMnLCAnczMnXSksICdmcycpLFxuICAgIFpFTklUSF9DT05GSUdfRlNfUEFUSDogdi5vcHRpb25hbCh2LnN0cmluZygpKSxcbiAgICBaRU5JVEhfQ09ORklHX0ZTX0ZPUk1BVDogdi5vcHRpb25hbCh2LnBpY2tsaXN0KFsnanNvbicsICd5bWwnXSksICdqc29uJyksXG4gICAgWkVOSVRIX0NPTkZJR19GU19GT1JNQVRfT1BUSU9OUzogdi5vcHRpb25hbChrZXlWYWx1ZSwgJycpLFxuXG4gICAgWkVOSVRIX0NPTkZJR19TM19CVUNLRVQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19SRUdJT046IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19BQ0NFU1NfS0VZX0lEOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIFpFTklUSF9DT05GSUdfUzNfU0VDUkVUX0FDQ0VTU19LRVk6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19TRVNTSU9OX1RPS0VOOiB2Lm9wdGlvbmFsKHYuc3RyaW5nKCkpLFxuICAgIFpFTklUSF9DT05GSUdfUzNfRU5EUE9JTlQ6IHYub3B0aW9uYWwodi5zdHJpbmcoKSksXG4gICAgWkVOSVRIX0NPTkZJR19TM19QUkVGSVg6IHYub3B0aW9uYWwodi5zdHJpbmcoKSwgJycpLFxuXG4gICAgWkVOSVRIX1BMVUdJTlNfRElSUzogdi5vcHRpb25hbChzdHJpbmdBcnJheSwgJycpLFxufSlcblxuIiwiaW1wb3J0IGRvdGVudiBmcm9tICdkb3RlbnYnXG5pbXBvcnQgKiBhcyB2IGZyb20gJ3ZhbGlib3QnXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcbmltcG9ydCB7IGVudlNjaGVtYSB9IGZyb20gJyNzZXJ2ZXIvc2NoZW1hcy9lbnZTY2hlbWEudHMnXG5pbXBvcnQgdHlwZSB7IEVudlNjaGVtYSB9IGZyb20gJyNzZXJ2ZXIvc2NoZW1hcy9lbnZTY2hlbWEudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVudlNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0VudlNlcnZpY2UnXG4gICAgcHJpdmF0ZSBlbnY6IEVudlNjaGVtYSB8IG51bGwgPSBudWxsXG4gICAgcHJpdmF0ZSBmaWxlczogc3RyaW5nW10gPSBbXVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRW52U2VydmljZSgpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkb3RFbnZDb25maWcob3B0aW9ucz86IGRvdGVudi5Eb3RlbnZDb25maWdPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBkb3RlbnYuY29uZmlnKG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpbGVzKGZpbGVzOiBzdHJpbmdbXSkge1xuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsZShmaWxlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGUpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGxvYWQoKSB7XG4gICAgICAgIEVudlNlcnZpY2UuZG90RW52Q29uZmlnKHtcbiAgICAgICAgICAgIHBhdGg6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICBvdmVycmlkZTogdHJ1ZSxcbiAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuZW52ID0gdi5wYXJzZShlbnZTY2hlbWEsIHByb2Nlc3MuZW52KVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBwcm9kdWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ05PREVfRU5WJykgPT09ICdwcm9kdWN0aW9uJ1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnTk9ERV9FTlYnKSA9PT0gJ2RldmVsb3BtZW50J1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGVzdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdOT0RFX0VOVicpID09PSAndGVzdCdcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzPEsgZXh0ZW5kcyBrZXlvZiBFbnZTY2hlbWE+KGtleTogSyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8SyBleHRlbmRzIGtleW9mIEVudlNjaGVtYT4oa2V5OiBLLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBFbnZTY2hlbWFbS10ge1xuICAgICAgICBpZiAoIXRoaXMuZW52KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBsb2FkZWQuIENhbGwgbG9hZCgpIGJlZm9yZSBhY2Nlc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLicpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lbnYhW2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXMuZW52IVtrZXldIDogZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHNldDxLIGV4dGVuZHMga2V5b2YgRW52U2NoZW1hPihrZXk6IEssIHZhbHVlOiBFbnZTY2hlbWFbS10pIHtcbiAgICAgICAgaWYgKCF0aGlzLmVudikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0Vudmlyb25tZW50IHZhcmlhYmxlcyBub3QgbG9hZGVkLiBDYWxsIGxvYWQoKSBiZWZvcmUgYWNjZXNzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcy4nKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5lbnYhW2tleV0gPSB2YWx1ZVxuICAgIH1cbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IG1zIGZyb20gJ21zJ1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgRW52U2VydmljZSBmcm9tICcuL0VudlNlcnZpY2UnO1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJztcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24gfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJztcblxuaW50ZXJmYWNlIFVSTE9wdGlvbnMge1xuICAgIGRhdGE/OiBhbnk7XG4gICAgZXhwaXJlcz86IG1zLlN0cmluZ1ZhbHVlO1xuICAgIGV4cGlyZUF0PzogbnVtYmVyIHwgRGF0ZTtcbn1cblxuaW50ZXJmYWNlIEVuY3J5cHRTZXJ2aWNlT3B0aW9ucyB7XG4gICAga2V5Pzogc3RyaW5nO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlO1xuICAgIGVudj86IEVudlNlcnZpY2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVuY3J5cHRTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFbmNyeXB0U2VydmljZSdcblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGVudjogRW52U2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxnb3JpdGhtID0gJ2Flcy0yNTYtY2JjJ1xuICAgIHByaXZhdGUga2V5OiBCdWZmZXIgfCBudWxsID0gbnVsbFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogRW5jcnlwdFNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZW52ID0gb3B0aW9ucy5lbnYgfHwgbmV3IEVudlNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2VcblxuICAgICAgICBpZiAob3B0aW9ucy5rZXkpIHtcbiAgICAgICAgICAgIHRoaXMua2V5ID0gY3J5cHRvLnNjcnlwdFN5bmMob3B0aW9ucy5rZXksICdzYWx0JywgMzIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBFbmNyeXB0U2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFbmNyeXB0U2VydmljZShvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXREZWJ1ZyhkZWJ1ZzogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRlYnVnID0gZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2RlYnVnIG1vZGUgZW5hYmxlZCcpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9nZ2VyKGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlclxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRFbnYoZW52OiBFbnZTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMuZW52ID0gZW52XG4gICAgfVxuXG4gICAgcHVibGljIHNldEtleShrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLmtleSA9IGNyeXB0by5zY3J5cHRTeW5jKGtleSwgJ3NhbHQnLCAzMilcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5jcnlwdCh0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGtleSBub3Qgc2V0JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl2ID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KVxuICAgICAgICBjb25zdCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LCBpdilcblxuICAgICAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZSh0ZXh0LCAndXRmOCcsICdoZXgnKVxuICAgICAgICBlbmNyeXB0ZWQgKz0gY2lwaGVyLmZpbmFsKCdoZXgnKVxuXG4gICAgICAgIHJldHVybiBgJHtpdi50b1N0cmluZygnaGV4Jyl9OiR7ZW5jcnlwdGVkfWBcbiAgICB9XG5cblxuXG4gICAgcHVibGljIGRlY3J5cHQob3B0aW9uczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGtleSBub3Qgc2V0JylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtpdiwgZW5jcnlwdGVkXSA9IG9wdGlvbnMuc3BsaXQoJzonKVxuXG4gICAgICAgIGNvbnN0IGl2QnVmZmVyID0gQnVmZmVyLmZyb20oaXYsICdoZXgnKVxuXG4gICAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYodGhpcy5hbGdvcml0aG0sIHRoaXMua2V5LCBpdkJ1ZmZlcilcblxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCwgJ2hleCcsICd1dGY4JylcbiAgICAgICAgZGVjcnlwdGVkICs9IGRlY2lwaGVyLmZpbmFsKCd1dGY4JylcblxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkXG4gICAgfVxuXG4gICAgcHVibGljIGVuY3J5cHRPYmplY3Qob2JqOiBhbnkpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkob2JqKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVuY3J5cHQoanNvblN0cmluZylcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjcnlwdE9iamVjdDxUPihlbmNyeXB0ZWRTdHJpbmc6IHN0cmluZyk6IFQge1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5kZWNyeXB0KGVuY3J5cHRlZFN0cmluZylcblxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uU3RyaW5nKSBhcyBUXG4gICAgfVxuXG4gICAgcHVibGljIHVybChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBVUkxPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGV4cGlyZUF0ID0gb3B0aW9ucz8uZXhwaXJlQXRcblxuICAgICAgICBpZiAob3B0aW9ucz8uZXhwaXJlcykge1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlcyA9IG1zKG9wdGlvbnMuZXhwaXJlcykgYXMgbnVtYmVyXG5cbiAgICAgICAgICAgIGV4cGlyZUF0ID0gRGF0ZS5ub3coKSArIGV4cGlyZXNcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXhwaXJlQXQpIHtcbiAgICAgICAgICAgIGV4cGlyZUF0ID0gRGF0ZS5ub3coKSArIG1zKCcxNSBtaW51dGVzJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBpcmVBdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIGV4cGlyZUF0ID0gZXhwaXJlQXQuZ2V0VGltZSgpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgICAgICAgZGF0YTogb3B0aW9ucz8uZGF0YSB8fCB7fSxcbiAgICAgICAgICAgIGV4cGlyZUF0LFxuICAgICAgICAgICAgZXhwaXJlQXRSZWFkYWJsZTogZm9ybWF0KG5ldyBEYXRlKGV4cGlyZUF0KSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5lbmNyeXB0KEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKVxuXG4gICAgICAgIGNvbnN0IGFwcFVybCA9IHRoaXMuZW52LmdldCgnWkVOSVRIX0FQUF9VUkwnKVxuXG4gICAgICAgIGlmICghYXBwVXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQVBQX1VSTCBub3Qgc2V0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcycpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIGFwcFVybClcblxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgna2V5JywgZW5jb2RlVVJJQ29tcG9uZW50KGtleSkpXG5cbiAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpXG4gICAgfVxuXG4gICAgcHVibGljIHZlcmlmeVVybChlbmNyeXB0ZWRLZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZERhdGEgPSB0aGlzLmRlY3J5cHQoZGVjb2RlVVJJQ29tcG9uZW50KGVuY3J5cHRlZEtleSkpXG5cbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04ucGFyc2UoZGVjcnlwdGVkRGF0YSlcblxuICAgICAgICBpZiAocGF5bG9hZC5leHBpcmVBdCAmJiBEYXRlLm5vdygpID4gcGF5bG9hZC5leHBpcmVBdCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQmFzZUV4Y2VwdGlvbignVVJMIGhhcyBleHBpcmVkJywgNDAzKVxuXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7XG4gICAgICAgICAgICAgICAgZXhwaXJlQXQ6IHBheWxvYWQuZXhwaXJlQXQsXG4gICAgICAgICAgICAgICAgZXhwaXJlQXRSZWFkYWJsZTogcGF5bG9hZC5leHBpcmVBdFJlYWRhYmxlXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBheWxvYWQuZGF0YVxuICAgIH1cbn1cbiIsImltcG9ydCBFbmNyeXB0U2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0VuY3J5cHRTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lci50cydcblxuY29uc3QgZW5jcnlwdCA9IGNvbnRhaW5lci5wcm94eTxFbmNyeXB0U2VydmljZT4oRW5jcnlwdFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGVuY3J5cHRcblxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGgsIHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSdcbmltcG9ydCBEcml2ZUVudGl0eSBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0RyaXZlRW50cnlFbnRpdHkudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCB2YWxpZGF0b3IgZnJvbSAnI3NoYXJlZC9mYWNhZGVzL3ZhbGlkYXRvci50cydcbmltcG9ydCBlbmNyeXB0IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9lbmNyeXB0LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgeyBiYXNlUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJpdmVGU0NvbmZpZyB7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHJpdmVGUyBleHRlbmRzIEJhc2VEcml2ZSB7XG4gICAgcHJpdmF0ZSBzY2hlbWEgPSB2YWxpZGF0b3IuY3JlYXRlKCh2KSA9PiB2Lm9iamVjdCh7XG4gICAgICAgIGRpcmVjdG9yeTogdi5waXBlKHYuc3RyaW5nKCksIHYubWluTGVuZ3RoKDEpKSxcbiAgICB9KSlcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBpY2s8QmFzZURyaXZlLCAnaWQnIHwgJ25hbWUnIHwgJ2Rlc2NyaXB0aW9uJyB8ICdjb25maWcnPikge1xuICAgICAgICBzdXBlcihkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFsaWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0b3IuaXNWYWxpZCh0aGlzLmNvbmZpZywgdGhpcy5zY2hlbWEpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1ZhbGlkKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCR0KCdJbnZhbGlkIGRyaXZlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnJvb3RQYXRoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJHQoJ0RyaXZlIHJvb3QgcGF0aCBkb2VzIG5vdCBleGlzdCcpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByb290UGF0aCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYmFzZVBhdGgodGhpcy5jb25maWcuZGlyZWN0b3J5IGFzIHN0cmluZylcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzOiBCYXNlRHJpdmVbJ2V4aXN0cyddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZnMucHJvbWlzZXMuYWNjZXNzKGpvaW4odGhpcy5yb290UGF0aCwgZmlsZW5hbWUpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdDogQmFzZURyaXZlWydsaXN0J10gPSBhc3luYyAoZm9sZGVyKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZvbGRlciA/IGpvaW4odGhpcy5yb290UGF0aCwgZm9sZGVyKSA6IHRoaXMucm9vdFBhdGhcblxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmV4aXN0cyhyZWxhdGl2ZSh0aGlzLnJvb3RQYXRoLCBmaWxlcGF0aCkpKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoZmlsZXBhdGgpXG5cbiAgICAgICAgY29uc3QgZW50cmllczogRHJpdmVFbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGZpbGVwYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5wcm9taXNlcy5zdGF0KGZpbGVQYXRoKVxuXG4gICAgICAgICAgICBjb25zdCBtZXRhczogYW55ID0ge31cblxuICAgICAgICAgICAgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAgICAgbWV0YXMuc2l6ZSA9IHN0YXRzLnNpemVcbiAgICAgICAgICAgICAgICBtZXRhcy5taW1ldHlwZSA9IG1pbWUuZ2V0VHlwZShmaWxlbmFtZSkgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBuZXcgRHJpdmVFbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJyArIHJlbGF0aXZlKHRoaXMucm9vdFBhdGgsIGZpbGVQYXRoKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBzdGF0cy5pc0RpcmVjdG9yeSgpID8gJ2RpcmVjdG9yeScgOiAnZmlsZScsXG4gICAgICAgICAgICAgICAgbWV0YXNcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGVudHJpZXMucHVzaChlbnRyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmQ6IEJhc2VEcml2ZVsnZmluZCddID0gYXN5bmMgKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlcGF0aCA9IGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSA/IGZpbGVuYW1lIDogJy8nICsgZmlsZW5hbWVcblxuICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgdGhpcy5saXN0KHBhdGguZGlybmFtZShmaWxlcGF0aCkpXG5cbiAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzLmZpbmQoZSA9PiBlLnBhdGggPT09IGZpbGVwYXRoKVxuXG4gICAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBcIiR7ZmlsZXBhdGh9XCIgbm90IGZvdW5kYClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbnRyeVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBta2RpcihmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmV4aXN0cyhwYXRoLmRpcm5hbWUoZmlsZW5hbWUpKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihmaWxlcGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZDogQmFzZURyaXZlWydyZWFkJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1ZmZlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4odGhpcy5yb290UGF0aCwgZmlsZW5hbWUpXG4gICAgICAgIFxuICAgICAgICBjb25zdCBzdHJlYW0gPSBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzdHJlYW0pXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlOiBCYXNlRHJpdmVbJ3dyaXRlJ10gPSBhc3luYyAoZmlsZW5hbWUsIGRhdGEpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5leGlzdHMocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWtkaXIocGF0aC5kaXJuYW1lKGZpbGVuYW1lKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUoZmlsZVBhdGgsIGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHdyaXRlU3RyZWFtKGZpbGVuYW1lOiBzdHJpbmcsIHN0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuY2hlY2tWYWxpZCgpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuZXhpc3RzKHBhdGguZGlybmFtZShmaWxlbmFtZSkpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1rZGlyKHBhdGguZGlybmFtZShmaWxlbmFtZSkpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd3JpdGVTdHJlYW0gPSBmcy5jcmVhdGVXcml0ZVN0cmVhbShmaWxlUGF0aClcblxuICAgICAgICAgICAgc3RyZWFtLnBpcGUod3JpdGVTdHJlYW0pXG5cbiAgICAgICAgICAgIHdyaXRlU3RyZWFtLm9uKCdmaW5pc2gnLCByZXNvbHZlKVxuICAgICAgICAgICAgd3JpdGVTdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGU6IEJhc2VEcml2ZVsnZGVsZXRlJ10gPSBhc3luYyAoZmlsZW5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gam9pbih0aGlzLnJvb3RQYXRoLCBmaWxlbmFtZSlcblxuICAgICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGF3YWl0IGZzLnByb21pc2VzLnN0YXQoZmlsZVBhdGgpXG4gICAgICAgICAgICAudGhlbihzdGF0ID0+IHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBmYWxzZSlcblxuICAgICAgICBpZiAoaXNEaXJlY3RvcnkpIHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnByb21pc2VzLnJtZGlyKGZpbGVQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsoZmlsZVBhdGgpXG4gICAgfVxuXG4gICAgcHVibGljIHVybDogQmFzZURyaXZlWyd1cmwnXSA9IGFzeW5jIChmaWxlbmFtZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrVmFsaWQoKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgZmlsZXBhdGggPSBmaWxlbmFtZS5zdGFydHNXaXRoKCcvJykgPyBmaWxlbmFtZSA6IGAvJHtmaWxlbmFtZX1gXG5cbiAgICAgICAgcmV0dXJuIGVuY3J5cHQudXJsKGAvYXBpL2RyaXZlcy8ke3RoaXMuaWR9L3N0cmVhbSR7ZmlsZXBhdGh9YCwge1xuICAgICAgICAgICAgZXhwaXJlczogb3B0aW9ucz8uZXhwaXJlcyB8fCAnMzBtJ1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWRVcmw6IEJhc2VEcml2ZVsndXBsb2FkVXJsJ10gPSBhc3luYyAoZmlsZW5hbWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja1ZhbGlkKClcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVwYXRoID0gZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpID8gZmlsZW5hbWUgOiBgLyR7ZmlsZW5hbWV9YFxuXG4gICAgICAgIHJldHVybiBlbmNyeXB0LnVybChgL2FwaS9kcml2ZXMvJHt0aGlzLmlkfS91cGxvYWQke2ZpbGVwYXRofWAsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IG9wdGlvbnM/LmV4cGlyZXMgfHwgJzMwbScsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgbWltZV90eXBlczogb3B0aW9ucz8ubWltZV90eXBlcyxcbiAgICAgICAgICAgICAgICBtYXhfc2l6ZTogb3B0aW9ucz8ubWF4X3NpemUsXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IERyaXZlRW50cnkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Ecml2ZUVudHJ5RW50aXR5LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5pbXBvcnQgdHlwZSB7IERyaXZlVXJsT3B0aW9ucyB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RyaXZlQ29udHJhY3QudHMnXG5pbXBvcnQgeyBzdG9yYWdlUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5pbXBvcnQgQmFzZURyaXZlIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVCYXNlR2F0ZXdheS50cydcbmltcG9ydCBEcml2ZVMzIGZyb20gJyNzZXJ2ZXIvZ2F0ZXdheXMvRHJpdmVTM0dhdGV3YXkudHMnXG5pbXBvcnQgRHJpdmVDb25maWcgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Ecml2ZUNvbmZpZ0VudGl0eS50cydcbmltcG9ydCB0eXBlIExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuaW1wb3J0IERyaXZlRlMgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9Ecml2ZUZTR2F0ZXdheS50cydcbmltcG9ydCBjb25maWcgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2NvbmZpZy50cydcblxuaW50ZXJmYWNlIFZhbGlkYXRlVXBsb2FkT3B0aW9ucyB7XG4gICAgbWltZV90eXBlczogc3RyaW5nXG4gICAgbWF4U2l6ZT86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEcml2ZVNlcnZpY2Uge1xuICAgIHB1YmxpYyBzdGF0aWMgX19jb250YWluZXJfZW50cnlfa2V5ID0gJ0RyaXZlU2VydmljZSdcblxuXG4gICAgcHVibGljIGdhdGV3YXlzOiBNYXA8c3RyaW5nLCB0eXBlb2YgQmFzZURyaXZlPlxuICAgIHB1YmxpYyBkcml2ZXM6IE1hcDxzdHJpbmcsIEJhc2VEcml2ZT4gPSBuZXcgTWFwKClcbiAgICBwdWJsaWMgc2VsZWN0ZWQ/OiBzdHJpbmdcbiAgICBwdWJsaWMgZGVmYXVsdERyaXZlPzogc3RyaW5nXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBwdWJsaWMgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuIHVuZGVmaW5lZCBcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGRyaXZlID0gdGhpcy5kcml2ZXMuZ2V0KHRoaXMuc2VsZWN0ZWQpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWRyaXZlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgcmV0dXJuIGRyaXZlXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxEcml2ZVNlcnZpY2U+ID0ge30pIHsgICAgICAgIFxuICAgICAgICB0aGlzLnNlbGVjdGVkID0gZGF0YS5zZWxlY3RlZCB8fCB0aGlzLnNlbGVjdGVkXG4gICAgICAgIHRoaXMuZGVidWcgPSBkYXRhLmRlYnVnIHx8IHRoaXMuZGVidWdcbiAgICAgICAgdGhpcy5kcml2ZXMgPSBkYXRhLmRyaXZlcyB8fCB0aGlzLmRyaXZlc1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGRhdGEubG9nZ2VyIHx8IGxvZ2dlci5jaGlsZCh7IGxhYmVsOiAnZHJpdmUnIH0pXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMgPSBuZXcgTWFwPHN0cmluZywgdHlwZW9mIEJhc2VEcml2ZT4oKVxuXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMuc2V0KCdzMycsIERyaXZlUzMpXG4gICAgICAgIHRoaXMuZ2F0ZXdheXMuc2V0KCdmcycsIERyaXZlRlMpXG4gICAgfVxuXG4gICAgcHVibGljIGxpc3REcml2ZXMoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZHJpdmVzLnZhbHVlcygpKS5tYXAoZHJpdmUgPT4gKHtcbiAgICAgICAgICAgIC4uLmRyaXZlLFxuICAgICAgICAgICAgZGVmYXVsdDogZHJpdmUuaWQgPT09IHRoaXMuZGVmYXVsdERyaXZlXG4gICAgICAgIH0pKVxuICAgIH1cbiAgICBcbiAgICBwdWJsaWMgZ2V0KG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFuYW1lIHx8ICF0aGlzLmRyaXZlcy5oYXMobmFtZSB8fCAnJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdEcml2ZSBub3QgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHJpdmUgPSB0aGlzLmRyaXZlcy5nZXQobmFtZSlcblxuICAgICAgICBpZiAoIWRyaXZlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignRHJpdmUgbm90IGZvdW5kJylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkcml2ZVxuICAgIH1cblxuICAgIHB1YmxpYyB1c2UobmFtZT86IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMuZHJpdmVzLmhhcyhuYW1lIHx8ICcnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0RyaXZlIG5vdCBmb3VuZCcpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBuZXcgRHJpdmVTZXJ2aWNlKHsgXG4gICAgICAgICAgICBzZWxlY3RlZDogbmFtZSxcbiAgICAgICAgICAgIGRyaXZlczogdGhpcy5kcml2ZXMsXG4gICAgICAgICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyBcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG5cbiAgICBwdWJsaWMgbGlzdChmb2xkZXI/OiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnlbXT4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Lmxpc3QoZm9sZGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERyaXZlRW50cnk+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC5maW5kKGZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBleGlzdHMoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmV4aXN0cyhmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQucmVhZChmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmVhbShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQucmVhZFN0cmVhbShmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVhZEFzVGV4dChmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucmVhZChmaWxlbmFtZSlcblxuICAgICAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKGRhdGEpXG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlKGZpbGVuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IFVpbnQ4QXJyYXkgfCBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgbGV0IGRhdGE6IGFueSA9IHBheWxvYWRcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgJiYgIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCBudWxsLCA0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShkYXRhKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC53cml0ZShmaWxlbmFtZSwgZGF0YSlcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJlYW0oZmlsZW5hbWU6IHN0cmluZywgc3RyZWFtOiBOb2RlSlMuUmVhZGFibGVTdHJlYW0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnQpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdObyBkcml2ZSBzZWxlY3RlZCcpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudC53cml0ZVN0cmVhbShmaWxlbmFtZSwgc3RyZWFtKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgVVJMIGZvciBhIGZpbGUgaW4gdGhlIGRyaXZlLlxuICAgICAqIEBwYXJhbSBwYXlsb2FkICBGaWxlIGluc3RhbmNlLCBGaWxlIElELCBEcml2ZUVudHJ5IGluc3RhbmNlIG9yIGZpbGVuYW1lIHN0cmluZ1xuICAgICAqIEBwYXJhbSBvcHRpb25zIFxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1cmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9uczogRHJpdmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4geyAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQudXJsKGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGxvYWRVcmwoZmlsZW5hbWU6IHN0cmluZywgb3B0aW9uczogRHJpdmVVcmxPcHRpb25zID0ge30pOiBQcm9taXNlPHN0cmluZz4geyAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy5jdXJyZW50KSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTm8gZHJpdmUgc2VsZWN0ZWQnKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmN1cnJlbnQudXBsb2FkVXJsKGZpbGVuYW1lLCBvcHRpb25zKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwbG9hZCBhIGZpbGUgZnJvbSB0aGUgbG9jYWwgZmlsZXN5c3RlbSB0byB0aGUgZHJpdmUuXG4gICAgICogQHBhcmFtIHNvdXJjZSBmaWxlbmFtZSBpbiBsb2NhbCBmaWxlc3lzdGVtXG4gICAgICogQHBhcmFtIGRlc3RpbmF0aW9uIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyB1cGxvYWQoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUoc291cmNlKVxuXG4gICAgICAgIGNvbnN0IHVpbnQ4ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKVxuXG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlKGRlc3RpbmF0aW9uLCB1aW50OClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZCBhIGZpbGUgZnJvbSB0aGUgZHJpdmUgdG8gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uXG4gICAgICogQHBhcmFtIGZpbGVuYW1lIGZpbGVuYW1lIGluIHRoZSBkcml2ZVxuICAgICAqIEBwYXJhbSBkZXN0aW5hdGlvbiBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWQoZmlsZW5hbWU6IHN0cmluZywgZGVzdGluYXRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5yZWFkKGZpbGVuYW1lKVxuICAgICAgICBcbiAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKGRlc3RpbmF0aW9uLCBkYXRhKVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUoZmlsZW5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGRyaXZlIHNlbGVjdGVkJylcblxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmRlbGV0ZShmaWxlbmFtZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpe1xuICAgICAgICB0aGlzLmRyaXZlcy5jbGVhcigpXG5cbiAgICAgICAgY29uc3QgY29uZmlncyA9IGF3YWl0IERyaXZlQ29uZmlnLmxpc3QoKVxuXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBjb25maWdzKSB7XG4gICAgICAgICAgICBjb25zdCBnYXRld2F5Q2xhc3MgPSB0aGlzLmdhdGV3YXlzLmdldChjLnR5cGUpXG5cbiAgICAgICAgICAgIGlmICghZ2F0ZXdheUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgRHJpdmUgZ2F0ZXdheSBmb3IgdHlwZSBcIiR7Yy50eXBlfVwiIG5vdCBmb3VuZGApXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZ2F0ZXdheSA9IG5ldyBnYXRld2F5Q2xhc3MoYylcblxuICAgICAgICAgICAgdGhpcy5kcml2ZXMuc2V0KGMuaWQsIGdhdGV3YXkpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYGRyaXZlIGxvYWRlZCAke2MuaWR9ICgke2MudHlwZX0pYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JylcbiAgICAgICAgdGhpcy5kZWZhdWx0RHJpdmUgPSBjb25maWcuZ2V0KCdkcml2ZS5kZWZhdWx0JylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY3JlYXRlRGVmYXVsdERyaXZlcygpe1xuXG4gICAgICAgIGF3YWl0IERyaXZlQ29uZmlnLnVwZGF0ZU9yQ3JlYXRlKCd1cGxvYWRzJywge1xuICAgICAgICAgICAgbmFtZTogJ1VwbG9hZHMnLFxuICAgICAgICAgICAgdHlwZTogJ2ZzJyxcbiAgICAgICAgICAgIGNvbmZpZzogeyBkaXJlY3Rvcnk6IHN0b3JhZ2VQYXRoKCd1cGxvYWRzJykgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICghY29uZmlnLmdldCgnZHJpdmUuZGVmYXVsdCcpKSB7XG4gICAgICAgICAgICBjb25maWcuc2V0KCdkcml2ZS5kZWZhdWx0JywgJ3VwbG9hZHMnKVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKClcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGVVcGxvYWQob3B0aW9uczogVmFsaWRhdGVVcGxvYWRPcHRpb25zLCBmaWxlOiB7IG1pbWV0eXBlOiBzdHJpbmcsIHNpemU6IG51bWJlciB9LCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBvcHRpb25zLm1pbWVfdHlwZXMuc3BsaXQoJywnKS5tYXAodCA9PiB0LnRyaW0oKSlcblxuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkVHlwZXMuc29tZShhbGxvd2VkVHlwZSA9PiB7XG4gICAgICAgICAgICBpZiAoIWFsbG93ZWRUeXBlLmVuZHNXaXRoKCcvKicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlID09PSBmaWxlLm1pbWV0eXBlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGJhc2VUeXBlID0gYWxsb3dlZFR5cGUuc2xpY2UoMCwgLTIpXG5cbiAgICAgICAgICAgIHJldHVybiBmaWxlLm1pbWV0eXBlLnN0YXJ0c1dpdGgoYmFzZVR5cGUgKyAnLycpXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdNSU1FIHR5cGUgbm90IGFsbG93ZWQnLCA0MDMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5tYXhTaXplICYmIGZpbGUuc2l6ZSA+IG9wdGlvbnMubWF4U2l6ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0ZpbGUgc2l6ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQnLCA0MDMpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZUVtbWl0dGVyU2VydmljZSBmcm9tIFwiLi4vLi4vc2hhcmVkL3NlcnZpY2VzL0VtbWl0dGVyU2VydmljZVwiO1xuaW1wb3J0IHR5cGUgeyBFdmVudENvbnRyYWN0IH0gZnJvbSAnLi4vY29udHJhY3RzL0V2ZW50Q29udHJhY3QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbW1pdHRlclNlcnZpY2UgZXh0ZW5kcyBCYXNlRW1taXR0ZXJTZXJ2aWNlPEV2ZW50Q29udHJhY3Q+IHt9XG4iLCJpbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcydcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24sIExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IEVudlNlcnZpY2UgZnJvbSAnLi9FbnZTZXJ2aWNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2VwdGlvblNlcnZpY2VPcHRpb25zIHtcbiAgICBpZ25vcmVDb2RlRXJyb3JzPzogbnVtYmVyW11cbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgZW52PzogRW52U2VydmljZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFeGNlcHRpb25TZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdFeGNlcHRpb25TZXJ2aWNlJ1xuICAgIHB1YmxpYyBpZ25vcmVDb2RlRXJyb3JzOiBudW1iZXJbXSA9IFs0MDAsIDQwMSwgNDAzLCA0MDQsIDQyMl1cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGVudjogRW52U2VydmljZVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogRXhjZXB0aW9uU2VydmljZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5lbnYgPSBvcHRpb25zLmVudiB8fCBuZXcgRW52U2VydmljZSgpXG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaWdub3JlQ29kZUVycm9ycykge1xuICAgICAgICAgICAgdGhpcy5pZ25vcmVDb2RlRXJyb3JzID0gb3B0aW9ucy5pZ25vcmVDb2RlRXJyb3JzXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlKGVycm9yOiBFcnJvciwgcmVzcG9uc2U6IFJlc3BvbnNlKSB7XG5cbiAgICAgICAgY29uc3QgZXJyb3JOYW1lID0gZXJyb3IubmFtZSB8fCAnSW50ZXJuYWwgU2VydmVyIEVycm9yJ1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8ICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkJ1xuICAgICAgICBjb25zdCBlcnJvclN0YXR1cyA9IChlcnJvciBhcyBhbnkpLnN0YXR1cyB8fCA1MDBcblxuICAgICAgICBpZiAoIXRoaXMuaWdub3JlQ29kZUVycm9ycy5pbmNsdWRlcyhlcnJvclN0YXR1cykpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cyhlcnJvclN0YXR1cykuanNvbih7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3JOYW1lLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiBlcnJvclN0YXR1cyxcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbiIsImltcG9ydCBiY3J5cHQgZnJvbSAnYmNyeXB0J1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIYXNoZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdIYXNoZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGhhc2godmFsdWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBiY3J5cHQuaGFzaCh2YWx1ZSwgMTIpXG4gICAgfVxuXG4gICAgYXN5bmMgY29tcGFyZShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gYmNyeXB0LmNvbXBhcmUoYSwgYilcbiAgICB9XG59XG5cbiIsImltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCB0eXBlIHsgSGFuZGxlciwgIE1pZGRsZXdhcmUgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcblxudHlwZSBSb3V0ZU1ldGhvZCA9ICdnZXQnIFxuICAgIHwgJ0dFVCcgXG4gICAgfCAncG9zdCcgXG4gICAgfCAnUE9TVCcgXG4gICAgfCAncHV0JyBcbiAgICB8ICdQVVQnIFxuICAgIHwgJ3BhdGNoJyBcbiAgICB8ICdQQVRDSCcgXG4gICAgfCAnZGVsZXRlJyBcbiAgICB8ICdERUxFVEUnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlIHtcbiAgICBwdWJsaWMgcGF0aDogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgbWV0aG9kOiBSb3V0ZU1ldGhvZCA9ICdnZXQnXG4gICAgcHVibGljIGhhbmRsZXI6IEhhbmRsZXI8YW55PiB8IG51bGwgPSBudWxsXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlW10gPSBbXVxuICAgIHB1YmxpYyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxSb3V0ZT4gPSB7fSkge1xuICAgICAgICB0aGlzLnBhdGggPSBkYXRhLnBhdGggfHwgJydcbiAgICAgICAgdGhpcy5tZXRob2QgPSBkYXRhLm1ldGhvZCB8fCAnZ2V0J1xuICAgICAgICB0aGlzLmhhbmRsZXIgPSBkYXRhLmhhbmRsZXIgfHwgbnVsbFxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gZGF0YS5taWRkbGV3YXJlcyB8fCBbXVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSB8fCB7fVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcGFyYW1zKHJvdXRlUGF0aDogc3RyaW5nLCByZXF1ZXN0UGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50cyA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuICAgICAgICBjb25zdCByZXF1ZXN0U2VnbWVudHMgPSByZXF1ZXN0UGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGVTZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVTZWdtZW50ID0gcm91dGVTZWdtZW50c1tpXVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFNlZ21lbnQgPSByZXF1ZXN0U2VnbWVudHNbaV1cblxuICAgICAgICAgICAgaWYgKHJvdXRlU2VnbWVudC5zdGFydHNXaXRoKCc6JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbU5hbWUgPSByb3V0ZVNlZ21lbnQuc2xpY2UoMSkgLy8gUmVtb3ZlIHRoZSAnOicgcHJlZml4XG4gICAgICAgICAgICAgICAgcGFyYW1zW3BhcmFtTmFtZV0gPSByZXF1ZXN0U2VnbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm91dGVTZWdtZW50ID09PSAnKicpIHtcbiAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGFsbCByZW1haW5pbmcgc2VnbWVudHMgYXMgYSBzaW5nbGUgcGF0aFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1NlZ21lbnRzID0gcmVxdWVzdFNlZ21lbnRzLnNsaWNlKGkpXG4gICAgICAgICAgICAgICAgcGFyYW1zWycqJ10gPSByZW1haW5pbmdTZWdtZW50cy5qb2luKCcvJylcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtc1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcXVlcnkocmVxdWVzdFBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcmVxdWVzdFBhdGguc3BsaXQoJz8nKVsxXVxuXG4gICAgICAgIGlmICghcXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWVyeVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFzLnBhcnNlKHF1ZXJ5U3RyaW5nKVxuICAgIH1cblxuICAgIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiB0aGlzLnBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgbWlkZGxld2FyZXM6IHRoaXMubWlkZGxld2FyZXMubWFwKG13ID0+IG13LmNvbnN0cnVjdG9yLm5hbWUpLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IGpvaW4gfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcbmltcG9ydCB0eXBlIHsgSGFuZGxlciwgTWlkZGxld2FyZSwgTWlkZGxld2FyZUhhbmRsZVJlc3VsdCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBIb29rcyBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgeyBtYXRjaFBhdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL21hdGNoUGF0aHMudHMnXG5cbnR5cGUgUm91dGVDb250ZXh0ID0gJ2dsb2JhbCcgfCAnZ3JvdXAnIHwgJ3JvdXRlJ1xuXG5pbnRlcmZhY2UgTWlkZGxld2FyZVJlZ2lzdGVyIHtcbiAgICBtaWRkbGV3YXJlOiBNaWRkbGV3YXJlXG4gICAgY29udGV4dDogUm91dGVDb250ZXh0XG59XG5cbmludGVyZmFjZSBMb2FkT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlckV2ZW50cyB7XG4gICAgJ3JvdXRlcjpyZWdpc3RlcmVkJzoge1xuICAgICAgICByb3V0ZXI6IFJvdXRlclNlcnZpY2VcbiAgICB9XG4gICAgJ3JvdXRlcjpsb2FkZWQnOiB7XG4gICAgICAgIHJvdXRlcjogUm91dGVyU2VydmljZVxuICAgIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJTZXJ2aWNlPEMgPSB7fT4gZXh0ZW5kcyBjb21wb3NlKEhvb2tzKSB7XG4gICAgcHVibGljIHN0YXRpYyBfX2NvbnRhaW5lcl9lbnRyeV9rZXkgPSAnUm91dGVyU2VydmljZSdcblxuICAgIHB1YmxpYyByb3V0ZXM6IFJvdXRlW10gPSBbXVxuXG4gICAgcHVibGljIG1pZGRsZXdhcmVzOiBNaWRkbGV3YXJlUmVnaXN0ZXJbXSA9IFtdXG4gICAgcHVibGljIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBwdWJsaWMgZ3JvdXBzOiBSb3V0ZXJTZXJ2aWNlPGFueT5bXSA9IFtdXG4gICAgcHVibGljIGdyb3VwUHJlZml4ZXM6IHN0cmluZ1tdID0gW11cblxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG4gICAgcHVibGljIGxvZ2dlciA9IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICBwdWJsaWMgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgY29uc3RydWN0b3IoZGF0YTogUGFydGlhbDxSb3V0ZXJTZXJ2aWNlPEM+PiA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5yb3V0ZXMgPSBkYXRhLnJvdXRlcyB8fCBbXVxuICAgICAgICB0aGlzLm1pZGRsZXdhcmVzID0gZGF0YS5taWRkbGV3YXJlcyB8fCBbXVxuICAgICAgICB0aGlzLnByZWZpeGVzID0gZGF0YS5wcmVmaXhlcyB8fCBbXVxuICAgICAgICB0aGlzLmdyb3VwcyA9IGRhdGEuZ3JvdXBzIHx8IFtdXG4gICAgICAgIHRoaXMuZ3JvdXBQcmVmaXhlcyA9IGRhdGEuZ3JvdXBQcmVmaXhlcyB8fCBbXVxuICAgICAgICB0aGlzLmRlYnVnID0gZGF0YS5kZWJ1ZyB8fCBmYWxzZVxuICAgICAgICB0aGlzLm1ldGFkYXRhID0gZGF0YS5tZXRhZGF0YSB8fCB7fVxuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IGRhdGEubGlzdGVuZXJzIHx8IFtdXG4gICAgICAgIHRoaXMubG9nZ2VyID0gZGF0YS5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIH1cblxuICAgIHB1YmxpYyB1c2U8VCBleHRlbmRzIE1pZGRsZXdhcmU+KG1pZGRsZXdhcmU6IFQsIGNvbnRleHQ6IFJvdXRlQ29udGV4dCA9ICdyb3V0ZScpIHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlcy5wdXNoKHtcbiAgICAgICAgICAgIG1pZGRsZXdhcmUsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiB0aGlzIGFzIFJvdXRlclNlcnZpY2U8QyAmIE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQ8W3R5cGVvZiBtaWRkbGV3YXJlXT4+XG4gICAgfVxuXG4gICAgcHVibGljIHByZWZpeChwcmVmaXg6IHN0cmluZykge1xuICAgICAgICB0aGlzLnByZWZpeGVzLnB1c2gocHJlZml4KVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIG1ha2VQYXRoKGFyZ3M6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSBqb2luKFsuLi50aGlzLmdyb3VwUHJlZml4ZXMsIC4uLnRoaXMucHJlZml4ZXMsIGFyZ3NdLCAnLycpXG5cbiAgICAgICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZSBzbGFzaGVzXG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXC8rL2csICcvJylcblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcHVibGljIGFkZChwYXlsb2FkOiBQaWNrPFJvdXRlLCAncGF0aCcgfCAnbWV0aG9kJyB8ICdoYW5kbGVyJz4pIHtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBuZXcgUm91dGUoe1xuICAgICAgICAgICAgbWV0aG9kOiBwYXlsb2FkLm1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMubWFrZVBhdGgocGF5bG9hZC5wYXRoKSxcbiAgICAgICAgICAgIGhhbmRsZXI6IHBheWxvYWQuaGFuZGxlcixcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzOiB0aGlzLm1pZGRsZXdhcmVzLm1hcChtID0+IG0ubWlkZGxld2FyZSksXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5taWRkbGV3YXJlcyA9IHRoaXMubWlkZGxld2FyZXMuZmlsdGVyKG0gPT4gbS5jb250ZXh0ICE9PSAncm91dGUnKVxuXG4gICAgICAgIHRoaXMucHJlZml4ZXMgPSBbXSAvLyBSZXNldCBwcmVmaXhlcyBhZnRlciB1c2VcblxuICAgICAgICB0aGlzLnJvdXRlcy5wdXNoKHJvdXRlKVxuXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnYWRkZWQgcm91dGUnLCByb3V0ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnYWRkZWQnLCByb3V0ZSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHBvc3QocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBIYW5kbGVyPEM+KSB7XG4gICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHB1dChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IEhhbmRsZXI8Qz4pIHtcbiAgICAgICAgdGhpcy5hZGQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG1hbnkobWV0aG9kczogUm91dGVbJ21ldGhvZCddW10sIHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICBtZXRob2RzLmZvckVhY2gobWV0aG9kID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkKHtcbiAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlKHBhdGg6IHN0cmluZywgaGFuZGxlcjogSGFuZGxlcjxDPikge1xuICAgICAgICB0aGlzLmFkZCh7XG4gICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICBwdWJsaWMgZ3JvdXAoKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gbmV3IFJvdXRlclNlcnZpY2U8Qz4oe1xuICAgICAgICAgICAgbGlzdGVuZXJzOiB0aGlzLmxpc3RlbmVycywgLy8gSW5oZXJpdCBsaXN0ZW5lcnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgIGRlYnVnOiB0aGlzLmRlYnVnLFxuICAgICAgICB9KVxuXG4gICAgICAgIGdyb3VwLmdyb3VwUHJlZml4ZXMgPSB0aGlzLnByZWZpeGVzIC8vIEluaGVyaXQgcHJlZml4ZXMgZnJvbSBwYXJlbnRcbiAgICAgICAgZ3JvdXAubWlkZGxld2FyZXMgPSB0aGlzLm1pZGRsZXdhcmVzLm1hcChyID0+ICh7XG4gICAgICAgICAgICBtaWRkbGV3YXJlOiByLm1pZGRsZXdhcmUsXG4gICAgICAgICAgICBjb250ZXh0OiAnZ3JvdXAnXG4gICAgICAgIH0pKVxuXG4gICAgICAgIHRoaXMuZ3JvdXBzLnB1c2goZ3JvdXApXG5cbiAgICAgICAgdGhpcy5taWRkbGV3YXJlcyA9IHRoaXMubWlkZGxld2FyZXMuZmlsdGVyKG0gPT4gbS5jb250ZXh0ICE9PSAncm91dGUnKVxuICAgICAgICB0aGlzLnByZWZpeGVzID0gW10gLy8gUmVzZXQgcHJlZml4ZXMgYWZ0ZXIgdXNlXG5cbiAgICAgICAgcmV0dXJuIGdyb3VwXG4gICAgfVxuXG4gICAgcHVibGljIHJlc29sdmUobWV0aG9kOiBzdHJpbmcsIHBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMubGlzdCgpXG4gICAgICAgICAgICAuZmluZChyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoci5tZXRob2QudG9VcHBlckNhc2UoKSAhPT0gbWV0aG9kLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoUGF0aChyLnBhdGgsIHBhdGgpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGlmICghcm91dGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGVcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShyb3V0ZTogUm91dGUsIGluaXRpYWxDdHg6IGFueSkge1xuICAgICAgICBpZiAoIXJvdXRlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGUgaGFuZGxlciBub3QgZm91bmQgZm9yICR7cm91dGUubWV0aG9kfSAke3JvdXRlLnBhdGh9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN0eCA9IHsgLi4uaW5pdGlhbEN0eCB9XG5cbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBtaWRkbGV3YXJlIG9mIHJvdXRlLm1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBtaWRkbGV3YXJlLmhhbmRsZShjdHgpXG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgJ3JlZGlyZWN0JyBpbiByZXN1bHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3R4LCByZXN1bHQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcm91dGUuaGFuZGxlcihjdHgpXG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyKCkge1xuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NsZWFyJywgeyBjb3VudDogdGhpcy5yb3V0ZXMubGVuZ3RoIH0pXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlcyA9IFtdXG4gICAgICAgIHRoaXMuZ3JvdXBzID0gW11cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVzLmNvbmNhdCguLi50aGlzLmdyb3Vwcy5tYXAoZyA9PiBnLnJvdXRlcykpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQob3B0aW9uczogTG9hZE9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdzZXJ2aWNlIGxvYWRlZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkU3luYyhvcHRpb25zOiBMb2FkT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IHRoaXMuZGVidWdcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3NlcnZpY2UgbG9hZGVkIGluIGRlYnVnIG1vZGUnKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUge1xuICAgIFJlcXVlc3QsIFxuICAgIFJlc3BvbnNlLFxuICAgIENvb2tpZU9wdGlvbnNcbn0gZnJvbSAnZXhwcmVzcydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb29raWVNYXBFbnRpdHkgZXh0ZW5kcyBCYXNlIHtcbiAgICBwdWJsaWMgcmVxdWVzdDogUmVxdWVzdFxuICAgIHB1YmxpYyByZXNwb25zZTogUmVzcG9uc2VcblxuICAgIGNvbnN0cnVjdG9yKHJlcXVlc3Q6IFJlcXVlc3QsIHJlc3BvbnNlOiBSZXNwb25zZSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBjb29raWVzOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihPYmplY3QuZW50cmllcyhyZXF1ZXN0LmNvb2tpZXMpKSxcbiAgICAgICAgICAgIHByZWZpeDogY29uZmlnLmdldCgnY29va2llLnByZWZpeCcsICcnKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlXG4gICAgfVxuXG4gICAgcHVibGljIHNldChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBDb29raWVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMucHJlZml4XG5cbiAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBwcmVmaXggKyBuYW1lXG5cbiAgICAgICAgY29uc3Qgb3B0czogQ29va2llT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXNwb25zZS5jb29raWUoZnVsbE5hbWUsIHZhbHVlLCBvcHRzKVxuICAgICAgICBcbiAgICAgICAgc3VwZXIuc2V0KGZ1bGxOYW1lLCB2YWx1ZSwgb3B0aW9ucylcbiAgICB9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFNlcnZlciB9IGZyb20gJ2h0dHAnXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJ1xuaW1wb3J0IGNvcnMgZnJvbSAnY29ycydcbmltcG9ydCBjb29raWVQYXJzZXIgZnJvbSAnY29va2llLXBhcnNlcidcbmltcG9ydCBSb3V0ZXIgZnJvbSAnLi9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IEV4Y2VwdGlvblNlcnZpY2UgZnJvbSAnLi9FeGNlcHRpb25TZXJ2aWNlLnRzJ1xuaW1wb3J0IFJvdXRlIGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvUm91dGVFbnRpdHkudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBFbW1pdHRlclNlcnZpY2UsIExvZ2dlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5pbXBvcnQgQ29va2llTWFwRW50aXR5IGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvQ29va2llTWFwRW50aXR5LnRzJ1xuaW1wb3J0IEVudlNlcnZpY2UgZnJvbSAnLi9FbnZTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBTZXJ2aWNlT3B0aW9ucyB7XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIHJvdXRlcj86IFJvdXRlcjtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlO1xuICAgIGV4Y2VwdGlvbj86IEV4Y2VwdGlvblNlcnZpY2U7XG4gICAgZW1taXR0ZXI/OiBFbW1pdHRlclNlcnZpY2U7XG4gICAgZW52PzogRW52U2VydmljZTtcbiAgICBvcmlnaW5zPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdIdHRwU2VydmljZSdcblxuICAgIHB1YmxpYyBhcHA6IGV4cHJlc3MuQXBwbGljYXRpb25cbiAgICBwdWJsaWMgc2VydmVyOiBTZXJ2ZXIgfCBudWxsID0gbnVsbFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlclxuICAgIHB1YmxpYyBleGNlcHRpb246IEV4Y2VwdGlvblNlcnZpY2VcbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG4gICAgcHVibGljIGVtbWl0dGVyOiBFbW1pdHRlclNlcnZpY2VcbiAgICBwdWJsaWMgZW52OiBFbnZTZXJ2aWNlXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgb25VbmhhbmRsZXJSb3V0ZWQ6ICgocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbFxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSHR0cFNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBvcHRpb25zLmRlYnVnIHx8IGZhbHNlXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLnJvdXRlciA9IG9wdGlvbnMucm91dGVyIHx8IG5ldyBSb3V0ZXIoKVxuICAgICAgICB0aGlzLmVtbWl0dGVyID0gb3B0aW9ucy5lbW1pdHRlciB8fCBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5lbnYgPSBvcHRpb25zLmVudiB8fCBuZXcgRW52U2VydmljZSgpXG4gICAgICAgIHRoaXMuZXhjZXB0aW9uID0gb3B0aW9ucy5leGNlcHRpb24gfHwgbmV3IEV4Y2VwdGlvblNlcnZpY2UoeyBsb2dnZXI6IHRoaXMubG9nZ2VyLCBlbnY6IHRoaXMuZW52IH0pXG5cbiAgICAgICAgdGhpcy5hcHAgPSBleHByZXNzKClcbiAgICAgICAgdGhpcy5hcHAudXNlKGNvb2tpZVBhcnNlcigpKVxuICAgICAgICB0aGlzLmFwcC51c2UodGhpcy5wYXJzZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGdldEV4cHJlc3NBcHAoKTogZXhwcmVzcy5BcHBsaWNhdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcFxuICAgIH1cblxuICAgIHB1YmxpYyBjb3JzKG9wdGlvbnM6IGNvcnMuQ29yc09wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5hcHAudXNlKGNvcnMob3B0aW9ucykpXG4gICAgfVxuXG4gICAgcHVibGljIHVzZTogZXhwcmVzcy5BcHBsaWNhdGlvblsndXNlJ10gPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgdGhpcy5hcHAudXNlKC4uLmFyZ3MpXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwXG4gICAgfVxuXG4gICAgcHVibGljIHJvdXRlcygpIHtcbiAgICAgICAgdGhpcy5hcHAudXNlKCcqYWxsJywgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS5vcmlnaW5hbFVybCwgYGh0dHA6Ly8ke3JlcS5oZWFkZXJzLmhvc3R9YClcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QudG9Mb3dlckNhc2UoKVxuXG4gICAgICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMucm91dGVyLnJlc29sdmUobWV0aG9kLCB1cmwucGF0aG5hbWUpXG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJvdXRlci5kZWJ1Zykge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLmxvZ2dlci5kZWJ1ZyhgJHttZXRob2QudG9VcHBlckNhc2UoKX0gJHt1cmwucGF0aG5hbWV9YClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJvdXRlKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRlKHVybCwgcmVxLCByZXMsIHJvdXRlKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoJy9hcGkvJykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg0MDQpLmpzb24oe1xuICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ05vdCBGb3VuZCcsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBBUEkgcm91dGUgZm91bmQgZm9yICR7bWV0aG9kLnRvVXBwZXJDYXNlKCl9ICR7dXJsfWAsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub25VbmhhbmRsZXJSb3V0ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vblVuaGFuZGxlclJvdXRlZChyZXEsIHJlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcGFyc2VyKHJlcTogZXhwcmVzcy5SZXF1ZXN0LCByZXM6IGV4cHJlc3MuUmVzcG9uc2UsIG5leHQ6IGV4cHJlc3MuTmV4dEZ1bmN0aW9uKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVxLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIHx8ICcnXG5cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlLnN0YXJ0c1dpdGgoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkge1xuICAgICAgICAgICAgLy8gU2tpcCBKU09OIGFuZCBVUkwtZW5jb2RlZCBwYXJzZXJzIGZvciBtdWx0aXBhcnQgcmVxdWVzdHNcbiAgICAgICAgICAgIHJldHVybiBuZXh0KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvciBvdGhlciBjb250ZW50IHR5cGVzLCBwYXJzZSBKU09OIGFuZCBVUkwtZW5jb2RlZCBib2R5XG4gICAgICAgIGV4cHJlc3MuanNvbigpKHJlcSwgcmVzLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gbmV4dChlcnIpXG5cbiAgICAgICAgICAgIGV4cHJlc3MudXJsZW5jb2RlZCh7IGV4dGVuZGVkOiB0cnVlIH0pKHJlcSwgcmVzLCBuZXh0KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlKHVybDogVVJMLCByZXF1ZXN0OiBleHByZXNzLlJlcXVlc3QsIHJlc3BvbnNlOiBleHByZXNzLlJlc3BvbnNlLCByb3V0ZTogUm91dGUpIHtcbiAgICAgICAgY29uc3QgY3R4OiBPbWl0PEh0dHBDb250ZXh0LCAnYWNsJz4gPSB7XG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICAgIHJlcXVlc3QsXG5cbiAgICAgICAgICAgIHVybDogdXJsLnBhdGhuYW1lLFxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgcGFyYW1zOiBSb3V0ZS5wYXJhbXMocm91dGUucGF0aCwgdXJsLnBhdGhuYW1lKSxcbiAgICAgICAgICAgIHF1ZXJ5OiBSb3V0ZS5xdWVyeSh1cmwuaHJlZiksXG4gICAgICAgICAgICBib2R5OiByZXF1ZXN0LmJvZHkgfHwge30sXG5cbiAgICAgICAgICAgIGNvb2tpZTogbmV3IENvb2tpZU1hcEVudGl0eShyZXF1ZXN0LCByZXNwb25zZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgcmVzdWx0XSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMucm91dGVyLmV4ZWN1dGUocm91dGUsIGN0eCkpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbi5oYW5kbGUoZXJyb3IsIHJlc3BvbnNlKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAvLyBpZiBoZWFkZXJzIGFyZSBhbHJlYWR5IHNlbnQsIGRvIG5vdCBtb2RpZnkgdGhlIHJlc3BvbnNlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5yZWRpcmVjdCkge1xuICAgICAgICAgICAgcmVzcG9uc2UucmVkaXJlY3QocmVzdWx0LnJlZGlyZWN0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBoZWFkZXJzIG5vdCBzZXQgXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1cygyMDApXG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpXG4gICAgICAgIH1cblxuICAgICAgICByZXNwb25zZS5zZW5kKHJlc3VsdClcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnQoKSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLmVudi5nZXQoJ1pFTklUSF9QT1JUJylcbiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuZW52LmdldCgnWkVOSVRIX0hPU1QnKVxuXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9YFxuXG4gICAgICAgIHRoaXMuc2VydmVyID0gdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3NlcnZlciBzdGFydGVkJywge1xuICAgICAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgICAgICBlbnY6IHRoaXMuZW52LmdldCgnTk9ERV9FTlYnKSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuZW1taXR0ZXIuZW1pdCgnaHR0cDpzdGFydGVkJylcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2Fybignc2VydmVyIGlzIG5vdCBydW5uaW5nJylcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2VydmVyLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKClcblxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3NlcnZlciBzdG9wcGVkJywge1xuICAgICAgICAgICAgICAgICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgICAgICAgICAgICAgICBlbnY6IHRoaXMuZW52LmdldCgnTk9ERV9FTlYnKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuY2xvc2UoKVxuXG4gICAgICAgIH0pXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgeyBLeXNlbHkgfSBmcm9tIFwia3lzZWx5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGFiYXNlR2F0ZXdheTxEQj4gZXh0ZW5kcyBLeXNlbHk8REI+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdEYXRhYmFzZUdhdGV3YXknXG59XG4iLCJpbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBEYXRhYmFzZUdhdGV3YXkgZnJvbSAnI3NlcnZlci9nYXRld2F5cy9EYXRhYmFzZUdhdGV3YXkudHMnXG5cbmNvbnN0IGRhdGFiYXNlID0gY29udGFpbmVyLnByb3h5PERhdGFiYXNlR2F0ZXdheTxEYXRhYmFzZUNvbnRyYWN0Pj4oRGF0YWJhc2VHYXRld2F5KVxuXG5leHBvcnQgZGVmYXVsdCBkYXRhYmFzZVxuXG4iLCJpbXBvcnQgdHlwZSB7IEZpbmRNYW55T3B0aW9ucywgUGFnaW5hdGVPcHRpb25zLCBQYWdpbmF0aW9uIH0gZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBJUmVwb3NpdG9yeVR5cGVzPFRFbnRpdHkgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBUUHJpbWFyeUtleVR5cGUgPSBhbnksIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPlxuXG4gICAgZmluZE1hbnkob3B0aW9ucz86IFRPcHRpb25zICYgRmluZE1hbnlPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+XG4gICAgZmluZEJ5SWQoaWQ6IFRQcmltYXJ5S2V5VHlwZSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD5cbiAgICBmaW5kQnlJZE9yRmFpbChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHk+XG5cbiAgICBwYWdpbmF0ZShvcHRpb25zPzogVE9wdGlvbnMgJiBQYWdpbmF0ZU9wdGlvbnMpOiBQcm9taXNlPFBhZ2luYXRpb24+XG5cbiAgICBjcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Piwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PlxuICAgIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHlbXT4gXG5cbiAgICBkZWxldGVCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUpOiBQcm9taXNlPHZvaWQ+XG4gICAgZGVzdHJveU1hbnkob3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPlxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluPFRFbnRpdHkgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBUUHJpbWFyeUtleVR5cGUgPSBhbnksIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55Pj4oKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICBhYnN0cmFjdCBjbGFzcyBPcHRpb25zTWl4aW4gZXh0ZW5kcyBCYXNlIHtcbiAgICAgICAgICAgIC8vIFdlIFwiZGVjbGFyZVwiIHRoZXNlIG1ldGhvZHMgc28gdGhleSBleGlzdCBpbiB0aGUgdHlwZSBzcGFjZVxuICAgICAgICAgICAgLy8gZm9yIHRoaXMgc3BlY2lmaWMgVE9wdGlvbnMsIHdpdGhvdXQgb3ZlcnJpZGluZyB0aGUgbG9naWMuXG4gICAgICAgICAgICBhYnN0cmFjdCBjb3VudChvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj5cblxuICAgICAgICAgICAgYWJzdHJhY3QgZmluZE1hbnkob3B0aW9ucz86IFRPcHRpb25zICYgRmluZE1hbnlPcHRpb25zKTogUHJvbWlzZTxURW50aXR5W10+XG4gICAgICAgICAgICBhYnN0cmFjdCBmaW5kQnlJZChpZDogVFByaW1hcnlLZXlUeXBlLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPlxuICAgICAgICAgICAgYWJzdHJhY3QgZmluZEJ5SWRPckZhaWwoaWQ6IFRQcmltYXJ5S2V5VHlwZSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PlxuXG4gICAgICAgICAgICBhYnN0cmFjdCBwYWdpbmF0ZShvcHRpb25zPzogVE9wdGlvbnMgJiBQYWdpbmF0ZU9wdGlvbnMpOiBQcm9taXNlPHsgaXRlbXM6IFRFbnRpdHlbXTsgdG90YWw6IG51bWJlciB9PlxuXG4gICAgICAgICAgICBhYnN0cmFjdCBjcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Piwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5PlxuICAgICAgICAgICAgYWJzdHJhY3QgY3JlYXRlTWFueShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+W10sIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPlxuXG4gICAgICAgICAgICBhYnN0cmFjdCBkZWxldGVCeUlkKGlkOiBUUHJpbWFyeUtleVR5cGUpOiBQcm9taXNlPHZvaWQ+XG4gICAgICAgICAgICBhYnN0cmFjdCBkZXN0cm95TWFueShvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gT3B0aW9uc01peGluIGFzIFRCYXNlICYgQ29uc3RydWN0b3I8SVJlcG9zaXRvcnlUeXBlczxURW50aXR5LCBUUHJpbWFyeUtleVR5cGUsIFRPcHRpb25zPj5cbiAgICB9XG59XG4iLCJpbXBvcnQgeyAgc3FsICB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgU2VsZWN0YWJsZSwgU2VsZWN0UXVlcnlCdWlsZGVyLCBFeHByZXNzaW9uQnVpbGRlciBhcyBLRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcblxuZXhwb3J0IHR5cGUgU2VsZWN0RnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID1cbiAgICBSZXR1cm5UeXBlPHR5cGVvZiBkYi5zZWxlY3RGcm9tPFQ+PlxuICAgIHwgU2VsZWN0UXVlcnlCdWlsZGVyPERhdGFiYXNlLCBULCBhbnk+XG5cbmV4cG9ydCB0eXBlIEluc2VydEZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLmluc2VydEludG88VD4+XG5leHBvcnQgdHlwZSBVcGRhdGVGcm9tPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBSZXR1cm5UeXBlPHR5cGVvZiBkYi51cGRhdGVUYWJsZTxUPj5cbmV4cG9ydCB0eXBlIERlbGV0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLmRlbGV0ZUZyb208VD4+XG5cbmV4cG9ydCB0eXBlIFNlbGVjdEJ1aWxkZXI8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFNlbGVjdFF1ZXJ5QnVpbGRlcjxEYXRhYmFzZSwgVCwgU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4+XG5leHBvcnQgdHlwZSBFeHByZXNzaW9uQnVpbGRlcjxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gS0V4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPlxuXG5leHBvcnQgY29uc3Qgbm93ID0gKCkgID0+IHNxbDxzdHJpbmc+YENVUlJFTlRfVElNRVNUQU1QYFxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgc2VyaWFsaXplPzogKHJvdzogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4pID0+IGFueVxufVxuXG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVSZXN1bHQ8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB8IHVuZGVmaW5lZD4gPVxuICAgIE8gZXh0ZW5kcyB1bmRlZmluZWQgPyBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPiA6XG4gICAgTyBleHRlbmRzIHsgc2VyaWFsaXplOiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gaW5mZXIgUiB9ID8gUiA6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+XG4iLCJpbXBvcnQgdHlwZSB7IFNlbGVjdEZyb20gfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIENvdW50T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBxdWVyeT86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxuICAgIGRlYnVnPzogYm9vbGVhblxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY291bnQ8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgQ291bnRPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGFibGUpIGFzIGFueSBcblxuICAgIGlmIChvcHRpb25zPy5xdWVyeSkge1xuICAgICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkoZGIuc2VsZWN0RnJvbSh0YWJsZSkpIFxuICAgIH1cblxuICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgLmNsZWFyU2VsZWN0KClcbiAgICAgICAgLmNsZWFyT3JkZXJCeSgpXG4gICAgICAgIC5zZWxlY3QoKGViOiBhbnkpID0+IGViLmZuLmNvdW50QWxsKCkuYXMoJ2NvdW50JykpXG5cbiAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2cocXVlcnkuY29tcGlsZSgpKVxuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IChxdWVyeSBhcyBhbnkpLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgcmV0dXJuIE51bWJlcihyb3c/LmNvdW50ID8/IDApXG59IiwiaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdG9EYih2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gKGRiIGFzIGFueSkuY3VycmVudENvbm5lY3Rpb25EaWFsZWN0TmFtZVxuXG4gICAgaWYgKGRpYWxlY3QgPT09ICdzcWxpdGUnKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQobmV3IERhdGUodmFsdWUpLCAneXl5eS1NTS1kZCBISDptbTpzcycpXG4gICAgfVxuXG4gICAgaWYgKGRpYWxlY3QgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdChuZXcgRGF0ZSh2YWx1ZSksICd5eXl5LU1NLWRkIEhIOm1tOnNzJylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpLnRvSVNPU3RyaW5nKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21EYih2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IERhdGUgfCBudWxsIHsgICAgXG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHRvRGIodmFsdWU6IG9iamVjdCB8IGFueVtdKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbURiKHZhbHVlOiBhbnkpOiBvYmplY3QgfCBhbnlbXSB8IG51bGwge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKVxufVxuIiwiaW1wb3J0IGRhdGFiYXNlIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuY29uc3QgZGIgPSBkYXRhYmFzZSBhcyBhbnlcblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGIodmFsdWU6IGJvb2xlYW4gfCBudW1iZXIgfCBudWxsKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3QgZGlhbGVjdCA9IGRiLmN1cnJlbnRDb25uZWN0aW9uRGlhbGVjdE5hbWVcblxuICAgIGlmIChkaWFsZWN0ID09PSAnc3FsaXRlJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPyAxIDogMFxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZSA/IHRydWUgOiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbURiKHZhbHVlOiBhbnkgfCBudWxsKTogYm9vbGVhbiB8IG51bGwgeyAgICBcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCBkaWFsZWN0ID0gZGIuY3VycmVudENvbm5lY3Rpb25EaWFsZWN0TmFtZVxuXG4gICAgaWYgKGRpYWxlY3QgID09PSAnc3FsaXRlJykge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgPyB0cnVlIDogZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZVxufVxuIiwiaW1wb3J0ICogYXMgIGRhdGV0aW1lIGZyb20gJy4vZGF0ZXRpbWUudHMnXG5pbXBvcnQgKiBhcyBqc29uIGZyb20gJy4vanNvbi50cydcbmltcG9ydCAqIGFzIGJvb2xlYW4gZnJvbSAnLi9ib29sZWFuLnRzJ1xuXG5leHBvcnQgZnVuY3Rpb24gdG9EYihwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7IC4uLnBheWxvYWQgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gcmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHRba2V5XSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gZGF0ZXRpbWUudG9EYihyZXN1bHRba2V5XSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IGpzb24udG9EYihyZXN1bHRba2V5XSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0W2tleV0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBib29sZWFuLnRvRGIocmVzdWx0W2tleV0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRba2V5XSkpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0ganNvbi50b0RiKHJlc3VsdFtrZXldKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbURiKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgcmVzdWx0ID0geyAuLi52YWx1ZSB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZXN1bHQpIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBwYXJzZVZhbHVlKHJlc3VsdFtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbiIsImltcG9ydCAqIGFzIGFsbCBmcm9tICcuL2FsbC50cydcbmltcG9ydCAqIGFzIGRhdGV0aW1lIGZyb20gJy4vZGF0ZXRpbWUudHMnXG5cbmNvbnN0IG5vcm1hbGl6ZXJzID0ge1xuICAgIGFsbCxcbiAgICBkYXRldGltZVxufVxuXG5leHBvcnQgZGVmYXVsdCBub3JtYWxpemVyc1xuIiwiaW1wb3J0IHR5cGUgeyBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IG5vcm1hbGl6ZXJzIGZyb20gJyNzZXJ2ZXIvbm9ybWFsaXplcnMvaW5kZXgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IGV4dGVuZHMgU2VyaWFsaXplT3B0aW9uczxUPiB7XG4gICAgdmFsdWVzOiBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPlxuICAgIHByaW1hcnlLZXk/OiBzdHJpbmcgLy8gZGVmYXVsdCAnaWQnXG4gICAgbm9ybWFsaXplPzogYm9vbGVhbiB8ICgodmFsdWU6IGFueSkgPT4gYW55KSAvLyBkZWZhdWx0IHRydWVcbn1cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCB2YWx1ZXMgPSAob3B0aW9ucz8udmFsdWVzIHx8IHt9KSBhcyBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPlxuICAgIGNvbnN0IGluc2VydCA9IGRiLmluc2VydEludG8odGFibGUpLnZhbHVlcyh2YWx1ZXMpXG5cbiAgICBsZXQgcm93OiBhbnkgPSBhd2FpdCBpbnNlcnQucmV0dXJuaW5nQWxsKCkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvdyA9IG9wdGlvbnMuc2VyaWFsaXplKHJvdylcbiAgICB9XG5cbiAgICByZXR1cm4gcm93IGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTXlzcWw8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgQ3JlYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgdmFsdWVzID0gKG9wdGlvbnM/LnZhbHVlcyB8fCB7fSkgYXMgSW5zZXJ0YWJsZTxEYXRhYmFzZVtUXT5cbiAgICBjb25zdCBpbnNlcnQgPSBkYi5pbnNlcnRJbnRvKHRhYmxlKS52YWx1ZXModmFsdWVzKVxuXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IChvcHRpb25zPy5wcmltYXJ5S2V5IHx8ICdpZCcpIGFzIGtleW9mIERhdGFiYXNlW1RdXG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnNlcnQuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICBjb25zdCByZXN1bHRJZCA9IHJlc3VsdC5pbnNlcnRJZCBhcyBhbnlcblxuICAgIGNvbnN0IHNlbGVjdCA9IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpIGFzIGFueVxuXG4gICAgbGV0IHJvdyA9IGF3YWl0IHNlbGVjdFxuICAgICAgICAud2hlcmUocHJpbWFyeUtleSwgJz0nLCByZXN1bHRJZClcbiAgICAgICAgLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlcmlhbGl6ZSkge1xuICAgICAgICByb3cgPSBvcHRpb25zLnNlcmlhbGl6ZShyb3cpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbn1cblxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIENyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGxldCB2YWx1ZXM6IGFueSA9IG9wdGlvbnM/LnZhbHVlcyB8fCB7fVxuXG4gICAgY29uc3Qgbm9ybWFsaXplID0gdHlwZW9mIG9wdGlvbnM/Lm5vcm1hbGl6ZSA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnM/Lm5vcm1hbGl6ZSA6IG5vcm1hbGl6ZXJzLmFsbC50b0RiXG5cbiAgICBpZiAob3B0aW9ucz8ubm9ybWFsaXplICE9PSBmYWxzZSkge1xuICAgICAgICB2YWx1ZXMgPSBub3JtYWxpemUodmFsdWVzKVxuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZE9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChkYi5kcml2ZXIgPT09ICdteXNxbCcpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU15c3FsKHRhYmxlLCBwYXJzZWRPcHRpb25zKVxuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVEZWZhdWx0KHRhYmxlLCBwYXJzZWRPcHRpb25zKVxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbldyYXBwZXIsIEV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbnR5cGUgRGVsZXRlRnJvbTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gUmV0dXJuVHlwZTx0eXBlb2YgZGIuZGVsZXRlRnJvbTxUPj5cblxuZXhwb3J0IGludGVyZmFjZSBEZXN0cm95T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+IHtcbiAgICBxdWVyeT86IChxYjogRGVsZXRlRnJvbTxUPikgPT4gRGVsZXRlRnJvbTxUPlxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXN0cm95PFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIERlc3Ryb3lPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBsZXQgcXVlcnk6IGFueSA9IG9wdGlvbnM/LnF1ZXJ5IFxuICAgICAgICA/IG9wdGlvbnMucXVlcnkoZGIuZGVsZXRlRnJvbSh0YWJsZSkpIFxuICAgICAgICA6IGRiLmRlbGV0ZUZyb20odGFibGUpXG5cbiAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKSBhcyBhbnlcbiAgICB9XG5cbiAgICBhd2FpdCBxdWVyeS5leGVjdXRlKClcbn0iLCJpbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25CdWlsZGVyLCBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSwgU2VyaWFsaXplT3B0aW9ucywgU2VyaWFsaXphYmxlUmVzdWx0IH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ICBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgb2Zmc2V0PzogbnVtYmVyXG4gICAgZGVidWc/OiBib29sZWFuXG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbiAgICBxdWVyeT86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBMaXN0T3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgbGV0IHF1ZXJ5ID0gKG9wdGlvbnM/LnF1ZXJ5IHx8IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy5xdWVyeSkge1xuICAgICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkoZGIuc2VsZWN0RnJvbSh0YWJsZSkpIFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpXG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmxpbWl0KSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkubGltaXQob3B0aW9ucy5saW1pdClcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8ub2Zmc2V0KSB7XG4gICAgICAgIHF1ZXJ5ID0gcXVlcnkub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgcXVlcnkuZXhlY3V0ZSgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvd3MgPSByb3dzLm1hcChvcHRpb25zLnNlcmlhbGl6ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXVxufSIsImltcG9ydCB7IGxpc3QgIH0gZnJvbSAnLi9saXN0LnRzJ1xuaW1wb3J0IHR5cGUgeyBMaXN0T3B0aW9ucyB9IGZyb20gJy4vbGlzdC50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGlzdHM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgTGlzdE9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBsaXN0KHRhYmxlLCBvcHRpb25zKVxuXG4gICAgY29uc3QgZm91bmQgPSByb3dzWzBdXG5cbiAgICByZXR1cm4gISFmb3VuZFxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluZE9uZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIG5hbWU/OiBzdHJpbmdcbiAgICBxdWVyeT86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kT25lPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIEZpbmRPbmVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBsZXQgcXVlcnkgPSBkYi5zZWxlY3RGcm9tKHRhYmxlKS5zZWxlY3RBbGwoKSBhcyBhbnlcblxuICAgIGlmIChvcHRpb25zPy5xdWVyeSkge1xuICAgICAgICBxdWVyeSA9IG9wdGlvbnMucXVlcnkocXVlcnkpIGFzIGFueVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy53aGVyZSkge1xuICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBvcHRpb25zLndoZXJlIShlYikpIGFzIGFueVxuICAgIH1cblxuICAgIGNvbnN0IHJvdzogYW55ID0gYXdhaXQgcXVlcnkubGltaXQoMSkuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICBpZiAoIXJvdykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemUpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2VyaWFsaXplKHJvdykgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvdyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRPbmVPckZhaWw8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgRmluZE9uZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgZmluZE9uZSh0YWJsZSwgb3B0aW9ucylcblxuICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IG9wdGlvbnM/Lm5hbWUgPz8gJ1JlY29yZCdcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYCR7bmFtZX0gbm90IGZvdW5kYCwgNDA0KVxuICAgIH1cblxuICAgIHJldHVybiBmb3VuZFxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBJbnNlcnRhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tLCBTZXJpYWxpemFibGVSZXN1bHQsIFNlcmlhbGl6ZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1vbi50cydcbmltcG9ydCB7IGxpc3QgfSBmcm9tICcuL2xpc3QudHMnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL2NyZWF0ZS50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0T3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICBzZWxlY3Q/OiAocWI6IFNlbGVjdEZyb208VD4pID0+IFNlbGVjdEZyb208VD5cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHZhbHVlczogSW5zZXJ0YWJsZTxEYXRhYmFzZVtUXT4gfCBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPltdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaXJzdE9yQ3JlYXRlPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZSwgTyBleHRlbmRzIEZpcnN0T3JDcmVhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCBpdGVtcyA9IGF3YWl0IGxpc3QodGFibGUsIHsgXG4gICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsXG4gICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSxcbiAgICAgICAgcXVlcnk6ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBxdWVyeTogYW55ID0gb3B0aW9ucz8uc2VsZWN0IFxuICAgICAgICAgICAgICAgID8gb3B0aW9ucy5zZWxlY3QoZGIuc2VsZWN0RnJvbSh0YWJsZSkpIFxuICAgICAgICAgICAgICAgIDogZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKClcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcXVlcnkubGltaXQoMSlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gaXRlbXNbMF0gYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IGNyZWF0ZSh0YWJsZSwgeyBcbiAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICBzZXJpYWxpemU6IG9wdGlvbnM/LnNlcmlhbGl6ZSxcbiAgICAgICAgdmFsdWVzOiBvcHRpb25zPy52YWx1ZXMgYXMgYW55XG4gICAgfSlcblxuICAgIHJldHVybiBjcmVhdGVkIGFzIFNlcmlhbGl6YWJsZVJlc3VsdDxULCBPPlxufSIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIsIEV4cHJlc3Npb25XcmFwcGVyLCBTZWxlY3RhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RGcm9tIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgeyBsaXN0IH0gZnJvbSAnLi9saXN0LnRzJ1xuaW1wb3J0IHsgY291bnQgfSBmcm9tICcuL2NvdW50LnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzIERhdGFiYXNlIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRGF0YWJhc2VDb250cmFjdC50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgUGFnaW5hdGlvbiBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1BhZ2luYXRpb25FbnRpdHkudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHBhZ2U/OiBudW1iZXJcbiAgICBsaW1pdD86IG51bWJlclxuICAgIG9yZGVyQnk/OiBEYXRhYmFzZVtUXSB8IChrZXlvZiBEYXRhYmFzZVtUXSlbXSBcbiAgICBvcmRlckRlc2M/OiAoJ2FzYycgfCAnZGVzYycpIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdXG4gICAgd2hlcmU/OiAocWI6IEV4cHJlc3Npb25CdWlsZGVyPERhdGFiYXNlLCBUPikgPT4gRXhwcmVzc2lvbldyYXBwZXI8RGF0YWJhc2UsIFQsIGFueT5cbiAgICBzZXJpYWxpemU/OiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gYW55XG4gICAgcXVlcnk/OiAocWI6IFNlbGVjdEZyb208VD4pID0+IGFueVxufVxuXG5leHBvcnQgdHlwZSBQYWdpbmF0ZVJlc3VsdDxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBQYWdpbmF0ZU9wdGlvbnM8VD4gfCB1bmRlZmluZWQ+ID1cbiAgICBPIGV4dGVuZHMgdW5kZWZpbmVkID8gU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4gOlxuICAgIE8gZXh0ZW5kcyB7IHNlcmlhbGl6ZTogKHJvdzogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT4pID0+IGluZmVyIFIgfSA/IFIgOiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFnaW5hdGU8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgUGFnaW5hdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSAmJiBvcHRpb25zLnBhZ2UgPiAwID8gb3B0aW9ucy5wYWdlIDogMVxuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgJiYgb3B0aW9ucy5saW1pdCA+IDAgPyBvcHRpb25zLmxpbWl0IDogMTBcbiAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogbGltaXRcbiAgICBjb25zdCBvcmRlckJ5ID0gb3B0aW9ucz8ub3JkZXJCeSAmJiAoQXJyYXkuaXNBcnJheShvcHRpb25zLm9yZGVyQnkpID8gb3B0aW9ucy5vcmRlckJ5IDogW29wdGlvbnMub3JkZXJCeV0pXG4gICAgY29uc3Qgb3JkZXJEZXNjID0gb3B0aW9ucz8ub3JkZXJEZXNjICYmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJEZXNjKSA/IG9wdGlvbnMub3JkZXJEZXNjIDogW29wdGlvbnMub3JkZXJEZXNjXSlcbiAgICBcbiAgICBjb25zdCBpdGVtcyA9IGF3YWl0IGxpc3QodGFibGUsIHsgXG4gICAgICAgIHNlcmlhbGl6ZTogb3B0aW9ucz8uc2VyaWFsaXplLCAgXG4gICAgICAgIHF1ZXJ5OiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcXVlcnk6IGFueSA9IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5xdWVyeSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LndoZXJlKSB7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgICAgICAgICAgICBvcmRlckJ5XG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCwgaSkgPT4gW2NvbCwgb3JkZXJEZXNjICYmIG9yZGVyRGVzY1tpXSA/IG9yZGVyRGVzY1tpXSA6ICdhc2MnXSBhcyBjb25zdClcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKFtjb2wsIGRpcmVjdGlvbl0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkub3JkZXJCeShjb2wgYXMgc3RyaW5nLCBkaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW1pdCA+IDApIHtcbiAgICAgICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LmxpbWl0KGxpbWl0KS5vZmZzZXQob2Zmc2V0KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocXVlcnkuY29tcGlsZSgpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcXVlcnlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCB0b3RhbCA9IGF3YWl0IGNvdW50KHRhYmxlLCB7XG4gICAgICAgIHF1ZXJ5OiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgcXVlcnk6IGFueSA9IGRiLnNlbGVjdEZyb20odGFibGUpLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5xdWVyeSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShkYi5zZWxlY3RGcm9tKHRhYmxlKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocXVlcnkuY29tcGlsZSgpKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcXVlcnlcbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gUGFnaW5hdGlvbi5mcm9tPFBhZ2luYXRlUmVzdWx0PFQsIE8+Pih7XG4gICAgICAgIGl0ZW1zOiBpdGVtcyBhcyBQYWdpbmF0ZVJlc3VsdDxULCBPPixcbiAgICAgICAgdG90YWwsXG4gICAgICAgIHBhZ2UsXG4gICAgICAgIHBlcl9wYWdlOiBsaW1pdCxcbiAgICAgICAgdG90YWxfcGFnZXM6IE1hdGguY2VpbCh0b3RhbCAvIGxpbWl0KSxcbiAgICB9KVxufSIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciAgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IENvbHVtblR5cGUsIEV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RhYmxlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxudHlwZSBXaGVyZUNhcGFibGU8UUI+ID0ge1xuICB3aGVyZTogKC4uLmFyZ3M6IGFueVtdKSA9PiBRQlxufVxuXG50eXBlIFVwZGF0ZUZyb208VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IFJldHVyblR5cGU8dHlwZW9mIGRiLnVwZGF0ZVRhYmxlPFQ+PlxuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4ge1xuICAgIHNlcmlhbGl6ZT86IChyb3c6IFNlbGVjdGFibGU8RGF0YWJhc2VbVF0+KSA9PiBhbnlcbiAgICBxdWVyeTogKHFiOiBVcGRhdGVGcm9tPFQ+KSA9PiBVcGRhdGVGcm9tPFQ+XG59XG5cbmV4cG9ydCB0eXBlIFNvZnREZWxldGVSZXN1bHQ8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgU29mdERlbGV0ZU9wdGlvbnM8VD4gfCB1bmRlZmluZWQ+ID1cbiAgICBPIGV4dGVuZHMgdW5kZWZpbmVkID8gU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT5bXSA6XG4gICAgTyBleHRlbmRzIHsgc2VyaWFsaXplOiAocm93OiBTZWxlY3RhYmxlPERhdGFiYXNlW1RdPikgPT4gaW5mZXIgUiB9ID8gUltdIDogU2VsZWN0YWJsZTxEYXRhYmFzZVtUXT5bXVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvZnREZWxldGVUYWJsZSB7XG4gIGRlbGV0ZWRfYXQ6IENvbHVtblR5cGU8RGF0ZSB8IG51bGwsIG5ldmVyIHwgbnVsbCB8IFJldHVyblR5cGU8dHlwZW9mIG5vdz4sIHN0cmluZyB8IG51bGwgfCBSZXR1cm5UeXBlPHR5cGVvZiBub3c+PlxufVxuXG5leHBvcnQgZnVuY3Rpb24gd2hlcmVOb3REZWxldGVkPFFCIGV4dGVuZHMgV2hlcmVDYXBhYmxlPFFCPj4ocWI6IFFCKTogUUIge1xuICAgIHJldHVybiBxYi53aGVyZSgnZGVsZXRlZF9hdCcsICdpcycsIG51bGwpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmRlbGV0ZWQgKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pIHtcbiAgICByZXR1cm4gcWIuZWIocWIucmVmKCdkZWxldGVkX2F0JyksICdpcycsIG51bGwpXG59XG5cbnVuZGVsZXRlZC5jb2x1bW4gPSAoY29sOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICAgICAgcmV0dXJuIHFiLmViKGNvbCwgJ2lzJywgbnVsbClcbiAgICB9XG59XG5cblxuZXhwb3J0IGNvbnN0IGRlbGV0ZWQgPSAocWI6IEV4cHJlc3Npb25CdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBxYi5lYignZGVsZXRlZF9hdCcsICdpcyBub3QnLCBudWxsKVxufVxuXG5leHBvcnQgY29uc3QgYWRkU29mdERlbGV0ZUNvbHVtbiA9IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICByZXR1cm4gY3RiLmFkZENvbHVtbignZGVsZXRlZF9hdCcsICd0aW1lc3RhbXAnKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc29mdERlbGV0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBTb2Z0RGVsZXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKTogUHJvbWlzZTxTb2Z0RGVsZXRlUmVzdWx0PFQsIE8+PiB7XG4gICAgbGV0IHF1ZXJ5OiBhbnkgPSBvcHRpb25zPy5xdWVyeSBcbiAgICAgICAgPyBvcHRpb25zLnF1ZXJ5KGRiLnVwZGF0ZVRhYmxlKHRhYmxlKSkgXG4gICAgICAgIDogZGIudXBkYXRlVGFibGUodGFibGUpXG5cbiAgICBxdWVyeSA9IHF1ZXJ5LnNldCh7IGRlbGV0ZWRfYXQ6IG5vdygpIH0pLndoZXJlKHVuZGVsZXRlZClcblxuICAgIGxldCByb3dzOiBhbnlbXSA9IGF3YWl0IHF1ZXJ5XG4gICAgICAgIC5yZXR1cm5pbmdBbGwoKVxuICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvd3MgPSByb3dzLm1hcChvcHRpb25zLnNlcmlhbGl6ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cyBhcyBTb2Z0RGVsZXRlUmVzdWx0PFQsIE8+XG59XG5cbmRlY2xhcmUgbW9kdWxlICdreXNlbHknIHtcbiAgaW50ZXJmYWNlIENyZWF0ZVRhYmxlQnVpbGRlcjxUQiBleHRlbmRzIHN0cmluZywgQyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPiB7XG4gICAgYWRkU29mdERlbGV0ZUNvbHVtbigpOiBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIsIEMgfCAnZGVsZXRlZF9hdCc+XG4gIH1cbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRTb2Z0RGVsZXRlQ29sdW1uID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4sXG4pIHtcbiAgICByZXR1cm4gdGhpcy5hZGRDb2x1bW4oJ2RlbGV0ZWRfYXQnLCAndGltZXN0YW1wJylcbn0iLCJpbXBvcnQgeyBDcmVhdGVUYWJsZUJ1aWxkZXIgIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHR5cGUgeyBDb2x1bW5UeXBlIH0gZnJvbSAna3lzZWx5J1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi9jb21tb24udHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXN0YW1wVGFibGUge1xuICBjcmVhdGVkX2F0OiBDb2x1bW5UeXBlPERhdGUsIHN0cmluZyB8IHVuZGVmaW5lZCwgbmV2ZXI+XG4gIHVwZGF0ZWRfYXQ6IENvbHVtblR5cGU8RGF0ZSwgc3RyaW5nIHwgdW5kZWZpbmVkLCBEYXRlIHwgc3RyaW5nIHwgUmV0dXJuVHlwZTx0eXBlb2Ygbm93Pj5cbn1cblxuZXhwb3J0IGNvbnN0IGFkZENyZWF0ZWRDb2x1bW4gPSAoY3RiOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+KSA9PiB7XG4gICAgcmV0dXJuIGN0YlxuICAgICAgICAuYWRkQ29sdW1uKCdjcmVhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbmV4cG9ydCBjb25zdCBhZGRVcGRhdGVkQ29sdW1uID0gKGN0YjogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55PikgPT4ge1xuICAgIHJldHVybiBjdGJcbiAgICAgICAgLmFkZENvbHVtbigndXBkYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxufVxuXG5leHBvcnQgY29uc3QgYWRkVGltZXN0YW1wQ29sdW1ucyA9IChjdGI6IENyZWF0ZVRhYmxlQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICByZXR1cm4gY3RiXG4gICAgICAgIC5hZGRDb2x1bW4oJ2NyZWF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbiAgICAgICAgLmFkZENvbHVtbigndXBkYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxufVxuXG5kZWNsYXJlIG1vZHVsZSAna3lzZWx5JyB7XG4gIGludGVyZmFjZSBDcmVhdGVUYWJsZUJ1aWxkZXI8VEIgZXh0ZW5kcyBzdHJpbmcsIEMgZXh0ZW5kcyBzdHJpbmcgPSBuZXZlcj4ge1xuICAgIGFkZFRpbWVzdGFtcENvbHVtbnMoKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgJ2NyZWF0ZWRfYXQnIHwgJ3VwZGF0ZWRfYXQnPlxuICAgIGFkZENyZWF0ZWRDb2x1bW4oKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgJ2NyZWF0ZWRfYXQnPlxuICAgIGFkZFVwZGF0ZWRDb2x1bW4oKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgJ3VwZGF0ZWRfYXQnPlxuICB9XG59XG5cbkNyZWF0ZVRhYmxlQnVpbGRlci5wcm90b3R5cGUuYWRkVGltZXN0YW1wQ29sdW1ucyA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+LFxuKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxuICAgICAgICAuYWRkQ29sdW1uKCd1cGRhdGVkX2F0JywgJ3RpbWVzdGFtcCcsIChjb2wpID0+ICBjb2wuZGVmYXVsdFRvKG5vdygpKS5ub3ROdWxsKCkpXG59XG5cbkNyZWF0ZVRhYmxlQnVpbGRlci5wcm90b3R5cGUuYWRkQ3JlYXRlZENvbHVtbiA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+LFxuKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAgICAgLmFkZENvbHVtbignY3JlYXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiAgY29sLmRlZmF1bHRUbyhub3coKSkubm90TnVsbCgpKVxufVxuXG5DcmVhdGVUYWJsZUJ1aWxkZXIucHJvdG90eXBlLmFkZFVwZGF0ZWRDb2x1bW4gPSBmdW5jdGlvbiAoXG4gICAgdGhpczogQ3JlYXRlVGFibGVCdWlsZGVyPGFueSwgYW55Pixcbikge1xuICAgIHJldHVybiB0aGlzXG4gICAgICAgIC5hZGRDb2x1bW4oJ3VwZGF0ZWRfYXQnLCAndGltZXN0YW1wJywgKGNvbCkgPT4gIGNvbC5kZWZhdWx0VG8obm93KCkpLm5vdE51bGwoKSlcbn0iLCJpbXBvcnQgdHlwZSB7IFVwZGF0ZWFibGUsIEV4cHJlc3Npb25CdWlsZGVyLCBFeHByZXNzaW9uV3JhcHBlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgVXBkYXRlRnJvbSwgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBub3JtYWxpemVycyBmcm9tICcjc2VydmVyL25vcm1hbGl6ZXJzL2luZGV4LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiBleHRlbmRzIFNlcmlhbGl6ZU9wdGlvbnM8VD4ge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIHZhbHVlczogVXBkYXRlYWJsZTxEYXRhYmFzZVtUXT5cbiAgICBub3JtYWxpemU/OiBib29sZWFuIHwgKCh2YWx1ZTogYW55KSA9PiBhbnkpIC8vIGRlZmF1bHQgdHJ1ZVxuICAgIHdoZXJlPzogKHFiOiBFeHByZXNzaW9uQnVpbGRlcjxEYXRhYmFzZSwgVD4pID0+IEV4cHJlc3Npb25XcmFwcGVyPERhdGFiYXNlLCBULCBhbnk+XG4gICAgcXVlcnk/OiAocWI6IFVwZGF0ZUZyb208VD4pID0+IFVwZGF0ZUZyb208VD5cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZURlZmF1bHQ8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgVXBkYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgdmFsdWVzID0gb3B0aW9ucz8udmFsdWVzIHx8IFtdXG4gICAgbGV0IHF1ZXJ5ID0gZGIudXBkYXRlVGFibGUodGFibGUpIGFzIGFueVxuXG4gICAgcXVlcnkgPSBxdWVyeS5zZXQodmFsdWVzKS5yZXR1cm5pbmdBbGwoKVxuXG4gICAgaWYgKG9wdGlvbnM/LnF1ZXJ5KSB7XG4gICAgICAgIHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeShxdWVyeSlcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgcXVlcnkgPSBxdWVyeS53aGVyZSgoZWI6IGFueSkgPT4gb3B0aW9ucy53aGVyZSEoZWIpKVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5kZWJ1Zykge1xuICAgICAgICBjb25zb2xlLmxvZyhxdWVyeS5jb21waWxlKCkpXG4gICAgfVxuXG4gICAgbGV0IHJvd3M6IGFueVtdID0gYXdhaXQgcXVlcnkuZXhlY3V0ZSgpXG5cbiAgICBpZiAob3B0aW9ucz8uc2VyaWFsaXplKSB7XG4gICAgICAgIHJvd3MgPSByb3dzLm1hcChvcHRpb25zLnNlcmlhbGl6ZSlcbiAgICB9XG5cbiAgICByZXR1cm4gcm93cyBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTXlzcWw8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlLCBPIGV4dGVuZHMgVXBkYXRlT3B0aW9uczxUPj4odGFibGU6IFQsIG9wdGlvbnM/OiBPKSB7XG4gICAgY29uc3QgdmFsdWVzID0gb3B0aW9ucz8udmFsdWVzIHx8IFtdXG4gICAgY29uc3QgdXBkYXRlUWIgPSBkYi51cGRhdGVUYWJsZSh0YWJsZSkgYXMgYW55XG5cbiAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgdXBkYXRlUWIud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSlcbiAgICB9XG5cbiAgICBhd2FpdCB1cGRhdGVRYi5zZXQodmFsdWVzKS5leGVjdXRlKClcblxuICAgIGNvbnN0IHNlbGVjdFFiID0gZGIuc2VsZWN0RnJvbSh0YWJsZSkuc2VsZWN0QWxsKCkgYXMgYW55XG5cbiAgICBpZiAob3B0aW9ucz8ud2hlcmUpIHtcbiAgICAgICAgc2VsZWN0UWIud2hlcmUoKGViOiBhbnkpID0+IG9wdGlvbnMud2hlcmUhKGViKSlcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coc2VsZWN0UWIuY29tcGlsZSgpKVxuICAgIH1cblxuICAgIGxldCByb3dzOiBhbnlbXSA9IGF3YWl0IHNlbGVjdFFiLmV4ZWN1dGUoKVxuXG4gICAgaWYgKG9wdGlvbnM/LnNlcmlhbGl6ZSkge1xuICAgICAgICByb3dzID0gcm93cy5tYXAob3B0aW9ucy5zZXJpYWxpemUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3MgYXMgU2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+W11cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPcHRpb25zPFQ+Pih0YWJsZTogVCwgb3B0aW9ucz86IE8pIHtcbiAgICBsZXQgdmFsdWVzOiBhbnkgPSBvcHRpb25zPy52YWx1ZXMgfHwge31cblxuICAgIGNvbnN0IG5vcm1hbGl6ZSA9IHR5cGVvZiBvcHRpb25zPy5ub3JtYWxpemUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zPy5ub3JtYWxpemUgOiBub3JtYWxpemVycy5hbGwudG9EYlxuXG4gICAgaWYgKG9wdGlvbnM/Lm5vcm1hbGl6ZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgdmFsdWVzID0gbm9ybWFsaXplKHZhbHVlcylcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoZGIuZHJpdmVyID09PSAnbXlzcWwnKSB7XG4gICAgICAgIHJldHVybiB1cGRhdGVNeXNxbCh0YWJsZSwgcGFyc2VkT3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlRGVmYXVsdCh0YWJsZSwgcGFyc2VkT3B0aW9ucylcbn0iLCJpbXBvcnQgdHlwZSB7IEV4cHJlc3Npb25CdWlsZGVyLCBFeHByZXNzaW9uV3JhcHBlciwgSW5zZXJ0YWJsZSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCB0eXBlIHsgU2VsZWN0RnJvbSwgU2VyaWFsaXphYmxlUmVzdWx0LCBTZXJpYWxpemVPcHRpb25zLCBVcGRhdGVGcm9tIH0gZnJvbSAnLi9jb21tb24udHMnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICcuL2NyZWF0ZS50cydcbmltcG9ydCB7IHVwZGF0ZSB9IGZyb20gJy4vdXBkYXRlLnRzJ1xuaW1wb3J0IHsgZmluZE9uZSB9IGZyb20gJy4vZmluZE9uZS50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlT3JDcmVhdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gZXh0ZW5kcyBTZXJpYWxpemVPcHRpb25zPFQ+IHtcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbiAgICB3aGVyZT86IChxYjogRXhwcmVzc2lvbkJ1aWxkZXI8RGF0YWJhc2UsIFQ+KSA9PiBFeHByZXNzaW9uV3JhcHBlcjxEYXRhYmFzZSwgVCwgYW55PlxuICAgIHNlbGVjdD86IChxYjogU2VsZWN0RnJvbTxUPikgPT4gU2VsZWN0RnJvbTxUPlxuICAgIHVwZGF0ZT86IChxYjogVXBkYXRlRnJvbTxUPikgPT4gVXBkYXRlRnJvbTxUPlxuICAgIHZhbHVlczogSW5zZXJ0YWJsZTxEYXRhYmFzZVtUXT4gfCBJbnNlcnRhYmxlPERhdGFiYXNlW1RdPltdXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVPckNyZWF0ZTxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2UsIE8gZXh0ZW5kcyBVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VD4+KHRhYmxlOiBULCBvcHRpb25zPzogTykge1xuICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBmaW5kT25lKHRhYmxlLCB7IFxuICAgICAgICBkZWJ1Zzogb3B0aW9ucz8uZGVidWcsXG4gICAgICAgIHNlcmlhbGl6ZTogb3B0aW9ucz8uc2VyaWFsaXplLCAgXG4gICAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSxcbiAgICB9KVxuXG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgYXdhaXQgdXBkYXRlKHRhYmxlLCB7IFxuICAgICAgICAgICAgZGVidWc6IG9wdGlvbnM/LmRlYnVnLFxuICAgICAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsXG4gICAgICAgICAgICB2YWx1ZXM6IG9wdGlvbnM/LnZhbHVlcyBhcyBhbnksXG4gICAgICAgICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmVcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gZmluZE9uZSh0YWJsZSwgeyBcbiAgICAgICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgICAgIHNlcmlhbGl6ZTogb3B0aW9ucz8uc2VyaWFsaXplLCAgXG4gICAgICAgICAgICB3aGVyZTogb3B0aW9ucz8ud2hlcmUsXG4gICAgICAgIH0pIGFzIFByb21pc2U8U2VyaWFsaXphYmxlUmVzdWx0PFQsIE8+PlxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBjcmVhdGUodGFibGUsIHsgXG4gICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgc2VyaWFsaXplOiBvcHRpb25zPy5zZXJpYWxpemUsXG4gICAgICAgIHZhbHVlczogb3B0aW9ucz8udmFsdWVzIGFzIGFueVxuICAgIH0pXG5cbiAgICByZXR1cm4gY3JlYXRlZCBhcyBTZXJpYWxpemFibGVSZXN1bHQ8VCwgTz5cbn1cbiIsImltcG9ydCB7IENyZWF0ZVRhYmxlQnVpbGRlciB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmRlY2xhcmUgbW9kdWxlICdreXNlbHknIHtcbiAgaW50ZXJmYWNlIENyZWF0ZVRhYmxlQnVpbGRlcjxUQiBleHRlbmRzIHN0cmluZywgQyBleHRlbmRzIHN0cmluZyA9IG5ldmVyPiB7XG4gICAgYWRkSWRDb2x1bW48Q04gZXh0ZW5kcyBzdHJpbmcgPSAnaWQnPihcbiAgICAgIGNvbD86IENOXG4gICAgKTogQ3JlYXRlVGFibGVCdWlsZGVyPFRCLCBDIHwgQ04+XG4gIH1cbn1cblxuQ3JlYXRlVGFibGVCdWlsZGVyLnByb3RvdHlwZS5hZGRJZENvbHVtbiA9IGZ1bmN0aW9uIChcbiAgICB0aGlzOiBDcmVhdGVUYWJsZUJ1aWxkZXI8YW55LCBhbnk+LFxuICAgIGNvbDogc3RyaW5nID0gJ2lkJ1xuKSB7XG4gICAgaWYgKGRiLmRyaXZlciA9PT0gJ3Bvc3RncmVzcWwnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZENvbHVtbihjb2wsICdzZXJpYWwnLCBjb2wgPT4gY29sLnByaW1hcnlLZXkoKSlcbiAgICB9XG5cbiAgICBpZiAoZGIuZHJpdmVyID09PSAnbXlzcWwnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZENvbHVtbihjb2wsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkuYXV0b0luY3JlbWVudCgpKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmFkZENvbHVtbihjb2wsICdpbnRlZ2VyJywgY29sID0+IGNvbC5wcmltYXJ5S2V5KCkpXG59IiwiaW1wb3J0IHR5cGUgeyBLeXNlbHkgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgQmFzZUV4Y2VwdGlvbiBmcm9tICcjc2hhcmVkL2V4Y2VwdGlvbnMvQmFzZUV4Y2VwdGlvbi50cydcbmltcG9ydCB7IG5vdyB9IGZyb20gJy4uL3F1ZXJpZXMnXG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGlvbjxUID0gYW55PiB7XG4gICAgaXRlbXM6IFRbXVxuICAgIHBhZ2U6IG51bWJlclxuICAgIHBlcl9wYWdlOiBudW1iZXJcbiAgICB0b3RhbDogbnVtYmVyXG4gICAgdG90YWxfcGFnZXM6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRNYW55T3B0aW9ucyB7XG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvZmZzZXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5Pzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBvcmRlckRpcmVjdGlvbj86ICdhc2MnIHwgJ2Rlc2MnIHwgKCdhc2MnIHwgJ2Rlc2MnKVtdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnaW5hdGVPcHRpb25zIHtcbiAgICBwYWdlPzogbnVtYmVyXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgICBvcmRlckJ5PzogRmluZE1hbnlPcHRpb25zWydvcmRlckJ5J11cbiAgICBvcmRlckRpcmVjdGlvbj86IEZpbmRNYW55T3B0aW9uc1snb3JkZXJEaXJlY3Rpb24nXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZU1hbnlPcHRpb25zIHtcbiAgICBsaW1pdD86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgVEVudGl0eSA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgVFByaW1hcnlLZXkgPSBhbnksXG4gICAgVE9wdGlvbnMgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4+IHtcblxuICAgIHB1YmxpYyBhdXRvQ3JlYXRlZEF0ID0gZmFsc2VcbiAgICBwdWJsaWMgYXV0b1VwZGF0ZWRBdCA9IGZhbHNlXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJvdGVjdGVkIGRiOiBLeXNlbHk8YW55PiwgXG4gICAgICAgIHByb3RlY3RlZCB0YWJsZTogc3RyaW5nLCBcbiAgICAgICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZ1xuICAgICkgeyAgICB9XG5cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogeyBxYj86IGFueSB9ICYgVE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcWIgPSBvcHRpb25zPy5xYiB8fCB0aGlzLmRiLnNlbGVjdEZyb20odGhpcy50YWJsZSBhcyBhbnkpXG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxuXG4gICAgYXN5bmMgY291bnQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShvcHRpb25zIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3QoKGViOiBhbnkpID0+IGViLmZuLmNvdW50QWxsKCkuYXMoJ2NvdW50JykpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdE9yVGhyb3coKVxuXG4gICAgICAgIHJldHVybiBOdW1iZXIocmVzdWx0LmNvdW50KVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkob3B0aW9ucykgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3RBbGwoKVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBxYiA9IHFiLmxpbWl0KG9wdGlvbnMubGltaXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub2Zmc2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHFiID0gcWIub2Zmc2V0KG9wdGlvbnMub2Zmc2V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lm9yZGVyQnkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQnkgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJCeSkgPyBvcHRpb25zLm9yZGVyQnkgOiBbb3B0aW9ucy5vcmRlckJ5XVxuICAgICAgICAgICAgY29uc3Qgb3JkZXJEaXJlY3Rpb24gPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJEaXJlY3Rpb24pID8gb3B0aW9ucy5vcmRlckRpcmVjdGlvbiA6IFtvcHRpb25zLm9yZGVyRGlyZWN0aW9uID8/ICdhc2MnXVxuXG4gICAgICAgICAgICBvcmRlckJ5LmZvckVhY2goKG9iLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIHFiID0gcWIub3JkZXJCeShvYiwgb3JkZXJEaXJlY3Rpb25baW5kZXhdIHx8ICdhc2MnKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCBxYi5leGVjdXRlKClcbiAgICB9XG5cbiAgICBhc3luYyBmaW5kT25lKG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShvcHRpb25zIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi5zZWxlY3RBbGwoKVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRCeUlkKGlkOiBUUHJpbWFyeUtleSwgb3B0aW9ucz86IFRPcHRpb25zKTogUHJvbWlzZTxURW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBsZXQgcWIgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgcWIgPSBxYi53aGVyZSh0aGlzLnByaW1hcnlLZXksICc9JywgaWQpXG5cbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgZmluZEJ5SWRPckZhaWwoaWQ6IFRQcmltYXJ5S2V5LCBvcHRpb25zPzogVE9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMuZmluZEJ5SWQoaWQsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignSXRlbSBub3QgZm91bmQnLCA0MDQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBwYWdpbmF0ZShvcHRpb25zPzogUGFnaW5hdGVPcHRpb25zICYgVE9wdGlvbnMpOiBQcm9taXNlPFBhZ2luYXRpb24+IHtcbiAgICAgICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMVxuICAgICAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogKG9wdGlvbnM/LmxpbWl0ID8/IDEwKVxuICAgICAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0ID8/IDEwXG5cbiAgICAgICAgY29uc3QgZmluZEFsbE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBvZmZzZXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50T3B0aW9ucyA9IHsgLi4ub3B0aW9ucyB9XG5cbiAgICAgICAgY29uc3QgW2l0ZW1zLCB0b3RhbEl0ZW1zXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuZmluZE1hbnkoZmluZEFsbE9wdGlvbnMgYXMgYW55KSxcbiAgICAgICAgICAgIHRoaXMuY291bnQoY291bnRPcHRpb25zIGFzIGFueSlcbiAgICAgICAgXSlcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgcGVyX3BhZ2U6IGxpbWl0LFxuICAgICAgICAgICAgdG90YWw6IHRvdGFsSXRlbXMsXG4gICAgICAgICAgICB0b3RhbF9wYWdlczogTWF0aC5jZWlsKHRvdGFsSXRlbXMgLyBsaW1pdClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBiZWZvcmVDcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8UGFydGlhbDxURW50aXR5Pj4ge1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JlIG5vbiB1c2VkIHBhcmFtZXRlciBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGNoaWxkIGNsYXNzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckNyZWF0ZShkYXRhOiBURW50aXR5KTogUHJvbWlzZTx2b2lkPiB7fVxuXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+KTogUHJvbWlzZTxURW50aXR5PiB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9DcmVhdGVkQXQpIHtcbiAgICAgICAgICAgIHNldChkYXRhLCAnY3JlYXRlZF9hdCcsIG5vdygpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b1VwZGF0ZWRBdCkge1xuICAgICAgICAgICAgc2V0KGRhdGEsICd1cGRhdGVkX2F0Jywgbm93KCkpXG4gICAgICAgIH1cblxuICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5iZWZvcmVDcmVhdGUoZGF0YSkgXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5kYi5pbnNlcnRJbnRvKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnZhbHVlcyhkYXRhKS5yZXR1cm5pbmdBbGwoKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHFiLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJDcmVhdGUocmVzdWx0KVxuXG4gICAgICAgIHJldHVybiByZXN1bHQgYXMgYW55XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZUNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKTogUHJvbWlzZTxQYXJ0aWFsPFRFbnRpdHk+W10+IHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYWZ0ZXJDcmVhdGVNYW55KGRhdGE6IFRFbnRpdHlbXSk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKSB7XG4gICAgICAgIGlmICh0aGlzLmF1dG9DcmVhdGVkQXQpIHtcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBzZXQoaXRlbSwgJ2NyZWF0ZWRfYXQnLCBub3coKSlcblxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmJlZm9yZUNyZWF0ZU1hbnkoZGF0YSkgXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5kYi5pbnNlcnRJbnRvKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnZhbHVlcyhkYXRhKS5yZXR1cm5pbmdBbGwoKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHFiLmV4ZWN1dGUoKVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJDcmVhdGVNYW55KHJlc3VsdClcblxuICAgICAgICByZXR1cm4gcmVzdWx0IGFzIGFueVtdXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmUgbm9uIHVzZWQgcGFyYW1ldGVyIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgY2hpbGQgY2xhc3NcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZVVwZGF0ZShkYXRhOiBQYXJ0aWFsPFRFbnRpdHk+LCBpZDogVFByaW1hcnlLZXkpOiBQcm9taXNlPFBhcnRpYWw8VEVudGl0eT4+IHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYWZ0ZXJVcGRhdGUoZGF0YTogVEVudGl0eSk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGVCeUlkKGlkOiBUUHJpbWFyeUtleSwgZGF0YTogUGFydGlhbDxURW50aXR5Pikge1xuICAgICAgICBpZiAodGhpcy5hdXRvVXBkYXRlZEF0KSB7XG4gICAgICAgICAgICBzZXQoZGF0YSwgJ3VwZGF0ZWRfYXQnLCBub3coKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEgPSBhd2FpdCB0aGlzLmJlZm9yZVVwZGF0ZShkYXRhLCBpZCkgXG5cbiAgICAgICAgY29uc3Qgcm93OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYXdhaXQgdGhpcy5maW5kQnlJZE9yRmFpbChpZClcblxuICAgICAgICBsZXQgcWIgPSB0aGlzLmRiLnVwZGF0ZVRhYmxlKHRoaXMudGFibGUgYXMgYW55KSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNldChkYXRhKVxuICAgICAgICAgICAgLndoZXJlKHRoaXMucHJpbWFyeUtleSwgJz0nLCByb3dbdGhpcy5wcmltYXJ5S2V5XSlcbiAgICAgICAgICAgIC5yZXR1cm5pbmdBbGwoKVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyVXBkYXRlKHVwZGF0ZWQpXG4gICAgfVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBpZ25vcmUgbm9uIHVzZWQgcGFyYW1ldGVyIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgY2hpbGQgY2xhc3NcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZURlbGV0ZShpZDogVFByaW1hcnlLZXkpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgaWdub3JlIG5vbiB1c2VkIHBhcmFtZXRlciBpdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGNoaWxkIGNsYXNzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBhc3luYyBhZnRlckRlbGV0ZShpZDogVFByaW1hcnlLZXkpOiBQcm9taXNlPHZvaWQ+IHtcblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGVCeUlkKGlkOiBUUHJpbWFyeUtleSkge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZURlbGV0ZShpZClcblxuICAgICAgICBjb25zdCByb3c6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBhd2FpdCB0aGlzLmZpbmRCeUlkT3JGYWlsKGlkKVxuXG4gICAgICAgIGxldCBxYiA9IHRoaXMuZGIuZGVsZXRlRnJvbSh0aGlzLnRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcWIgPSBxYi53aGVyZSh0aGlzLnByaW1hcnlLZXksICc9Jywgcm93W3RoaXMucHJpbWFyeUtleV0pXG5cbiAgICAgICAgYXdhaXQgcWIuZXhlY3V0ZVRha2VGaXJzdCgpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckRlbGV0ZShpZClcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlRGVsZXRlTWFueShvcHRpb25zPzogRGVsZXRlTWFueU9wdGlvbnMgJiBUT3B0aW9ucyl7XG4gICAgICAgIHJldHVybiBvcHRpb25zXG5cbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGlnbm9yZSBub24gdXNlZCBwYXJhbWV0ZXIgaXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjaGlsZCBjbGFzc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgYWZ0ZXJEZWxldGVNYW55KG9wdGlvbnM/OiBEZWxldGVNYW55T3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQge1xuXG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlTWFueShvcHRpb25zPzogRGVsZXRlTWFueU9wdGlvbnMgJiBUT3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gdGhpcy5iZWZvcmVEZWxldGVNYW55KG9wdGlvbnMgKVxuXG4gICAgICAgIGNvbnN0IGRlbGV0ZU9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgcWI6IHRoaXMuZGIuZGVsZXRlRnJvbSh0aGlzLnRhYmxlIGFzIGFueSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHFiID0gdGhpcy5xdWVyeShkZWxldGVPcHRpb25zIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmxpbWl0KSB7XG4gICAgICAgICAgICBxYiA9IHFiLmxpbWl0KG9wdGlvbnMubGltaXQpXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBxYi5leGVjdXRlKClcblxuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyRGVsZXRlTWFueShvcHRpb25zKVxuICAgIH1cbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnlJbmZlciBmcm9tICcjc2VydmVyL21peGlucy9EYXRhYmFzZVJlcG9zaXRvcnlJbmZlck1peGluLnRzJ1xuaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgeyBjb21wb3NlLCBtaXhpbiB9IGZyb20gJyNzaGFyZWQvdXRpbHMvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IFRva2VuIH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Rva2VuU2NoZW1hLnRzJ1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nXG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgc2VhcmNoPzogc3RyaW5nXG4gICAgdHlwZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXBvc2l0b3J5R2VuZXJhdGVPcHRpb25zIHtcbiAgICB1c2VyX2lkOiBudW1iZXJcbiAgICB0eXBlPzogc3RyaW5nXG4gICAgZXhwaXJlc19pbl9ob3Vycz86IG51bWJlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb2tlblJlcG9zaXRvcnkgZXh0ZW5kcyBjb21wb3NlKFxuICAgIG1peGluKERhdGFiYXNlUmVwb3NpdG9yeSksXG4gICAgRGF0YWJhc2VSZXBvc2l0b3J5SW5mZXI8VG9rZW4sIFRva2VuWydpZCddLCBUb2tlblJlcG9zaXRvcnlRdWVyeU9wdGlvbnM+KClcbikge1xuICAgIHB1YmxpYyBhdXRvQ3JlYXRlZEF0OiBib29sZWFuID0gdHJ1ZVxuICAgIHB1YmxpYyBhdXRvVXBkYXRlZEF0OiBib29sZWFuID0gZmFsc2VcblxuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICd0b2tlbnMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogVG9rZW5SZXBvc2l0b3J5UXVlcnlPcHRpb25zKSB7XG4gICAgICAgIGxldCBxYiA9IHN1cGVyLnF1ZXJ5KG9wdGlvbnMgYXMgYW55KVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5pZCkge1xuICAgICAgICAgICAgY29uc3QgaWRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmlkKSA/IG9wdGlvbnMuaWQgOiBbb3B0aW9ucy5pZF1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc2VhcmNoKSB7XG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCduYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy5zZWFyY2h9JWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8udHlwZSkge1xuICAgICAgICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkgPyBvcHRpb25zLnR5cGUgOiBbb3B0aW9ucy50eXBlXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCd0eXBlJywgJ2luJywgdHlwZXMpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEJ5VG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8VG9rZW4gfCBudWxsPiB7XG4gICAgICAgIGxldCBxYiA9IHRoaXMucXVlcnkoKSBhcyBhbnlcblxuICAgICAgICBxYiA9IHFiLnNlbGVjdEFsbCgpXG5cbiAgICAgICAgcWIgPSBxYi53aGVyZSgndG9rZW4nLCAnPScsIHRva2VuKVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCBxYi5leGVjdXRlVGFrZUZpcnN0KClcblxuICAgICAgICByZXR1cm4gaXRlbSB8fCBudWxsXG4gICAgfVxuXG4gICAgYXN5bmMgZ2VuZXJhdGUob3B0aW9uczogVG9rZW5SZXBvc2l0b3J5R2VuZXJhdGVPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcmFuZG9tQnl0ZXMoNjQpLnRvU3RyaW5nKCdoZXgnKVxuXG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IG9wdGlvbnMuZXhwaXJlc19pbl9ob3Vyc1xuICAgICAgICAgICAgPyBuZXcgRGF0ZShEYXRlLm5vdygpICsgb3B0aW9ucy5leHBpcmVzX2luX2hvdXJzICogNjAgKiA2MCAqIDEwMDApXG4gICAgICAgICAgICA6IG51bGxcblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgdXNlcl9pZDogb3B0aW9ucy51c2VyX2lkLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICB0eXBlOiBvcHRpb25zLnR5cGUgfHwgJ2F1dGgnLFxuICAgICAgICAgICAgZXhwaXJlc19hdDogZXhwaXJlc0F0XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBUb2tlblJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvVG9rZW5SZXBvc2l0b3J5LnRzJ1xuXG5jb25zdCB0b2tlblJlcG9zaXRvcnkgPSBuZXcgVG9rZW5SZXBvc2l0b3J5KGRiIGFzIGFueSlcblxuZXhwb3J0IGRlZmF1bHQgdG9rZW5SZXBvc2l0b3J5XG5cbiIsImltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXInXG5pbXBvcnQgeyBFbW1pdHRlclNlcnZpY2UgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuXG5jb25zdCBlbW1pdHRlciA9IGNvbnRhaW5lci5wcm94eTxFbW1pdHRlclNlcnZpY2U+KEVtbWl0dGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgZW1taXR0ZXJcblxuIiwiXG5pbXBvcnQgSGFzaGVyU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0hhc2hlclNlcnZpY2UudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJy4vY29udGFpbmVyLnRzJ1xuXG5jb25zdCBoYXNoZXIgPSBjb250YWluZXIucHJveHk8SGFzaGVyU2VydmljZT4oSGFzaGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgaGFzaGVyXG5cbiIsImltcG9ydCBlbW1pdHRlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMnXG5pbXBvcnQgaGFzaGVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9oYXNoZXIudHMnXG5pbXBvcnQgdHlwZSB7IFVzZXJFbnRpdHkgfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcuL0RhdGFiYXNlUmVwb3NpdG9yeSdcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHNlYXJjaD86IHN0cmluZ1xuICAgIGVtYWlsPzogc3RyaW5nXG4gICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICBzaG93RGVsZXRlZD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVwb3NpdG9yeUV2ZW50cyB7XG4gICAgJ3VzZXI6Y3JlYXRlZCc6IHtcbiAgICAgICAgdXNlcjogVXNlckVudGl0eVxuICAgIH1cbiAgICAndXNlcjp1cGRhdGVkJzoge1xuICAgICAgICB1c2VyOiBVc2VyRW50aXR5XG4gICAgfVxuICAgICd1c2VyOmRlbGV0ZWQnOiB7XG4gICAgICAgIHVzZXI6IFVzZXJFbnRpdHlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVzZXJSZXBvc2l0b3J5IGV4dGVuZHMgRGF0YWJhc2VSZXBvc2l0b3J5PFVzZXJFbnRpdHksIG51bWJlciwgVXNlclJlcG9zaXRvcnlRdWVyeU9wdGlvbnM+IHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdVc2VyUmVwb3NpdG9yeSdcbiAgICBwdWJsaWMgYXV0b0NyZWF0ZWRBdCA9IHRydWUgXG4gICAgcHVibGljIGF1dG9VcGRhdGVkQXQgPSB0cnVlXG5cbiAgICBjb25zdHJ1Y3RvcihkYjogRGF0YWJhc2VSZXBvc2l0b3J5WydkYiddKSB7XG4gICAgICAgIHN1cGVyKGRiLCAndXNlcnMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNoVXNlclBhc3N3b3JkSWZEZWZpbmVkKGRhdGE6IFBhcnRpYWw8VXNlckVudGl0eT4pIHtcbiAgICAgICAgaWYgKGRhdGEucGFzc3dvcmQpIHtcbiAgICAgICAgICAgIGRhdGEucGFzc3dvcmQgPSBhd2FpdCBoYXNoZXIuaGFzaChkYXRhLnBhc3N3b3JkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZUNyZWF0ZShkYXRhOiBQYXJ0aWFsPFVzZXJFbnRpdHk+KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaGFzaFVzZXJQYXNzd29yZElmRGVmaW5lZChkYXRhKVxuXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGJlZm9yZUNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxVc2VyRW50aXR5PltdKTogUHJvbWlzZTxQYXJ0aWFsPFVzZXJFbnRpdHk+W10+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaGFzaFVzZXJQYXNzd29yZElmRGVmaW5lZChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYmVmb3JlVXBkYXRlKGRhdGE6IFBhcnRpYWw8VXNlckVudGl0eT4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYXNoVXNlclBhc3N3b3JkSWZEZWZpbmVkKGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgYWZ0ZXJDcmVhdGUoZGF0YTogVXNlckVudGl0eSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBlbW1pdHRlci5lbWl0KCd1c2VyOmNyZWF0ZWQnLCB7XG4gICAgICAgICAgICB1c2VyOiBkYXRhXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM6IFVzZXJSZXBvc2l0b3J5UXVlcnlPcHRpb25zID0ge30pIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gc3VwZXIucXVlcnkob3B0aW9ucylcblxuICAgICAgICBpZiAoIW9wdGlvbnMuc2hvd0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ2RlbGV0ZWRfYXQnLCAnaXMnLCBudWxsKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuc2VhcmNoKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKChlYjogYW55KSA9PiBlYi5vcihbXG4gICAgICAgICAgICAgICAgZWIoJ25hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYCksXG4gICAgICAgICAgICAgICAgZWIoJ3VzZXJuYW1lJywgJ2xpa2UnLCBgJSR7b3B0aW9ucy5zZWFyY2h9JWApLFxuICAgICAgICAgICAgICAgIGViKCdlbWFpbCcsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKSxcbiAgICAgICAgICAgIF0pKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uc1xuICAgICAgICBpZiAob3B0aW9ucz8uZW1haWwpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ2VtYWlsJywgJz0nLCBvcHRpb25zLmVtYWlsKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnVzZXJuYW1lKSB7XG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LndoZXJlKCd1c2VybmFtZScsICdsaWtlJywgYCUke29wdGlvbnMudXNlcm5hbWV9JWApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHF1ZXJ5XG4gICAgfVxufVxuIiwiaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBVc2VyUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9Vc2VyUmVwb3NpdG9yeS50cydcblxuY29uc3QgdXNlclJlcG9zaXRvcnkgPSBuZXcgVXNlclJlcG9zaXRvcnkoZGIgYXMgYW55KVxuXG5leHBvcnQgZGVmYXVsdCB1c2VyUmVwb3NpdG9yeVxuXG4iLCJpbXBvcnQgdG9rZW5SZXBvc2l0b3J5IGZyb20gXCIjc2VydmVyL2ZhY2FkZXMvdG9rZW5SZXBvc2l0b3J5LnRzXCJcbmltcG9ydCB1c2VyUmVwb3NpdG9yeSBmcm9tIFwiI3NlcnZlci9mYWNhZGVzL3VzZXJSZXBvc2l0b3J5LnRzXCJcbmltcG9ydCB7IEJhc2VFeGNlcHRpb24sIFVzZXJFbnRpdHkgfSBmcm9tIFwiI3NoYXJlZC9pbmRleC50c1wiXG5pbXBvcnQgdHlwZSBIdHRwU2VydmljZSBmcm9tIFwiLi9IdHRwU2VydmljZVwiXG5pbXBvcnQgc3VwZXJ0ZXN0LCB7IHR5cGUgVGVzdCB9IGZyb20gJ3N1cGVydGVzdCdcblxuZXhwb3J0IGludGVyZmFjZSBIdHRwVGVzdGVyU2VydmljZU9wdGlvbnMge1xuICAgIGh0dHA6IEh0dHBTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBUZXN0ZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdIdHRwVGVzdGVyU2VydmljZSdcbiAgICBwdWJsaWMgaHR0cDogSHR0cFNlcnZpY2VcbiAgICBwdWJsaWMgcmVxdWVzdDogc3VwZXJ0ZXN0LlN1cGVyVGVzdDxzdXBlcnRlc3QuVGVzdD5cbiAgICBwdWJsaWMgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gICAgcHVibGljIGNvb2tpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSHR0cFRlc3RlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaHR0cCA9IG9wdGlvbnMuaHR0cFxuICAgICAgICB0aGlzLnJlcXVlc3QgPSBzdXBlcnRlc3QodGhpcy5odHRwLmdldEV4cHJlc3NBcHAoKSlcbiAgICB9XG5cblxuICAgIHB1YmxpYyBjcmVhdGUocmVxdWVzdDogVGVzdCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmhlYWRlcnMpKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnNldChrZXksIHZhbHVlKVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5jb29raWVzKSkge1xuICAgICAgICAgICAgcmVxdWVzdC5zZXQoJ0Nvb2tpZScsIGAke2tleX09JHt2YWx1ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcXVlc3RcblxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQodXJsOiBzdHJpbmcpOiBUZXN0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHRoaXMucmVxdWVzdC5nZXQodXJsKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcG9zdCh1cmw6IHN0cmluZywgYm9keT86IGFueSk6IFRlc3Qge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUodGhpcy5yZXF1ZXN0LnBvc3QodXJsKS5zZW5kKGJvZHkpKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dpbkJ5VXNlcih1c2VyOiBVc2VyRW50aXR5KSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdG9rZW5SZXBvc2l0b3J5LmdlbmVyYXRlKHtcbiAgICAgICAgICAgIHVzZXJfaWQ6IHVzZXIuaWQsXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb29raWVzWydBdXRob3JpemF0aW9uJ10gPSB0b2tlbi50b2tlblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2dpbkJ5VXNlcm5hbWUodXNlcm5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCB1c2VyID0gYXdhaXQgdXNlclJlcG9zaXRvcnkuZmluZE9uZSh7IHVzZXJuYW1lIH0pXG5cbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVXNlciBub3QgZm91bmQnKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubG9naW5CeVVzZXIodXNlcilcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBpbXBvcnRBbGwgfSBmcm9tICcjc2VydmVyL3V0aWxzL2ltcG9ydEFsbC50cyc7XG5pbXBvcnQgTGlmZWN5Y2xlSG9vayBmcm9tICcjc2hhcmVkL2VudGl0aWVzL0xpZmVjeWNsZUhvb2sudHMnO1xuaW1wb3J0IEJhc2VMaWZlY3ljbGVTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTGlmZWN5Y2xlU2VydmljZS50cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZmVjeWNsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTGlmZWN5Y2xlU2VydmljZSB7XG4gICAgcHVibGljIGFzeW5jIGFkZERpcmVjdG9yeShkaXJuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbW9kcyA9IGF3YWl0IGltcG9ydEFsbChkaXJuYW1lKVxuICAgICAgICBjb25zdCBob29rczogTGlmZWN5Y2xlSG9va1tdID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBtb2RdIG9mIE9iamVjdC5lbnRyaWVzKG1vZHMpKSB7XG4gICAgICAgICAgICBjb25zdCBIb29rQ2xhc3MgPSBtb2QuZGVmYXVsdCB8fCBtb2RcbiAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IEhvb2tDbGFzcygpIGFzIExpZmVjeWNsZUhvb2tcblxuICAgICAgICAgICAgaW5zdGFuY2UuaG9va19pZCA9IGluc3RhbmNlLmhvb2tfaWQgfHwgbmFtZVxuXG4gICAgICAgICAgICBob29rcy5wdXNoKGluc3RhbmNlKVxuICAgICAgICB9XG5cbiAgICAgICAgaG9va3MuZm9yRWFjaChob29rID0+IHRoaXMuYWRkKGhvb2spKVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRXhwcmVzc2lvbkJ1aWxkZXIgfSBmcm9tICdreXNlbHknXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYWZpbHRlciB7XG4gICAgZXE/OiBzdHJpbmcsXG4gICAgbmVxPzogc3RyaW5nLFxuICAgIFxuICAgIGxpa2U/OiBzdHJpbmcsXG4gICAgbmxpa2U/OiBzdHJpbmcsXG5cbiAgICBpbj86IHN0cmluZ1tdLFxuICAgIG5pbj86IHN0cmluZ1tdLFxuXG4gICAgZ3Q/OiBzdHJpbmcsXG4gICAgZ3RlPzogc3RyaW5nLFxuICAgIGx0Pzogc3RyaW5nLFxuICAgIGx0ZT86IHN0cmluZyxcblxuICAgIGlzX251bGw/OiBib29sZWFuXG4gICAgZXhpc3RzPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhUXVlcnlQYXlsb2FkIHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBNZXRhZGFmaWx0ZXJcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YWRhdGFRdWVyeVNlcnZpY2U8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiB7XG4gICAgcHJpdmF0ZSBwYXlsb2FkOiBNZXRhZGF0YVF1ZXJ5UGF5bG9hZFxuICAgIHByaXZhdGUgdGFibGU6IFRcbiAgICBwcml2YXRlIGZvcmVpZ25LZXk6IGtleW9mIERhdGFiYXNlW1RdXG4gICAgcHJpdmF0ZSBwYXJlbnRLZXkgPSAnaWQnXG5cbiAgICBjb25zdHJ1Y3RvcihwYXlsb2FkOiBNZXRhZGF0YVF1ZXJ5UGF5bG9hZCwgdGFibGU6IFQsIGZvcmVpZ25LZXk6IGtleW9mIERhdGFiYXNlW1RdLCBwYXJlbnRLZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZFxuICAgICAgICB0aGlzLnRhYmxlID0gdGFibGVcbiAgICAgICAgdGhpcy5mb3JlaWduS2V5ID0gZm9yZWlnbktleVxuXG4gICAgICAgIGlmIChwYXJlbnRLZXkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50S2V5ID0gcGFyZW50S2V5XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5lZWRXaGVyZUluKCl7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIE9iamVjdC52YWx1ZXModGhpcy5wYXlsb2FkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbi5lcSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLm5lcSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmxpa2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5ubGlrZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmluICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24ubmluICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB8fCBjb25kaXRpb24uZ3QgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5ndGUgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5sdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmx0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfHwgY29uZGl0aW9uLmlzX251bGwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHx8IGNvbmRpdGlvbi5leGlzdHMgPT09IHRydWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG5lZWRXaGVyZU5vdEluKCl7XG4gICAgICAgIGZvciAoY29uc3QgY29uZGl0aW9uIG9mIE9iamVjdC52YWx1ZXModGhpcy5wYXlsb2FkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdzdHJpbmcnKSBjb250aW51ZVxuXG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uLmV4aXN0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIGFwcGx5KGRiUXVlcnk6IGFueSkge1xuICAgICAgICBsZXQgcXVlcnkgPSBkYlF1ZXJ5XG5cbiAgICAgICAgaWYgKHRoaXMubmVlZFdoZXJlSW4pIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAgICAgICAud2hlcmUodGhpcy5wYXJlbnRLZXksICdpbicsIChlYjogYW55KSA9PiBcbiAgICAgICAgICAgICAgICAgICAgZWIuc2VsZWN0RnJvbSh0aGlzLnRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCh0aGlzLmZvcmVpZ25LZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUodGhpcy53aGVyZUluKGViKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5uZWVkV2hlcmVOb3RJbikge1xuICAgICAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgICAgIC53aGVyZSh0aGlzLnBhcmVudEtleSwgJ25vdCBpbicsIChlYjogYW55KSA9PiBcbiAgICAgICAgICAgICAgICAgICAgZWIuc2VsZWN0RnJvbSh0aGlzLnRhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCh0aGlzLmZvcmVpZ25LZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUodGhpcy53aGVyZU5vdEluKGViKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnlcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkUm93Q29uZGl0aW9ucyhlYjogRXhwcmVzc2lvbkJ1aWxkZXI8YW55LCBhbnk+LCBuYW1lOiBzdHJpbmcsIGNvbmRpdGlvbjogc3RyaW5nIHwgTWV0YWRhZmlsdGVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBlYi5lYignbmFtZScsICc9JywgbmFtZSksXG4gICAgICAgICAgICAgICAgZWIuZWIoJ3ZhbHVlJywgJz0nLCBjb25kaXRpb24pXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGF1c2VzID0gW1xuICAgICAgICAgICAgZWIuZWIoJ25hbWUnLCAnPScsIG5hbWUpXG4gICAgICAgIF1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmVxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnPScsIGNvbmRpdGlvbi5lcSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLm5lcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJyE9JywgY29uZGl0aW9uLm5lcSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmxpa2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsICdsaWtlJywgY29uZGl0aW9uLmxpa2UpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5ubGlrZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJ25vdCBsaWtlJywgY29uZGl0aW9uLm5saWtlKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25kaXRpb24uaW4pIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnaW4nLCBjb25kaXRpb24uaW4pKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmRpdGlvbi5uaW4pIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnbm90IGluJywgY29uZGl0aW9uLm5pbikpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmd0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnPicsIGNvbmRpdGlvbi5ndCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmd0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJz49JywgY29uZGl0aW9uLmd0ZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNsYXVzZXMucHVzaChlYi5lYigndmFsdWUnLCAnPCcsIGNvbmRpdGlvbi5sdCkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmx0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjbGF1c2VzLnB1c2goZWIuZWIoJ3ZhbHVlJywgJzw9JywgY29uZGl0aW9uLmx0ZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZGl0aW9uLmlzX251bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2xhdXNlcy5wdXNoKGViLmViKCd2YWx1ZScsIGNvbmRpdGlvbi5pc19udWxsID8gJ2lzJyA6ICdpcyBub3QnLCBudWxsKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjbGF1c2VzXG4gICAgfVxuXG4gICAgcHVibGljIHdoZXJlSW4gPSA8REJRdWVyeT4oZWI6ICBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gZWIgYXMgYW55XG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiAhPT0gJ3N0cmluZycgJiYgY29uZGl0aW9uLmV4aXN0cyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBxdWVyeSA9IHF1ZXJ5LmFuZCh0aGlzLmJ1aWxkUm93Q29uZGl0aW9ucyhlYiwgbmFtZSwgY29uZGl0aW9uKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBxdWVyeSBhcyBEQlF1ZXJ5XG4gICAgfVxuXG4gICAgcHVibGljIHdoZXJlTm90SW4gPSA8REJRdWVyeT4oZWI6ICBFeHByZXNzaW9uQnVpbGRlcjxhbnksIGFueT4pID0+IHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gZWIgYXMgYW55XG5cbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29uZGl0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnBheWxvYWQpKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ3N0cmluZycpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGlmIChjb25kaXRpb24uZXhpc3RzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkoJ25hbWUnLCAnPScsIG5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcXVlcnkgYXMgREJRdWVyeVxuICAgIH1cbn1cbiIsImltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1ldGFkYXRhU2VydmljZSB7XG4gICAgcHVibGljIGlkOiBudW1iZXJcbiAgICBwdWJsaWMgdGFibGU6IHN0cmluZ1xuICAgIHB1YmxpYyBmb3JlaWduS2V5OiBzdHJpbmdcblxuICAgIGNvbnN0cnVjdG9yKHBheWxvYWQ6IFBpY2s8TWV0YWRhdGFTZXJ2aWNlLCAndGFibGUnIHwgJ2ZvcmVpZ25LZXknIHwgJ2lkJz4pIHtcbiAgICAgICAgdGhpcy5pZCA9IHBheWxvYWQuaWRcbiAgICAgICAgdGhpcy50YWJsZSA9IHBheWxvYWQudGFibGVcbiAgICAgICAgdGhpcy5mb3JlaWduS2V5ID0gcGF5bG9hZC5mb3JlaWduS2V5XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBwYXJzZSh2YWx1ZTogYW55KTogYW55IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnanNvbjonKSkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUuc2xpY2UoNSkpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuc2xpY2UoNSkgPT09ICd0cnVlJ1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuc3RhcnRzV2l0aCgnbnVtYmVyOicpKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlLnNsaWNlKDcpKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdzdHJpbmc6JykpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSg3KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmbGF0dGVuKGl0ZW1zOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgcmVzdWx0W2l0ZW0ubmFtZV0gPSBNZXRhZGF0YVNlcnZpY2UucGFyc2UoaXRlbS52YWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG4gICAgXG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUKTogUHJvbWlzZTxUPlxuICAgIHB1YmxpYyBhc3luYyBnZXQ8VCA9IGFueT4obmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBUKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGxldCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAgIC5zZWxlY3RBbGwoKVxuICAgICAgICAgICAgLndoZXJlKCh0aGlzLmZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCB0aGlzLmlkKVxuICAgICAgICAgICAgLndoZXJlKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgLmxpbWl0KDEpXG5cbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcnkuZXhlY3V0ZVRha2VGaXJzdCgpIFxuXG4gICAgICAgIGlmICghcm93IHx8ICFyb3cudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gTWV0YWRhdGFTZXJ2aWNlLnBhcnNlKHJvdy52YWx1ZSlcblxuICAgICAgICByZXR1cm4gdmFsdWUgYXMgVFxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGZvcmVpZ25LZXkgPSB0aGlzLmZvcmVpZ25LZXlcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlXG5cbiAgICAgICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICAgICAgW2ZvcmVpZ25LZXldOiB0aGlzLmlkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdmFsdWVzLnZhbHVlID0gYGpzb246JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgZGIuc2VsZWN0RnJvbSh0YWJsZSBhcyBhbnkpLndoZXJlKChmb3JlaWduS2V5IGFzIHN0cmluZyksICc9JywgdGhpcy5pZCkud2hlcmUoJ25hbWUnLCAnPScsIG5hbWUpLmV4ZWN1dGVUYWtlRmlyc3QoKVxuXG4gICAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgICAgIGF3YWl0IGRiLnVwZGF0ZVRhYmxlKHRhYmxlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAuc2V0KHZhbHVlcylcbiAgICAgICAgICAgICAgICAud2hlcmUoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCB0aGlzLmlkKVxuICAgICAgICAgICAgICAgIC53aGVyZSgnbmFtZScsICc9JywgbmFtZSlcbiAgICAgICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgZGIuaW5zZXJ0SW50byh0YWJsZSBhcyBhbnkpXG4gICAgICAgICAgICAudmFsdWVzKHZhbHVlcylcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8QXJyYXk8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBhbnkgfT4+IHtcbiAgICAgICAgY29uc3QgZm9yZWlnbktleSA9IHRoaXMuZm9yZWlnbktleVxuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVcblxuICAgICAgICBsZXQgcXVlcnkgPSBkYi5zZWxlY3RGcm9tKHRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcXVlcnkgPSBxdWVyeVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCB0aGlzLmlkKVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeS5leGVjdXRlKClcblxuICAgICAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogYW55KSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogcm93Lm5hbWUsXG4gICAgICAgICAgICB2YWx1ZTogTWV0YWRhdGFTZXJ2aWNlLnBhcnNlKHJvdy52YWx1ZSlcbiAgICAgICAgfSkpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFsbCgpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMubGlzdCgpXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG5cbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICAgICAgcmVzdWx0W3Jvdy5uYW1lXSA9IHJvdy52YWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gXCJreXNlbHlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25FbnRpeURhdGEge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZyB8IG51bGw7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBleGVjdXRlZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWlncmF0aW9uRW50aXR5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHNvdXJjZTogc3RyaW5nIHwgbnVsbFxuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG4gICAgcHVibGljIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBNaWdyYXRpb25FbnRpeURhdGEpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2VcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGRhdGEuZmlsZW5hbWVcbiAgICAgICAgdGhpcy5leGVjdXRlZEF0ID0gZGF0YS5leGVjdXRlZEF0XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHVwKGRiOiBLeXNlbHk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQodGhpcy5maWxlbmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIG1vZC51cCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE1pZ3JhdGlvbiAke3RoaXMubmFtZX0gZG9lcyBub3QgZXhwb3J0IGFuIHVwIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1vZC51cChkYilcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bihkYjogS3lzZWx5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KHRoaXMuZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKHR5cGVvZiBtb2QuZG93biAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE1pZ3JhdGlvbiAke3RoaXMubmFtZX0gZG9lcyBub3QgZXhwb3J0IGEgZG93biBmdW5jdGlvbmApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtb2QuZG93bihkYilcbiAgICB9XG59XG5cbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tICdkYXRlLWZucydcbmltcG9ydCB7IHRyeUNhdGNoIH0gZnJvbSAnI3NoYXJlZC91dGlscy90cnlDYXRjaC50cydcbmltcG9ydCBFbW1pdHRlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBNaWdyYXRpb25FbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9NaWdyYXRpb25FbnRpdHkudHMnXG5pbXBvcnQgeyBvcmRlckJ5IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU291cmNlIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGRpcmVjdG9yeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvbiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIGV4ZWN1dGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGaWx0ZXJzIHtcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgbmFtZT86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgTWlncmF0aW9uUmVzdWx0IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZyB8IG51bGw7XG4gICAgcmVzdWx0OiAnc3VjY2VzcycgfCAnZmFpbGVkJztcbiAgICBlcnJvcj86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRvclNlcnZpY2VPcHRpb25zIHtcbiAgICBzb3VyY2VzOiBNaWdyYXRpb25Tb3VyY2VbXTtcbiAgICBkYjogS3lzZWx5PGFueT47XG4gICAgZGVidWc/OiBib29sZWFuO1xuICAgIGVtbWl0dGVyPzogRW1taXR0ZXJTZXJ2aWNlO1xuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRvclNlcnZpY2VFdmVudHMge1xuICAgICdtaWdyYXRvcjpiZWZvcmUtbWlncmF0ZSc6IHtcbiAgICAgICAgbWlncmF0aW9uczogTWlncmF0aW9uRW50aXR5W11cbiAgICB9XG4gICAgJ21pZ3JhdG9yOmFmdGVyLW1pZ3JhdGUnOiB7XG4gICAgICAgIG1pZ3JhdGlvbnM6IE1pZ3JhdGlvbkVudGl0eVtdXG4gICAgfVxuICAgICdtaWdyYXRvcjpiZWZvcmUtcm9sbGJhY2snOiB7XG4gICAgICAgIG1pZ3JhdGlvbnM6IE1pZ3JhdGlvbkVudGl0eVtdXG4gICAgfVxuICAgICdtaWdyYXRvcjphZnRlci1yb2xsYmFjayc6IHtcbiAgICAgICAgbWlncmF0aW9uczogTWlncmF0aW9uRW50aXR5W11cbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWlncmF0b3JTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdNaWdyYXRvclNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGVidWcgPSBmYWxzZVxuICAgIHB1YmxpYyBlbW1pdHRlcjogRW1taXR0ZXJTZXJ2aWNlXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkYjogS3lzZWx5PGFueT5cbiAgICBwdWJsaWMgc291cmNlczogTWlncmF0aW9uU291cmNlW11cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1pZ3JhdG9yU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gdGhpcy5kZWJ1Z1xuICAgICAgICB0aGlzLmVtbWl0dGVyID0gb3B0aW9ucy5lbW1pdHRlciB8fCBuZXcgRW1taXR0ZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIHRoaXMuZGIgPSBvcHRpb25zLmRiXG4gICAgICAgIHRoaXMuc291cmNlcyA9IG9wdGlvbnMuc291cmNlc1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRTb3VyY2Uoc291cmNlOiBNaWdyYXRpb25Tb3VyY2UpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VzLnB1c2goc291cmNlKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZW5zdXJlTWlncmF0aW9uc1RhYmxlKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRiLnNjaGVtYVxuICAgICAgICAgICAgLmNyZWF0ZVRhYmxlKCdtaWdyYXRpb25zJylcbiAgICAgICAgICAgIC5pZk5vdEV4aXN0cygpXG4gICAgICAgICAgICAuYWRkQ29sdW1uKCduYW1lJywgJ3ZhcmNoYXIoMjU1KScsIChjb2wpID0+IGNvbC5wcmltYXJ5S2V5KCkpXG4gICAgICAgICAgICAuYWRkQ29sdW1uKCdtb2R1bGUnLCAndmFyY2hhcigyNTUpJykgLy8gbW9kdWxlIHdpbGwgYmUgcmVuYW1lZCB0byBzb3VyY2UgaW4gZnV0dXJlIHZlcnNpb25zXG4gICAgICAgICAgICAuYWRkQ29sdW1uKCdleGVjdXRlZF9hdCcsICd0aW1lc3RhbXAnLCAoY29sKSA9PiBjb2wubm90TnVsbCgpKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0U291cmNlKHNvdXJjZTogTWlncmF0aW9uU291cmNlKSB7XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNvdXJjZS5kaXJlY3RvcnkpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBNaWdyYXRpb24gc291cmNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdDogJHtzb3VyY2UuZGlyZWN0b3J5fWApXG5cbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlLmRpcmVjdG9yeSlcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmpzJywgJy50cycsICcubWpzJywgJy5tdHMnXVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBNaWdyYXRpb25FbnRpdHlbXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbnMuc29tZShleHQgPT4gZW50cnkuZW5kc1dpdGgoZXh0KSkpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHNvdXJjZS5kaXJlY3RvcnksIGVudHJ5KVxuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHBhdGguYmFzZW5hbWUoZW50cnksIHBhdGguZXh0bmFtZShlbnRyeSkpXG5cbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IG5ldyBNaWdyYXRpb25FbnRpdHkoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzb3VyY2UuaWQsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVkQXQ6IG51bGwsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0KGZpbHRlcnM/OiBMaXN0RmlsdGVycykge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgbGV0IGl0ZW1zID0gW10gYXMgTWlncmF0aW9uRW50aXR5W11cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3RTb3VyY2Uoc291cmNlKVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKC4uLm1pZ3JhdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZXhlY3V0ZWQgbWlncmF0aW9ucyBmcm9tIGRhdGFiYXNlXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVkID0gYXdhaXQgdGhpcy5kYlxuICAgICAgICAgICAgLnNlbGVjdEZyb20oJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGV4ZWN1dGVkKSB7XG4gICAgICAgICAgICBpZiAoIWUuc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZS5zb3VyY2UgPSAncm9vdCdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbSA9IGl0ZW1zLmZpbmQobSA9PiBtLm5hbWUgPT09IGUubmFtZSlcblxuICAgICAgICAgICAgaWYgKCFtKSBjb250aW51ZVxuXG4gICAgICAgICAgICBtLmV4ZWN1dGVkQXQgPSBuZXcgRGF0ZShlLmV4ZWN1dGVkX2F0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcnM/LnNvdXJjZSkge1xuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIobSA9PiBtLnNvdXJjZSA9PT0gZmlsdGVycy5zb3VyY2UpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVycz8ubmFtZSkge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5pc0FycmF5KGZpbHRlcnMubmFtZSkgPyBmaWx0ZXJzLm5hbWUgOiBbZmlsdGVycy5uYW1lXVxuXG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihtID0+IG5hbWVzLmluY2x1ZGVzKG0ubmFtZSkpXG4gICAgICAgIH1cblxuICAgICAgICBpdGVtcyA9IG9yZGVyQnkoaXRlbXMsIFsnc291cmNlJywgJ25hbWUnXSwgWydhc2MnLCAnYXNjJ10pXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlVXAobWlncmF0aW9uOiBNaWdyYXRpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbWlncmF0aW9uLnVwKHRoaXMuZGIpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5kYlxuICAgICAgICAgICAgLmluc2VydEludG8oJ21pZ3JhdGlvbnMnKVxuICAgICAgICAgICAgLnZhbHVlcyh7XG4gICAgICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIGV4ZWN1dGVkX2F0OiBmb3JtYXQobmV3IERhdGUoKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnKSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgJHttaWdyYXRpb24ubmFtZX0gbWlncmF0ZWQgc3VjY2Vzc2Z1bGx5YClcblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWlncmF0ZURvd24obWlncmF0aW9uOiBNaWdyYXRpb25FbnRpdHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgbWlncmF0aW9uLmRvd24odGhpcy5kYilcblxuICAgICAgICBhd2FpdCB0aGlzLmRiXG4gICAgICAgICAgICAuZGVsZXRlRnJvbSgnbWlncmF0aW9ucycpXG4gICAgICAgICAgICAud2hlcmUoJ25hbWUnLCAnPScsIG1pZ3JhdGlvbi5uYW1lKVxuICAgICAgICAgICAgLndoZXJlKCdtb2R1bGUnLCAnPScsIG1pZ3JhdGlvbi5zb3VyY2UpXG4gICAgICAgICAgICAuZXhlY3V0ZSgpXG5cbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgJHttaWdyYXRpb24ubmFtZX0gcm9sbGVkIGJhY2sgc3VjY2Vzc2Z1bGx5YClcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVGaWxlKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgY29uc3QgbWlncmF0aW9ucyA9IGF3YWl0IHRoaXMubGlzdCgpXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbiA9IG1pZ3JhdGlvbnMuZmluZChtID0+IG0uZmlsZW5hbWUgPT09IGZpbGVuYW1lKVxuXG4gICAgICAgIGlmICghbWlncmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHBhdGguZXh0bmFtZShmaWxlbmFtZSkpLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBNaWdyYXRpb24gJHtmaWxlbmFtZX0gbm90IGZvdW5kYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaWdyYXRpb24uZXhlY3V0ZWRBdCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiB0aGlzLm1pZ3JhdGVVcChtaWdyYXRpb24pKVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBtaWdyYXRpb24ubmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgICAgICByZXN1bHQ6ICdmYWlsZWQnLFxuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICBmaWxlbmFtZTogbWlncmF0aW9uLmZpbGVuYW1lLFxuICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgcmVzdWx0OiAnc3VjY2VzcydcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcm9sbGJhY2tGaWxlKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE1pZ3JhdGlvblJlc3VsdD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgY29uc3QgbWlncmF0aW9ucyA9IGF3YWl0IHRoaXMubGlzdCgpXG4gICAgICAgIGNvbnN0IG1pZ3JhdGlvbiA9IG1pZ3JhdGlvbnMuZmluZChtID0+IG0uZmlsZW5hbWUgPT09IGZpbGVuYW1lKVxuXG4gICAgICAgIGlmICghbWlncmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHBhdGguZXh0bmFtZShmaWxlbmFtZSkpLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvcjogYE1pZ3JhdGlvbiAke2ZpbGVuYW1lfSBub3QgZm91bmRgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW1pZ3JhdGlvbi5leGVjdXRlZEF0KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBtaWdyYXRpb24uZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBtaWdyYXRpb24uc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMubWlncmF0ZURvd24obWlncmF0aW9uKSlcblxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogbWlncmF0aW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG1pZ3JhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IG1pZ3JhdGlvbi5zb3VyY2UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiAnZmFpbGVkJyxcbiAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IG1pZ3JhdGlvbi5uYW1lLFxuICAgICAgICAgICAgZmlsZW5hbWU6IG1pZ3JhdGlvbi5maWxlbmFtZSxcbiAgICAgICAgICAgIHNvdXJjZTogbWlncmF0aW9uLnNvdXJjZSxcbiAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbWlncmF0ZShmaWx0ZXJzOiBMaXN0RmlsdGVycyAmIHsgc3RlcHM/OiBudW1iZXIgfSA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgbGV0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3QoZmlsdGVycylcblxuICAgICAgICBtaWdyYXRpb25zID0gbWlncmF0aW9ucy5maWx0ZXIobSA9PiAhbS5leGVjdXRlZEF0KVxuXG4gICAgICAgIG1pZ3JhdGlvbnMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSlcblxuICAgICAgICBpZiAoZmlsdGVycy5zdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtaWdyYXRpb25zID0gbWlncmF0aW9ucy5zbGljZSgwLCBmaWx0ZXJzLnN0ZXBzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pZ3JhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1taXR0ZXIuZW1pdEFuZFdhaXQoJ21pZ3JhdG9yOmJlZm9yZS1taWdyYXRlJywge1xuICAgICAgICAgICAgbWlncmF0aW9uczogbWlncmF0aW9ucy5tYXAobSA9PiBtLm5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWlncmF0ZUZpbGUobWlncmF0aW9uLmZpbGVuYW1lKVxuXG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KVxuXG4gICAgICAgICAgICAvLyBTdG9wIG9uIGZpcnN0IGZhaWx1cmVcbiAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSAnZmFpbGVkJykge1xuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtbWl0dGVyLmVtaXRBbmRXYWl0KCdtaWdyYXRvcjphZnRlci1taWdyYXRlJywge1xuICAgICAgICAgICAgbWlncmF0aW9uczogbWlncmF0aW9ucyxcbiAgICAgICAgICAgIHJlc3VsdHNcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByb2xsYmFjayhmaWx0ZXJzOiBMaXN0RmlsdGVycyAmIHsgc3RlcHM/OiBudW1iZXIgfSA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZU1pZ3JhdGlvbnNUYWJsZSgpXG5cbiAgICAgICAgbGV0IG1pZ3JhdGlvbnMgPSBhd2FpdCB0aGlzLmxpc3QoZmlsdGVycylcblxuICAgICAgICBtaWdyYXRpb25zID0gbWlncmF0aW9ucy5maWx0ZXIobSA9PiBtLmV4ZWN1dGVkQXQpXG5cbiAgICAgICAgbWlncmF0aW9ucy5zb3J0KChhLCBiKSA9PiBiLm5hbWUubG9jYWxlQ29tcGFyZShhLm5hbWUpKVxuXG4gICAgICAgIGlmIChmaWx0ZXJzLnN0ZXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1pZ3JhdGlvbnMgPSBtaWdyYXRpb25zLnNsaWNlKDAsIGZpbHRlcnMuc3RlcHMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbXVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YmVmb3JlLXJvbGxiYWNrJywge1xuICAgICAgICAgICAgbWlncmF0aW9uczogbWlncmF0aW9ucy5tYXAobSA9PiBtLm5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogTWlncmF0aW9uUmVzdWx0W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgbWlncmF0aW9uIG9mIG1pZ3JhdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucm9sbGJhY2tGaWxlKG1pZ3JhdGlvbi5maWxlbmFtZSlcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnbWlncmF0b3I6YWZ0ZXItcm9sbGJhY2snLCB7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBtaWdyYXRpb25zLm1hcChtID0+IG0ubmFtZSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1cChzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlncmF0ZSh7XG4gICAgICAgICAgICAuLi5maWx0ZXJzLFxuICAgICAgICAgICAgc3RlcHNcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bihzdGVwczogbnVtYmVyID0gMSwgZmlsdGVyczogTGlzdEZpbHRlcnMgPSB7fSk6IFByb21pc2U8TWlncmF0aW9uUmVzdWx0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm9sbGJhY2soe1xuICAgICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICAgIHN0ZXBzXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5taWdyYXRlKGZpbHRlcnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxhdGVzdE9yRmFpbChmaWx0ZXJzOiBMaXN0RmlsdGVycyA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5sYXRlc3QoZmlsdGVycylcblxuICAgICAgICBjb25zdCBmYWlsZWQgPSByZXN1bHRzLmZpbmQociA9PiByLnJlc3VsdCA9PT0gJ2ZhaWxlZCcpXG5cbiAgICAgICAgaWYgKGZhaWxlZCkge1xuICAgICAgICAgICAgdGhyb3cgZmFpbGVkLmVycm9yIHx8IG5ldyBCYXNlRXhjZXB0aW9uKGBNaWdyYXRpb24gZmFpbGVkOiAke2ZhaWxlZC5uYW1lfWApXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmcmVzaChmaWx0ZXJzOiBMaXN0RmlsdGVycyAmIHsgc3RlcHM/OiBudW1iZXIgfSA9IHt9KTogUHJvbWlzZTxNaWdyYXRpb25SZXN1bHRbXT4ge1xuICAgICAgICBjb25zdCBkb3duUmVzdWx0cyA9IGF3YWl0IHRoaXMucm9sbGJhY2soZmlsdGVycylcblxuICAgICAgICBpZiAoZG93blJlc3VsdHMuc29tZShyID0+IHIucmVzdWx0ID09PSAnZmFpbGVkJykpIHtcbiAgICAgICAgICAgIHJldHVybiBkb3duUmVzdWx0c1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBSZXN1bHRzID0gYXdhaXQgdGhpcy5taWdyYXRlKGZpbHRlcnMpXG5cbiAgICAgICAgcmV0dXJuIHVwUmVzdWx0c1xuICAgIH1cblxufVxuXG4iLCJpbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9jcmVhdGVJZC50cydcblxuZXhwb3J0IHR5cGUgSXBjTWVzc2FnZTxUID0gYW55PiA9IHtcbiAgICBpZDogc3RyaW5nXG4gICAgZXZlbnQ6IHN0cmluZ1xuICAgIGRhdGE6IFRcbn1cblxudHlwZSBJcGNMaXN0ZW5lcjxUID0gYW55PiA9IChkYXRhOiBUKSA9PiB2b2lkXG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5JcGNDbGllbnQge1xuICAgIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxJcGNMaXN0ZW5lcj4+KClcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgcHJvY2Vzcy5vbignbWVzc2FnZScsIChtZXNzYWdlOiBJcGNNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMubGlzdGVuZXJzLmdldChtZXNzYWdlLmV2ZW50KVxuICAgICAgICAgICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIobWVzc2FnZS5kYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvbjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoZXZlbnQpKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnQsIG5ldyBTZXQoKSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmdldChldmVudCkhLmFkZChjYWxsYmFjayBhcyBJcGNMaXN0ZW5lcilcbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmPFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiBJcGNMaXN0ZW5lcjxUPik6IHZvaWQge1xuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpPy5kZWxldGUoY2FsbGJhY2sgYXMgSXBjTGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHVibGljIGVtaXQ8VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgZGF0YT86IFQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXByb2Nlc3Muc2VuZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbHVnaW5JcGNDbGllbnQuZW1pdDogcHJvY2Vzcy5zZW5kIGlzIG5vdCBhdmFpbGFibGUg4oCUIHByb2Nlc3Mgd2FzIG5vdCBzcGF3bmVkIHdpdGggSVBDIGNoYW5uZWwnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWQgPSBjcmVhdGVJZCgpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2U6IElwY01lc3NhZ2U8VD4gPSB7IGlkLCBldmVudCwgZGF0YTogZGF0YSBhcyBUIH1cbiAgICAgICAgcHJvY2Vzcy5zZW5kKG1lc3NhZ2UpXG5cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgfVxuXG59XG5cbiIsImltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IHsgY3JlYXRlSWQgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMnXG5pbXBvcnQgdHlwZSB7IElwY01lc3NhZ2UgfSBmcm9tICcuL1BsdWdpbklwY0NsaWVudC50cydcblxudHlwZSBJcGNMaXN0ZW5lcjxUID0gYW55PiA9IChkYXRhOiBUKSA9PiB2b2lkXG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5JcGNIb3N0IHtcbiAgICBwcml2YXRlIGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8SXBjTGlzdGVuZXI+PigpXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjaGlsZDogQ2hpbGRQcm9jZXNzKSB7XG4gICAgICAgIHRoaXMuY2hpbGQub24oJ21lc3NhZ2UnLCAobWVzc2FnZTogSXBjTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmxpc3RlbmVycy5nZXQobWVzc2FnZS5ldmVudClcbiAgICAgICAgICAgIGlmICghaGFuZGxlcnMpIHJldHVyblxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKG1lc3NhZ2UuZGF0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgb248VCA9IGFueT4oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IElwY0xpc3RlbmVyPFQ+KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGV2ZW50KSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGV2ZW50LCBuZXcgU2V0KCkpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlbmVycy5nZXQoZXZlbnQpIS5hZGQoY2FsbGJhY2sgYXMgSXBjTGlzdGVuZXIpXG4gICAgfVxuXG4gICAgcHVibGljIG9mZjxUID0gYW55PihldmVudDogc3RyaW5nLCBjYWxsYmFjazogSXBjTGlzdGVuZXI8VD4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50KT8uZGVsZXRlKGNhbGxiYWNrIGFzIElwY0xpc3RlbmVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0PFQgPSBhbnk+KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiBUKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkLnNlbmQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGx1Z2luSXBjSG9zdC5lbWl0OiBjaGlsZCBwcm9jZXNzIHdhcyBub3Qgc3Bhd25lZCB3aXRoIGFuIElQQyBjaGFubmVsJylcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkID0gY3JlYXRlSWQoKVxuICAgICAgICBjb25zdCBtZXNzYWdlOiBJcGNNZXNzYWdlPFQ+ID0geyBpZCwgZXZlbnQsIGRhdGE6IGRhdGEgYXMgVCB9XG4gICAgICAgIHRoaXMuY2hpbGQuc2VuZChtZXNzYWdlKVxuXG4gICAgICAgIHJldHVybiBpZFxuICAgIH1cblxufVxuIiwiaW1wb3J0IHsgUGx1Z2luSXBjQ2xpZW50IH0gZnJvbSAnLi9QbHVnaW5JcGNDbGllbnQudHMnXG5cbmV4cG9ydCB0eXBlIEh0dHBNZXRob2QgPSAnR0VUJyB8ICdQT1NUJyB8ICdQVVQnIHwgJ1BBVENIJyB8ICdERUxFVEUnXG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVEZWZpbml0aW9uIHtcbiAgICBtZXRob2Q6IEh0dHBNZXRob2RcbiAgICBwYXRoOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVJlcXVlc3Qge1xuICAgIHJlcXVlc3RJZDogc3RyaW5nXG4gICAgbWV0aG9kOiBIdHRwTWV0aG9kXG4gICAgcGF0aDogc3RyaW5nXG4gICAgYm9keT86IGFueVxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlUmVzcG9uc2VQYXlsb2FkIHtcbiAgICByZXF1ZXN0SWQ6IHN0cmluZ1xuICAgIHN0YXR1czogbnVtYmVyXG4gICAgYm9keT86IGFueVxuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGVSZXBseSB7XG4gICAgc3RhdHVzKGNvZGU6IG51bWJlcik6IFJvdXRlUmVwbHlcbiAgICBzZW5kKGJvZHk/OiBhbnkpOiB2b2lkXG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlSGFuZGxlciA9IChyZXE6IFJvdXRlUmVxdWVzdCwgcmVwbHk6IFJvdXRlUmVwbHkpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+XG5cbmludGVyZmFjZSBSb3V0ZUVudHJ5IGV4dGVuZHMgUm91dGVEZWZpbml0aW9uIHtcbiAgICBoYW5kbGVyOiBSb3V0ZUhhbmRsZXJcbiAgICBwYXR0ZXJuOiBSZWdFeHBcbiAgICBwYXJhbU5hbWVzOiBzdHJpbmdbXVxufVxuXG5mdW5jdGlvbiBidWlsZFBhdHRlcm4ocGF0aDogc3RyaW5nKTogeyBwYXR0ZXJuOiBSZWdFeHA7IHBhcmFtTmFtZXM6IHN0cmluZ1tdIH0ge1xuICAgIGNvbnN0IHBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW11cblxuICAgIGNvbnN0IHJlZ2V4U3RyID0gcGF0aFxuICAgICAgICAucmVwbGFjZSgvOlthLXpBLVpfXVthLXpBLVowLTlfXSovZywgKG1hdGNoKSA9PiB7XG4gICAgICAgICAgICBwYXJhbU5hbWVzLnB1c2gobWF0Y2guc2xpY2UoMSkpXG4gICAgICAgICAgICByZXR1cm4gJyhbXi9dKyknXG4gICAgICAgIH0pXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJ1xcXFwvJylcblxuICAgIHJldHVybiB7IHBhdHRlcm46IG5ldyBSZWdFeHAoYF4ke3JlZ2V4U3RyfSRgKSwgcGFyYW1OYW1lcyB9XG59XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW5Sb3V0ZXIge1xuICAgIHByaXZhdGUgcm91dGVzOiBSb3V0ZUVudHJ5W10gPSBbXVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFBsdWdpbklwY0NsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudC5vbjxSb3V0ZVJlcXVlc3Q+KCdyb3V0ZXI6cmVxdWVzdCcsIChyZXEpID0+IHRoaXMuZGlzcGF0Y2gocmVxKSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoKHJlcTogUm91dGVSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGZvciAoY29uc3Qgcm91dGUgb2YgdGhpcy5yb3V0ZXMpIHtcbiAgICAgICAgICAgIGlmIChyb3V0ZS5tZXRob2QgIT09IHJlcS5tZXRob2QpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gcm91dGUucGF0dGVybi5leGVjKHJlcS5wYXRoKVxuICAgICAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cbiAgICAgICAgICAgIHJvdXRlLnBhcmFtTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHBhcmFtc1tuYW1lXSA9IG1hdGNoW2kgKyAxXVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IHN0YXR1c0NvZGUgPSAyMDBcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fVxuXG4gICAgICAgICAgICBjb25zdCByZXBseTogUm91dGVSZXBseSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXMoY29kZSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlID0gY29kZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VuZDogKGJvZHk/OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2U6IFJvdXRlUmVzcG9uc2VQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiByZXEucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuZW1pdCgncm91dGVyOnJlc3BvbnNlJywgcmVzcG9uc2UpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgcm91dGUuaGFuZGxlcih7IC4uLnJlcSwgcGFyYW1zIH0sIHJlcGx5KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsaWVudC5lbWl0KCdyb3V0ZXI6cmVzcG9uc2UnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQ6IHJlcS5yZXF1ZXN0SWQsXG4gICAgICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgICAgICAgIGJvZHk6IHsgbWVzc2FnZTogJ05vdCBGb3VuZCcgfSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgUm91dGVSZXNwb25zZVBheWxvYWQpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlcihtZXRob2Q6IEh0dHBNZXRob2QsIHBhdGg6IHN0cmluZywgaGFuZGxlcjogUm91dGVIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgcGF0dGVybiwgcGFyYW1OYW1lcyB9ID0gYnVpbGRQYXR0ZXJuKHBhdGgpXG5cbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaCh7IG1ldGhvZCwgcGF0aCwgaGFuZGxlciwgcGF0dGVybiwgcGFyYW1OYW1lcyB9KVxuICAgICAgICB0aGlzLmNsaWVudC5lbWl0KCdyb3V0ZXI6cmVnaXN0ZXInLCB7IG1ldGhvZCwgcGF0aCB9IHNhdGlzZmllcyBSb3V0ZURlZmluaXRpb24pXG4gICAgfVxuXG4gICAgcHVibGljIGdldChwYXRoOiBzdHJpbmcsIGhhbmRsZXI6IFJvdXRlSGFuZGxlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKCdHRVQnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBwb3N0KHBhdGg6IHN0cmluZywgaGFuZGxlcjogUm91dGVIYW5kbGVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoJ1BPU1QnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBwdXQocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignUFVUJywgcGF0aCwgaGFuZGxlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgcGF0Y2gocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignUEFUQ0gnLCBwYXRoLCBoYW5kbGVyKVxuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGUocGF0aDogc3RyaW5nLCBoYW5kbGVyOiBSb3V0ZUhhbmRsZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWdpc3RlcignREVMRVRFJywgcGF0aCwgaGFuZGxlcilcbiAgICB9XG59XG4iLCJpbXBvcnQgZmcgZnJvbSAnZmFzdC1nbG9iJ1xuaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJyNzaGFyZWQvc2VydmljZXMvTG9nZ2VyU2VydmljZS50cydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHR5cGUgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcblxuaW50ZXJmYWNlIFJvdXRlRmlsZURlZmluaXRpb24ge1xuICAgIGZpbGU6IHN0cmluZ1xuICAgIHJvdXRlUGF0aDogc3RyaW5nXG4gICAgbW9kdWxlPzogc3RyaW5nXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwYXRjaCcgfCAnZGVsZXRlJyB8ICdwdXQnXG4gICAgc29ydEtleTogbnVtYmVyXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2Uge1xuICAgIHByaXZhdGUgZGlyZWN0b3J5OiBzdHJpbmcgXG4gICAgcHJpdmF0ZSBwcmVmaXg6IHN0cmluZ1xuICAgIHByaXZhdGUgbW9kdWxlPzogc3RyaW5nXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICAgIHByaXZhdGUgbG9nZ2VyID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHByaXZhdGUgcm91dGVzOiBSb3V0ZUZpbGVEZWZpbml0aW9uW10gPSBbXVxuICAgIHB1YmxpYyBkZWJ1ZyA9IGZhbHNlXG5cbiAgICBwdWJsaWMgc2V0RGlyZWN0b3J5KGRpcmVjdG9yeTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldFByZWZpeChwcmVmaXg6IHN0cmluZykge1xuICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSb3V0ZXIocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIgPSByb3V0ZXJcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TW9kdWxlKG1vZHVsZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldExvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXJcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGVidWcoZGVidWc6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZXJGaWxlQmFzZVJvdXRpbmdTZXJ2aWNlKCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSlcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZEZpbGVzKCkge1xuICAgICAgICBjb25zdCBmaWxlcyA9IGZnLnN5bmMoJyoqLyouKHRzfGpzfG1qcyknLCB7IGN3ZDogdGhpcy5kaXJlY3RvcnkgfSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEZvdW5kICR7ZmlsZXMubGVuZ3RofSByb3V0ZSBmaWxlcyBpbiAke3RoaXMuZGlyZWN0b3J5fWAsIHtcbiAgICAgICAgICAgICAgICBmaWxlcyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFsbCBmaWxlcyBhbmQgYnVpbGQgcm91dGUgZGF0YVxuICAgICAgICBjb25zdCByb3V0ZXM6IFJvdXRlRmlsZURlZmluaXRpb25bXSA9IFtdXG5cbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZXh0ZW5zaW9uXG4gICAgICAgICAgICBsZXQgcm91dGVQYXRoID0gZmlsZS5yZXBsYWNlKC9cXC4odHN8anN8bWpzKSQvLCAnJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIEhUVFAgbWV0aG9kIGZyb20gc3VmZml4XG4gICAgICAgICAgICBsZXQgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwYXRjaCcgfCAnZGVsZXRlJyB8ICdwdXQnID0gJ2dldCdcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZFN1ZmZpeGVzID0gWycucG9zdCcsICcucGF0Y2gnLCAnLmRlbGV0ZScsICcucHV0J11cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWZmaXggb2YgbWV0aG9kU3VmZml4ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocm91dGVQYXRoLmVuZHNXaXRoKHN1ZmZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gc3VmZml4LnN1YnN0cmluZygxKSBhcyBhbnlcbiAgICAgICAgICAgICAgICAgICAgcm91dGVQYXRoID0gcm91dGVQYXRoLnJlcGxhY2Uoc3VmZml4LCAnJylcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZmlsZSBwYXRoIHRvIHJvdXRlIHBhdGhcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgJ2luZGV4JyB3aXRoIGVtcHR5IHN0cmluZyBmb3IgaW5kZXggcm91dGVzXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXFwvaW5kZXgkLywgJycpXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXmluZGV4JC8sICcnKVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb252ZXJ0IFsuLi5uYW1lXSB0byAvOm5hbWUoLiopIGZvciBuYW1lZCBjYXRjaC1hbGwgcm91dGVzXG4gICAgICAgICAgICByb3V0ZVBhdGggPSByb3V0ZVBhdGgucmVwbGFjZSgvXFxbXFwuXFwuXFwuKFteXFxdXSspXS9nLCAnKiQxJylcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ29udmVydCBbcGFyYW1dIHRvIDpwYXJhbSBmb3Igcm91dGUgcGFyYW1ldGVyc1xuICAgICAgICAgICAgcm91dGVQYXRoID0gcm91dGVQYXRoLnJlcGxhY2UoL1xcWyhbXlxcXV0rKV0vZywgJzokMScpXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEVuc3VyZSByb3V0ZSBzdGFydHMgd2l0aCAvXG4gICAgICAgICAgICBpZiAoIXJvdXRlUGF0aC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSAnLycgKyByb3V0ZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIHJvb3QgaW5kZXggY2FzZVxuICAgICAgICAgICAgaWYgKHJvdXRlUGF0aCA9PT0gJy8nKSB7XG4gICAgICAgICAgICAgICAgcm91dGVQYXRoID0gJy8nXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEFwcGx5IHByZWZpeCBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKHRoaXMucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IHRoaXMucHJlZml4LnN0YXJ0c1dpdGgoJy8nKSA/IHRoaXMucHJlZml4IDogJy8nICsgdGhpcy5wcmVmaXhcbiAgICAgICAgICAgICAgICByb3V0ZVBhdGggPSBub3JtYWxpemVkUHJlZml4ICsgcm91dGVQYXRoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzb3J0IGtleSBmb3IgcHJpb3JpdGl6YXRpb25cbiAgICAgICAgICAgIGxldCBzb3J0S2V5ID0gMFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYXRjaC1hbGwgcm91dGVzIHNob3VsZCBjb21lIGxhc3QgKGhpZ2ggc29ydCBrZXkpXG4gICAgICAgICAgICBpZiAocm91dGVQYXRoLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICBzb3J0S2V5ICs9IDEwMDAwMDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ291bnQgcGFyYW1ldGVycyAocm91dGVzIHdpdGggZmV3ZXIgcGFyYW1zIGNvbWUgZmlyc3QpXG4gICAgICAgICAgICBjb25zdCBwYXJhbUNvdW50ID0gKHJvdXRlUGF0aC5tYXRjaCgvOi9nKSB8fCBbXSkubGVuZ3RoXG4gICAgICAgICAgICBzb3J0S2V5ICs9IHBhcmFtQ291bnQgKiAxMDAwMFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDb3VudCBzZWdtZW50cyAocm91dGVzIHdpdGggbW9yZSBzZWdtZW50cyBjb21lIGZpcnN0LCBzbyB3ZSBzdWJ0cmFjdClcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRDb3VudCA9IHJvdXRlUGF0aC5zcGxpdCgnLycpLmZpbHRlcihzID0+IHMpLmxlbmd0aFxuICAgICAgICAgICAgc29ydEtleSAtPSBzZWdtZW50Q291bnQgKiAxMDBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcm91dGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICBzb3J0S2V5LFxuICAgICAgICAgICAgICAgIG1vZHVsZTogdGhpcy5tb2R1bGUsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTb3J0IHJvdXRlcyBieSBzcGVjaWZpY2l0eSAobG93ZXIgc29ydEtleSA9IG1vcmUgc3BlY2lmaWMgPSByZWdpc3RlcmVkIGZpcnN0KVxuICAgICAgICByb3V0ZXMuc29ydCgoYSwgYikgPT4gYS5zb3J0S2V5IC0gYi5zb3J0S2V5KVxuXG4gICAgICAgIHRoaXMucm91dGVzID0gcm91dGVzXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlZ2lzdGVyUm91dGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMucm91dGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignUm91dGVyIGluc3RhbmNlIG5vdCBzZXQnKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IHRoaXMubW9kdWxlIHx8ICd1bmtub3duJ1xuXG4gICAgICAgIGNvbnN0IGhvb2sgPSBmdW5jdGlvbihyb3V0ZTogUm91dGUpe1xuICAgICAgICAgICAgcm91dGUubWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgICAgLi4ucm91dGUubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIub24oJ2FkZGVkJywgaG9vaylcblxuICAgICAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHRoaXMucm91dGVzKSB7XG4gICAgICAgICAgICBjb25zdCByb3V0ZU1vZHVsZSA9IGF3YWl0IGltcG9ydChgJHt0aGlzLmRpcmVjdG9yeX0vJHtyb3V0ZS5maWxlfWApXG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gcm91dGVNb2R1bGUuZGVmYXVsdFxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBSb3V0ZSBmaWxlICR7cm91dGUuZmlsZX0gZG9lcyBub3QgZXhwb3J0IGEgZGVmYXVsdCBmdW5jdGlvbmApXG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yb3V0ZXJbcm91dGUubWV0aG9kXShyb3V0ZS5yb3V0ZVBhdGgsIGhhbmRsZXIpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJvdXRlci5vZmYoJ2FkZGVkJywgaG9vaylcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpe1xuXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEZpbGVzKClcbiAgICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclJvdXRlcygpXG5cbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IFJvdXRlclNlcnZpY2UgZnJvbSAnLi9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgdHJ5Q2F0Y2ggfSBmcm9tICcjc2hhcmVkL3V0aWxzL3RyeUNhdGNoLnRzJ1xuaW1wb3J0IHR5cGUgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJSZWdpc3RlckVudHJ5IHtcbiAgICBmaWxlcGF0aDogc3RyaW5nXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm91dGVyUmVnaXN0ZXI8QyA9IHt9PiBleHRlbmRzIFJvdXRlclNlcnZpY2U8Qz4ge1xuICAgIHB1YmxpYyBmaWxlcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZXJSZWdpc3RlckVudHJ5PigpXG4gICAgcHVibGljIGRpcnMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVyUmVnaXN0ZXJFbnRyeT4oKVxuICAgIFxuICAgIGNvbnN0cnVjdG9yKHJvdXRlcjogUGFydGlhbDxSb3V0ZXJTZXJ2aWNlPEM+PiA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHJvdXRlcilcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmlsZShmaWxlbmFtZTogc3RyaW5nLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSB7XG4gICAgICAgICAgICBmaWxlcGF0aDogZmlsZW5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEgfHwge31cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnYWRkRW50cnknLCBlbnRyeSlcblxuICAgICAgICB0aGlzLmZpbGVzLnNldChmaWxlbmFtZSwgZW50cnkpXG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRGlyKGRpcm5hbWU6IHN0cmluZywgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0ge1xuICAgICAgICAgICAgZmlsZXBhdGg6IGRpcm5hbWUsXG4gICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGEgfHwge31cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnYWRkRW50cnknLCBlbnRyeSlcblxuICAgICAgICB0aGlzLmRpcnMuc2V0KGRpcm5hbWUsIGVudHJ5KVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbG9hZEZpbGUoZW50cnk6IFJvdXRlclJlZ2lzdGVyRW50cnkpOiBQcm9taXNlPGJvb2xlYW4+IHsgICAgICAgIFxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZW50cnkuZmlsZXBhdGgpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBGaWxlIG5vdCBmb3VuZDogJHtlbnRyeS5maWxlcGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob29rID0gZnVuY3Rpb24ocm91dGU6IFJvdXRlKXtcbiAgICAgICAgICAgIHJvdXRlLm1ldGFkYXRhID0ge1xuICAgICAgICAgICAgICAgIC4uLnJvdXRlLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIC4uLmVudHJ5Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBlbnRyeS5maWxlcGF0aCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIFxuICAgICAgICBjb25zdCB1bmFjaGVkID0gYCR7ZW50cnkuZmlsZXBhdGh9P3Q9JHtEYXRlLm5vdygpfWAgLy8gUHJldmVudCBjYWNoaW5nIGlzc3Vlc1xuXG4gICAgICAgIHRoaXMub24oJ2FkZGVkJywgaG9vaylcbiAgICBcbiAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IGltcG9ydCh1bmFjaGVkKSlcblxuICAgICAgICB0aGlzLm9mZignYWRkZWQnLCBob29rKVxuICAgIFxuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIGVudHJ5KVxuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZmFpbGVkIHRvIGxvYWQgZmlsZScsIGVycm9yKVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkRGlyKGVudHJ5OiBSb3V0ZXJSZWdpc3RlckVudHJ5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICBjb25zdCBsb2FkZWQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGVudHJ5LmZpbGVwYXRoKSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgRGlyZWN0b3J5IG5vdCBmb3VuZDogJHtlbnRyeS5maWxlcGF0aH1gKVxuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obG9hZGVkKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhlbnRyeS5maWxlcGF0aClcbiAgICAgICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0ZXN0IGZpbGVzXG4gICAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnRlc3QudHMnKSB8fCBmaWxlLmVuZHNXaXRoKCcuc3BlYy50cycpIHx8IGZpbGUuZW5kc1dpdGgoJy50ZXN0LmpzJykgfHwgZmlsZS5lbmRzV2l0aCgnLnNwZWMuanMnKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGVudHJ5LmZpbGVwYXRoLCBmaWxlKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgZmlsZVJvdXRlclJlZ2lzdGVyRW50cnkgPSB7IFxuICAgICAgICAgICAgICAgIGZpbGVwYXRoOiBmdWxsUGF0aCxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogZW50cnkubWV0YWRhdGEgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoYXdhaXQgdGhpcy5sb2FkRmlsZShmaWxlUm91dGVyUmVnaXN0ZXJFbnRyeSkpKSB7XG4gICAgICAgICAgICAgICAgbG9hZGVkLmFkZChmdWxsUGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGxvYWRlZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgbG9hZGVkID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgdGhpcy5maWxlcy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKChhd2FpdCB0aGlzLmxvYWRGaWxlKGUpKSkge1xuICAgICAgICAgICAgICAgIGxvYWRlZC5hZGQoZS5maWxlcGF0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGlyIG9mIHRoaXMuZGlycy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgZGlyTG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkRGlyKGRpcilcblxuICAgICAgICAgICAgZGlyTG9hZGVkLmZvckVhY2gocCA9PiBsb2FkZWQuYWRkKHApKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdsb2FkIGZpbGVzJywge1xuICAgICAgICAgICAgICAgIGZpbGVzOiBBcnJheS5mcm9tKGxvYWRlZCkubWFwKHAgPT4gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBwKSksXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgUm91dGVyIGZyb20gJy4vUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuaW1wb3J0IHsgY29tcG9zZSB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBIb29rcyBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHR5cGUgUm91dGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9Sb3V0ZUVudGl0eS50cydcbmltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBSZXNvdXJjZU1ldGhvZCA9ICdpbmRleCcgfCAnc2hvdycgfCAnc3RvcmUnIHwgJ3VwZGF0ZScgfCAnZGVzdHJveSdcblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZXJSZXNvdXJjZU9wdGlvbnMge1xuICAgIG1pZGRsZXdhcmU/OiBQYXJ0aWFsPFJlY29yZDxSZXNvdXJjZU1ldGhvZCB8ICdhbGwnLCBNaWRkbGV3YXJlPj5cbiAgICBleGNlcHQ/OiBSZXNvdXJjZU1ldGhvZFtdXG59XG5cbmNvbnN0IHJvdXRlcyA9IFtcbiAgICB7XG4gICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgaGFuZGxlcjogJ2luZGV4JyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVJbmRleCddLFxuICAgICAgICAgICAgYWZ0ZXI6ICBbJ2FmdGVySW5kZXgnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICdzaG93JyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVTaG93J10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJTaG93J10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgIHBhdGg6ICcvJyxcbiAgICAgICAgaGFuZGxlcjogJ3N0b3JlJyxcbiAgICAgICAgaG9va3M6IHtcbiAgICAgICAgICAgIGJlZm9yZTogWydiZWZvcmVTdG9yZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJTdG9yZScsICdhZnRlclNhdmUnXSxcbiAgICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgICBtZXRob2Q6ICdwdXQnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICd1cGRhdGUnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVVwZGF0ZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJTYXZlJ10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAncGF0Y2gnLFxuICAgICAgICBwYXRoOiAnLzppZCcsXG4gICAgICAgIGhhbmRsZXI6ICd1cGRhdGUnLFxuICAgICAgICBob29rczoge1xuICAgICAgICAgICAgYmVmb3JlOiBbJ2JlZm9yZVVwZGF0ZScsICdiZWZvcmVTYXZlJ10sXG4gICAgICAgICAgICBhZnRlcjogIFsnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJTYXZlJ10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAgICAgICAgcGF0aDogJy86aWQnLFxuICAgICAgICBoYW5kbGVyOiAnZGVzdHJveScsXG4gICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmU6IFsnYmVmb3JlRGVzdHJveSddLFxuICAgICAgICAgICAgYWZ0ZXI6ICBbJ2FmdGVyRGVzdHJveSddLFxuICAgICAgICB9XG4gICAgfSxcbl1cblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBjb21wb3NlKEhvb2tzKSB7XG4gICAgcHJpdmF0ZSBvcHRpb25zOiBSb3V0ZXJSZXNvdXJjZU9wdGlvbnNcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJvdXRlclJlc291cmNlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbmRleChjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaG93KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdG9yZShjdHg6IEh0dHBDb250ZXh0KTogUHJvbWlzZTxhbnk+ICB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgY3R4IH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZXN0cm95KGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPGFueT4gIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCcpXG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwgeyBjdHggfSlcblxuICAgICAgICB0aHJvdyBlcnJvclxuICAgIH1cblxuICAgIHByaXZhdGUgd3JhcChcbiAgICAgICAgbWV0aG9kTmFtZTogJ2luZGV4JyB8ICdzaG93JyB8ICdzdG9yZScgfCAndXBkYXRlJyB8ICdkZXN0cm95JyxcbiAgICAgICAgYmVmb3JlOiBzdHJpbmdbXSxcbiAgICAgICAgYWZ0ZXI6IHN0cmluZ1tdLFxuICAgICkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKGN0eDogSHR0cENvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdCgnYmVmb3JlQWxsJywgY3R4KVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGhvb2sgb2YgYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGhvb2ssIGN0eClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpc1ttZXRob2ROYW1lXShjdHgpXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgaG9vayBvZiBhZnRlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdChob29rLCBjdHgsIHJlc3VsdClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgcmVnaXN0ZXIocm91dGVyOiBSb3V0ZXIpIHtcbiAgICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IHJvdXRlLm1ldGhvZCBhcyBSb3V0ZVsnbWV0aG9kJ11cbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSByb3V0ZS5oYW5kbGVyIGFzIFJlc291cmNlTWV0aG9kXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZXhjZXB0ICYmIHRoaXMub3B0aW9ucy5leGNlcHQuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1pZGRsZXdhcmUgJiYgdGhpcy5vcHRpb25zLm1pZGRsZXdhcmVbJ2FsbCddKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLnVzZSh0aGlzLm9wdGlvbnMubWlkZGxld2FyZVsnYWxsJ10pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWlkZGxld2FyZSAmJiB0aGlzLm9wdGlvbnMubWlkZGxld2FyZVttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgICAgIHJvdXRlci51c2UodGhpcy5vcHRpb25zLm1pZGRsZXdhcmVbbWV0aG9kTmFtZV0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJvdXRlclttZXRob2RdKFxuICAgICAgICAgICAgICAgIHJvdXRlLnBhdGgsXG4gICAgICAgICAgICAgICAgdGhpcy53cmFwKFxuICAgICAgICAgICAgICAgICAgICByb3V0ZS5oYW5kbGVyIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGUuaG9va3M/LmJlZm9yZSB8fCBbXSxcbiAgICAgICAgICAgICAgICAgICAgcm91dGUuaG9va3M/LmFmdGVyIHx8IFtdLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBSb3V0ZXJSZXNvdXJjZVNlcnZpY2UgZnJvbSAnLi9Sb3V0ZXJSZXNvdXJjZVNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlclJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4vUm91dGVyUmVzb3VyY2VTZXJ2aWNlLnRzJ1xuaW1wb3J0IHR5cGUgeyBIdHRwQ29udGV4dCB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHMnXG5pbXBvcnQgdHlwZSB7IENvbmZpZ01vZGVsIH0gZnJvbSAnI3NlcnZlci9taXhpbnMvTW9kZWxDb25maWdNaXhpbi50cydcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0ZXJSZXNvdXJjZUNvbmZpZyBleHRlbmRzIFJvdXRlclJlc291cmNlU2VydmljZSB7XG4gICAgcHJpdmF0ZSBtb2RlbDogQ29uZmlnTW9kZWxcblxuICAgIGNvbnN0cnVjdG9yKG1vZGVsOiBDb25maWdNb2RlbCwgb3B0aW9uczogUm91dGVyUmVzb3VyY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucylcblxuICAgICAgICBpZiAoIW1vZGVsLl9faXNDb25maWdNb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSb3V0ZXJSZXNvdXJjZUNvbmZpZ1NlcnZpY2UgcmVxdWlyZXMgYSBDb25maWdNb2RlbCcpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWxcbiAgICB9XG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2Uga25vdyB0aGlzIGlzIGNvcnJlY3QsIGJ1dCBUeXBlU2NyaXB0IGNhbid0IGluZmVyIGl0IFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgYXN5bmMgaW5kZXgoY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMubW9kZWwubGlzdCgpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IDEsXG4gICAgICAgICAgICB0b3RhbDogaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxfcGFnZXM6IDEsXG4gICAgICAgICAgICBpdGVtczogaXRlbXNcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzaG93KGN0eDogSHR0cENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBjdHgucGFyYW1zLmlkIVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLm1vZGVsLmZpbmRPckZhaWwoaWQpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcmUoY3R4OiBIdHRwQ29udGV4dCkge1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LnJlcXVlc3QuYm9keSBhcyBhbnlcblxuICAgICAgICBhd2FpdCB0aGlzLm1vZGVsLmNyZWF0ZShkYXRhKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVzb3VyY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHknXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgdXBkYXRlKGN0eDogSHR0cENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgaWQgPSBjdHgucGFyYW1zLmlkIVxuICAgICAgICBjb25zdCBkYXRhID0gY3R4LnJlcXVlc3QuYm9keSBhcyBhbnlcblxuICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5tb2RlbC51cGRhdGUoaWQsIGRhdGEpXG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWRcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZGVzdHJveShjdHg6IEh0dHBDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGlkID0gY3R4LnBhcmFtcy5pZCFcblxuICAgICAgICBhd2FpdCB0aGlzLm1vZGVsLmRlc3Ryb3koaWQpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBKb2IgfSBmcm9tICdub2RlLXNjaGVkdWxlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRpbmVIYW5kbGVyIHtcbiAgICAoKTogdm9pZCB8IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0aW5lRW50aXR5T3B0aW9ucyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIGNyb246IHN0cmluZ1xuICAgIGhhbmRsZXI/OiBSb3V0aW5lSGFuZGxlclxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb3V0aW5lRW50aXR5IHtcbiAgICBwdWJsaWMgaWQ6IHN0cmluZ1xuICAgIHB1YmxpYyBjcm9uOiBzdHJpbmdcbiAgICBwdWJsaWMgam9iPzogSm9iXG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZSgpe1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRpbmVFbnRpdHkoKVxuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGU6IFJvdXRpbmVIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRpbmVFbnRpdHkgaGFuZGxlciBub3QgaW1wbGVtZW50ZWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRJZChpZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZFxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgcHVibGljIHNldENyb24oY3Jvbjogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY3JvbiA9IGNyb25cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIYW5kbGVyKGhhbmRsZXI6IFJvdXRpbmVIYW5kbGVyKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxufVxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBub2RlU2NoZWR1bGUgZnJvbSAnbm9kZS1zY2hlZHVsZSdcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vZmFjYWRlcy9sb2dnZXIudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvdHJ5Q2F0Y2gudHMnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJyNjbGllbnQvdXRpbHMvY3JlYXRlSWQudHMnXG5pbXBvcnQgUm91dGluZUVudGl0eSBmcm9tICcjc2VydmVyL2VudGl0aWVzL1JvdXRpbmVFbnRpdHkudHMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uLCBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuZXhwb3J0IGludGVyZmFjZSBBZGRPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlclNlcnZpY2VPcHRpb25zIHtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgZGVidWc/OiBib29sZWFuXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZWR1bGVyRXZlbnRzIHtcbiAgICAnc2NoZWR1bGVyOnJlZ2lzdGVyZWQnOiB7XG4gICAgICAgIHNjaGVkdWxlcjogU2NoZWR1bGVyU2VydmljZVxuICAgIH1cbiAgICAnc2NoZWR1bGVyOmxvYWRlZCc6IHtcbiAgICAgICAgc2NoZWR1bGVyOiBTY2hlZHVsZXJTZXJ2aWNlXG4gICAgfVxuICAgICdzY2hlZHVsZXI6Ym9vdGVkJzoge1xuICAgICAgICBzY2hlZHVsZXI6IFNjaGVkdWxlclNlcnZpY2VcbiAgICB9LFxuICAgICdzY2hlZHVsZXI6c2h1dGRvd25lZCc6IHtcbiAgICAgICAgc2NoZWR1bGVyOiBTY2hlZHVsZXJTZXJ2aWNlXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2hlZHVsZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdTY2hlZHVsZXJTZXJ2aWNlJ1xuICAgIHB1YmxpYyByb3V0aW5lczogUm91dGluZUVudGl0eVtdXG4gICAgcHVibGljIGxvZ2dlcjogTG9nZ2VyU2VydmljZVxuICAgIHB1YmxpYyBkZWJ1ZzogYm9vbGVhblxuICAgIHB1YmxpYyBkaXJzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zPzogU2NoZWR1bGVyU2VydmljZU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5yb3V0aW5lcyA9IFtdXG4gICAgICAgIHRoaXMubG9nZ2VyID0gb3B0aW9ucz8ubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnM/LmRlYnVnIHx8IGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGUob3B0aW9ucz86IFNjaGVkdWxlclNlcnZpY2VPcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2NoZWR1bGVyU2VydmljZShvcHRpb25zKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRMb2dnZXIobG9nZ2VyOiBMb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyXG4gICAgfVxuXG4gICAgcHVibGljIHNldERlYnVnKGRlYnVnOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGVidWcgPSBkZWJ1Z1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGREaXIoZGlyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5kaXJzLnB1c2goZGlyKVxuICAgIH1cblxuICAgIHB1YmxpYyBhZGQocm91dGluZTogT21pdDxSb3V0aW5lRW50aXR5LCAnam9iJz4pIHtcbiAgICAgICAgY29uc3QgaWQgPSByb3V0aW5lPy5pZCB8fCBjcmVhdGVJZCgpXG5cbiAgICAgICAgdGhpcy5yb3V0aW5lcy5wdXNoKHJvdXRpbmUpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGAke2lkfSByb3V0aW5lIGFkZGVkYCwge1xuICAgICAgICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICAgICAgICBjcm9uOiByb3V0aW5lLmNyb24sXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZShpZDogUm91dGluZUVudGl0eVsnaWQnXSB8IFJvdXRpbmVFbnRpdHlbJ2lkJ11bXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KGlkKSA/IGlkIDogW2lkXVxuXG4gICAgICAgIHRoaXMucm91dGluZXMgPSB0aGlzLnJvdXRpbmVzLmZpbHRlcihyID0+ICFpZHMuaW5jbHVkZXMoci5pZCkpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ3JvdXRpbmVzIHJlbW92ZWQnLCB7XG4gICAgICAgICAgICAgICAgaWRzOiBpZHNcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkRmlsZShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYEZpbGUgbm90IGZvdW5kOiAke2ZpbGVuYW1lfWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFtlcnJvciwgbW9kXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IGltcG9ydChmaWxlbmFtZSkpXG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZmFpbGVkIHRvIGxvYWQgcm91dGluZXMgZnJvbSAke2ZpbGVuYW1lfWAsIGVycm9yKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdHIgPSBtb2Q/LmRlZmF1bHQgfHwgbW9kXG5cbiAgICAgICAgaWYgKCFjdHI/LmlzX3JvdXRpbmUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYGZpbGUgZG9lcyBub3QgZXhwb3J0IGEgcm91dGluZTogJHtmaWxlbmFtZX1gKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBjdHIoKVxuXG4gICAgICAgIGluc3RhbmNlLmlkID0gaW5zdGFuY2UuaWQgfHwgZmlsZW5hbWVcblxuICAgICAgICB0aGlzLmFkZChpbnN0YW5jZSlcblxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2ZpbGUgbG9hZGVkJywgeyBmaWxlbmFtZSB9KVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWREaXJlY3RvcnkoZGlyZWN0b3J5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGRpcmVjdG9yeSkpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdkaXJlY3Rvcnkgbm90IGZvdW5kJywgeyBkaXJlY3RvcnkgfSlcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJlY3RvcnkpLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy50cycpKVxuXG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkRmlsZShwYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiB0aGlzLmRpcnMpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubG9hZERpcmVjdG9yeShkaXIpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGlkOiBSb3V0aW5lRW50aXR5WydpZCddKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRpbmVzLnNvbWUocm91dGluZSA9PiByb3V0aW5lLmlkID09PSBpZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RhcnRSb3V0aW5lKGlkOiBSb3V0aW5lRW50aXR5WydpZCddKSB7XG4gICAgICAgIGNvbnN0IHJvdXRpbmUgPSB0aGlzLnJvdXRpbmVzLmZpbmQociA9PiByLmlkID09PSBpZClcblxuICAgICAgICBpZiAoIXJvdXRpbmUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBSb3V0aW5lRW50aXR5IG5vdCBmb3VuZDogJHtpZH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJvdXRpbmUuam9iKSB7XG4gICAgICAgICAgICByb3V0aW5lLmpvYi5jYW5jZWwoKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9nZ2VyID0gdGhpcy5sb2dnZXIuY2hpbGQoe1xuICAgICAgICAgICAgcm91dGluZUlkOiByb3V0aW5lLmlkLFxuICAgICAgICAgICAgcm91dGluZUNyb246IHJvdXRpbmUuY3JvblxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGNiID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgW2Vycm9yXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHJvdXRpbmUuaGFuZGxlKCkpXG5cbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcilcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCR7cm91dGluZS5pZH0gcm91dGluZSBleGVjdXRlZGApXG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5lLmpvYiA9IG5vZGVTY2hlZHVsZS5zY2hlZHVsZUpvYihyb3V0aW5lLmNyb24sIGNiKVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKGAke3JvdXRpbmUuaWR9IHJvdXRpbmUgc3RhcnRlZGApXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGFkZEFuZFN0YXJ0KHJvdXRpbmU6IE9taXQ8Um91dGluZUVudGl0eSwgJ2pvYic+KSB7XG4gICAgICAgIHRoaXMuYWRkKHJvdXRpbmUpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydFJvdXRpbmUocm91dGluZS5pZClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcFJvdXRpbmUoaWQ6IFJvdXRpbmVFbnRpdHlbJ2lkJ10pIHtcbiAgICAgICAgY29uc3Qgcm91dGluZSA9IHRoaXMucm91dGluZXMuZmluZChyID0+IHIuaWQgPT09IGlkKVxuXG4gICAgICAgIGlmICghcm91dGluZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1JvdXRpbmVFbnRpdHkgbm90IGZvdW5kJywgNDA0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyb3V0aW5lLmpvYikge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICByb3V0aW5lLmpvYi5jYW5jZWwoKVxuXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYCR7cm91dGluZS5pZH0gcm91dGluZSBzdG9wcGVkYClcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc3RvcEFuZFJlbW92ZShpZDogUm91dGluZUVudGl0eVsnaWQnXSkge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BSb3V0aW5lKGlkKVxuXG4gICAgICAgIHRoaXMucmVtb3ZlKGlkKVxuICAgIH1cblxuXG4gICAgcHVibGljIGFzeW5jIGJvb3QoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm91dGluZSBvZiB0aGlzLnJvdXRpbmVzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Um91dGluZShyb3V0aW5lLmlkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNodXRkb3duKCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJvdXRpbmUgb2YgdGhpcy5yb3V0aW5lcykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9wUm91dGluZShyb3V0aW5lLmlkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3QoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRpbmVzXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gXCIjc2hhcmVkL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gXCJreXNlbHlcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJFbnRpeURhdGEge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZyB8IG51bGw7XG4gICAgZmlsZW5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VlZGVyRW50aXR5IHtcbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nXG4gICAgcHVibGljIHNvdXJjZTogc3RyaW5nIHwgbnVsbFxuICAgIHB1YmxpYyBmaWxlbmFtZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhOiBTZWVkZXJFbnRpeURhdGEpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lXG4gICAgICAgIHRoaXMuc291cmNlID0gZGF0YS5zb3VyY2VcbiAgICAgICAgdGhpcy5maWxlbmFtZSA9IGRhdGEuZmlsZW5hbWVcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuKGRiOiBLeXNlbHk8YW55Pik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBtb2QgPSBhd2FpdCBpbXBvcnQodGhpcy5maWxlbmFtZSlcblxuICAgICAgICBpZiAodHlwZW9mIG1vZC5kZWZhdWx0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgU2VlZGVyICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBleHBvcnQgYSBmdW5jdGlvbmApXG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBtb2QuZGVmYXVsdChkYilcbiAgICB9XG5cbn1cblxuIiwiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBFbW1pdHRlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9FbW1pdHRlclNlcnZpY2UudHMnXG5pbXBvcnQgTG9nZ2VyU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0xvZ2dlclNlcnZpY2UudHMnXG5pbXBvcnQgdHlwZSB7IEt5c2VseSB9IGZyb20gJ2t5c2VseSdcbmltcG9ydCBTZWVkZXJFbnRpdHkgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9TZWVkZXJFbnRpdHkudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5cblxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJTb3VyY2Uge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZGlyZWN0b3J5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZpbHRlcnMge1xuICAgIHNvdXJjZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIG5hbWU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWVkZXJSZXN1bHQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlbmFtZTogc3RyaW5nO1xuICAgIHNvdXJjZTogc3RyaW5nIHwgbnVsbDtcbiAgICByZXN1bHQ6ICdzdWNjZXNzJyB8ICdmYWlsZWQnO1xuICAgIGVycm9yPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlckV2ZW50cyB7XG4gICAgJ3NlZWRlcjpiZWZvcmUtcnVuJzoge1xuICAgICAgICBzZWVkZXJzOiBzdHJpbmdbXTtcbiAgICB9O1xuICAgICdzZWVkZXI6YWZ0ZXItcnVuJzoge1xuICAgICAgICBzZWVkZXJzOiBzdHJpbmdbXTtcbiAgICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlZWRlclNlcnZpY2VPcHRpb25zIHtcbiAgICBkYjogS3lzZWx5PGFueT47XG4gICAgc291cmNlcz86IFNlZWRlclNvdXJjZVtdO1xuICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICBlbW1pdHRlcj86IEVtbWl0dGVyU2VydmljZTtcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlZWVkZXJTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdTZWVkZXJTZXJ2aWNlJ1xuXG4gICAgcHVibGljIGRlYnVnID0gZmFsc2VcbiAgICBwdWJsaWMgZW1taXR0ZXI6IEVtbWl0dGVyU2VydmljZVxuICAgIHB1YmxpYyBsb2dnZXI6IExvZ2dlclNlcnZpY2VcbiAgICBwdWJsaWMgZGI6IEt5c2VseTxhbnk+XG4gICAgcHVibGljIHNvdXJjZXM6IFNlZWRlclNvdXJjZVtdXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTZWVkZXJTZXJ2aWNlT3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyB0aGlzLmRlYnVnXG4gICAgICAgIHRoaXMuZW1taXR0ZXIgPSBvcHRpb25zLmVtbWl0dGVyIHx8IG5ldyBFbW1pdHRlclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgdGhpcy5kYiA9IG9wdGlvbnMuZGJcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gb3B0aW9ucy5zb3VyY2VzIHx8IFtdXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNvdXJjZShzb3VyY2U6IFNlZWRlclNvdXJjZSkge1xuICAgICAgICB0aGlzLnNvdXJjZXMucHVzaChzb3VyY2UpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxpc3RTb3VyY2Uoc291cmNlOiBTZWVkZXJTb3VyY2UpIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnByb21pc2VzLnJlYWRkaXIoc291cmNlLmRpcmVjdG9yeSlcbiAgICAgICAgICAgICAgICBjb25zdCBleHRlbnNpb25zID0gWycuanMnLCAnLnRzJywgJy5tanMnLCAnLm10cyddXG5cblxuICAgICAgICBjb25zdCBpdGVtczogU2VlZGVyRW50aXR5W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgaWYgKCFleHRlbnNpb25zLmluY2x1ZGVzKHBhdGguZXh0bmFtZShlbnRyeSkpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oc291cmNlLmRpcmVjdG9yeSwgZW50cnkpXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGF0aC5iYXNlbmFtZShlbnRyeSwgcGF0aC5leHRuYW1lKGVudHJ5KSlcblxuICAgICAgICAgICAgY29uc3QgZW50aXR5ID0gbmV3IFNlZWRlckVudGl0eSh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZS5pZCxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogZnVsbFBhdGgsXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBpdGVtcy5wdXNoKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtc1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsaXN0KGZpbHRlcnM/OiBMaXN0RmlsdGVycykge1xuICAgICAgICBsZXQgaXRlbXMgPSBbXSBhcyBTZWVkZXJFbnRpdHlbXVxuXG4gICAgICAgIGZvciBhd2FpdCAoY29uc3Qgc291cmNlIG9mIHRoaXMuc291cmNlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlU2VlZGVycyA9IGF3YWl0IHRoaXMubGlzdFNvdXJjZShzb3VyY2UpXG5cbiAgICAgICAgICAgIGl0ZW1zLnB1c2goLi4uc291cmNlU2VlZGVycylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJzPy5zb3VyY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KGZpbHRlcnMuc291cmNlKSA/IGZpbHRlcnMuc291cmNlIDogW2ZpbHRlcnMuc291cmNlXVxuXG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcihpID0+IGkuc291cmNlICYmIHNvdXJjZXMuaW5jbHVkZXMoaS5zb3VyY2UpKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlcnM/Lm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gQXJyYXkuaXNBcnJheShmaWx0ZXJzLm5hbWUpID8gZmlsdGVycy5uYW1lIDogW2ZpbHRlcnMubmFtZV1cblxuICAgICAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIoaSA9PiBuYW1lcy5pbmNsdWRlcyhpLm5hbWUpKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBieSBuYW1lXG4gICAgICAgIGl0ZW1zLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJ1blNlZWRlcihzZWVkZXI6IFNlZWRlckVudGl0eSk6IFByb21pc2U8U2VlZGVyUmVzdWx0PiB7XG4gICAgICAgIGNvbnN0IFtlcnJvcl0gPSBhd2FpdCB0cnlDYXRjaCgoKSA9PiBzZWVkZXIucnVuKHRoaXMuZGIpKVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYGZhaWxlZCB0byBydW4gc2VlZGVyICR7c2VlZGVyLm5hbWV9YCwgZXJyb3IpXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHNlZWRlci5uYW1lLFxuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBzZWVkZXIuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzZWVkZXIuc291cmNlLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogJ2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBzZWVkZXIgJHtzZWVkZXIubmFtZX0gcmFuIHN1Y2Nlc3NmdWxseWApXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHNlZWRlci5uYW1lLFxuICAgICAgICAgICAgZmlsZW5hbWU6IHNlZWRlci5maWxlbmFtZSxcbiAgICAgICAgICAgIHNvdXJjZTogc2VlZGVyLnNvdXJjZSxcbiAgICAgICAgICAgIHJlc3VsdDogJ3N1Y2Nlc3MnLFxuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuKGZpbHRlcnM6IExpc3RGaWx0ZXJzICYgeyBzdGVwcz86IG51bWJlciB9ID0ge30pOiBQcm9taXNlPFNlZWRlclJlc3VsdFtdPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gYXdhaXQgdGhpcy5saXN0KGZpbHRlcnMpXG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnc2VlZGVyOmJlZm9yZS1ydW4nLCB7XG4gICAgICAgICAgICBzZWVkZXJzOiBpdGVtcy5tYXAobSA9PiBtLm5hbWUpXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogU2VlZGVyUmVzdWx0W10gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgcyBvZiBpdGVtcykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5TZWVkZXIocylcblxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdClcblxuICAgICAgICAgICAgLy8gU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4gICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gJ2ZhaWxlZCcpIHtcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbW1pdHRlci5lbWl0QW5kV2FpdCgnc2VlZGVyOmFmdGVyLXJ1bicsIHtcbiAgICAgICAgICAgIHNlZWRlcnM6IHJlc3VsdHMubWFwKG0gPT4gbS5uYW1lKSxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH1cbn1cblxuIiwiaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJ1xuaW1wb3J0IExvZ2dlclNlcnZpY2UgZnJvbSAnI3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IFNoZWxsRXhlY3B0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9TaGVsbEV4Y2VwdGlvbi50cydcblxuaW50ZXJmYWNlIENvbW1hbmRPcHRpb25zIHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgICBlbnY/OiBOb2RlSlMuUHJvY2Vzc0VudlxuICAgIHNoZWxsPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoZWxsU2VydmljZU9wdGlvbnMge1xuICAgIGRlYnVnPzogYm9vbGVhblxuICAgIGxvZ2dlcj86IExvZ2dlclNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2hlbGxTZXJ2aWNlIHtcbiAgICBwdWJsaWMgc3RhdGljIF9fY29udGFpbmVyX2VudHJ5X2tleSA9ICdTaGVsbFNlcnZpY2UnXG5cbiAgICBwdWJsaWMgZGVidWc6IGJvb2xlYW5cbiAgICBwdWJsaWMgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlXG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTaGVsbFNlcnZpY2VPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2VcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgTG9nZ2VyU2VydmljZSgpXG5cbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdpbml0aWFsaXplZCBpbiBkZWJ1ZyBtb2RlJylcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgYSBzaGVsbCBjb21tYW5kIGFuZCByZXR1cm4gYSBwcm9taXNlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNvbW1hbmQoYmluOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBDb21tYW5kT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZCA9IHNwYXduKGJpbiwgYXJncywge1xuICAgICAgICAgICAgICAgIGN3ZDogb3B0aW9ucy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICBzdGRpbzogJ3BpcGUnLFxuICAgICAgICAgICAgICAgIHNoZWxsOiBvcHRpb25zLnNoZWxsID8/IHRydWUsXG4gICAgICAgICAgICAgICAgZW52OiBvcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IGRhdGEgPSAnJ1xuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGQpID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhICs9IGQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIChkKSA9PiB7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBkLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ2NvbW1hbmQgZXhlY3V0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZnVsbENvbW1hbmQ6IGAke2Jpbn0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBkYXRhXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBDb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9YFxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiBkYXRhXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgU2hlbGxFeGVjcHRpb24oZXJyb3JNZXNzYWdlLCBkYXRhLCBiaW4sIGFyZ3MpKVxuXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ29tbWFuZCBleGVjdXRpb24gZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgZnVsbENvbW1hbmQ6IGAke2Jpbn0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgc2hlbGwgY29tbWFuZCBhbmQgcmV0dXJuIHRoZSBvdXRwdXQgYXMgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KGJpbjogc3RyaW5nLCBhcmdzOiBzdHJpbmdbXSwgb3B0aW9uczogQ29tbWFuZE9wdGlvbnMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnZXhlY3V0aW5nIGNvbW1hbmQnLCB7XG4gICAgICAgICAgICAgICAgYmluLFxuICAgICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgICAgZnVsbENvbW1hbmQ6IGAke2Jpbn0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bihiaW4sIGFyZ3MsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgc3RkaW86ICdwaXBlJyxcbiAgICAgICAgICAgICAgICBzaGVsbDogb3B0aW9ucy5zaGVsbCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zaGVsbCA6IHRydWUsXG4gICAgICAgICAgICAgICAgZW52OiBvcHRpb25zLmVudiB8fCBwcm9jZXNzLmVudlxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgbGV0IG91dHB1dCA9ICcnXG4gICAgICAgICAgICBsZXQgZXJyb3JPdXRwdXQgPSAnJ1xuXG4gICAgICAgICAgICBjaGlsZC5zdGRvdXQ/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgKz0gZGF0YS50b1N0cmluZygpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5zdGRlcnI/Lm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBlcnJvck91dHB1dCArPSBkYXRhLnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIGNoaWxkLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShvdXRwdXQudHJpbSgpKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBDb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke2NvZGV9OiAke2Vycm9yT3V0cHV0fWBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxDb21tYW5kOiBgJHtiaW59ICR7YXJncy5qb2luKCcgJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yT3V0cHV0XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBTaGVsbEV4ZWNwdGlvbihlcnJvck1lc3NhZ2UsIG91dHB1dCwgYmluLCBhcmdzKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjaGlsZC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ29tbWFuZCBleGVjdXRpb24gZXJyb3InLCB7XG4gICAgICAgICAgICAgICAgICAgIGJpbixcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgb3JkZXJCeSB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCBCYXNlRXhjZXB0aW9uIGZyb20gJyNzaGFyZWQvZXhjZXB0aW9ucy9CYXNlRXhjZXB0aW9uLnRzJ1xuaW1wb3J0IHR5cGUgQ29uZmlnU2VydmljZSBmcm9tICcjc2hhcmVkL3NlcnZpY2VzL0NvbmZpZ1NlcnZpY2UudHMnXG5pbXBvcnQgeyBjcmVhdGVJZCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY3JlYXRlSWQudHMnXG5cbmltcG9ydCB0eXBlIHsgUGFnaW5hdGlvbiwgRmluZE1hbnlPcHRpb25zLCBQYWdpbmF0ZU9wdGlvbnMsIERlbGV0ZU1hbnlPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb25maWdSZXBvc2l0b3J5PFxuICAgIFRFbnRpdHkgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRPcHRpb25zID0gUmVjb3JkPHN0cmluZywgYW55PlxuPiB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCBjb25maWc6IENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBrZXk6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIHByaW1hcnlLZXk6IHN0cmluZyA9ICdpZCdcbiAgICApIHt9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0SXRlbXMoKTogVEVudGl0eVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmdldDxURW50aXR5W10+KHRoaXMua2V5LCBbXSlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0SXRlbXMoaXRlbXM6IFRFbnRpdHlbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZy5zZXQodGhpcy5rZXksIGl0ZW1zKVxuICAgIH1cblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBhbGxvdyBwYXNzaW5nIG9wdGlvbnMgZm9yIGZpbHRlcmluZyBpbiBzdWJjbGFzc2VzIFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwdWJsaWMgcXVlcnkob3B0aW9ucz86IFRPcHRpb25zKTogVEVudGl0eVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SXRlbXMoKVxuICAgIH1cblxuICAgIGFzeW5jIGNvdW50KG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KG9wdGlvbnMpLmxlbmd0aFxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRNYW55KG9wdGlvbnM/OiBGaW5kTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eVtdPiB7XG4gICAgICAgIGxldCBpdGVtcyA9IHRoaXMucXVlcnkob3B0aW9ucylcblxuICAgICAgICBpZiAob3B0aW9ucz8ub3JkZXJCeSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLm9yZGVyQnkpID8gb3B0aW9ucy5vcmRlckJ5IDogW29wdGlvbnMub3JkZXJCeV1cbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3JkZXJEaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgPyBvcHRpb25zLm9yZGVyRGlyZWN0aW9uXG4gICAgICAgICAgICAgICAgOiBbb3B0aW9ucy5vcmRlckRpcmVjdGlvbiA/PyAnYXNjJ11cblxuICAgICAgICAgICAgaXRlbXMgPSBvcmRlckJ5KGl0ZW1zLCBmaWVsZHMsIGRpcmVjdGlvbnMpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8ub2Zmc2V0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLnNsaWNlKG9wdGlvbnMub2Zmc2V0KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmxpbWl0KSB7XG4gICAgICAgICAgICBpdGVtcyA9IGl0ZW1zLnNsaWNlKDAsIG9wdGlvbnMubGltaXQpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbXNcbiAgICB9XG5cbiAgICBhc3luYyBmaW5kT25lKG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLnF1ZXJ5KG9wdGlvbnMpXG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zWzBdID8/IG51bGxcbiAgICB9XG5cbiAgICBhc3luYyBmaW5kQnlJZChpZDogc3RyaW5nLCBvcHRpb25zPzogVE9wdGlvbnMpOiBQcm9taXNlPFRFbnRpdHkgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5xdWVyeShvcHRpb25zKVxuXG4gICAgICAgIHJldHVybiBpdGVtcy5maW5kKGl0ZW0gPT4gKGl0ZW0gYXMgYW55KVt0aGlzLnByaW1hcnlLZXldID09PSBpZCkgPz8gbnVsbFxuICAgIH1cblxuICAgIGFzeW5jIGZpbmRCeUlkT3JGYWlsKGlkOiBzdHJpbmcsIG9wdGlvbnM/OiBUT3B0aW9ucyk6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy5maW5kQnlJZChpZCwgb3B0aW9ucylcblxuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdJdGVtIG5vdCBmb3VuZCcsIDQwNClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgfVxuXG4gICAgYXN5bmMgcGFnaW5hdGUob3B0aW9ucz86IFBhZ2luYXRlT3B0aW9ucyAmIFRPcHRpb25zKTogUHJvbWlzZTxQYWdpbmF0aW9uPFRFbnRpdHk+PiB7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBvcHRpb25zPy5wYWdlID8/IDFcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAxMFxuICAgICAgICBjb25zdCBvZmZzZXQgPSAocGFnZSAtIDEpICogbGltaXRcblxuICAgICAgICBjb25zdCBbaXRlbXMsIHRvdGFsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRoaXMuZmluZE1hbnkoeyAuLi5vcHRpb25zLCBsaW1pdCwgb2Zmc2V0IH0gYXMgYW55KSxcbiAgICAgICAgICAgIHRoaXMuY291bnQob3B0aW9ucyBhcyBhbnkpLFxuICAgICAgICBdKVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICBwZXJfcGFnZTogbGltaXQsXG4gICAgICAgICAgICB0b3RhbCxcbiAgICAgICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodG90YWwgLyBsaW1pdCksXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICAgICAgICBbdGhpcy5wcmltYXJ5S2V5XTogY3JlYXRlSWQoKSxcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgIH0gYXMgVEVudGl0eVxuXG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSlcbiAgICAgICAgdGhpcy5zZXRJdGVtcyhpdGVtcylcblxuICAgICAgICByZXR1cm4gaXRlbVxuICAgIH1cblxuICAgIGFzeW5jIGNyZWF0ZU1hbnkoZGF0YTogUGFydGlhbDxURW50aXR5PltdKTogUHJvbWlzZTxURW50aXR5W10+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKClcblxuICAgICAgICBjb25zdCBjcmVhdGVkID0gZGF0YS5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgW3RoaXMucHJpbWFyeUtleV06IGNyZWF0ZUlkKCksXG4gICAgICAgICAgICAuLi5kLFxuICAgICAgICB9IGFzIFRFbnRpdHkpKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMoWy4uLml0ZW1zLCAuLi5jcmVhdGVkXSlcblxuICAgICAgICByZXR1cm4gY3JlYXRlZFxuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZUJ5SWQoaWQ6IHN0cmluZywgZGF0YTogUGFydGlhbDxURW50aXR5Pik6IFByb21pc2U8VEVudGl0eT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKVxuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChpdGVtID0+IChpdGVtIGFzIGFueSlbdGhpcy5wcmltYXJ5S2V5XSA9PT0gaWQpXG5cbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ0l0ZW0gbm90IGZvdW5kJywgNDA0KVxuICAgICAgICB9XG5cbiAgICAgICAgaXRlbXNbaW5kZXhdID0geyAuLi5pdGVtc1tpbmRleF0sIC4uLmRhdGEgfVxuICAgICAgICB0aGlzLnNldEl0ZW1zKGl0ZW1zKVxuXG4gICAgICAgIHJldHVybiBpdGVtc1tpbmRleF1cbiAgICB9XG5cbiAgICBhc3luYyBkZWxldGVCeUlkKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlJZE9yRmFpbChpZClcblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKS5maWx0ZXIoaXRlbSA9PiAoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0gIT09IGlkKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXMpXG4gICAgfVxuXG4gICAgYXN5bmMgZGVsZXRlTWFueShvcHRpb25zPzogRGVsZXRlTWFueU9wdGlvbnMgJiBUT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0b0RlbGV0ZSA9IHRoaXMucXVlcnkob3B0aW9ucyBhcyBhbnkpXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gdG9EZWxldGUubGVuZ3RoXG4gICAgICAgIGNvbnN0IHRvRGVsZXRlSWRzID0gbmV3IFNldChcbiAgICAgICAgICAgIHRvRGVsZXRlLnNsaWNlKDAsIGxpbWl0KS5tYXAoaXRlbSA9PiAoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0pXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmdldEl0ZW1zKCkuZmlsdGVyKGl0ZW0gPT4gIXRvRGVsZXRlSWRzLmhhcygoaXRlbSBhcyBhbnkpW3RoaXMucHJpbWFyeUtleV0pKVxuXG4gICAgICAgIHRoaXMuc2V0SXRlbXMocmVtYWluaW5nKVxuICAgIH1cbn1cbiIsImltcG9ydCBEYXRhYmFzZVJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvRGF0YWJhc2VSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHR5cGUgeyBNZXRhZGF0YVF1ZXJ5UGF5bG9hZCB9IGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWV0YWRhdGFRdWVyeVNlcnZpY2UudHMnXG5pbXBvcnQgTWV0YWRhdGFRdWVyeVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVF1ZXJ5U2VydmljZS50cydcbmltcG9ydCB0eXBlIEZpbGVFbnRpdHkgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVSZXBvc2l0b3J5UXVlcnlPcHRpb25zIHtcbiAgICBpZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgc2VhcmNoPzogc3RyaW5nXG4gICAgcHVycG9zZT86IHN0cmluZ1tdXG4gICAgY2xpZW50X25hbWU/OiBzdHJpbmdbXVxuICAgIG1ldGFzPzogTWV0YWRhdGFRdWVyeVBheWxvYWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmlsZVJlcG9zaXRvcnkgZXh0ZW5kcyBEYXRhYmFzZVJlcG9zaXRvcnk8XG4gICAgRmlsZUVudGl0eSxcbiAgICBGaWxlRW50aXR5WydpZCddLFxuICAgIEZpbGVSZXBvc2l0b3J5UXVlcnlPcHRpb25zXG4+IHtcbiAgICBjb25zdHJ1Y3RvcihkYjogRGF0YWJhc2VSZXBvc2l0b3J5WydkYiddKSB7XG4gICAgICAgIHN1cGVyKGRiLCAnZmlsZXMnLCAnaWQnKVxuICAgIH1cblxuICAgIHB1YmxpYyBxdWVyeShvcHRpb25zPzogRmlsZVJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zZWFyY2gpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2YuY2xpZW50X25hbWUnLCAnbGlrZScsIGAlJHtvcHRpb25zLnNlYXJjaH0lYClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5wdXJwb3NlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2YucHVycG9zZScsICdpbicsIG9wdGlvbnMucHVycG9zZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5jbGllbnRfbmFtZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdmLmNsaWVudF9uYW1lJywgJ2luJywgb3B0aW9ucy5jbGllbnRfbmFtZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5tZXRhcykge1xuICAgICAgICAgICAgY29uc3QgbWV0YXNRdWVyeVNlcnZpY2UgPSBuZXcgTWV0YWRhdGFRdWVyeVNlcnZpY2Uob3B0aW9ucy5tZXRhcywgJ2ZpbGVfbWV0YXMnLCAnZmlsZV9pZCcpXG5cbiAgICAgICAgICAgIHFiID0gbWV0YXNRdWVyeVNlcnZpY2UuYXBwbHkocWIpXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcWJcbiAgICB9XG59XG4iLCJpbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gXCIjc2VydmVyL3NlcnZpY2VzL1NoZWxsU2VydmljZS50c1wiXG5pbXBvcnQgR2l0QnJhbmNoRW50aXR5IGZyb20gXCIjc2hhcmVkL2VudGl0aWVzL0dpdEJyYW5jaEVudGl0eS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0QnJhbmNoUmVwb3NpdG9yeU9wdGlvbnMge1xuICAgIGN3ZDogc3RyaW5nXG4gICAgc2hlbGw/OiBTaGVsbFNlcnZpY2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0QnJhbmNoUmVwb3NpdG9yeSB7XG4gICAgcHVibGljIGN3ZDogc3RyaW5nXG4gICAgcHVibGljIHNoZWxsOiBTaGVsbFNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEJyYW5jaFJlcG9zaXRvcnlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY3dkID0gb3B0aW9ucy5jd2RcbiAgICAgICAgdGhpcy5zaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gbmV3IFNoZWxsU2VydmljZSgpXG4gICAgfVxuXG4gICAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPEdpdEJyYW5jaEVudGl0eVtdPiB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwuZXhlY3V0ZUNvbW1hbmRXaXRoT3V0cHV0KFxuICAgICAgICAgICAgJ2dpdCcsXG4gICAgICAgICAgICBbJ2JyYW5jaCcsICctYScsIGAtLWZvcm1hdD0nJShIRUFEKXwlKHJlZm5hbWU6c2hvcnQpfCUocmVmbmFtZSl8JSh1cHN0cmVhbTpyZW1vdGVuYW1lKSdgXSxcbiAgICAgICAgICAgIHsgY3dkOiB0aGlzLmN3ZCB9LFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIG91dHB1dFxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5pbmNsdWRlcygnfCcpKVxuICAgICAgICAgICAgLm1hcCgobGluZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtoZWFkLCByZWZTaG9ydCwgcmVmRnVsbCwgcmVtb3RlTmFtZV0gPSBsaW5lLnNwbGl0KCd8JylcblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVtb3RlID0gcmVmRnVsbC5zdGFydHNXaXRoKCdyZWZzL3JlbW90ZXMvJylcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2l0QnJhbmNoRW50aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVmU2hvcnQsXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZTogaXNSZW1vdGUgPyByZWZTaG9ydC5zcGxpdCgnLycpWzBdIDogcmVtb3RlTmFtZSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc19jdXJyZW50OiBoZWFkID09PSAnKicsXG4gICAgICAgICAgICAgICAgICAgIGlzX3JlbW90ZTogaXNSZW1vdGUsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2gob3B0aW9uczogeyByZW1vdGU6IHN0cmluZzsgYnJhbmNoOiBzdHJpbmc7IGxvY2FsTmFtZT86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcmVtb3RlLCBicmFuY2gsIGxvY2FsTmFtZSA9IGJyYW5jaCB9ID0gb3B0aW9uc1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc2hlbGwuY29tbWFuZCgnZ2l0JywgWydmZXRjaCcsIHJlbW90ZSwgYCR7YnJhbmNofToke2xvY2FsTmFtZX1gXSwgeyBjd2Q6IHRoaXMuY3dkIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IFNoZWxsU2VydmljZSBmcm9tIFwiI3NlcnZlci9zZXJ2aWNlcy9TaGVsbFNlcnZpY2UudHNcIlxuaW1wb3J0IEdpdENvbW1pdEVudGl0eSBmcm9tIFwiI3NoYXJlZC9lbnRpdGllcy9HaXRDb21taXRFbnRpdHkudHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdFJlcG9zaXRvcnlPcHRpb25zIHtcbiAgICBjd2Q6IHN0cmluZ1xuICAgIHNoZWxsPzogU2hlbGxTZXJ2aWNlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q29tbWl0TGlzdE9wdGlvbnMge1xuICAgIGxpbWl0PzogbnVtYmVyXG4gICAgY3Vyc29yPzogc3RyaW5nXG4gICAgYnJhbmNoZXM/OiBzdHJpbmcgfCBzdHJpbmdbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdExpc3RSZXN1bHQge1xuICAgIGl0ZW1zOiBHaXRDb21taXRFbnRpdHlbXVxuICAgIGN1cnNvcl9wcmV2aW91czogc3RyaW5nIHwgbnVsbFxuICAgIGN1cnNvcl9jdXJyZW50OiBzdHJpbmcgfCBudWxsXG4gICAgY3Vyc29yX25leHQ6IHN0cmluZyB8IG51bGxcbn1cblxuLy8gJUggPSBmdWxsIGhhc2gsICVoID0gc2hvcnQgaGFzaCwgJXMgPSBzdWJqZWN0LCAlYW4gPSBhdXRob3IgbmFtZSwgJWFlID0gYXV0aG9yIGVtYWlsLCAlYUkgPSBhdXRob3IgZGF0ZSAoSVNPIDg2MDEpLCAlYiA9IGJvZHlcbmNvbnN0IExPR19GT1JNQVQgPSBbJyVIJywgJyVoJywgJyVzJywgJyVhbicsICclYWUnLCAnJWFJJywgJyViJ10uam9pbignJXgwOScpXG5jb25zdCBDT01NSVRfU0VQQVJBVE9SID0gJy0tLUNPTU1JVC0tLSdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2l0Q29tbWl0UmVwb3NpdG9yeSB7XG4gICAgcHVibGljIGN3ZDogc3RyaW5nXG4gICAgcHVibGljIHNoZWxsOiBTaGVsbFNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdENvbW1pdFJlcG9zaXRvcnlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY3dkID0gb3B0aW9ucy5jd2RcbiAgICAgICAgdGhpcy5zaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gbmV3IFNoZWxsU2VydmljZSgpXG4gICAgfVxuXG4gICAgYXN5bmMgbGlzdChvcHRpb25zPzogR2l0Q29tbWl0TGlzdE9wdGlvbnMpOiBQcm9taXNlPEdpdENvbW1pdExpc3RSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgbGltaXQgPSBvcHRpb25zPy5saW1pdCA/PyAyMFxuICAgICAgICBjb25zdCBjdXJzb3IgPSBvcHRpb25zPy5jdXJzb3JcblxuICAgICAgICBjb25zdCBhcmdzID0gWydsb2cnLCBgLS1mb3JtYXQ9JHtDT01NSVRfU0VQQVJBVE9SfSVuJHtMT0dfRk9STUFUfWAsIGAtbmAsIFN0cmluZyhsaW1pdCldXG5cbiAgICAgICAgaWYgKGN1cnNvcikgYXJncy5wdXNoKGAke2N1cnNvcn1eYClcblxuICAgICAgICBpZiAob3B0aW9ucz8uYnJhbmNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyYW5jaGVzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmJyYW5jaGVzKSA/IG9wdGlvbnMuYnJhbmNoZXMgOiBbb3B0aW9ucy5icmFuY2hlc11cbiAgICAgICAgICAgIGFyZ3MucHVzaCguLi5icmFuY2hlcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3B0aW9ucz8uYnJhbmNoZXMgJiYgIWN1cnNvcikge1xuICAgICAgICAgICAgYXJncy5wdXNoKCctLWFsbCcpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsLmV4ZWN1dGVDb21tYW5kV2l0aE91dHB1dCgnZ2l0JywgYXJncywgeyBjd2Q6IHRoaXMuY3dkIH0pXG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBvdXRwdXRcbiAgICAgICAgICAgIC5zcGxpdChDT01NSVRfU0VQQVJBVE9SKVxuICAgICAgICAgICAgLm1hcCgoYmxvY2spID0+IGJsb2NrLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5tYXAoKGJsb2NrKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2hhc2gsIHNob3J0SGFzaCwgbWVzc2FnZSwgYXV0aG9yTmFtZSwgYXV0aG9yRW1haWwsIGRhdGUsIC4uLmJvZHlQYXJ0c10gPVxuICAgICAgICAgICAgICAgICAgICBibG9jay5zcGxpdCgnXFx0JylcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2l0Q29tbWl0RW50aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgaGFzaCxcbiAgICAgICAgICAgICAgICAgICAgc2hvcnRfaGFzaDogc2hvcnRIYXNoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBhdXRob3JfbmFtZTogYXV0aG9yTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYXV0aG9yX2VtYWlsOiBhdXRob3JFbWFpbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogYm9keVBhcnRzLmpvaW4oJ1xcdCcpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBjdXJzb3JfY3VycmVudCA9IGl0ZW1zWzBdPy5oYXNoID8/IG51bGxcbiAgICAgICAgY29uc3QgY3Vyc29yX25leHQgPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXT8uaGFzaCA/PyBudWxsXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgICAgY3Vyc29yX3ByZXZpb3VzOiBjdXJzb3IgPz8gbnVsbCxcbiAgICAgICAgICAgIGN1cnNvcl9jdXJyZW50LFxuICAgICAgICAgICAgY3Vyc29yX25leHQ6IGl0ZW1zLmxlbmd0aCA8IGxpbWl0ID8gbnVsbCA6IGN1cnNvcl9uZXh0LFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNoZWNrb3V0KGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnNoZWxsLmNvbW1hbmQoJ2dpdCcsIFsnY2hlY2tvdXQnLCBoYXNoXSwgeyBjd2Q6IHRoaXMuY3dkIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb25Bc3NpZ25tZW50IH0gZnJvbSAnI3NoYXJlZC9zY2hlbWFzL3Blcm1pc3Npb25Bc3NpZ25tZW50U2NoZW1hLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHBlcm1pc3Npb25JZD86IG51bWJlciB8IG51bWJlcltdXG4gICAgYXNzaWduYWJsZUlkPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgICBhc3NpZ25hYmxlVHlwZT86IHN0cmluZyB8IHN0cmluZ1tdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudCxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudFsnaWQnXSxcbiAgICBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdwZXJtaXNzaW9uc19hc3NpZ25tZW50cycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlRdWVyeU9wdGlvbnMpIHtcbiAgICAgICAgbGV0IHFiID0gc3VwZXIucXVlcnkob3B0aW9ucyBhcyBhbnkpXG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmlkKSB7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuaWQpID8gb3B0aW9ucy5pZCA6IFtvcHRpb25zLmlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdpZCcsICdpbicsIGlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5wZXJtaXNzaW9uSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMucGVybWlzc2lvbklkKSA/IG9wdGlvbnMucGVybWlzc2lvbklkIDogW29wdGlvbnMucGVybWlzc2lvbklkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdwZXJtaXNzaW9uX2lkJywgJ2luJywgcGVybWlzc2lvbklkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5hc3NpZ25hYmxlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZHMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMuYXNzaWduYWJsZUlkKSA/IG9wdGlvbnMuYXNzaWduYWJsZUlkIDogW29wdGlvbnMuYXNzaWduYWJsZUlkXVxuXG4gICAgICAgICAgICBxYiA9IHFiLndoZXJlKCdhc3NpZ25hYmxlX2lkJywgJ2luJywgYXNzaWduYWJsZUlkcylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5hc3NpZ25hYmxlVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgYXNzaWduYWJsZVR5cGVzID0gQXJyYXkuaXNBcnJheShvcHRpb25zLmFzc2lnbmFibGVUeXBlKSA/IG9wdGlvbnMuYXNzaWduYWJsZVR5cGUgOiBbb3B0aW9ucy5hc3NpZ25hYmxlVHlwZV1cblxuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnYXNzaWduYWJsZV90eXBlJywgJ2luJywgYXNzaWduYWJsZVR5cGVzKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxufVxuIiwiaW1wb3J0IERhdGFiYXNlUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9EYXRhYmFzZVJlcG9zaXRvcnkudHMnXG5pbXBvcnQgdHlwZSB7IFBlcm1pc3Npb24gfSBmcm9tICcjc2hhcmVkL3NjaGVtYXMvcGVybWlzc2lvblNjaGVtYS50cydcblxuZXhwb3J0IGludGVyZmFjZSBQZXJtaXNzaW9uUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucyB7XG4gICAgaWQ/OiBudW1iZXIgfCBudW1iZXJbXVxuICAgIHNlYXJjaD86IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJtaXNzaW9uUmVwb3NpdG9yeSBleHRlbmRzIERhdGFiYXNlUmVwb3NpdG9yeTxcbiAgICBQZXJtaXNzaW9uLFxuICAgIFBlcm1pc3Npb25bJ2lkJ10sXG4gICAgUGVybWlzc2lvblJlcG9zaXRvcnlRdWVyeU9wdGlvbnNcbj4ge1xuICAgIGNvbnN0cnVjdG9yKGRiOiBEYXRhYmFzZVJlcG9zaXRvcnlbJ2RiJ10pIHtcbiAgICAgICAgc3VwZXIoZGIsICdwZXJtaXNzaW9ucycsICdpZCcpXG4gICAgfVxuXG4gICAgcHVibGljIHF1ZXJ5KG9wdGlvbnM/OiBQZXJtaXNzaW9uUmVwb3NpdG9yeVF1ZXJ5T3B0aW9ucykge1xuICAgICAgICBsZXQgcWIgPSBzdXBlci5xdWVyeShvcHRpb25zIGFzIGFueSlcblxuICAgICAgICBpZiAob3B0aW9ucz8uaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5pZCkgPyBvcHRpb25zLmlkIDogW29wdGlvbnMuaWRdXG5cbiAgICAgICAgICAgIHFiID0gcWIud2hlcmUoJ2lkJywgJ2luJywgaWRzKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnNlYXJjaCkge1xuICAgICAgICAgICAgcWIgPSBxYi53aGVyZSgnbmFtZScsICdsaWtlJywgYCUke29wdGlvbnMuc2VhcmNofSVgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHFiXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0bydcbmltcG9ydCBMb2dnZXJTZXJ2aWNlIGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9Mb2dnZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IHsgdG1wUGF0aCB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvYmFzZVBhdGgudHMnXG5pbXBvcnQgeyB0cnlDYXRjaCB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdFJlcG9JbmZvIHtcbiAgICBkaXJlY3Rvcnk6IHN0cmluZ1xuICAgIGhlYWQ6IHN0cmluZyB8IG51bGxcbiAgICBzaG9ydEhhc2g6IHN0cmluZ1xuICAgIGlzRGV0YWNoZWRIZWFkOiBib29sZWFuXG4gICAgcmVtb3Rlczogc3RyaW5nW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRHYXRld2F5T3B0aW9ucyB7XG4gICAgY3dkOiBzdHJpbmdcbiAgICBzc2hLZXk/OiBzdHJpbmdcbiAgICBzc2hLZXlGaWxlPzogc3RyaW5nXG4gICAgbG9nZ2VyPzogTG9nZ2VyU2VydmljZVxuICAgIHNoZWxsPzogU2hlbGxTZXJ2aWNlXG4gICAgZGVidWc/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBHaXRHYXRld2F5RXhlY3V0ZU9wdGlvbnMge1xuICAgIGFyZ3M6IHN0cmluZ1xuICAgIGN3ZD86IHN0cmluZ1xuICAgIHNzaEtleT86IHN0cmluZ1xuICAgIHNzaEtleUZpbGU/OiBzdHJpbmdcbiAgICBsb2dnZXI/OiBMb2dnZXJTZXJ2aWNlXG4gICAgc2hlbGw/OiBTaGVsbFNlcnZpY2VcbiAgICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNsYXNzIEdpdEdhdGV3YXkge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY3dkOiBzdHJpbmdcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNzaEtleT86IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3NoS2V5RmlsZT86IHN0cmluZ1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlID0gbmV3IExvZ2dlclNlcnZpY2UoKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWc6IGJvb2xlYW5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNoZWxsOiBTaGVsbFNlcnZpY2VcblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEdpdEdhdGV3YXlPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuY3dkID0gb3B0aW9ucy5jd2RcbiAgICAgICAgdGhpcy5zc2hLZXkgPSBvcHRpb25zLnNzaEtleVxuICAgICAgICB0aGlzLnNzaEtleUZpbGUgPSBvcHRpb25zLnNzaEtleUZpbGVcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBvcHRpb25zLmxvZ2dlciA/PyBuZXcgTG9nZ2VyU2VydmljZSgpXG4gICAgICAgIHRoaXMuc2hlbGwgPSBvcHRpb25zLnNoZWxsID8/IG5ldyBTaGVsbFNlcnZpY2UoeyBsb2dnZXI6IHRoaXMubG9nZ2VyLCBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyB9KVxuICAgICAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyBmYWxzZVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZXhlY3V0ZShvcHRpb25zOiBHaXRHYXRld2F5RXhlY3V0ZU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBjd2QgPSBvcHRpb25zLmN3ZFxuICAgICAgICBjb25zdCBzc2hLZXkgPSBvcHRpb25zLnNzaEtleVxuICAgICAgICBjb25zdCBzc2hLZXlGaWxlID0gb3B0aW9ucy5zc2hLZXlGaWxlXG4gICAgICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyID8/IG5ldyBMb2dnZXJTZXJ2aWNlKClcbiAgICAgICAgY29uc3QgZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IGZhbHNlXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBvcHRpb25zLmFyZ3NcbiAgICAgICAgY29uc3Qgc2hlbGwgPSBvcHRpb25zLnNoZWxsID8/IG5ldyBTaGVsbFNlcnZpY2UoeyBsb2dnZXIsIGRlYnVnIH0pXG5cbiAgICAgICAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyB9XG5cbiAgICAgICAgaWYgKHNzaEtleUZpbGUpIHtcbiAgICAgICAgICAgIGVudi5HSVRfU1NIX0NPTU1BTkQgPSBgc3NoIC1pICR7c3NoS2V5RmlsZX0gLW8gU3RyaWN0SG9zdEtleUNoZWNraW5nPW5vYFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNzaEtleSkge1xuICAgICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSB0bXBQYXRoKCdnaXQtY2xvbmUtc3NoLWtleS0nICsgcmFuZG9tVVVJRCgpKVxuXG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcEZpbGUsIHNzaEtleSwgeyBtb2RlOiAwbzYwMCB9KVxuXG4gICAgICAgICAgICBlbnYuR0lUX1NTSF9DT01NQU5EID0gYHNzaCAtaSAke3RlbXBGaWxlfSAtbyBTdHJpY3RIb3N0S2V5Q2hlY2tpbmc9bm9gXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tYW5kID0gYGdpdCAke2FyZ3N9YFxuXG4gICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGNvbW1hbmQsIHtcbiAgICAgICAgICAgICAgICBjd2Q6IGN3ZCxcbiAgICAgICAgICAgICAgICBzc2hLZXlGaWxlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGVsbC5leGVjdXRlQ29tbWFuZFdpdGhPdXRwdXQoJ2dpdCcsIGFyZ3Muc3BsaXQoJyAnKSwge1xuICAgICAgICAgICAgY3dkOiBjd2QsXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAgICAgICAuLi5lbnYsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY2xvbmUocmVwb1VybDogc3RyaW5nLCB0YXJnZXREaXI6IHN0cmluZywgb3B0aW9uczogT21pdDxHaXRHYXRld2F5T3B0aW9ucywgJ2N3ZCc+KSB7XG4gICAgICAgIGF3YWl0IEdpdEdhdGV3YXkuZXhlY3V0ZSh7XG4gICAgICAgICAgICBzc2hLZXk6IG9wdGlvbnMuc3NoS2V5LFxuICAgICAgICAgICAgc3NoS2V5RmlsZTogb3B0aW9ucy5zc2hLZXlGaWxlLFxuICAgICAgICAgICAgbG9nZ2VyOiBvcHRpb25zLmxvZ2dlcixcbiAgICAgICAgICAgIGRlYnVnOiBvcHRpb25zLmRlYnVnLFxuICAgICAgICAgICAgc2hlbGw6IG9wdGlvbnMuc2hlbGwsXG4gICAgICAgICAgICBhcmdzOiBgY2xvbmUgJyR7cmVwb1VybH0nICcke3RhcmdldERpcn0nYCxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbmV3IEdpdEdhdGV3YXkoeyAuLi5vcHRpb25zLCBjd2Q6IHRhcmdldERpciB9KVxuICAgIH1cblxuXG4gICAgYXN5bmMgcnVuKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBHaXRHYXRld2F5LmV4ZWN1dGUoe1xuICAgICAgICAgICAgY3dkOiB0aGlzLmN3ZCxcbiAgICAgICAgICAgIHNzaEtleTogdGhpcy5zc2hLZXksXG4gICAgICAgICAgICBzc2hLZXlGaWxlOiB0aGlzLnNzaEtleUZpbGUsXG4gICAgICAgICAgICBsb2dnZXI6IHRoaXMubG9nZ2VyLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICAgICAgICBzaGVsbDogdGhpcy5zaGVsbCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgYXN5bmMgdHJ5UnVuKGFyZ3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBbZXJyb3IsIHJlc3BvbnNlXSA9IGF3YWl0IHRyeUNhdGNoKCgpID0+IHRoaXMucnVuKGFyZ3MpKVxuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlXG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tvdXQocmVmOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuKGBjaGVja291dCAke3JlZn1gKVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW4oJ2ZldGNoIC0tYWxsIC0tcHJ1bmUnKVxuICAgIH1cblxuICAgIGFzeW5jIHB1bGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hBbGwoKVxuXG4gICAgICAgIGNvbnN0IHVwc3RyZWFtID0gYXdhaXQgdGhpcy50cnlSdW4oJ3Jldi1wYXJzZSAtLWFiYnJldi1yZWYgLS1zeW1ib2xpYy1mdWxsLW5hbWUgQHt1cHN0cmVhbX0nKVxuXG4gICAgICAgIGlmICh1cHN0cmVhbSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ydW4oYHB1bGwgLS1mZi1vbmx5YClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEluZm8oKTogUHJvbWlzZTxHaXRSZXBvSW5mbz4ge1xuICAgICAgICBjb25zdCBoZWFkID0gYXdhaXQgdGhpcy5ydW4oJ3Jldi1wYXJzZSAtLWFiYnJldi1yZWYgSEVBRCcpXG4gICAgICAgIGNvbnN0IGlzRGV0YWNoZWRIZWFkID0gaGVhZCA9PT0gJ0hFQUQnXG5cbiAgICAgICAgY29uc3Qgc2hvcnRIYXNoID0gYXdhaXQgdGhpcy5ydW4oJ3Jldi1wYXJzZSAtLXNob3J0IEhFQUQnKVxuXG4gICAgICAgIGNvbnN0IHJlbW90ZXNPdXRwdXQgPSBhd2FpdCB0aGlzLnRyeVJ1bigncmVtb3RlJylcblxuICAgICAgICBjb25zdCByZW1vdGVzID0gcmVtb3Rlc091dHB1dFxuICAgICAgICAgICAgPyByZW1vdGVzT3V0cHV0LnNwbGl0KCdcXG4nKS5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIDogW11cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlyZWN0b3J5OiB0aGlzLmN3ZCxcbiAgICAgICAgICAgIGhlYWQ6IGlzRGV0YWNoZWRIZWFkID8gbnVsbCA6IGhlYWQsXG4gICAgICAgICAgICBzaG9ydEhhc2gsXG4gICAgICAgICAgICBpc0RldGFjaGVkSGVhZCxcbiAgICAgICAgICAgIHJlbW90ZXMsXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyB1cGRhdGVPckNyZWF0ZSB9IGZyb20gJyNzZXJ2ZXIvcXVlcmllcy9pbmRleC50cydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZVRvU3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBganNvbjoke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHJldHVybiBgYm9vbDoke3ZhbHVlfWBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gYG51bWJlcjoke3ZhbHVlfWBcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBNZXRhZGF0YTxUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlPihtZXRhc1RhYmxlOiBUYWJsZSwgZm9yZWlnbktleToga2V5b2YgRGF0YWJhc2VbVGFibGVdKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIE1ldGFkYXRhRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+XG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZ2V0PFQgPSBhbnk+KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUKTogUHJvbWlzZTxUPlxuICAgICAgICAgICAgcHVibGljIGFzeW5jIGdldDxUID0gYW55PihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFQpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMuY29uc3RydWN0b3IgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWJsZSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnRhYmxlXG4gICAgICAgICAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IGNvbnN0cnVjdG9yLl9fbW9kZWw/LnByaW1hcnlLZXlcblxuICAgICAgICAgICAgICAgIGlmICghdGFibGUgfHwgIXByaW1hcnlLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgdXNlIE1vZGVsIG1peGluIGJlZm9yZSBNZXRhZGF0YScpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbShtZXRhc1RhYmxlKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnlcbiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZSgoZm9yZWlnbktleSBhcyBzdHJpbmcpLCAnPScsICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0pXG4gICAgICAgICAgICAgICAgICAgIC53aGVyZSgnbmFtZScsICc9JywgbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEpXG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyeS5leGVjdXRlVGFrZUZpcnN0KCkgXG5cbiAgICAgICAgICAgICAgICBpZiAoIXJvdyB8fCAhcm93LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSByb3c/LnZhbHVlXG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdqc29uOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZS5zbGljZSg1KSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdGFydHNXaXRoKCdib29sOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoNSkgPT09ICd0cnVlJ1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBhcyBUXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBhc3luYyBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGUgPSBjb25zdHJ1Y3Rvci5fX21vZGVsPy50YWJsZVxuICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSBjb25zdHJ1Y3Rvci5fX21vZGVsPy5wcmltYXJ5S2V5XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRhYmxlIHx8ICFwcmltYXJ5S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2hvdWxkIHVzZSBNb2RlbCBtaXhpbiBiZWZvcmUgTWV0YWRhdGEnKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgW2ZvcmVpZ25LZXldOiAodGhpcyBhcyBhbnkpW3ByaW1hcnlLZXldLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhbHVlcy52YWx1ZSA9IHZhbHVlVG9TdHJpbmcodmFsdWUpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB1cGRhdGVPckNyZWF0ZShtZXRhc1RhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYi5hbmQoW1xuICAgICAgICAgICAgICAgICAgICAgICAgcWIuZWIoKGZvcmVpZ25LZXkgYXMgc3RyaW5nKSwgJz0nLCAodGhpcyBhcyBhbnkpW3ByaW1hcnlLZXldKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHFiLmViKCduYW1lJywgJz0nLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBvbWl0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZW1pdEhvb2sgfSBmcm9tICcjc2hhcmVkL21peGlucy9Ib29rc01peGluLnRzJ1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPckNyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvdXBkYXRlT3JDcmVhdGUudHMnXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29udHJhY3QgYXMgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0ICogYXMgcXVlcmllcyBmcm9tICcjc2VydmVyL3F1ZXJpZXMvaW5kZXgudHMnXG5cbmltcG9ydCB0eXBlIHsgTGlzdE9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvbGlzdC50cydcbmltcG9ydCB0eXBlIHsgUGFnaW5hdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3BhZ2luYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBDb3VudE9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvY291bnQudHMnXG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvY3JlYXRlLnRzJ1xuaW1wb3J0IHR5cGUgeyBVcGRhdGVPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9xdWVyaWVzL3VwZGF0ZS50cydcbmltcG9ydCB0eXBlIHsgRGVzdHJveU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZGVzdHJveS50cydcbmltcG9ydCB0eXBlIHsgRmlyc3RPckNyZWF0ZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZmlyc3RPckNyZWF0ZS50cydcbmltcG9ydCB0eXBlIHsgRmluZE9uZU9wdGlvbnMgfSBmcm9tICcjc2VydmVyL3F1ZXJpZXMvZmluZE9uZS50cydcbmltcG9ydCB0eXBlIFBhZ2luYXRpb24gZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QYWdpbmF0aW9uRW50aXR5LnRzJ1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gJ2t5c2VseSdcblxuZXhwb3J0IHR5cGUgTW9kZWxMaXN0T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxMaXN0T3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbEZpbmRPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PEZpbmRPbmVPcHRpb25zPFQ+LCAnc2VyaWFsaXplJyB8ICdvcmRlckJ5Jz5cbmV4cG9ydCB0eXBlIE1vZGVsUGFnaW5hdGVPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBPbWl0PFBhZ2luYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbENvdW50T3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gQ291bnRPcHRpb25zPFQ+XG5leHBvcnQgdHlwZSBNb2RlbENyZWF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8Q3JlYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9wdGlvbnM8VCBleHRlbmRzIGtleW9mIERhdGFiYXNlPiA9IE9taXQ8VXBkYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbERlc3Ryb3lPcHRpb25zPFQgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZT4gPSBEZXN0cm95T3B0aW9uczxUPlxuZXhwb3J0IHR5cGUgTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUPiwgJ3NlcmlhbGl6ZSc+XG5leHBvcnQgdHlwZSBNb2RlbFVwZGF0ZU9yQ3JlYXRlT3B0aW9uczxUIGV4dGVuZHMga2V5b2YgRGF0YWJhc2U+ID0gT21pdDxVcGRhdGVPckNyZWF0ZU9wdGlvbnM8VD4sICdzZXJpYWxpemUnPlxuXG5leHBvcnQgdHlwZSBNb2RlbEVudGl0eSA9IFJldHVyblR5cGU8UmV0dXJuVHlwZTx0eXBlb2YgTW9kZWxNaXhpbjxhbnk+Pj5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gTW9kZWxNaXhpbjxUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlPih0YWJsZTogVGFibGUsIHByaW1hcnlLZXk6IGtleW9mIERhdGFiYXNlW1RhYmxlXSA9ICdpZCcgYXMgYW55KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIE1vZGVsRXh0ZW5kPFRCYXNlIGV4dGVuZHMgQ29uc3RydWN0b3I+KEJhc2U6IFRCYXNlKSB7XG4gICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEJhc2Uge1xuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBfX21vZGVsID0ge1xuICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgIHByaW1hcnlLZXksXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCByb3c6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoKSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oaW5zdGFuY2UgYXMgYW55LCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0KCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxEYXRhYmFzZSwgVGFibGUsIGFueT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYi5zZWxlY3RGcm9tKHRhYmxlKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gJ3RoaXMnIGlzIHRoZSBjb25jcmV0ZSBjb25zdHJ1Y3RvciAoZS5nLiBGb29kKSwgc28gdGhlIHJldHVybiB0eXBlIGlzIGluZmVycmVkIGNvcnJlY3RseS5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgcGFnaW5hdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbFBhZ2luYXRlT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFBhZ2luYXRpb248VD4+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmF0aW9uID0gYXdhaXQgcXVlcmllcy5wYWdpbmF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAuLi5vLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCByb3cgb2YgcGFnaW5hdGlvbi5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlclBhZ2luYXRlJywgcGFnaW5hdGlvbilcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYWdpbmF0aW9uIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGxpc3Q8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbExpc3RPcHRpb25zPFRhYmxlPik6IFByb21pc2U8VFtdPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCBxdWVyaWVzLmxpc3QodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCBpdGVtKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJMaXN0JywgaXRlbXMpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9uZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRmluZE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBvPy5xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IG8/LndoZXJlLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZE9uZU9yRmFpbDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbz86IE1vZGVsRmluZE9wdGlvbnM8VGFibGU+KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5maW5kT25lT3JGYWlsKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG8/Lm5hbWUgPz8gY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZDxUPih0aGlzOiBuZXcgKCkgPT4gVCwgaWQ6IGFueSk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIocHJpbWFyeUtleSBhcyBzdHJpbmcsICc9JywgaWQpXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRPckZhaWw8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmVPckZhaWwodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29uc3RydWN0b3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIocHJpbWFyeUtleSBhcyBzdHJpbmcsICc9JywgaWQpXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93IGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRCeTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgY29sdW1uOiBrZXlvZiBEYXRhYmFzZVtUYWJsZV0sIHZhbHVlOiBhbnkpOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmZpbmRPbmVPckZhaWwodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiAocWI6IGFueSkgPT4gcWIoY29sdW1uIGFzIHN0cmluZywgJz0nLCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9KSBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRmluZCcsIHJvdylcblxuICAgICAgICAgICAgICAgIHJldHVybiByb3cgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5T3JGYWlsPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBjb2x1bW46IGtleW9mIERhdGFiYXNlW1RhYmxlXSwgdmFsdWU6IGFueSk6IFByb21pc2U8VD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBjb25zdHJ1Y3Rvci5zZXJpYWxpemUocm93KSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihjb2x1bW4gYXMgc3RyaW5nLCAnPScsIHZhbHVlKVxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdzZXJpYWxpemVkJywgcm93KVxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJGaW5kJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvdyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleGlzdHM8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbExpc3RPcHRpb25zPFRhYmxlPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLmV4aXN0cyh0YWJsZSwgeyBxdWVyeTogbz8ucXVlcnkgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY291bnQ8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbENvdW50T3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLmNvdW50KHRhYmxlLCBvKSBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBjcmVhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIHBheWxvYWQ6IE1vZGVsQ3JlYXRlT3B0aW9uczxUYWJsZT5bJ3ZhbHVlcyddKTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0geyAuLi5wYXlsb2FkIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlQ3JlYXRlJywgdmFsdWVzKVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgcXVlcmllcy5jcmVhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckNyZWF0ZScsIHJvdylcbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ3NlcmlhbGl6ZWQnLCByb3cpXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlTWFueTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgdmFsdWVzOiBBcnJheTxNb2RlbENyZWF0ZU9wdGlvbnM8VGFibGU+Wyd2YWx1ZXMnXT4pOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBbXVxuXG4gICAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVDcmVhdGUnLCB2YWx1ZSlcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBxdWVyaWVzLmNyZWF0ZSh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJDcmVhdGUnLCByb3cpXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnc2VyaWFsaXplZCcsIHJvdylcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckZpbmQnLCByb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgcm93cy5wdXNoKHJvdylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcm93cyBhcyBhbnlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyB1cGRhdGU8VD4odGhpczogbmV3ICgpID0+IFQsIG86IE1vZGVsVXBkYXRlT3B0aW9uczxUYWJsZT4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB7IC4uLm8udmFsdWVzIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlVXBkYXRlJywgdmFsdWVzLCBvLndoZXJlKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy51cGRhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWc6IG8uZGVidWcsXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiBvLndoZXJlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHF1ZXJpZXMuZmluZE9uZU9yRmFpbCh0YWJsZSwge1xuICAgICAgICAgICAgICAgICAgICB3aGVyZTogby53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyVXBkYXRlJywgcm93KVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJvd1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnksIHZhbHVlczogTW9kZWxVcGRhdGVPcHRpb25zPFRhYmxlPlsndmFsdWVzJ10sIG9wdGlvbnM/OiB7IGRlYnVnPzogYm9vbGVhbiB9KTogUHJvbWlzZTxUPiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0aGlzIGFzIGFueVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnOiBvcHRpb25zPy5kZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZCksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGRlc3Ryb3k8VD4odGhpczogbmV3ICgpID0+IFQsIG8/OiBNb2RlbERlc3Ryb3lPcHRpb25zPFRhYmxlPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlRGVzdHJveScsIG8pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLmRlc3Ryb3kodGFibGUsIG8pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2FmdGVyRGVzdHJveScsIG8pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmlyc3RPckNyZWF0ZTxUPih0aGlzOiBuZXcgKCkgPT4gVCwgbzogTW9kZWxGaXJzdE9yQ3JlYXRlT3B0aW9uczxUYWJsZT4pOiBUIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gcXVlcmllcy5maXJzdE9yQ3JlYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIC4uLm8sXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogcm93ID0+IGNvbnN0cnVjdG9yLnNlcmlhbGl6ZShyb3cpLFxuICAgICAgICAgICAgICAgIH0pIGFzIGFueVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHVwZGF0ZU9yQ3JlYXRlPFQ+KHRoaXM6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQsIG86IE1vZGVsVXBkYXRlT3JDcmVhdGVPcHRpb25zPFRhYmxlPik6IFQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcyBhcyBhbnlcblxuICAgICAgICAgICAgICAgIHJldHVybiBxdWVyaWVzLnVwZGF0ZU9yQ3JlYXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnOiBvLmRlYnVnLFxuICAgICAgICAgICAgICAgICAgICB3aGVyZTogby53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiBvLnNlbGVjdCxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBvLnVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBvLnZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gY29uc3RydWN0b3Iuc2VyaWFsaXplKHJvdyksXG4gICAgICAgICAgICAgICAgfSkgYXMgYW55XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgZGVzdHJveUJ5SWQ8VD4odGhpczogbmV3ICgpID0+IFQsIGlkOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMgYXMgYW55XG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IChxYjogYW55KSA9PiBxYi53aGVyZShwcmltYXJ5S2V5IGFzIHN0cmluZywgJz0nLCBpZClcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBlbWl0SG9vayhjb25zdHJ1Y3RvciwgJ2JlZm9yZURlc3Ryb3knLCBvcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy5kZXN0cm95KHRhYmxlLCBvcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckRlc3Ryb3knLCBvcHRpb25zKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgc2F2ZSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvbWl0KHRoaXMgYXMgYW55LCBbcHJpbWFyeUtleSBhcyBzdHJpbmddKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdiZWZvcmVTYXZlJywgdGhpcywgdmFsdWVzKVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcmllcy51cGRhdGUodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IChxYjogYW55KSA9PiBxYihwcmltYXJ5S2V5LCAnPScsICh0aGlzIGFzIGFueSlbcHJpbWFyeUtleV0pLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlclNhdmUnLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlRGVzdHJveScsIHRoaXMpXG5cbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyaWVzLmRlc3Ryb3kodGFibGUsIHtcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHFiID0+IChxYiBhcyBhbnkpLndoZXJlKHByaW1hcnlLZXksICc9JywgKHRoaXMgYXMgYW55KS5pZClcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZW1pdEhvb2soY29uc3RydWN0b3IsICdhZnRlckRlc3Ryb3knLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwdWJsaWMgYXN5bmMgc29mdERlbGV0ZSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICh0aGlzIGFzIGFueSkuY29uc3RydWN0b3JcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYmVmb3JlU29mdERlbGV0ZScsIHRoaXMpXG5cbiAgICAgICAgICAgICAgICBjb25zdCByb3dzID0gYXdhaXQgcXVlcmllcy5zb2Z0RGVsZXRlKHRhYmxlLCB7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBxYiA9PiAocWIgYXMgYW55KS53aGVyZShwcmltYXJ5S2V5LCAnPScsICh0aGlzIGFzIGFueSkuaWQpXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd3NbMF1cblxuICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcyBhcyBhbnksIHJvdylcblxuICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRIb29rKGNvbnN0cnVjdG9yLCAnYWZ0ZXJTb2Z0RGVsZXRlJywgdGhpcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQ29uc3RydWN0b3IgfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5cbmludGVyZmFjZSBSZWxhdGlvbiB7XG4gICAgbG9hZChlbnRpdGllczogYW55W10pOiBQcm9taXNlPHZvaWQ+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIFJlbGF0aW9uPFIgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBSZWxhdGlvbj4+KHJlbGF0aW9uczogUikge1xuICAgIHJldHVybiBmdW5jdGlvbiBSZWxhdGlvbkV4dGVuZDxUQmFzZSBleHRlbmRzIENvbnN0cnVjdG9yPihCYXNlOiBUQmFzZSkge1xuICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcblxuICAgICAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkPFQ+KHRoaXM6IG5ldyAoKSA9PiBULCBlbnRpdGllczogVCB8IFRbXSwgbmFtZXM6IGtleW9mIFIgfCAoa2V5b2YgUilbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShlbnRpdGllcykgPyBlbnRpdGllcyA6IFtlbnRpdGllc11cbiAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IFtuYW1lc11cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiByZWxhdGlvbk5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID0gcmVsYXRpb25zPy5bbmFtZSBhcyBzdHJpbmddIGFzIFJlbGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWxhdGlvbiAke1N0cmluZyhuYW1lKX0gZGVjbGFyZWRgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVsYXRpb24ubG9hZChpdGVtcylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IERvd25sb2FkU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0Rvd25sb2FkU2VydmljZS50cydcblxuY29uc3QgZG93bmxvYWQgPSBuZXcgRG93bmxvYWRTZXJ2aWNlKClcblxuZXhwb3J0IGRlZmF1bHQgZG93bmxvYWRcblxuIiwiaW1wb3J0IERyaXZlU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL0RyaXZlU2VydmljZS50cydcbmltcG9ydCBjb250YWluZXIgZnJvbSAnLi9jb250YWluZXIudHMnXG5cbmNvbnN0IGRyaXZlID0gY29udGFpbmVyLnByb3h5PERyaXZlU2VydmljZT4oRHJpdmVTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBkcml2ZVxuXG4iLCJpbXBvcnQgRW52U2VydmljZSBmcm9tIFwiI3NlcnZlci9zZXJ2aWNlcy9FbnZTZXJ2aWNlLnRzXCJcbmltcG9ydCBjb250YWluZXIgZnJvbSBcIi4vY29udGFpbmVyXCJcblxuY29uc3QgZW52ID0gY29udGFpbmVyLnByb3h5PEVudlNlcnZpY2U+KEVudlNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IGVudlxuXG4iLCJpbXBvcnQgRmlsZVJlcG9zaXRvcnkgZnJvbSBcIiNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0ZpbGVSZXBvc2l0b3J5LnRzXCI7XG5pbXBvcnQgZGF0YWJhc2UgZnJvbSBcIi4vZGF0YWJhc2UudHNcIjtcblxuY29uc3QgZmlsZVJlcG9zaXRvcnkgPSBuZXcgRmlsZVJlcG9zaXRvcnkoZGF0YWJhc2UpXG5cbmV4cG9ydCBkZWZhdWx0IGZpbGVSZXBvc2l0b3J5XG4iLCJpbXBvcnQgSHR0cFNlcnZpY2UgZnJvbSBcIiNzZXJ2ZXIvc2VydmljZXMvSHR0cFNlcnZpY2UudHNcIjtcbmltcG9ydCBjb250YWluZXIgZnJvbSBcIi4vY29udGFpbmVyXCI7XG5cbmNvbnN0IGh0dHAgPSBjb250YWluZXIucHJveHk8SHR0cFNlcnZpY2U+KEh0dHBTZXJ2aWNlKVxuXG5leHBvcnQgZGVmYXVsdCBodHRwXG4iLCJpbXBvcnQgTWlncmF0b3JTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvTWlncmF0b3JTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3QgbWlncmF0b3IgPSBjb250YWluZXIucHJveHk8TWlncmF0b3JTZXJ2aWNlPihNaWdyYXRvclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IG1pZ3JhdG9yXG4iLCJpbXBvcnQgUGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL1Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmNvbnN0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSA9IG5ldyBQZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkoZGIgYXMgYW55KVxuXG5leHBvcnQgZGVmYXVsdCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnlcbiIsImltcG9ydCBQZXJtaXNzaW9uUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL3JlcG9zaXRvcmllcy9QZXJtaXNzaW9uUmVwb3NpdG9yeS50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmNvbnN0IHBlcm1pc3Npb25SZXBvc2l0b3J5ID0gbmV3IFBlcm1pc3Npb25SZXBvc2l0b3J5KGRiIGFzIGFueSlcblxuZXhwb3J0IGRlZmF1bHQgcGVybWlzc2lvblJlcG9zaXRvcnlcbiIsImltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJ1xuaW1wb3J0IFJvdXRlclNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9Sb3V0ZXJTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuXG5jb25zdCByb3V0ZXIgPSBjb250YWluZXIucHJveHk8Um91dGVyU2VydmljZTxIdHRwQ29udGV4dD4+KFJvdXRlclNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IHJvdXRlclxuIiwiaW1wb3J0IGNvbnRhaW5lciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29udGFpbmVyLnRzJ1xuaW1wb3J0IFNjaGVkdWxlclNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9TY2hlZHVsZXJTZXJ2aWNlLnRzJ1xuXG5jb25zdCBzY2hlZHVsZXIgPSBjb250YWluZXIucHJveHk8U2NoZWR1bGVyU2VydmljZT4oU2NoZWR1bGVyU2VydmljZSlcblxuZXhwb3J0IGRlZmF1bHQgc2NoZWR1bGVyXG4iLCJpbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzJ1xuaW1wb3J0IGNvbnRhaW5lciBmcm9tICcuL2NvbnRhaW5lcidcblxuY29uc3Qgc2hlbGwgPSBjb250YWluZXIucHJveHk8U2hlbGxTZXJ2aWNlPihTaGVsbFNlcnZpY2UpXG5cbmV4cG9ydCBkZWZhdWx0IHNoZWxsXG4iLCJleHBvcnQgaW50ZXJmYWNlIExvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxvYWQoZW50aXRpZXM6IFRbXSk6IFByb21pc2U8dm9pZD5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkZXJSZWNvcmQ8VCA9IFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBba2V5OiBzdHJpbmddOiBMb2FkZXI8VD5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvYWRlcjxUID0gUmVjb3JkPHN0cmluZywgYW55Pj4obG9hZGVyOiBMb2FkZXI8VD4pOiBMb2FkZXI8VD4ge1xuICAgIHJldHVybiBsb2FkZXJcbn1cbiIsImltcG9ydCBNb2RlbE1peGluIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHMnXG5pbXBvcnQgQmFzZU1ldGEgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlTWV0YUVudGl0eS50cydcbmltcG9ydCB7IGNvbXBvc2VXaXRoIH0gZnJvbSAnI3NoYXJlZC91dGlscy9jb21wb3NlLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGaWxlTWV0YSBleHRlbmRzIGNvbXBvc2VXaXRoKFxuICAgIEJhc2VNZXRhLFxuICAgIE1vZGVsTWl4aW4oJ2ZpbGVfbWV0YXMnKVxuKSB7XG5cbn1cbiIsImltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcydcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UudHMnXG5cbmludGVyZmFjZSBIYXNNZXRhc09wdGlvbnMge1xuICAgIHRhYmxlOiBrZXlvZiBEYXRhYmFzZVxuICAgIHRhYmxlS2V5OiBzdHJpbmdcbiAgICBcbiAgICB0YXJnZXRUYWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHJvcGVydHk6IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIYXNNZXRhcyB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSGFzTWV0YXNPcHRpb25zKSB7XG4gICAgICAgIHRoaXMudGFibGUgPSBvcHRpb25zLnRhYmxlXG4gICAgICAgIHRoaXMudGFibGVLZXkgPSBvcHRpb25zLnRhYmxlS2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhcmdldFRhYmxlID0gb3B0aW9ucy50YXJnZXRUYWJsZVxuICAgICAgICB0aGlzLnRhcmdldEtleSA9IG9wdGlvbnMudGFyZ2V0S2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnByb3BlcnR5ID0gb3B0aW9ucy5wcm9wZXJ0eVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoKVxuXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiBpZHMuYWRkKGVbdGhpcy50YWJsZUtleV0pKVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpZHMuc2l6ZSkgcmV0dXJuXG5cbiAgICAgICAgbGV0IHF1ZXJ5ID0gZGIuc2VsZWN0RnJvbSh0aGlzLnRhcmdldFRhYmxlIGFzIGFueSkgYXMgYW55XG5cbiAgICAgICAgcXVlcnkgPSBxdWVyeS5zZWxlY3RBbGwoKS53aGVyZSh0aGlzLnRhcmdldEtleSwgJ2luJywgQXJyYXkuZnJvbShpZHMpKVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKVxuICAgICAgICAgICAgXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gcmVzdWx0cy5maWx0ZXIoKHI6IGFueSkgPT4gclt0aGlzLnRhcmdldEtleV0gPT09IGVbdGhpcy50YWJsZUtleV0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHNldChlLCB0aGlzLnByb3BlcnR5LCBNZXRhZGF0YVNlcnZpY2UuZmxhdHRlbihyb3dzKSlcbiAgICAgICAgfSlcblxuICAgIH1cbn1cbiIsImltcG9ydCBtcyBmcm9tICdtcydcbmltcG9ydCBGaWxlTWV0YSBmcm9tICcuL0ZpbGVNZXRhRW50aXR5LnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9GaWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgTWV0YWRhdGEgZnJvbSAnI3NlcnZlci9taXhpbnMvTWV0YWRhdGFNaXhpbi50cydcbmltcG9ydCBkcml2ZSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZHJpdmUudHMnXG5pbXBvcnQgSG9va3NTdGF0aWMgZnJvbSAnI3NoYXJlZC9taXhpbnMvSG9va3NNaXhpbi50cydcbmltcG9ydCB0eXBlIHsgRHJpdmVVcmxPcHRpb25zIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvRHJpdmVDb250cmFjdC50cydcbmltcG9ydCBNZXRhZGF0YVNlcnZpY2UgZnJvbSAnI3NlcnZlci9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UudHMnXG5pbXBvcnQgSGFzTWV0YXMgZnJvbSAnI3NlcnZlci9yZWxhdGlvbnMvSGFzTWV0YXNSZWxhdGlvbi50cydcbmltcG9ydCBSZWxhdGlvbiBmcm9tICcjc2VydmVyL21peGlucy9SZWxhdGlvbnNNaXhpbi50cydcbmltcG9ydCBNb2RlbE1peGluIGZyb20gJyNzZXJ2ZXIvbWl4aW5zL01vZGVsTWl4aW4udHMnXG5cbmludGVyZmFjZSBVUkxDYWNoZSB7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBleHBpcmVzOiBudW1iZXJcbn1cblxuY29uc3QgRmlsZVJlbGF0aW9ucyA9IHtcbiAgICBtZXRhczogbmV3IEhhc01ldGFzKHtcbiAgICAgICAgdGFibGU6ICdmaWxlcycsXG4gICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuXG4gICAgICAgIHRhcmdldFRhYmxlOiAnZmlsZV9tZXRhcycsXG4gICAgICAgIHRhcmdldEtleTogJ2ZpbGVfaWQnLFxuXG4gICAgICAgIHByb3BlcnR5OiAnbWV0YXMnLFxuICAgIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZpbGUgZXh0ZW5kcyBjb21wb3NlV2l0aChcbiAgICBCYXNlLFxuICAgIEhvb2tzU3RhdGljLFxuICAgIE1vZGVsTWl4aW4oJ2ZpbGVzJyksXG4gICAgUmVsYXRpb24oRmlsZVJlbGF0aW9ucyksXG4gICAgTWV0YWRhdGEoJ2ZpbGVfbWV0YXMnLCAnZmlsZV9pZCcpXG4pIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgVVJMQ2FjaGU+KClcblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgaGFzKGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5leGlzdHMoe1xuICAgICAgICAgICAgcXVlcnk6IHEgPT4gcS53aGVyZSgnZmlsZW5hbWUnLCAnPScsIGZpbGVuYW1lKVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiBleGlzdHNcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmRCeUZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE9uZSh7XG4gICAgICAgICAgICB3aGVyZTogcWIgPT4gcWIoJ2ZpbGVuYW1lJywgJz0nLCBmaWxlbmFtZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVhZFN0cmVhbSgpIHtcbiAgICAgICAgcmV0dXJuIGRyaXZlLnVzZSh0aGlzLmRyaXZlKS5yZWFkU3RyZWFtKHRoaXMuZmlsZW5hbWUpXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlYWQoKSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkcml2ZS51c2UodGhpcy5kcml2ZSkucmVhZCh0aGlzLmZpbGVuYW1lKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkVXJsKG9wdGlvbnM6IERyaXZlVXJsT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gRmlsZS5jYWNoZS5nZXQodGhpcy5maWxlbmFtZSlcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICAgIGlmIChjYWNoZSAmJiBub3cgPCBjYWNoZS5leHBpcmVzKSB7XG4gICAgICAgICAgICB0aGlzLnVybCA9IGNhY2hlLnVybFxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuZXhwaXJlcykge1xuICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gJzFoJ1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0aGlzLnVybCA9IGF3YWl0IGRyaXZlLnVzZSh0aGlzLmRyaXZlKS51cmwodGhpcy5maWxlbmFtZSwgb3B0aW9ucylcbiAgICAgICAgXG4gICAgICAgIGlmICghdGhpcy51cmwpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwaXJlcyA9IG5vdyArIG1zKG9wdGlvbnMuZXhwaXJlcykgLSAxMDAwIC8vIDEgc2Vjb25kIGVhcmx5XG5cbiAgICAgICAgRmlsZS5jYWNoZS5zZXQodGhpcy5maWxlbmFtZSwge1xuICAgICAgICAgICAgdXJsOiB0aGlzLnVybCxcbiAgICAgICAgICAgIGV4cGlyZXNcbiAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkVXJscyhpdGVtczogRmlsZVtdLCBvcHRpb25zOiBEcml2ZVVybE9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuXG4gICAgICAgICAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGUuZ2V0KGl0ZW0uZmlsZW5hbWUpXG5cbiAgICAgICAgICAgIGlmIChjYWNoZSAmJiBub3cgPCBjYWNoZS5leHBpcmVzKSB7XG4gICAgICAgICAgICAgICAgaXRlbS51cmwgPSBjYWNoZS51cmxcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZW0ubG9hZFVybChvcHRpb25zKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBsb2FkTWV0YXMoaXRlbXM6IEZpbGVbXSl7XG4gICAgICAgIGNvbnN0IGlkcyA9IGl0ZW1zLm1hcChpID0+IGkuaWQpXG4gICAgXG4gICAgICAgIGlmICghaWRzLmxlbmd0aCkgcmV0dXJuXG4gICAgXG4gICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCBGaWxlTWV0YS5saXN0KHtcbiAgICAgICAgICAgIHF1ZXJ5OiBxID0+IHEuc2VsZWN0QWxsKCkud2hlcmUoJ2ZpbGVfaWQnLCAnaW4nLCBpZHMpXG4gICAgICAgIH0pXG4gICAgXG4gICAgICAgIGl0ZW1zLmZvckVhY2goZiA9PiB7XG4gICAgICAgICAgICBmLm1ldGFzID0gTWV0YWRhdGFTZXJ2aWNlLmZsYXR0ZW4ocm93cy5maWx0ZXIociA9PiByLmZpbGVfaWQgPT09IGYuaWQpKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkZWxldGVGcm9tRHJpdmUoKSB7XG4gICAgICAgIGF3YWl0IGRyaXZlLnVzZSh0aGlzLmRyaXZlKS5kZWxldGUodGhpcy5maWxlbmFtZSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBkZWZpbmVMb2FkZXIgfSBmcm9tICcjc2VydmVyL3V0aWxzL2RlZmluZUxvYWRlci50cydcbmltcG9ydCBGaWxlIGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvRmlsZUVudGl0eS50cydcblxuaW50ZXJmYWNlIEZpbGVMb2FkZXJPcHRpb25zIHtcbiAgICBmaWxlSWRQcm9wZXJ0eTogc3RyaW5nXG4gICAgZmlsZVByb3BlcnR5OiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVMb2FkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM6IEZpbGVMb2FkZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIGRlZmluZUxvYWRlcjxUPih7XG5cbiAgICAgICAgYXN5bmMgbG9hZChlbnRpdGllczogVFtdKSB7XG4gICAgICAgICAgICBjb25zdCB7IGZpbGVJZFByb3BlcnR5LCBmaWxlUHJvcGVydHkgfSA9IG9wdGlvbnMgXG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVJZHMgPSBlbnRpdGllcy5tYXAoZSA9PiBlW2ZpbGVJZFByb3BlcnR5XSBhcyBudW1iZXIpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgICAgICAgICBpZiAoIWZpbGVJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgRmlsZS5saXN0KHsgd2hlcmU6IChlYikgPT4gZWIoJ2lkJywgJ2luJywgZmlsZUlkcykgfSlcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gZmlsZXMuZmluZChmID0+IGYuaWQgPT09IGVudGl0eVtmaWxlSWRQcm9wZXJ0eV0pXG5cbiAgICAgICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXQoZW50aXR5LCBmaWxlUHJvcGVydHksIGZpbGUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHsgZGVmaW5lTG9hZGVyIH0gZnJvbSAnI3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMnXG5pbXBvcnQgRmlsZSBmcm9tICcjc2VydmVyL2VudGl0aWVzL0ZpbGVFbnRpdHkudHMnXG5cbmludGVyZmFjZSBGaWxlTG9hZGVyT3B0aW9ucyB7XG4gICAgZmlsZUlkUHJvcGVydHk/OiBzdHJpbmdcbiAgICBmaWxlVXJsUHJvcGVydHk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRGaWxlVXJsPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihlbnRpdGllczogVFtdLCBvcHRpb25zPzogRmlsZUxvYWRlck9wdGlvbnMpIHtcbiAgICBjb25zdCBmaWxlSWRQcm9wZXJ0eSA9IG9wdGlvbnM/LmZpbGVJZFByb3BlcnR5IHx8ICdmaWxlX2lkJ1xuICAgIGNvbnN0IGZpbGVVcmxQcm9wZXJ0eSA9IG9wdGlvbnM/LmZpbGVVcmxQcm9wZXJ0eSB8fCAndXJsJ1xuICAgIGNvbnN0IGZpbGVJZHMgPSBlbnRpdGllcy5tYXAoZSA9PiBlW2ZpbGVJZFByb3BlcnR5XSBhcyBudW1iZXIpLmZpbHRlcihCb29sZWFuKVxuXG4gICAgaWYgKCFmaWxlSWRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IEZpbGUubGlzdCh7IHdoZXJlOiAoZWIpID0+IGViKCdpZCcsICdpbicsIGZpbGVJZHMpIH0pXG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IGZpbGUubG9hZFVybCgpKSlcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBmaWxlcy5maW5kKGYgPT4gZi5pZCA9PT0gZW50aXR5W2ZpbGVJZFByb3BlcnR5XSlcblxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgc2V0KGVudGl0eSwgZmlsZVVybFByb3BlcnR5LCBmaWxlLnVybClcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZpbGVVcmxMb2FkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBGaWxlTG9hZGVyT3B0aW9ucykge1xuICAgIHJldHVybiBkZWZpbmVMb2FkZXI8VD4oe1xuICAgICAgICBsb2FkOiAoZW50aXRpZXMpID0+IGxvYWRGaWxlVXJsKGVudGl0aWVzLCBvcHRpb25zKSxcbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgc2V0LCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyBkZWZpbmVMb2FkZXIgfSBmcm9tICcjc2VydmVyL3V0aWxzL2RlZmluZUxvYWRlci50cydcblxudHlwZSBLZXlPckZ1bmN0aW9uPFQ+ID0ga2V5b2YgVCB8ICgoZW50aXR5OiBUKSA9PiBhbnkpXG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFxuICAgIFRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUUGl2b3RFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBUVGFyZ2V0RW50aXR5IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IFJlY29yZDxzdHJpbmcsIGFueT5cbj4ge1xuICAgIGtleTogc3RyaW5nIC8vIHRhcmdldCBwcm9wZXJ0eSB0byBzZXQgb24gdGhlIGVudGl0eVxuICAgIHBpdm90OiB7XG4gICAgICAgIHNvdXJjZUtleTogS2V5T3JGdW5jdGlvbjxURW50aXR5PiAvLyBwaXZvdCB0YWJsZSBmb3JlaWduIGtleSB0byByZWxhdGVkIGVudGl0eVxuICAgICAgICB0YXJnZXRLZXk6IEtleU9yRnVuY3Rpb248VFBpdm90RW50aXR5PiAvLyBwaXZvdCB0YWJsZSBmb3JlaWduIGtleSB0byBjdXJyZW50IGVudGl0eVxuICAgICAgICBmaW5kRW50aXRpZXMoaWRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTxUUGl2b3RFbnRpdHlbXT4gLy8gZnVuY3Rpb24gdG8gZmV0Y2ggcGl2b3QgdGFibGUgcm93cyBieSByZWxhdGVkIGVudGl0eSBpZHNcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgICBzb3VyY2VLZXk6IEtleU9yRnVuY3Rpb248VFBpdm90RW50aXR5PiAvLyB0YXJnZXQgZW50aXR5IGlkIGtleSwgZGVmYXVsdCAnaWQnXG4gICAgICAgIHRhcmdldEtleTogS2V5T3JGdW5jdGlvbjxUVGFyZ2V0RW50aXR5PiAvLyB0YXJnZXQgZW50aXR5IGZvcmVpZ24ga2V5IHRvIHBpdm90IHRhYmxlXG4gICAgICAgIGZpbmRFbnRpdGllcyhpZHM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPFRUYXJnZXRFbnRpdHlbXT4gLy8gZnVuY3Rpb24gdG8gZmV0Y2ggcmVsYXRlZCBlbnRpdGllcyBieSBpZHNcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkSGFzTWFueVRocm91Z2g8XG4gICAgVEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PlxuPihwYXlsb2FkOiBhbnkgfCBhbnlbXSwgb3B0aW9uczogSGFzTWFueVRocm91Z2hMb2FkZXJPcHRpb25zPFRFbnRpdHksIFRQaXZvdEVudGl0eSwgVFRhcmdldEVudGl0eT4pIHtcbiAgICBjb25zdCBlbnRpdGllcyA9IEFycmF5LmlzQXJyYXkocGF5bG9hZCkgPyBwYXlsb2FkIDogW3BheWxvYWRdXG4gICAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgXG4gICAgY29uc3QgcGl2b3QgPSBvcHRpb25zLnBpdm90XG5cbiAgICBmdW5jdGlvbiBmaW5kS2V5KGVudGl0eTogYW55LCBrZXlPckZuOiBLZXlPckZ1bmN0aW9uPGFueT4pOiBhbnkge1xuICAgICAgICBpZiAodHlwZW9mIGtleU9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBrZXlPckZuKGVudGl0eSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBnZXQoZW50aXR5LCBrZXlPckZuKVxuICAgICAgICBcbiAgICB9XG5cbiAgICBjb25zdCBwaXZvSWRzID0gZW50aXRpZXMubWFwKGUgPT4gZmluZEtleShlLCBwaXZvdC5zb3VyY2VLZXkpKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCBwaXZvdEVudGl0aWVzID0gYXdhaXQgcGl2b3QuZmluZEVudGl0aWVzKHBpdm9JZHMpXG4gICAgY29uc3QgdGFyZ2V0SWRzID0gcGl2b3RFbnRpdGllcy5tYXAoKHA6IGFueSkgPT4gZmluZEtleShwLCBwaXZvdC50YXJnZXRLZXkpKS5maWx0ZXIoQm9vbGVhbilcbiAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9IGF3YWl0IHRhcmdldC5maW5kRW50aXRpZXModGFyZ2V0SWRzKVxuXG4gICAgZm9yIChjb25zdCBlbnRpdHkgb2YgZW50aXRpZXMpIHtcbiAgICAgICAgY29uc3QgcGl2b3RzID0gcGl2b3RFbnRpdGllcy5maWx0ZXIoKHA6IGFueSkgPT4gZmluZEtleShwLCBwaXZvdC5zb3VyY2VLZXkpID09PSBmaW5kS2V5KGVudGl0eSwgcGl2b3Quc291cmNlS2V5KSlcblxuICAgICAgICBpZiAoIXBpdm90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNldChlbnRpdHksIG9wdGlvbnMua2V5LCBbXSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRzID0gdGFyZ2V0RW50aXRpZXMuZmlsdGVyKCh0OiBhbnkpID0+IHBpdm90cy5zb21lKChwOiBhbnkpID0+IGZpbmRLZXkocCwgdGFyZ2V0LnNvdXJjZUtleSkgPT09IGZpbmRLZXkodCwgdGFyZ2V0LnRhcmdldEtleSkpKVxuXG4gICAgICAgIHNldChlbnRpdHksIG9wdGlvbnMua2V5LCB0YXJnZXRzKVxuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFzTWFueVRocm91Z2hMb2FkZXI8XG4gICAgVEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRQaXZvdEVudGl0eSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIFRUYXJnZXRFbnRpdHkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PlxuPihvcHRpb25zOiBIYXNNYW55VGhyb3VnaExvYWRlck9wdGlvbnM8VEVudGl0eSwgVFBpdm90RW50aXR5LCBUVGFyZ2V0RW50aXR5Pikge1xuICAgIHJldHVybiBkZWZpbmVMb2FkZXI8VEVudGl0eT4oe1xuICAgICAgICBsb2FkOiBhc3luYyAoZW50aXRpZXM6IFRFbnRpdHlbXSkgPT4gbG9hZEhhc01hbnlUaHJvdWdoKGVudGl0aWVzLCBvcHRpb25zKVxuICAgIH0pXG59XG5cblxuIiwiaW1wb3J0IHsgc2V0LCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgeyB1bmZsYXR0ZW4gfSBmcm9tICcjc2hhcmVkL2luZGV4LnRzJ1xuaW1wb3J0IHsgZGVmaW5lTG9hZGVyIH0gZnJvbSAnI3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMnXG5cbmludGVyZmFjZSBSZXBvc2l0b3J5TWV0YSB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgdmFsdWU6IGFueVxufVxuXG5pbnRlcmZhY2UgTG9hZE1ldGFzT3B0aW9ucyB7XG4gICAgZmluZE1hbnkoaWRzOiBhbnlbXSk6IFByb21pc2U8UmVwb3NpdG9yeU1ldGFbXT5cbiAgICBlbnRpdHlJZEtleT86IHN0cmluZ1xuICAgIGZvcmVpZ25LZXk/OiBzdHJpbmdcbiAgICB0YXJnZXRLZXk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRNZXRhczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ocGF5bG9hZDogVCB8IFRbXSwgb3B0aW9uczogTG9hZE1ldGFzT3B0aW9ucykge1xuICAgIGNvbnN0IGVudGl0eUlkS2V5ID0gb3B0aW9ucz8uZW50aXR5SWRLZXkgfHwgJ2lkJ1xuICAgIGNvbnN0IGZvcmVpZ25LZXkgPSBvcHRpb25zPy5mb3JlaWduS2V5IHx8ICdpZCdcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBvcHRpb25zPy50YXJnZXRLZXkgfHwgJ21ldGFzJ1xuICAgIGNvbnN0IGZpbmRNYW55ID0gb3B0aW9ucy5maW5kTWFueVxuXG4gICAgY29uc3QgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuICAgIGNvbnN0IGlkTGlzdCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICBlbnRpdGllcy5mb3JFYWNoKGVudGl0eSA9PiBpZExpc3QuYWRkKGdldChlbnRpdHksIGVudGl0eUlkS2V5KSkpXG5cbiAgICBjb25zdCBtZXRhcyA9IGF3YWl0IGZpbmRNYW55KEFycmF5LmZyb20oaWRMaXN0LnZhbHVlcygpKSlcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gZ2V0KGVudGl0eSwgZW50aXR5SWRLZXkpXG5cbiAgICAgICAgY29uc3QgZW50aXR5TWV0YXMgPSBtZXRhcy5maWx0ZXIobWV0YSA9PiBnZXQobWV0YSwgZm9yZWlnbktleSkgPT09IGVudGl0eUlkKVxuXG4gICAgICAgIGxldCByZWNvcmQgPSBPYmplY3QuZnJvbUVudHJpZXMoZW50aXR5TWV0YXMubWFwKG1ldGEgPT4gW21ldGEubmFtZSwgbWV0YS52YWx1ZV0pKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG5cbiAgICAgICAgT2JqZWN0LmtleXMocmVjb3JkKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtrZXldXG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ251bWJlcjonKSkge1xuICAgICAgICAgICAgICAgIHJlY29yZFtrZXldID0gTnVtYmVyKHZhbHVlLnNsaWNlKDcpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHJlY29yZCA9IHVuZmxhdHRlbihyZWNvcmQpXG5cbiAgICAgICAgc2V0KGVudGl0eSwgdGFyZ2V0S2V5LCByZWNvcmQpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWV0YXNMb2FkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM6IExvYWRNZXRhc09wdGlvbnMpIHtcbiAgICByZXR1cm4gZGVmaW5lTG9hZGVyPFQ+KHsgbG9hZDogKGVudGl0aWVzKSA9PiBsb2FkTWV0YXMoZW50aXRpZXMsIG9wdGlvbnMpLCB9KVxufVxuIiwiaW1wb3J0IHR5cGUgeyBQZXJtaXNzaW9uIH0gZnJvbSAnQHNpZGVraWNrLWNvZGVyL3plbml0aC1raXQvc2hhcmVkJ1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJ1xuaW1wb3J0IHBlcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cydcbmltcG9ydCB7IGRlZmluZUxvYWRlciB9IGZyb20gJyNzZXJ2ZXIvdXRpbHMvZGVmaW5lTG9hZGVyLnRzJ1xuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkxvYWRlck9wdGlvbnMge1xuICAgIGFzc2lnbmFibGVUeXBlOiBzdHJpbmcgfCAoKGU6IGFueSkgPT4gc3RyaW5nKVxuICAgIGFzc2lnbmFibGVJZDogc3RyaW5nIHwgKChlOiBhbnkpID0+IHN0cmluZylcbiAgICB0YXJnZXRLZXk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQZXJtaXNzaW9uczxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ocGF5bG9hZDogVCB8IFRbXSwgb3B0aW9ucz86IFBlcm1pc3Npb25Mb2FkZXJPcHRpb25zKSB7XG4gICAgY29uc3QgZW50aXRpZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuXG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gb3B0aW9ucz8udGFyZ2V0S2V5IHx8ICdwZXJtaXNzaW9ucydcbiAgICBjb25zdCBhc3NpZ25UeXBlRm4gPSB0eXBlb2Ygb3B0aW9ucz8uYXNzaWduYWJsZVR5cGUgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmFzc2lnbmFibGVUeXBlIDogKCkgPT4gb3B0aW9ucz8uYXNzaWduYWJsZVR5cGUgYXMgc3RyaW5nXG4gICAgY29uc3QgYXNzaWduYWJsZUlkRm4gPSB0eXBlb2Ygb3B0aW9ucz8uYXNzaWduYWJsZUlkID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hc3NpZ25hYmxlSWQgOiAoKSA9PiBvcHRpb25zPy5hc3NpZ25hYmxlSWQgYXMgc3RyaW5nXG5cbiAgICBjb25zdCBhc3NpZ25UeXBlcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgY29uc3QgYXNzaWduYWJsZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCBhc3NpZ25hYmxlVHlwZSA9IGFzc2lnblR5cGVGbihlbnRpdHkpXG4gICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZCA9IGFzc2lnbmFibGVJZEZuKGVudGl0eSlcblxuICAgICAgICBpZiAoYXNzaWduYWJsZVR5cGUgJiYgYXNzaWduYWJsZUlkKSB7XG4gICAgICAgICAgICBhc3NpZ25UeXBlcy5hZGQoYXNzaWduYWJsZVR5cGUpXG4gICAgICAgICAgICBhc3NpZ25hYmxlSWRzLmFkZChhc3NpZ25hYmxlSWQpXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gYXdhaXQgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LmZpbmRNYW55KHtcbiAgICAgICAgYXNzaWduYWJsZUlkOiBBcnJheS5mcm9tKGFzc2lnbmFibGVJZHMudmFsdWVzKCkpLFxuICAgICAgICBhc3NpZ25hYmxlVHlwZTogQXJyYXkuZnJvbShhc3NpZ25UeXBlcy52YWx1ZXMoKSksXG4gICAgfSlcblxuICAgIGNvbnN0IHBlcm1pc3Npb25JZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSkpXG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCBwZXJtaXNzaW9uUmVwb3NpdG9yeS5maW5kTWFueSh7IGlkOiBwZXJtaXNzaW9uSWRzIH0pXG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICBjb25zdCBhc3NpZ25hYmxlVHlwZSA9IGFzc2lnblR5cGVGbihlbnRpdHkpXG4gICAgICAgIGNvbnN0IGFzc2lnbmFibGVJZCA9IGFzc2lnbmFibGVJZEZuKGVudGl0eSlcblxuICAgICAgICBpZiAoIWFzc2lnbmFibGVUeXBlIHx8ICFhc3NpZ25hYmxlSWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbnRpdHlBc3NpZ25tZW50cyA9IGFzc2lnbm1lbnRzLmZpbHRlcihhID0+IGEuYXNzaWduYWJsZV90eXBlID09PSBhc3NpZ25hYmxlVHlwZSAmJiBhLmFzc2lnbmFibGVfaWQgPT09IGFzc2lnbmFibGVJZClcbiAgICAgICAgY29uc3QgZW50aXR5UGVybWlzc2lvbnMgPSBlbnRpdHlBc3NpZ25tZW50cy5tYXAoYSA9PiBwZXJtaXNzaW9ucy5maW5kKHAgPT4gcC5pZCA9PT0gYS5wZXJtaXNzaW9uX2lkKSkuZmlsdGVyKEJvb2xlYW4pIGFzIFBlcm1pc3Npb25bXVxuXG4gICAgICAgIHNldChlbnRpdHksIHRhcmdldEtleSwgZW50aXR5UGVybWlzc2lvbnMpXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGVybWlzc2lvbkxvYWRlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4ob3B0aW9ucz86IFBlcm1pc3Npb25Mb2FkZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuIGRlZmluZUxvYWRlcjxUPih7IGxvYWQ6IChlbnRpdGllcykgPT4gbG9hZFBlcm1pc3Npb25zKGVudGl0aWVzLCBvcHRpb25zKSwgfSlcbn1cblxuIiwiaW1wb3J0IHsgc2V0LCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgdXNlclJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3VzZXJSZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHsgZGVmaW5lTG9hZGVyIH0gZnJvbSAnI3NlcnZlci91dGlscy9kZWZpbmVMb2FkZXIudHMnXG5cbmludGVyZmFjZSBVc2VyTG9hZGVyT3B0aW9ucyB7IFxuICAgIGlkS2V5Pzogc3RyaW5nXG4gICAgdGFyZ2V0S2V5Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkVXNlcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oZW50aXRpZXM6IFRbXSwgb3B0aW9ucz86IFVzZXJMb2FkZXJPcHRpb25zKSB7XG4gICAgY29uc3QgaWRLZXkgPSBvcHRpb25zPy5pZEtleSB8fCAndXNlcl9pZCdcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBvcHRpb25zPy50YXJnZXRLZXkgfHwgJ3VzZXInXG5cbiAgICBjb25zdCBpZHMgPSBlbnRpdGllcy5tYXAoZSA9PiBnZXQoZSwgaWRLZXkpIGFzIG51bWJlcikuZmlsdGVyKEJvb2xlYW4pXG5cbiAgICBpZiAoIWlkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdXNlcnMgPSBhd2FpdCB1c2VyUmVwb3NpdG9yeS5maW5kTWFueSh7IGlkOiBpZHMgfSlcblxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAodXNlcnMubWFwKHUgPT4gW3UuaWQsIHVdKSlcblxuICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzKSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBtYXAuZ2V0KGdldChlbnRpdHksIGlkS2V5KSBhcyBudW1iZXIpXG5cbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICAgIHNldChlbnRpdHksIHRhcmdldEtleSwgdXNlcilcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzZXJMb2FkZXI8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KG9wdGlvbnM/OiBVc2VyTG9hZGVyT3B0aW9ucykge1xuICAgIHJldHVybiBkZWZpbmVMb2FkZXI8VD4oeyBsb2FkOiAoZW50aXRpZXMpID0+IGxvYWRVc2VyKGVudGl0aWVzLCBvcHRpb25zKSwgfSlcbn1cbiIsImltcG9ydCBCYXNlQWNsIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvQWNsRW50aXR5LnRzJ1xuaW1wb3J0IEJhc2VFeGNlcHRpb24gZnJvbSAnI3NoYXJlZC9leGNlcHRpb25zL0Jhc2VFeGNlcHRpb24udHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjbCBleHRlbmRzIEJhc2VBY2wge1xuICAgIHB1YmxpYyBhdXRob3JpemUoYWN0aW9uOiBzdHJpbmcsIHN1YmplY3Q6IGFueSwgb2JqZWN0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgICBpZiAodGhpcy5jYW5ub3QoYWN0aW9uLCBzdWJqZWN0LCBvYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBCYXNlRXhjZXB0aW9uKCdVbmF1dGhvcml6ZWQnLCA0MDMpXG5cbiAgICAgICAgICAgIGxldCBzdWJqZWN0TmFtZSA9ICcnXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdWJqZWN0TmFtZSA9IHN1YmplY3RcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdmdW5jdGlvbicgJiYgc3ViamVjdC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdE5hbWUgPSBzdWJqZWN0Lm5hbWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHN1YmplY3QgJiYgdHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnICYmIHN1YmplY3QuY29uc3RydWN0b3IgJiYgc3ViamVjdC5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICAgICAgICAgICAgc3ViamVjdE5hbWUgPSBzdWJqZWN0LmNvbnN0cnVjdG9yLm5hbWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnJvciwge1xuICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICBzdWJqZWN0OiBzdWJqZWN0TmFtZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCdcbmltcG9ydCB7IEdpdEdhdGV3YXkgfSBmcm9tICcjc2VydmVyL2dhdGV3YXlzL0dpdEdhdGV3YXkudHMnXG5pbXBvcnQgeyB0bXBQYXRoIH0gZnJvbSAnI3NlcnZlci91dGlscy9iYXNlUGF0aC50cydcbmltcG9ydCBCYXNlIGZyb20gJyNzaGFyZWQvZW50aXRpZXMvTW9kdWxlRW50aXR5LnRzJ1xuaW1wb3J0IHsgY29tcG9zZVdpdGggfSBmcm9tICcjc2hhcmVkL3V0aWxzL2NvbXBvc2UudHMnXG5pbXBvcnQgc2hlbGwgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3NoZWxsLnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBjb21wb3NlV2l0aChCYXNlKSB7XG4gICAgcHVibGljIGdldCBnaXQoKXtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRHYXRld2F5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzc2hLZXk6IGNvbmZpZy5nZXQoYG1vZHVsZXMuJHt0aGlzLmlkfS5zc2hfa2V5YCksXG4gICAgICAgICAgICBzc2hLZXlUbXBGaWxlTmFtZTogdG1wUGF0aChgc3NoX2tleV8ke3RoaXMuaWR9LnBlbWApLFxuICAgICAgICAgICAgbG9nZ2VyOiBsb2dnZXIuY2hpbGQoeyBsYWJlbDogJ2dpdCcgfSksXG4gICAgICAgICAgICBkZWJ1ZzogY29uZmlnLmdldCgnZ2l0LmRlYnVnJywgZmFsc2UpLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBtYWtlUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4odGhpcy5kaXJlY3RvcnksIC4uLnBhcnRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWNQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbignL3N0YXRpYycsICdtb2R1bGVzJywgdGhpcy5pZCwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIGNvbW1hbmQ6IHR5cGVvZiBzaGVsbC5jb21tYW5kID0gKGJpbiwgYXJncywgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gc2hlbGwuY29tbWFuZChiaW4sIGFyZ3MsIHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkKCl7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0UGF0aCA9IHRoaXMubWFrZVBhdGgoJ21vZHVsZS5qc29uJylcblxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0Zi04JylcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UoY29udGVudClcblxuICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGpzb24uZGVwZW5kZW5jaWVzIHx8IHt9XG4gICAgICAgIHRoaXMuYnVpbGQgPSBqc29uLmJ1aWxkIHx8IHt9ICAgICAgXG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRDbGllbnRFbnRyeXBvaW50RmlsZW5hbWUoY29udGV4dDogJ2RldicgfCAnbm9kZScgfCAnYnJvd3NlcicgPSAnZGV2Jyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gW10gYXMgc3RyaW5nW11cblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ2RldicpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQnLCAnbW9kdWxlLmNsaWVudC50cycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdtb2R1bGUuY2xpZW50LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50JywgJ2NsaWVudC50cycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudCcsICdjbGllbnQuanMnKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0ID09PSAnbm9kZScpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ2luZGV4LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3Qvbm9kZScsICdpbmRleC5tanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ21vZHVsZS5jbGllbnQuanMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ha2VQYXRoKCdjbGllbnQtZGlzdC9ub2RlJywgJ21vZHVsZS5jbGllbnQubWpzJyksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dCA9PT0gJ2Jyb3dzZXInKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdpbmRleC5qcycpLFxuICAgICAgICAgICAgICAgIHRoaXMubWFrZVBhdGgoJ2NsaWVudC1kaXN0L2Jyb3dzZXInLCAnaW5kZXgubWpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdtb2R1bGUuY2xpZW50LmpzJyksXG4gICAgICAgICAgICAgICAgdGhpcy5tYWtlUGF0aCgnY2xpZW50LWRpc3QvYnJvd3NlcicsICdtb2R1bGUuY2xpZW50Lm1qcycpLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG59XG4iLCJpbXBvcnQgQ29va2llTWFwRW50aXR5IGZyb20gXCIjc2VydmVyL2VudGl0aWVzL0Nvb2tpZU1hcEVudGl0eS50c1wiXG5pbXBvcnQgQ29udGFpbmVyU2VydmljZSBmcm9tIFwiI3NoYXJlZC9zZXJ2aWNlcy9Db250YWluZXJTZXJ2aWNlLnRzXCJcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJ1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlSGVhZCB9IGZyb20gJ0B1bmhlYWQvdnVlJ1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSBcIiNzaGFyZWQvc2VydmljZXMvQ29uZmlnU2VydmljZS50c1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcXVlc3RDb250ZXh0RW50aXR5T3B0aW9ucyB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgcmVxdWVzdDogUmVxdWVzdDtcbiAgICByZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgICBzdGF0ZT86IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIG5vZGVDb250YWluZXI/OiBDb250YWluZXJTZXJ2aWNlXG4gICAgbm9kZUNvbmZpZz86IENvbmZpZ1NlcnZpY2VcbiAgICBub2RlU3RhdGU/OiBNYXA8c3RyaW5nLCBhbnk+XG5cbiAgICBicm93c2VyQ29udGFpbmVyPzogQ29udGFpbmVyU2VydmljZVxuICAgIGJyb3dzZXJDb25maWc/OiBDb25maWdTZXJ2aWNlXG4gICAgYnJvd3NlclN0YXRlPzogTWFwPHN0cmluZywgYW55PlxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlUmVxdWVzdENvbnRleHRFbnRpdHkge1xuICAgIHB1YmxpYyB1cmw6IHN0cmluZztcbiAgICBwdWJsaWMgcmVxdWVzdDogUmVxdWVzdDtcbiAgICBwdWJsaWMgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICAgIHB1YmxpYyBjb29raWVzOiBDb29raWVNYXBFbnRpdHlcbiAgICBwdWJsaWMgaGVhZDogUmVzb2x2YWJsZUhlYWRbXVxuXG4gICAgcHVibGljIG5vZGVDb250YWluZXI6IENvbnRhaW5lclNlcnZpY2VcbiAgICBwdWJsaWMgbm9kZUNvbmZpZzogQ29uZmlnU2VydmljZVxuICAgIHB1YmxpYyBub2RlU3RhdGU6IE1hcDxzdHJpbmcsIGFueT5cblxuICAgIHB1YmxpYyBicm93c2VyQ29udGFpbmVyOiBDb250YWluZXJTZXJ2aWNlXG4gICAgcHVibGljIGJyb3dzZXJDb25maWc6IENvbmZpZ1NlcnZpY2VcbiAgICBwdWJsaWMgYnJvd3NlclN0YXRlOiBNYXA8c3RyaW5nLCBhbnk+XG5cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VSZXF1ZXN0Q29udGV4dEVudGl0eU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy51cmwgPSBkYXRhLnVybFxuICAgICAgICB0aGlzLnJlcXVlc3QgPSBkYXRhLnJlcXVlc3RcbiAgICAgICAgdGhpcy5yZXNwb25zZSA9IGRhdGEucmVzcG9uc2VcbiAgICAgICAgdGhpcy5jb29raWVzID0gbmV3IENvb2tpZU1hcEVudGl0eSh0aGlzLnJlcXVlc3QsIHRoaXMucmVzcG9uc2UpXG5cbiAgICAgICAgdGhpcy5oZWFkID0gW11cblxuICAgICAgICB0aGlzLm5vZGVDb250YWluZXIgPSBkYXRhLm5vZGVDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuICAgICAgICB0aGlzLm5vZGVDb25maWcgPSBkYXRhLm5vZGVDb25maWcgfHwgbmV3IENvbmZpZ1NlcnZpY2UoKVxuICAgICAgICB0aGlzLm5vZGVTdGF0ZSA9IGRhdGEubm9kZVN0YXRlIHx8IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25maWcgPSBkYXRhLmJyb3dzZXJDb25maWcgfHwgbmV3IENvbmZpZ1NlcnZpY2UoKVxuICAgICAgICB0aGlzLmJyb3dzZXJDb250YWluZXIgPSBkYXRhLmJyb3dzZXJDb250YWluZXIgfHwgbmV3IENvbnRhaW5lclNlcnZpY2UoKVxuICAgICAgICB0aGlzLmJyb3dzZXJTdGF0ZSA9IGRhdGEuYnJvd3NlclN0YXRlIHx8IG5ldyBNYXA8c3RyaW5nLCBhbnk+KClcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QnJvd3NlclN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuYnJvd3NlclN0YXRlLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXROb2RlU3RhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgdGhpcy5ub2RlU3RhdGUuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldFN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZVN0YXRlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlclN0YXRlKGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEJyb3dzZXJDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb250YWluZXIuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVDb250YWluZXJWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVDb250YWluZXIuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbnRhaW5lclZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZUNvbnRhaW5lclZhbHVlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlckNvbnRhaW5lclZhbHVlKGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldEJyb3dzZXJDb25maWdWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJDb25maWcuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldE5vZGVDb25maWdWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLm5vZGVDb25maWcuc2V0KGtleSwgdmFsdWUpXG4gICAgfVxuXG4gICAgcHVibGljIHNldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuc2V0Tm9kZUNvbmZpZ1ZhbHVlKGtleSwgdmFsdWUpXG4gICAgICAgIHRoaXMuc2V0QnJvd3NlckNvbmZpZ1ZhbHVlKGtleSwgdmFsdWUpXG4gICAgfVxuXG59XG4iLCJpbXBvcnQgY29uZmlnIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb25maWcudHMnXG5pbXBvcnQgY29udGFpbmVyIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9jb250YWluZXIudHMnXG5pbXBvcnQgeyBHaXRHYXRld2F5IH0gZnJvbSAnI3NlcnZlci9nYXRld2F5cy9HaXRHYXRld2F5LnRzJ1xuaW1wb3J0IEdpdEJyYW5jaFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9yZXBvc2l0b3JpZXMvR2l0QnJhbmNoUmVwb3NpdG9yeS50cydcbmltcG9ydCBHaXRDb21taXRSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvcmVwb3NpdG9yaWVzL0dpdENvbW1pdFJlcG9zaXRvcnkudHMnXG5pbXBvcnQgU2hlbGxTZXJ2aWNlIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvU2hlbGxTZXJ2aWNlLnRzJ1xuaW1wb3J0IEJhc2UgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QbHVnaW5FbnRpdHkudHMnXG5pbXBvcnQgeyBjb21wb3NlV2l0aCB9IGZyb20gJyNzaGFyZWQvdXRpbHMvY29tcG9zZS50cydcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudHJ5RW50aXR5IGV4dGVuZHMgY29tcG9zZVdpdGgoQmFzZSkge1xuICAgIHB1YmxpYyBkaXJlY3Rvcnk6IHN0cmluZ1xuXG4gICAgcHVibGljIG1ha2VQYXRoKC4uLnBhcnRzOiBzdHJpbmdbXSkge1xuICAgICAgICByZXR1cm4gam9pbih0aGlzLmRpcmVjdG9yeSwgLi4ucGFydHMpXG4gICAgfVxuXG4gICAgcHVibGljIHNldDogdHlwZW9mIGNvbmZpZy5zZXQgPSAoa2V5LCB2YWx1ZSwgc291cmNlKSA9PiB7XG4gICAgICAgIGNvbmZpZy5zZXQoYHBsdWdpbnMucmVnaXN0cnkuJHt0aGlzLmlkfS4ke2tleX1gLCB2YWx1ZSwgc291cmNlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ6IHR5cGVvZiBjb25maWcuZ2V0ID0gKGtleSwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiBjb25maWcuZ2V0KGBwbHVnaW5zLnJlZ2lzdHJ5LiR7dGhpcy5pZH0uJHtrZXl9YCwgZGVmYXVsdFZhbHVlKVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ2l0KCl7XG4gICAgICAgIHJldHVybiBuZXcgR2l0R2F0ZXdheSh7XG4gICAgICAgICAgICBjd2Q6IHRoaXMuZGlyZWN0b3J5LFxuICAgICAgICAgICAgc2hlbGw6IGNvbnRhaW5lci5oYXMoU2hlbGxTZXJ2aWNlKSA/IGNvbnRhaW5lci5nZXQoU2hlbGxTZXJ2aWNlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzaEtleTogY29uZmlnLmdldChgcGx1Z2lucy5yZWdpc3RyeS4ke3RoaXMuaWR9LnNzaF9rZXlgKSxcbiAgICAgICAgICAgIHNzaEtleUZpbGU6IGNvbmZpZy5nZXQoYHBsdWdpbnMucmVnaXN0cnkuJHt0aGlzLmlkfS5zc2hfa2V5X2ZpbGVgKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgY29tbWl0cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRDb21taXRSZXBvc2l0b3J5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzaGVsbDogY29udGFpbmVyLmhhcyhTaGVsbFNlcnZpY2UpID8gY29udGFpbmVyLmdldChTaGVsbFNlcnZpY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIGdldCBicmFuY2hlcygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBHaXRCcmFuY2hSZXBvc2l0b3J5KHtcbiAgICAgICAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgICAgICAgICBzaGVsbDogY29udGFpbmVyLmhhcyhTaGVsbFNlcnZpY2UpID8gY29udGFpbmVyLmdldChTaGVsbFNlcnZpY2UpIDogdW5kZWZpbmVkXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnXG5pbXBvcnQgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZSBmcm9tICcjc2VydmVyL3NlcnZpY2VzL1JvdXRlckZpbGVCYXNlUm91dGluZ1NlcnZpY2UudHMnXG5pbXBvcnQgUGx1Z2luRW50cnlFbnRpdHkgZnJvbSAnLi9QbHVnaW5FbnRyeUVudGl0eS50cydcbmltcG9ydCBlbW1pdHRlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZW1taXR0ZXIudHMnXG5pbXBvcnQgdHlwZSB7IFJvdXRlckV2ZW50cyB9IGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyU2VydmljZS50cydcbmltcG9ydCB0eXBlIFJvdXRlclJlZ2lzdGVyIGZyb20gJyNzZXJ2ZXIvc2VydmljZXMvUm91dGVyUmVnaXN0ZXJTZXJ2aWNlLnRzJ1xuXG5pbnRlcmZhY2UgQWRkQXBpRm9sZGVyT3B0aW9ucyB7XG4gICAgcHJlZml4Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkVudGl0eSBleHRlbmRzIFBsdWdpbkVudHJ5RW50aXR5IHtcbiAgICBwdWJsaWMgYXBpRm9sZGVycyA9IG5ldyBNYXA8c3RyaW5nLCBBZGRBcGlGb2xkZXJPcHRpb25zPigpXG4gICAgcHVibGljIGFwaURpcmVjdG9yaWVzID0gbmV3IFNldDxzdHJpbmc+KClcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpXG5cbiAgICAgICAgZW1taXR0ZXIub24oJ3JvdXRlcjpyZWdpc3RlcmVkJywgdGhpcy5vblJvdXRlclJlZ2lzdGVyZWQuYmluZCh0aGlzKSlcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljUGF0aCguLi5wYXJ0czogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIGpvaW4oJy9zdGF0aWMnLCAnbW9kdWxlcycsIHRoaXMuaWQsIC4uLnBhcnRzKVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBsb2FkIGFkZGl0aW9uYWwgZGF0YSBmcm9tIHRoZSBwbHVnaW4ncyBkaXJlY3RvcnkgaWYgbmVlZGVkXG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUm91dGVyUmVnaXN0ZXJlZChjdHg6IFJvdXRlckV2ZW50c1sncm91dGVyOnJlZ2lzdGVyZWQnXSkge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSBjdHgucm91dGVyIGFzIFJvdXRlclJlZ2lzdGVyXG5cbiAgICAgICAgZm9yIChjb25zdCBbZGlyZWN0b3J5LCBvcHRpb25zXSBvZiB0aGlzLmFwaUZvbGRlcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG9wdGlvbnMucHJlZml4IHx8IGAvYXBpL2BcblxuICAgICAgICAgICAgYXdhaXQgUm91dGVyRmlsZUJhc2VSb3V0aW5nU2VydmljZVxuICAgICAgICAgICAgICAgIC5jcmVhdGUoZGlyZWN0b3J5KVxuICAgICAgICAgICAgICAgIC5zZXRQcmVmaXgocHJlZml4KVxuICAgICAgICAgICAgICAgIC5zZXRSb3V0ZXIocm91dGVyKVxuICAgICAgICAgICAgICAgIC5zZXRNb2R1bGUodGhpcy5pZClcbiAgICAgICAgICAgICAgICAubG9hZCgpXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGFwaURpciBvZiB0aGlzLmFwaURpcmVjdG9yaWVzKSB7XG4gICAgICAgICAgICByb3V0ZXIuYWRkRGlyKGFwaURpciwge1xuICAgICAgICAgICAgICAgIG1vZHVsZTogdGhpcy5pZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQXBpRm9sZGVyKGRpcmVjdG9yeTogc3RyaW5nLCBvcHRpb25zOiBBZGRBcGlGb2xkZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5hcGlGb2xkZXJzLnNldChkaXJlY3RvcnksIG9wdGlvbnMpXG4gICAgfVxuXG4gICAgcHVibGljIGFkZFJvdXRlckZvbGRlcihkaXJlY3Rvcnk6IHN0cmluZykge1xuICAgICAgICB0aGlzLmFwaURpcmVjdG9yaWVzLmFkZChkaXJlY3RvcnkpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tUGx1Z2luRGlzY292ZXJFbnRpdHk8VD4odGhpczogbmV3ICgpID0+IFQsIGVudGl0eTogUGx1Z2luRW50cnlFbnRpdHkpOiBUIHtcbiAgICAgICAgY29uc3QgY29udHJ1Y3RvciA9ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBQbHVnaW5FbnRpdHkpIGFzIGFueVxuXG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IGNvbnRydWN0b3IoKSBhcyBhbnlcblxuICAgICAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICBuYW1lOiBlbnRpdHkubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IGVudGl0eS52ZXJzaW9uLFxuICAgICAgICAgICAgZGlyZWN0b3J5OiBlbnRpdHkuZGlyZWN0b3J5LFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb250cnVjdG9yPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGF5bG9hZCA9IChjb250cnVjdG9yIGFzIGFueSkucGFyc2UoZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcyBhcyBhbnkpPy5wYXJzZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcGF5bG9hZCA9ICh0aGlzIGFzIGFueSkucGFyc2UoZW50aXR5KVxuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZSBhcyBhbnksIHBheWxvYWQpXG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlXG4gICAgfVxuXG5cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VSZWxhdGlvbiB7XG5cbiAgICBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJylcblxuICAgICAgICBPYmplY3QuYXNzaWduKGVycm9yLCB7IGVudGl0aWVzIH0pXG5cbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VSZWxhdGlvbiBmcm9tICcuL0Jhc2VSZWxhdGlvbi50cydcbmltcG9ydCBkYiBmcm9tICcjc2VydmVyL2ZhY2FkZXMvZGF0YWJhc2UudHMnXG5cbmludGVyZmFjZSBCZWxvbmdzVG9PcHRpb25zIHtcbiAgICB0YWJsZTogc3RyaW5nXG4gICAgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHRhcmdldFRhYmxlOiBzdHJpbmdcbiAgICB0YXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHJvcGVydHk6IHN0cmluZ1xuICAgIHNlcmlhbGl6ZT86IChyb3c6IGFueSkgPT4gYW55XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlbG9uZ3NUbyBleHRlbmRzIEJhc2VSZWxhdGlvbiB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuICAgIHB1YmxpYyBzZXJpYWxpemU6IChyb3c6IGFueSkgPT4gYW55XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBCZWxvbmdzVG9PcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy50YWJsZSA9IG9wdGlvbnMudGFibGVcbiAgICAgICAgdGhpcy50YWJsZUtleSA9IG9wdGlvbnMudGFibGVLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGFyZ2V0VGFibGUgPSBvcHRpb25zLnRhcmdldFRhYmxlXG4gICAgICAgIHRoaXMudGFyZ2V0S2V5ID0gb3B0aW9ucy50YXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgIH1cblxuICAgIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IFsuLi5uZXcgU2V0KGVudGl0aWVzLm1hcChlID0+IGVbdGhpcy50YXJnZXRLZXldKS5maWx0ZXIoQm9vbGVhbikpXVxuICAgICAgICBcbiAgICAgICAgaWYgKCFpZHMubGVuZ3RoKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUodGhpcy50YWJsZUtleSwgJ2luJywgaWRzKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzLm1hcCgocjogYW55KSA9PiB0aGlzLnNlcmlhbGl6ZShyKSlcblxuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKHJvd3MubWFwKChyOiBhbnkpID0+IFtyW3RoaXMudGFibGVLZXldLCByXSkpXG4gICAgICAgIFxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZVt0aGlzLnByb3BlcnR5XSA9IG1hcC5nZXQoZVt0aGlzLnRhcmdldEtleV0pIHx8IG51bGxcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gtZXMnXG5pbXBvcnQgQmVsb25nc1RvIGZyb20gJy4vQmVsb25nc1RvUmVsYXRpb24udHMnXG5pbXBvcnQgQmFzZVJlbGF0aW9uIGZyb20gJy4vQmFzZVJlbGF0aW9uLnRzJ1xuaW1wb3J0IEZpbGUgZnJvbSAnI3NlcnZlci9lbnRpdGllcy9GaWxlRW50aXR5LnRzJ1xuXG5leHBvcnQgY2xhc3MgTG9hZEZpbGVNZXRhcyBleHRlbmRzIEJhc2VSZWxhdGlvbiB7XG4gICAgcHVibGljIGZpbGVLZXk6IHN0cmluZ1xuICAgIHB1YmxpYyBwcm9wZXJ0eTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihmaWxlS2V5OiBzdHJpbmcgPSAnZmlsZScsIHByb3BlcnR5OiBzdHJpbmcgPSAndXJsJykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMuZmlsZUtleSA9IGZpbGVLZXlcbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGxvYWQoZW50aXRpZXM6IGFueVtdKSB7XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlW10gPSBlbnRpdGllcy5tYXAoZSA9PiBlW3RoaXMuZmlsZUtleV0pLmZpbHRlcigoZik6IGYgaXMgRmlsZSA9PiBmIGluc3RhbmNlb2YgRmlsZSlcblxuICAgICAgICBhd2FpdCBGaWxlLmxvYWQoZmlsZXMsICdtZXRhcycpXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9hZEZpbGVVcmwgZXh0ZW5kcyBCYXNlUmVsYXRpb24ge1xuICAgIHB1YmxpYyBmaWxlS2V5OiBzdHJpbmdcbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IoZmlsZUtleTogc3RyaW5nID0gJ2ZpbGUnLCBwcm9wZXJ0eTogc3RyaW5nID0gJ3VybCcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmZpbGVLZXkgPSBmaWxlS2V5XG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudGl0eSBvZiBlbnRpdGllcykge1xuICAgICAgICAgICAgY29uc3QgZmlsZTogRmlsZSB8IG51bGwgPSBlbnRpdHlbdGhpcy5maWxlS2V5XVxuXG4gICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGZpbGUubG9hZFVybCgpXG4gICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICBzZXQoZW50aXR5LCB0aGlzLnByb3BlcnR5LCBmaWxlID8gZmlsZS51cmwgOiBudWxsKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCZWxvbmdzVG9GaWxlIGV4dGVuZHMgQmVsb25nc1RvIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eTogc3RyaW5nID0gJ2ZpbGUnLCB0YXJnZXRLZXk6IHN0cmluZyA9ICdmaWxlX2lkJykge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0YWJsZTogJ2ZpbGVzJyxcbiAgICAgICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YXJnZXRUYWJsZTogJ2ZpbGVzJyxcbiAgICAgICAgICAgIHRhcmdldEtleTogdGFyZ2V0S2V5LFxuXG4gICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksXG4gICAgICAgICAgICBzZXJpYWxpemU6IHJvdyA9PiBGaWxlLmZyb20ocm93KVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyB1cmwocHJvcGVydHk6IHN0cmluZyA9ICd1cmwnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG9hZEZpbGVVcmwodGhpcy5wcm9wZXJ0eSwgcHJvcGVydHkpXG4gICAgfVxuXG4gICAgcHVibGljIG1ldGFzKHByb3BlcnR5OiBzdHJpbmcgPSAnbWV0YXMnKSB7XG4gICAgICAgIHJldHVybiBuZXcgTG9hZEZpbGVNZXRhcyh0aGlzLnByb3BlcnR5LCBwcm9wZXJ0eSlcbiAgICB9XG59XG4iLCJpbXBvcnQgQmVsb25nc1RvIGZyb20gJy4vQmVsb25nc1RvUmVsYXRpb24udHMnXG5pbXBvcnQgVXNlciBmcm9tICcjc2hhcmVkL2VudGl0aWVzL1VzZXJFbnRpdHkudHMnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJlbG9uZ3NUb1VzZXIgZXh0ZW5kcyBCZWxvbmdzVG8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICB0YWJsZTogJ3VzZXJzJyxcbiAgICAgICAgICAgIHRhYmxlS2V5OiAnaWQnLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICB0YXJnZXRUYWJsZTogJ3VzZXJzJyxcbiAgICAgICAgICAgIHRhcmdldEtleTogJ3VzZXJfaWQnLFxuXG4gICAgICAgICAgICBwcm9wZXJ0eTogJ3VzZXInLFxuICAgICAgICAgICAgc2VyaWFsaXplOiByb3cgPT4gVXNlci5mcm9tKHJvdylcbiAgICAgICAgfSlcblxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgRGF0YWJhc2VDb250cmFjdCBhcyAgRGF0YWJhc2UgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9EYXRhYmFzZUNvbnRyYWN0LnRzJ1xuaW1wb3J0IGRiIGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9kYXRhYmFzZS50cydcblxuaW50ZXJmYWNlIEhhc01hbnlPcHRpb25zIHtcbiAgICB0YWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgdGFyZ2V0VGFibGU6IGtleW9mIERhdGFiYXNlXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmdcblxuICAgIHByb3BlcnR5OiBzdHJpbmdcbiAgICBzZXJpYWxpemU/OiAocm93OiBhbnkpID0+IGFueVxuICAgIGFmdGVyPzogKHJvd3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGFzTWFueSB7XG4gICAgcHVibGljIHRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFibGVLZXk6IHN0cmluZ1xuICAgIFxuICAgIHB1YmxpYyB0YXJnZXRUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZ1xuICAgIHB1YmxpYyBzZXJpYWxpemU6IChyb3c6IGFueSkgPT4gYW55XG4gICAgcHVibGljIGFmdGVyOiAocm93czogYW55W10pID0+IFByb21pc2U8YW55PlxuXG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSGFzTWFueU9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy50YWJsZSA9IG9wdGlvbnMudGFibGVcbiAgICAgICAgdGhpcy50YWJsZUtleSA9IG9wdGlvbnMudGFibGVLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMudGFyZ2V0VGFibGUgPSBvcHRpb25zLnRhcmdldFRhYmxlXG4gICAgICAgIHRoaXMudGFyZ2V0S2V5ID0gb3B0aW9ucy50YXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgICAgICB0aGlzLmFmdGVyID0gb3B0aW9ucy5hZnRlciB8fCAoYXN5bmMgKHJvd3M6IGFueVtdKSA9PiByb3dzKVxuXG4gICAgfVxuXG4gICAgYXN5bmMgbG9hZChlbnRpdGllczogYW55W10pIHtcbiAgICAgICAgY29uc3QgaWRzID0gbmV3IFNldCgpXG5cbiAgICAgICAgZW50aXRpZXMuZm9yRWFjaChlID0+IGlkcy5hZGQoZVt0aGlzLnRhYmxlS2V5XSkpXG4gICAgICAgIFxuICAgICAgICBpZiAoIWlkcy5zaXplKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIC8vIEFzc3VtZXMgeW91ciBtb2RlbHMgaGF2ZSBhIHN0YW5kYXJkIC5saXN0KCkgb3IgLndoZXJlKClcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHF1ZXJ5LnNlbGVjdEFsbCgpXG4gICAgICAgICAgICAud2hlcmUodGhpcy50YXJnZXRLZXksICdpbicsIEFycmF5LmZyb20oaWRzKSlcbiAgICAgICAgICAgIC5leGVjdXRlKClcblxuICAgICAgICBjb25zdCByb3dzID0gcmVzdWx0cy5tYXAoKHI6IGFueSkgPT4gdGhpcy5zZXJpYWxpemUocikpXG4gICAgICAgIFxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgZVt0aGlzLnByb3BlcnR5XSA9IHJvd3MuZmlsdGVyKChyOiBhbnkpID0+IHJbdGhpcy50YXJnZXRLZXldID09PSBlW3RoaXMudGFibGVLZXldKVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXIocm93cylcbiAgICB9XG59XG4iLCJpbXBvcnQgQmFzZVJlbGF0aW9uIGZyb20gJy4vQmFzZVJlbGF0aW9uLnRzJ1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUNvbnRyYWN0IGFzICBEYXRhYmFzZSB9IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL0RhdGFiYXNlQ29udHJhY3QudHMnXG5pbXBvcnQgZGIgZnJvbSAnI3NlcnZlci9mYWNhZGVzL2RhdGFiYXNlLnRzJ1xuXG5pbnRlcmZhY2UgSGFzTWFueVRocm91Z2hPcHRpb25zIHtcbiAgICB0YWJsZToga2V5b2YgRGF0YWJhc2VcbiAgICB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgdGFyZ2V0VGFibGU6IGtleW9mIERhdGFiYXNlXG4gICAgdGFyZ2V0S2V5OiBzdHJpbmdcbiAgICBcbiAgICBwaXZvdFRhYmxlOiBrZXlvZiBEYXRhYmFzZVxuICAgIHBpdm90U291cmNlS2V5OiBzdHJpbmdcbiAgICBwaXZvdFRhcmdldEtleTogc3RyaW5nXG5cbiAgICBwcm9wZXJ0eTogc3RyaW5nXG4gICAgc2VyaWFsaXplPzogKHJvdzogYW55KSA9PiBhbnlcbiAgICBhZnRlcj86IChyb3dzOiBhbnlbXSkgPT4gUHJvbWlzZTxhbnk+XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhc01hbnlUaHJvdWdoIGV4dGVuZHMgQmFzZVJlbGF0aW9uIHtcbiAgICBwdWJsaWMgdGFibGU6IHN0cmluZ1xuICAgIHB1YmxpYyB0YWJsZUtleTogc3RyaW5nXG4gICAgXG4gICAgcHVibGljIHRhcmdldFRhYmxlOiBzdHJpbmdcbiAgICBwdWJsaWMgdGFyZ2V0S2V5OiBzdHJpbmdcbiAgICBcbiAgICBwdWJsaWMgcGl2b3RUYWJsZTogc3RyaW5nXG4gICAgcHVibGljIHBpdm90U291cmNlS2V5OiBzdHJpbmdcbiAgICBwdWJsaWMgcGl2b3RUYXJnZXRLZXk6IHN0cmluZ1xuXG4gICAgcHVibGljIHByb3BlcnR5OiBzdHJpbmdcbiAgICBwdWJsaWMgc2VyaWFsaXplOiAocm93OiBhbnkpID0+IGFueVxuICAgIHB1YmxpYyBhZnRlcjogKHJvd3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT5cblxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEhhc01hbnlUaHJvdWdoT3B0aW9ucykge1xuICAgICAgICBzdXBlcigpXG4gICAgICAgIHRoaXMudGFibGUgPSBvcHRpb25zLnRhYmxlXG4gICAgICAgIHRoaXMudGFibGVLZXkgPSBvcHRpb25zLnRhYmxlS2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnRhcmdldFRhYmxlID0gb3B0aW9ucy50YXJnZXRUYWJsZVxuICAgICAgICB0aGlzLnRhcmdldEtleSA9IG9wdGlvbnMudGFyZ2V0S2V5XG4gICAgICAgIFxuICAgICAgICB0aGlzLnBpdm90VGFibGUgPSBvcHRpb25zLnBpdm90VGFibGVcbiAgICAgICAgdGhpcy5waXZvdFNvdXJjZUtleSA9IG9wdGlvbnMucGl2b3RTb3VyY2VLZXlcbiAgICAgICAgdGhpcy5waXZvdFRhcmdldEtleSA9IG9wdGlvbnMucGl2b3RUYXJnZXRLZXlcbiAgICAgICAgXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBvcHRpb25zLnByb3BlcnR5XG4gICAgICAgIHRoaXMuc2VyaWFsaXplID0gb3B0aW9ucy5zZXJpYWxpemUgfHwgKChyb3c6IGFueSkgPT4gcm93KVxuICAgICAgICB0aGlzLmFmdGVyID0gb3B0aW9ucy5hZnRlciB8fCAoYXN5bmMgKHJvd3M6IGFueSkgPT4gcm93cylcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKGVudGl0aWVzOiBhbnlbXSkge1xuICAgICAgICBjb25zdCBpZHMgPSBuZXcgU2V0KClcblxuICAgICAgICBlbnRpdGllcy5mb3JFYWNoKGUgPT4gaWRzLmFkZChlW3RoaXMudGFibGVLZXldKSlcblxuICAgICAgICBpZiAoIWlkcy5zaXplKSByZXR1cm5cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGRiLnNlbGVjdEZyb20odGhpcy50YXJnZXRUYWJsZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBxdWVyeVxuICAgICAgICAgICAgLnNlbGVjdEFsbCh0aGlzLnRhcmdldFRhYmxlKVxuICAgICAgICAgICAgLmlubmVySm9pbihcbiAgICAgICAgICAgICAgICB0aGlzLnBpdm90VGFibGUgYXMgYW55LFxuICAgICAgICAgICAgICAgIGAke3RoaXMudGFyZ2V0VGFibGV9LiR7dGhpcy50YXJnZXRLZXl9YCxcbiAgICAgICAgICAgICAgICBgJHt0aGlzLnBpdm90VGFibGV9LiR7dGhpcy5waXZvdFRhcmdldEtleX1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAud2hlcmUoYCR7dGhpcy5waXZvdFRhYmxlfS4ke3RoaXMucGl2b3RTb3VyY2VLZXl9YCwgJ2luJywgQXJyYXkuZnJvbShpZHMpKVxuICAgICAgICAgICAgLmV4ZWN1dGUoKVxuXG4gICAgICAgIGNvbnN0IHJvd3MgPSByZXN1bHRzLm1hcCgocjogYW55KSA9PiB0aGlzLnNlcmlhbGl6ZShyKSlcbiAgICAgICAgXG4gICAgICAgIGVudGl0aWVzLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBlW3RoaXMucHJvcGVydHldID0gcm93cy5maWx0ZXIoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiByW3RoaXMucGl2b3RTb3VyY2VLZXldID09PSBlW3RoaXMudGFibGVLZXldXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXIoZW50aXRpZXMpXG4gICAgfVxufVxuIiwiaW1wb3J0IHR5cGUgeyBUb2tlbiwgVXNlckVudGl0eSB9IGZyb20gJ0BzaWRla2ljay1jb2Rlci96ZW5pdGgta2l0L3NoYXJlZCdcbmltcG9ydCB0eXBlIHsgIE1pZGRsZXdhcmUsIH0gZnJvbSAnI3NlcnZlci9jb250cmFjdHMvUm91dGVyQ29udHJhY3QudHMnXG5pbXBvcnQgeyBCYXNlRXhjZXB0aW9uIH0gZnJvbSAnI3NoYXJlZC9pbmRleC50cydcblxuZXhwb3J0IHR5cGUgQXV0aE1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI6IFVzZXJFbnRpdHlcbiAgICB0b2tlbjogVG9rZW5cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXV0aE1pZGRsZXdhcmUgaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKGN0eDogYW55KTogUHJvbWlzZTxBdXRoTWlkZGxld2FyZUNvbnRleHQ+IHtcbiAgICAgICAgaWYgKCFjdHgudXNlciB8fCAhY3R4LnRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignSW52YWxpZCBhdXRoZW50aWNhdGlvbiB0b2tlbicsIDQwMSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1c2VyOiBjdHgudXNlciEsXG4gICAgICAgICAgICB0b2tlbjogY3R4LnRva2VuISxcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gJ0BzaWRla2ljay1jb2Rlci96ZW5pdGgta2l0L3NoYXJlZCdcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSwgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9Sb3V0ZXJDb250cmFjdC50cydcbmltcG9ydCB0eXBlIFVzZXIgZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9Vc2VyRW50aXR5LnRzJ1xuaW1wb3J0IHRva2VuUmVwb3NpdG9yeSBmcm9tICcjc2VydmVyL2ZhY2FkZXMvdG9rZW5SZXBvc2l0b3J5LnRzJ1xuaW1wb3J0IHVzZXJSZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy91c2VyUmVwb3NpdG9yeS50cydcbmltcG9ydCB0eXBlIHsgSHR0cENvbnRleHQgfSBmcm9tICcjc2VydmVyL2NvbnRyYWN0cy9IdHRwQ29udGV4dENvbnRyYWN0LnRzJ1xuXG5leHBvcnQgdHlwZSBBdXRoU2lsZW5jZU1pZGRsZXdhcmVDb250ZXh0ID0ge1xuICAgIHVzZXI/OiBVc2VyXG4gICAgdG9rZW4/OiBUb2tlblxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBdXRoU2lsZW5jZU1pZGRsZXdhcmUgaW1wbGVtZW50cyBNaWRkbGV3YXJlIHtcbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlKGN0eDogSHR0cENvbnRleHQpOiBQcm9taXNlPEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQ+IHtcbiAgICAgICAgLy8gRXhhbXBsZSBhdXRoZW50aWNhdGlvbiBsb2dpY1xuICAgICAgICBsZXQgdG9rZW4gPSBjdHguY29va2llLmdldCgnQXV0aG9yaXphdGlvbicpXG5cbiAgICAgICAgaWYgKGN0eC5yZXF1ZXN0ICYmIGN0eC5yZXF1ZXN0LmhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSkge1xuICAgICAgICAgICAgdG9rZW4gPSBjdHgucmVxdWVzdC5oZWFkZXJzWydhdXRob3JpemF0aW9uJ11cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi5zdGFydHNXaXRoKCdCZWFyZXIgJykpIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc2xpY2UoNykgLy8gUmVtb3ZlICdCZWFyZXIgJyBwcmVmaXhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB7IFxuICAgICAgICAgICAgICAgIHVzZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0b2tlbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG9rZW5Sb3cgPSBhd2FpdCB0b2tlblJlcG9zaXRvcnkuZmluZEJ5VG9rZW4odG9rZW4pXG4gICAgICAgIGxldCB1c2VyOiBVc2VyIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgICAgaWYgKHRva2VuUm93KSB7XG4gICAgICAgICAgICB1c2VyID0gYXdhaXQgdXNlclJlcG9zaXRvcnkuZmluZE9yRmFpbCh0b2tlblJvdy51c2VyX2lkKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgXG4gICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgdG9rZW46IHRva2VuUm93IHx8IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB0eXBlIHsgQXV0aFNpbGVuY2VNaWRkbGV3YXJlQ29udGV4dCB9IGZyb20gJy4vQXV0aFNpbGVuY2VNaWRkbGV3YXJlLnRzJ1xuaW1wb3J0IHR5cGUge1xuICAgIE1pZGRsZXdhcmUsIFxuICAgIE1pZGRsZXdhcmVIYW5kbGVSZXN1bHQgXG59IGZyb20gJyNzZXJ2ZXIvY29udHJhY3RzL1JvdXRlckNvbnRyYWN0LnRzJ1xuXG5pbXBvcnQgQWNsIGZyb20gJyNzZXJ2ZXIvZW50aXRpZXMvQWNsRW50aXR5LnRzJ1xuaW1wb3J0IFBlcm1pc3Npb24gZnJvbSAnI3NoYXJlZC9lbnRpdGllcy9QZXJtaXNzaW9uRW50aXR5LnRzJ1xuaW1wb3J0IGNvbmZpZyBmcm9tICcjc2VydmVyL2ZhY2FkZXMvY29uZmlnLnRzJ1xuaW1wb3J0IGxvZ2dlciBmcm9tICcjc2VydmVyL2ZhY2FkZXMvbG9nZ2VyLnRzJ1xuaW1wb3J0IHBlcm1pc3Npb25SZXBvc2l0b3J5IGZyb20gJyNzZXJ2ZXIvZmFjYWRlcy9wZXJtaXNzaW9uUmVwb3NpdG9yeS50cydcbmltcG9ydCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkgZnJvbSAnI3NlcnZlci9mYWNhZGVzL3Blcm1pc3Npb25Bc3NpZ25tZW50UmVwb3NpdG9yeS50cydcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXphdGlvbkNvbnRleHQgPSBNaWRkbGV3YXJlSGFuZGxlUmVzdWx0PFtBdXRob3JpemF0aW9uTWlkZGxld2FyZV0+XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWQge1xuICAgIGFjdGlvbjogc3RyaW5nXG4gICAgcmVzb3VyY2U6IHN0cmluZ1xuICAgIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRob3JpemVQZXJtaXNzaW9uIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uczogQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWRbXVxuXG4gICAgY29uc3RydWN0b3IocGF5bG9hZDogQXV0aG9yaXplUGVybWlzc2lvblBheWxvYWQgfCBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZFtdKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpID8gcGF5bG9hZCA6IFtwYXlsb2FkXVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGUoY3R4OiBBdXRob3JpemF0aW9uQ29udGV4dCkge1xuICAgICAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5wZXJtaXNzaW9ucykge1xuICAgICAgICAgICAgY3R4LmFjbC5hdXRob3JpemUoXG4gICAgICAgICAgICAgICAgcC5hY3Rpb24sXG4gICAgICAgICAgICAgICAgcC5yZXNvdXJjZSxcbiAgICAgICAgICAgICAgICBwLmNvbmRpdGlvbnMgfHwge30sXG4gICAgICAgICAgICApXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dGhvcml6YXRpb25NaWRkbGV3YXJlIGltcGxlbWVudHMgTWlkZGxld2FyZSB7XG4gICAgcHVibGljIGFzeW5jIGhhbmRsZShjdHg6IEF1dGhTaWxlbmNlTWlkZGxld2FyZUNvbnRleHQpe1xuICAgICAgICBjb25zdCB0b2tlbiA9IGN0eC50b2tlblxuICAgICAgICBsZXQgY3VycmVudFBlcm1pc3Npb25zOiBQZXJtaXNzaW9uW10gPSBbXVxuICAgICAgICBjb25zdCBwZXJtaXNzaW9uQ29udGV4dCA9IHt9IGFzIFJlY29yZDxzdHJpbmcsIGFueT5cblxuICAgICAgICAvLyBpZiBhdXRoIHRva2VuIGxvYWQgcGVybWlzc2lvbnMgZm9yIHVzZXJcbiAgICAgICAgaWYgKGN0eC51c2VyICYmIHRva2VuPy50eXBlID09PSAnYXV0aCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gYXdhaXQgcGVybWlzc2lvbkFzc2lnbm1lbnRSZXBvc2l0b3J5LmZpbmRNYW55KHtcbiAgICAgICAgICAgICAgICBhc3NpZ25hYmxlSWQ6IFN0cmluZyhjdHgudXNlci5pZCksXG4gICAgICAgICAgICAgICAgYXNzaWduYWJsZVR5cGU6ICd1c2VyJ1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY3VycmVudFBlcm1pc3Npb25zID0gYXdhaXQgcGVybWlzc2lvblJlcG9zaXRvcnkuZmluZE1hbnkoeyBpZDogYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSB9KVxuXG4gICAgICAgICAgICBwZXJtaXNzaW9uQ29udGV4dC5hdXRoID0ge1xuICAgICAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGN0eC51c2VyLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjdHgudXNlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogY3R4LnVzZXIuZW1haWwsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0b2tlbiAmJiB0b2tlbi50eXBlID09PSAnYXBpJykge1xuICAgICAgICAgICAgY29uc3QgYXNzaWdubWVudHMgPSBhd2FpdCBwZXJtaXNzaW9uQXNzaWdubWVudFJlcG9zaXRvcnkuZmluZE1hbnkoe1xuICAgICAgICAgICAgICAgIGFzc2lnbmFibGVJZDogU3RyaW5nKHRva2VuLmlkKSxcbiAgICAgICAgICAgICAgICBhc3NpZ25hYmxlVHlwZTogJ3Rva2VuJ1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY3VycmVudFBlcm1pc3Npb25zID0gYXdhaXQgcGVybWlzc2lvblJlcG9zaXRvcnkuZmluZE1hbnkoeyBpZDogYXNzaWdubWVudHMubWFwKGEgPT4gYS5wZXJtaXNzaW9uX2lkKSB9KVxuXG4gICAgICAgICAgICBwZXJtaXNzaW9uQ29udGV4dC5hcGkgPSB7XG4gICAgICAgICAgICAgICAgdG9rZW46IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRva2VuLmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IFBlcm1pc3Npb24uYXBwbHlDb250ZXh0KGN1cnJlbnRQZXJtaXNzaW9ucywgcGVybWlzc2lvbkNvbnRleHQpXG5cbiAgICAgICAgY29uc3QgYWNsID0gbmV3IEFjbCh7XG4gICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgIGRlYnVnOiBjb25maWcuZ2V0KCdhY2wuZGVidWcnKSB8fCBjb25maWcuZ2V0KCdhcHAuZGVidWcnKSxcbiAgICAgICAgICAgIGxvZ2dlcjogbG9nZ2VyLmNoaWxkKHsgbGFiZWw6ICdhY2wnIH0pLFxuICAgICAgICB9KVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHsgYWNsIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZShwYXlsb2FkOiBBdXRob3JpemVQZXJtaXNzaW9uUGF5bG9hZCB8IEF1dGhvcml6ZVBlcm1pc3Npb25QYXlsb2FkW10pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBBdXRob3JpemVQZXJtaXNzaW9uKHBheWxvYWQpXG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZUV4Y2VwdGlvbiB9IGZyb20gJyNzaGFyZWQvaW5kZXgudHMnXG5pbXBvcnQgdHlwZSB7IExvYWRlciwgTG9hZGVyUmVjb3JkIH0gZnJvbSAnLi9kZWZpbmVMb2FkZXIudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2FkZXJGYWN0b3J5PEUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gUmVjb3JkPHN0cmluZywgYW55PiwgUiBleHRlbmRzIExvYWRlclJlY29yZDxFPiA9IExvYWRlclJlY29yZDxFPj4obG9hZGVyczogUikge1xuICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWQoZW50aXRpZXM6IEUgfCBFW10sIG5hbWVzOiBrZXlvZiBSIHwgKGtleW9mIFIpW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGVudGl0aWVzKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXVxuICAgICAgICBjb25zdCByZWxhdGlvbk5hbWVzID0gQXJyYXkuaXNBcnJheShuYW1lcykgPyBuYW1lcyA6IFtuYW1lc11cblxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVsYXRpb25OYW1lcykge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gbG9hZGVycz8uW25hbWUgYXMgc3RyaW5nXSBhcyBMb2FkZXJcblxuICAgICAgICAgICAgaWYgKCFsb2FkZXIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTG9hZGVyICR7U3RyaW5nKG5hbWUpfSBub3QgZGVjbGFyZWRgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBsb2FkZXIubG9hZChpdGVtcylcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5czogT2JqZWN0LmtleXMobG9hZGVycykgYXMgKGtleW9mIFIpW10sXG4gICAgICAgIGxvYWRlcnMsXG4gICAgICAgIGxvYWQgXG4gICAgfVxufVxuXG4iLCJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0bydcblxuZXhwb3J0IGZ1bmN0aW9uIGN1aWQoKXtcbiAgICBjb25zdCByYW5kb21CeXRlcyA9IG5ldyBVaW50OEFycmF5KDgpXG4gICAgXG4gICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhyYW5kb21CeXRlcylcbiAgICBcbiAgICBjb25zdCByYW5kb20gPSBBcnJheS5mcm9tKHJhbmRvbUJ5dGVzLCBiID0+IGIudG9TdHJpbmcoMzYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpXG4gIFxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCkudG9TdHJpbmcoMzYpXG5cbiAgICByZXR1cm4gYGMke3RpbWVzdGFtcH0ke3JhbmRvbS5zbGljZSgwLCAxMil9YFxufVxuXG4iLCJpbXBvcnQgdHlwZSB7IEh0dHBDb250ZXh0IH0gZnJvbSBcIiNzZXJ2ZXIvY29udHJhY3RzL0h0dHBDb250ZXh0Q29udHJhY3QudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVyIHtcbiAgICAoY3R4OiBIdHRwQ29udGV4dCk6IFByb21pc2U8YW55PiB8ICgoKSA9PiBhbnkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVIYW5kbGVyKGhhbmRsZXI6IEhhbmRsZXIpOiBIYW5kbGVyIHtcbiAgICByZXR1cm4gaGFuZGxlclxufVxuIiwiaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYidcbmltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5cbi8vIGdlbmVyYXRlIGluZGV4ZXMgZm9yIGZvbGRlcnMgXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVJbmRleEZpbGUob3B0aW9uczogYW55KSB7XG4gICAgY29uc3QgZm9sZGVycyA9IG9wdGlvbnMuZm9sZGVyc1xuICAgIGNvbnN0IGZpbGVuYW1lID0gb3B0aW9ucy5maWxlbmFtZVxuICAgIGNvbnN0IHBhdHRlcm5zID0gb3B0aW9ucy5wYXR0ZXJucyB8fCBbXVxuICAgIGNvbnN0IGRlZmF1bHRJZ25vcmUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiKiovKi5zcGVjLnRzXCIsXG4gICAgICAgIFwiKiovKi5zcGVjLWQudHNcIixcbiAgICAgICAgXCIqKi8qLnRlc3QudHNcIixcbiAgICAgICAgXCIqKi8qLnRlc3QtZC50c1wiLFxuICAgIF1cblxuICAgIGlmIChvcHRpb25zLmZvbGRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgICAgICAgICAgcGF0dGVybnMucHVzaChgJHtmb2xkZXJ9LyoqLyoudHNgLCBgJHtmb2xkZXJ9LyoqLyouanNgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaWdub3JlID0gb3B0aW9ucy5pZ25vcmUgfHwgW11cblxuICAgIGxldCBjb250ZW50ID0gJydcblxuICAgIGNvbnN0IGZpbGVzID0gZmcuc3luYyhwYXR0ZXJucywge1xuICAgICAgICBpZ25vcmU6IFsuLi5kZWZhdWx0SWdub3JlLCAuLi5pZ25vcmVdLFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShmaWxlbmFtZSksIGZpbGUpXG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShmaWxlKVxuXG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUsICd1dGYtOCcpXG5cbiAgICAgICAgbGV0IHNob3VsZEV4cG9ydERlZmF1bHQgPSBmaWxlQ29udGVudC5pbmNsdWRlcygnZXhwb3J0IGRlZmF1bHQnKSAmJiAhZmlsZVBhdGguaW5jbHVkZXMoJ2dlbmVyYXRlSW5kZXhGaWxlLnRzJylcblxuICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnZ1ZScpKSB7XG4gICAgICAgICAgICBzaG91bGRFeHBvcnREZWZhdWx0ID0gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudCArPSBgZXhwb3J0ICogZnJvbSAnLi8ke2ZpbGVQYXRofSdcXG5gXG5cbiAgICAgICAgLy8gZGVmYXVsdCBleHBvcnQgXG4gICAgICAgIGlmIChzaG91bGRFeHBvcnREZWZhdWx0KSB7XG4gICAgICAgICAgICBjb250ZW50ICs9IGBleHBvcnQgeyBkZWZhdWx0IGFzICR7cGF0aC5iYXNlbmFtZShmaWxlLCBleHRlbnNpb24pfSB9IGZyb20gJy4vJHtmaWxlUGF0aH0nXFxuYFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29udGVudCA9IGNvbnRlbnQudHJpbSgpXG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVuYW1lLCBjb250ZW50KVxufVxuIiwiaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJ1xuaW1wb3J0IGZzIGZyb20gJ25vZGU6ZnMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRPbmUoZmlsZW5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8YW55PiB7XG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlbmFtZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVVybCA9IHBhdGhUb0ZpbGVVUkwoZmlsZW5hbWUpXG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZpbGVuYW1lKSkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChmaWxlVXJsLnRvU3RyaW5nKCkpXG5cbiAgICAgICAgcmV0dXJuIG1vZFxuICAgIH1cblxuICAgIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiIrbERBYUEsU0FBZ0IsR0FBWSxFQUFjLEVBQUUsQ0FBRSxFQUF5QixFQUFFLENBQUUsQ0FDdkUsSUFBTSxFQUFjLFFBQVEsT0FBTyxTQUFXLEdBSXhDLEVBQVEsSUFBSSxFQUFNLENBQ3BCLFNBQVUsR0FDVixtQkFBb0IsR0FDcEIsVUFBVyxDQU5FLEVBQVEsVUFBWSxLQUFLLE1BQU0sRUFBYyxHQUFJLENBQy9DLEtBQUssTUFBTSxFQUFjLEdBQUksQ0FLWCxDQUNwQyxDQUFDLENBRUYsSUFBSyxJQUFNLEtBQU8sT0FBTyxLQUFLLEVBQU8sQ0FDakMsRUFBTSxLQUFLLENBQUMsRUFBSyxPQUFPLEVBQU8sR0FBSyxDQUFDLENBQUMsQ0FHMUMsUUFBUSxJQUFJLEVBQU0sVUFBVSxDQUFDLENBR2pDLFNBQWdCLEdBQVcsRUFBYyxFQUF5QixDQUM5RCxJQUFNLEdBQWUsUUFBUSxPQUFPLFNBQVcsSUFBTSxFQUMvQyxFQUFPLEVBQUUsQ0FDVCxFQUFzQixFQUFFLENBRTFCLEdBQ0EsRUFBSyxLQUFLLEdBQUcsRUFBUSxDQUdwQixHQUNELEVBQU0sSUFBSyxHQUFjLE9BQU8sS0FBSyxFQUFLLENBQUMsQ0FDdEMsTUFBTSxDQUNOLFFBQVEsRUFBTyxFQUFPLElBQVMsRUFBSyxRQUFRLEVBQU0sR0FBSyxFQUFNLENBQzdELFFBQVMsR0FBUSxDQUNkLEVBQUssS0FBSyxDQUNOLE1BQU8sRUFD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
|