logixlysia 6.3.0 → 6.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -74,6 +74,11 @@ interface Options {
74
74
  disableFileLogging?: boolean;
75
75
  logFilePath?: string;
76
76
  logRotation?: LogRotationConfig;
77
+ /**
78
+ * Automatically redact sensitive information (PII) from logs.
79
+ * Masks emails, IP addresses, Luhn-valid payment card numbers, and JWTs in strings and deeply nested objects.
80
+ */
81
+ autoRedact?: boolean;
77
82
  pino?: (PinoLoggerOptions & {
78
83
  prettyPrint?: PrettyPrintConfig;
79
84
  }) | undefined;
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import{Elysia as Q$}from"elysia";import{createRequire as C}from"node:module";var j0=(()=>{try{return C(import.meta.url)("elysia/package.json")}catch{return{}}})(),J0=(()=>{try{return C(import.meta.url)("../../package.json")}catch{return{}}})(),Q0=($,b)=>{if($.length>=b)return $.slice(0,b);let I=Math.floor((b-$.length)/2),j=b-$.length-I;return`${" ".repeat(I)}${$}${" ".repeat(j)}`},n=($,b)=>{let I=j0.version,j=I?`Elysia v${I}`:"Elysia",G=[{kind:"empty"},{kind:"center",text:j},{kind:"empty"},{kind:"left",text:$}];if(b)G.push({kind:"left",text:b});G.push({kind:"empty"});let R=Math.max(j.length,$.length,...b?[b.length]:[0])+4,J=`┌${"─".repeat(R)}┐`,z=`└${"─".repeat(R)}┘`,N=`│${" ".repeat(R)}│`,Y=[J];for(let F of G){if(F.kind==="empty"){Y.push(N);continue}if(F.kind==="center"){Y.push(`│${Q0(F.text,R)}│`);continue}let V=F.text,H=Math.max(0,R-V.length-4);Y.push(`│ ${V}${" ".repeat(H)} │`)}return Y.push(z),Y.join(`
2
- `)},h=()=>{let $=J0.version;if(!$)return null;return` logixlysia v${$}`};var q=($,b)=>{if(!(b.config?.showStartupMessage??!0))return;let{port:j,hostname:G,protocol:X}=$;if(j===void 0||!G||!X)return;let R=`${X}://${G}:${j}`,J=`\uD83E\uDD8A Elysia is running at ${R}`,z=`\uD83E\uDD8A ${R}`;if((b.config?.startupMessageFormat??"banner")==="simple"){console.log(J);return}console.log(n(z,h()))};import J$ from"pino";var S=(...$)=>{let b=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:I,request:j,data:G,store:X,options:R}=b,J=R.config?.transports??[];if(J.length===0)return;let z=typeof G.message==="string"?G.message:"",N={request:{method:j.method,url:j.url},...G,beforeTime:X.beforeTime};for(let Y of J)try{let F=Y.log(I,z,N);if(F&&typeof F.catch==="function")F.catch(()=>{})}catch{}};import{appendFile as D0}from"node:fs/promises";import{dirname as M0}from"node:path";import{promises as Z0}from"node:fs";var g=async($)=>{await Z0.mkdir($,{recursive:!0})};import{promises as E}from"node:fs";import{promisify as V0}from"node:util";import{gzip as W0}from"node:zlib";import{promises as c}from"node:fs";import{basename as z0,dirname as K0}from"node:path";var N0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,B0=/^(\d+)(h|d|w)$/i,Y0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,v=($)=>{if(typeof $==="number")return $;let b=$.trim(),I=Number(b);if(Number.isFinite(I))return I;let j=b.match(N0);if(!j)throw Error(`Invalid size format: ${$}`);let G=Number(j[1]),X=j[2].toLowerCase(),R=1024;if(X.startsWith("m"))R=1048576;else if(X.startsWith("g"))R=1073741824;return Math.floor(G*R)},F0=($)=>{let b=$.trim().match(B0);if(!b)throw Error(`Invalid interval format: ${$}`);let I=Number(b[1]),j=b[2].toLowerCase(),G=3600000;if(j==="d")G=86400000;else if(j==="w")G=604800000;return I*G},p=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:F0($)}},d=async($,b)=>{try{return(await c.stat($)).size>b}catch{return!1}},x=async($)=>{let b=K0($),I=z0($),j;try{j=await c.readdir(b)}catch{return[]}return j.filter((G)=>G.startsWith(`${I}.`)&&Y0.test(G)).map((G)=>`${b}/${G}`)};var w0=V0(W0),_=($)=>String($).padStart(2,"0"),H0=($,b)=>{let I=b.getFullYear(),j=_(b.getMonth()+1),G=_(b.getDate()),X=_(b.getHours()),R=_(b.getMinutes()),J=_(b.getSeconds());return`${$}.${I}-${j}-${G}-${X}-${R}-${J}`},E0=async($)=>{try{if((await E.stat($)).size===0)return""}catch{return""}let b=H0($,new Date);return await E.rename($,b),b},U0=async($)=>{let b=await E.readFile($),I=await w0(b);await E.writeFile(`${$}.gz`,I),await E.rm($,{force:!0})},u=async($,b)=>{if(b.maxSize===void 0)return!1;let I=v(b.maxSize);return await d($,I)},f0=async($,b)=>{let I=await x($);if(I.length<=b)return;let j=await Promise.all(I.map(async(X)=>({path:X,stat:await E.stat(X)})));j.sort((X,R)=>R.stat.mtimeMs-X.stat.mtimeMs);let G=j.slice(b);await Promise.all(G.map(({path:X})=>E.rm(X,{force:!0})))},A0=async($,b)=>{let I=await x($);if(I.length===0)return;let j=Date.now(),X=(await Promise.all(I.map(async(R)=>({path:R,stat:await E.stat(R)})))).filter(({stat:R})=>j-R.mtimeMs>b);await Promise.all(X.map(({path:R})=>E.rm(R,{force:!0})))},i=async($,b)=>{let I=await E0($);if(!I)return;if(b.compress===!0){if((b.compression??"gzip")==="gzip")await U0(I)}if(b.maxFiles!==void 0){let G=p(b.maxFiles);if(G.type==="count")await f0($,G.value);else await A0($,G.value)}};var k=async(...$)=>{let b=typeof $[0]==="string"?(()=>{let[Z,K,B,U,f,D]=$;return{filePath:Z,level:K,request:B,data:U,store:f,options:D}})():$[0],{filePath:I,level:j,request:G,data:X,store:R,options:J}=b,z=J.config,N=z?.useTransportsOnly===!0,Y=z?.disableFileLogging===!0;if(N||Y)return;let F=typeof X.message==="string"?X.message:"",V=R.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-R.beforeTime)/1e6,H=`${j} ${V.toFixed(2)}ms ${G.method} ${new URL(G.url).pathname} ${F}
3
- `;await g(M0(I)),await D0(I,H,{encoding:"utf-8"});let W=z?.logRotation;if(!W)return;if(await u(I,W))await i(I,W)};import{STATUS_CODES as q0}from"node:http";import Q from"chalk";import{StatusMap as _0}from"elysia";var O0=/^\d+$/,T0=/[_-]+/g,L0=/([a-z0-9])([A-Z])/g,S0=/([A-Z])([A-Z][a-z])/g,k0=/['’]/g,y0=/[^a-z0-9\s]+/g,P0=/\s+/g,r=($)=>{let b=$.trim();if(!b)return"";return b.replace(T0," ").replace(L0,"$1 $2").replace(S0,"$1 $2").replace(k0,"").toLowerCase().replace(y0," ").replace(P0," ").trim()},m0=(()=>{let $=new Map;for(let[b,I]of Object.entries(_0))$.set(r(b),I);return $})(),o=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let b=$.trim();if(O0.test(b))return Number(b);return m0.get(r(b))??500}return 500};var y=($)=>{let b="An error occurred";if($ instanceof Error)b=$.message;else if($&&typeof $==="object"&&"message"in $)b=$.message;else b=String($);return b};var O=($)=>String($).padStart(2,"0"),c0=($)=>String($).padStart(3,"0"),x0=500,C0=1000,n0=7,h0="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",s=($)=>{let I=$.config?.useColors??!0,j=typeof process<"u"&&process.stdout?.isTTY===!0;return I&&j},g0=($,b)=>{if(!b)return $.toISOString();let I=String($.getFullYear()),j=O($.getMonth()+1),G=O($.getDate()),X=O($.getHours()),R=O($.getMinutes()),J=O($.getSeconds()),z=c0($.getMilliseconds());return b.replaceAll("yyyy",I).replaceAll("mm",j).replaceAll("dd",G).replaceAll("HH",X).replaceAll("MM",R).replaceAll("ss",J).replaceAll("SSS",z)},v0=($)=>{let b=$.headers.get("x-forwarded-for");if(b)return b.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},p0=($)=>{if($>=1000){let b=$/1000;if(b>=10)return`${Math.round(b)}s`;let I=b.toFixed(1);return I.endsWith(".0")?`${Math.round(b)}s`:`${I}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},d0=($)=>{let b=$.config;return{slow:b?.slowThreshold??x0,verySlow:b?.verySlowThreshold??C0}},u0=($,b,I)=>{let j=p0($),{slow:G,verySlow:X}=d0(I),R=$>=X;if(!b)return{text:j,isVerySlow:R};let J=j;if($<G)J=Q.green(j);else if($<X)J=Q.yellow(j);else J=Q.red.bold(j);return{text:J,isVerySlow:R}},i0=($,b)=>{if(!$)return"";let I="⚡ slow";if(!b)return` ${I}`;return` ${Q.yellow(I)}`},r0=($,b)=>{if(!b)return"\uD83E\uDD8A";if($==="ERROR")return Q.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return Q.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return Q.bgBlue.black(" \uD83E\uDD8A ");return Q.bgGreen.black(" \uD83E\uDD8A ")},o0=($,b)=>{if(!b)return $;if($==="ERROR")return Q.bgRed.black($);if($==="WARNING")return Q.bgYellow.black($);if($==="DEBUG")return Q.bgBlue.black($);return Q.bgGreen.black($)},s0=($,b)=>{if(!b)return $;let I=$.toUpperCase();if(I==="GET")return Q.green.bold(I);if(I==="POST")return Q.blue.bold(I);if(I==="PUT")return Q.yellow.bold(I);if(I==="PATCH")return Q.yellowBright.bold(I);if(I==="DELETE")return Q.red.bold(I);if(I==="OPTIONS")return Q.cyan.bold(I);if(I==="HEAD")return Q.greenBright.bold(I);if(I==="TRACE")return Q.magenta.bold(I);if(I==="CONNECT")return Q.cyanBright.bold(I);return Q.white.bold(I)},l0=($,b)=>{if(!b)return $;let I=Number.parseInt($,10);if(!Number.isFinite(I))return $;if(I>=500)return Q.red($);if(I>=400)return Q.yellow($);if(I>=300)return Q.cyan($);if(I>=200)return Q.green($);return Q.gray($)},a0=($,b)=>{if(!b)return $;return Q.gray($)},t0=($,b)=>{if(!b)return $;return Q.whiteBright($)},e0=($)=>{return q0[$]??""},$$=($,b)=>{let I=$.config?.service?.trim();if(!I)return"";let j=`[${I}]`;if(!b)return`${j} `;return`${Q.dim(j)} `},b$=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},I$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),l=($,b,I)=>{let j=[];for(let[G,X]of Object.entries($)){let R=b?`${b}.${G}`:G;if(I$(X)&&I>1)j.push(...l(X,R,I-1));else j.push([R,b$(X)])}return j},R$=($,b)=>{if($.length===0)return[];let I=[],j=$.length-1;for(let G=0;G<$.length;G++){let X=G===j?"└─":"├─",R=$[G];if(!R)continue;let[J,z]=R,N=b?Q.cyan(J):J,Y=b?Q.white(z):z;I.push(` ${X} ${N} ${Y}`)}return I};var X$=($,b,I)=>{if(I.config?.showContextTree===!1)return[];let j=s(I),G=I.config?.contextDepth??1,X=[],R=b.context;if(R&&typeof R==="object"&&!Array.isArray(R)&&Object.keys(R).length>0&&G>=1)X.push(...l(R,"",G));if($==="ERROR"&&"error"in b&&b.error!==void 0){let J=y(b.error);if(J)X.push(["error",J])}return R$(X,j)},G$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},P=({level:$,request:b,data:I,store:j,options:G})=>{let X=G.config,R=s(G),J=X?.customLogFormat??h0,z=new Date,N=String(z.getTime()),Y=g0(z,X?.timestamp?.translateTime),F=a0(Y,R),V=typeof I.message==="string"?I.message:"",H=j.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-j.beforeTime)/1e6,W=new URL(b.url).pathname,w=I.status,Z=w===null||w===void 0?200:o(w),K=String(Z),B=X?.ip===!0?v0(b):"",f=X?.showContextTree!==!1&&I.context&&typeof I.context==="object"&&!Array.isArray(I.context)&&Object.keys(I.context).length>0?"":G$(I.context),D=o0($,R),m=b.method.toUpperCase().padEnd(n0),T=s0(m,R),M=t0(W,R),A=l0(K,R),{text:L,isVerySlow:e}=u0(H,R,G),$0=i0(e,R),b0=r0($,R),I0=e0(Z),R0=$$(G,R),X0=J.replaceAll("{now}",F).replaceAll("{epoch}",N).replaceAll("{level}",D).replaceAll("{icon}",b0).replaceAll("{duration}",L).replaceAll("{method}",T).replaceAll("{pathname}",M).replaceAll("{path}",M).replaceAll("{status}",A).replaceAll("{statusText}",I0).replaceAll("{message}",V).replaceAll("{ip}",B).replaceAll("{context}",f).replaceAll("{service}",R0).replaceAll("{speed}",$0),G0=X$($,I,G);return{main:X0,contextLines:G0}};var j$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",a=($,b,I,j)=>{let G=j.config,X=G?.logFilter;if(X?.level&&X.level.length>0&&!X.level.includes("ERROR"))return;let R=G?.useTransportsOnly===!0,J=G?.disableInternalLogger===!0,z=G?.disableFileLogging===!0,N=j$(b)?b.status:500,Y=y(b),F="ERROR",V={status:N,message:Y,error:b};if(S({level:F,request:$,data:V,store:I,options:j}),!(R||z)){let Z=G?.logFilePath;if(Z)k({filePath:Z,level:F,request:$,data:V,store:I,options:j}).catch(()=>{})}if(R||J)return;let{main:H,contextLines:W}=P({level:F,request:$,data:V,store:I,options:j}),w=W.length>0?`${H}
4
- ${W.join(`
5
- `)}`:H;console.error(w)};var t=($={},b=J$)=>{let I=$.config,j=I?.pino,{prettyPrint:G,...X}=j??{},R=typeof G==="object"&&G!==null?G:void 0,z=(G===!0||R!==void 0)&&X.transport===void 0,N=R?.messageKey??X.messageKey,Y=R?.errorKey??X.errorKey,F=z?{target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:I?.timestamp?.translateTime,...R,messageKey:N,errorKey:Y}}:X.transport,V=b({...X,level:X.level??"info",messageKey:N,errorKey:Y,transport:F}),H=(Z,K)=>{if(!K?.level||K.level.length===0)return!0;return K.level.includes(Z)},W=(Z,K,B,U)=>{if(!H(Z,I?.logFilter))return;S({level:Z,request:K,data:B,store:U,options:$});let f=I?.useTransportsOnly===!0,D=I?.disableInternalLogger===!0,m=I?.disableFileLogging===!0;if(!(f||m)){let L=I?.logFilePath;if(L)k({filePath:L,level:Z,request:K,data:B,store:U,options:$}).catch(()=>{})}if(f||D)return;let{main:T,contextLines:M}=P({level:Z,request:K,data:B,store:U,options:$}),A=M.length>0?`${T}
6
- ${M.join(`
7
- `)}`:T;switch(Z){case"DEBUG":{console.debug(A);break}case"INFO":{console.info(A);break}case"WARNING":{console.warn(A);break}case"ERROR":{console.error(A);break}default:{console.log(A);break}}},w=(Z,K,B,U)=>{let f={beforeTime:process.hrtime.bigint()};W(Z,K,{message:B,context:U},f)};return{pino:V,log:W,handleHttpError:(Z,K,B)=>{a(Z,K,B,$)},debug:(Z,K,B)=>{w("DEBUG",Z,K,B)},info:(Z,K,B)=>{w("INFO",Z,K,B)},warn:(Z,K,B)=>{w("WARNING",Z,K,B)},error:(Z,K,B)=>{w("ERROR",Z,K,B)}}};var Z$=($={})=>{let b=new WeakSet,I=t($),j={...I,debug:(X,R,J)=>{b.add(X),I.debug(X,R,J)},info:(X,R,J)=>{b.add(X),I.info(X,R,J)},warn:(X,R,J)=>{b.add(X),I.warn(X,R,J)},error:(X,R,J)=>{b.add(X),I.error(X,R,J)}};return new Q$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",j).state("pino",j.pino).state("beforeTime",BigInt(0)).onStart(({server:X})=>{if(X)q(X,$);else{let R=Number(process.env.PORT)||3000,J=process.env.HOST||"localhost";q({port:R,hostname:J,protocol:"http"},$)}}).onRequest(({store:X})=>{X.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:X,set:R,store:J})=>{if(b.has(X))return;let z=typeof R.status==="number"?R.status:200,N="INFO";if(z>=500)N="ERROR";else if(z>=400)N="WARNING";j.log(N,X,{status:z},J)}).onError(({request:X,error:R,store:J})=>{j.handleHttpError(X,R,J)}).as("scoped")},e$=Z$;export{Z$ as logixlysia,e$ as default};
1
+ import{Elysia as S$}from"elysia";import{createRequire as s}from"node:module";var H0=(()=>{try{return s(import.meta.url)("elysia/package.json")}catch{return{}}})(),I0=(()=>{try{return s(import.meta.url)("../../package.json")}catch{return{}}})(),V0=($,Q)=>{if($.length>=Q)return $.slice(0,Q);let Z=Math.floor((Q-$.length)/2),J=Q-$.length-Z;return`${" ".repeat(Z)}${$}${" ".repeat(J)}`},l=($,Q)=>{let Z=H0.version,J=Z?`Elysia v${Z}`:"Elysia",X=[{kind:"empty"},{kind:"center",text:J},{kind:"empty"},{kind:"left",text:$}];if(Q)X.push({kind:"left",text:Q});X.push({kind:"empty"});let z=Math.max(J.length,$.length,...Q?[Q.length]:[0])+4,Y=`┌${"─".repeat(z)}┐`,B=`└${"─".repeat(z)}┘`,W=`│${" ".repeat(z)}│`,H=[Y];for(let I of X){if(I.kind==="empty"){H.push(W);continue}if(I.kind==="center"){H.push(`│${V0(I.text,z)}│`);continue}let U=I.text,V=Math.max(0,z-U.length-4);H.push(`│ ${U}${" ".repeat(V)} │`)}return H.push(B),H.join(`
2
+ `)},r=()=>{let $=I0.version;if(!$)return null;return` logixlysia v${$}`};var d=($,Q)=>{if(!(Q.config?.showStartupMessage??!0))return;let{port:J,hostname:X,protocol:K}=$;if(J===void 0||!X||!K)return;let z=`${K}://${X}:${J}`,Y=`\uD83E\uDD8A Elysia is running at ${z}`,B=`\uD83E\uDD8A ${z}`;if((Q.config?.startupMessageFormat??"banner")==="simple"){console.log(Y);return}console.log(l(B,r()))};import E$ from"pino";var q=(...$)=>{let Q=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:Z,request:J,data:X,store:K,options:z}=Q,Y=z.config?.transports??[];if(Y.length===0)return;let B=typeof X.message==="string"?X.message:"",W={request:{method:J.method,url:J.url},...X,beforeTime:K.beforeTime};for(let H of Y)try{let I=H.log(Z,B,W);if(I&&typeof I.catch==="function")I.catch(()=>{})}catch{}};import{appendFile as q0}from"node:fs/promises";import{dirname as x0}from"node:path";import{promises as F0}from"node:fs";var a=async($)=>{await F0.mkdir($,{recursive:!0})};import{promises as M}from"node:fs";import{promisify as w0}from"node:util";import{gzip as A0}from"node:zlib";import{promises as n}from"node:fs";import{basename as U0,dirname as M0}from"node:path";var O0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,_0=/^(\d+)(h|d|w)$/i,R0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}(?:-\d{3})?(?:-\d+)?)(?:\.gz)?$/,t=($)=>{if(typeof $==="number")return $;let Q=$.trim(),Z=Number(Q);if(Number.isFinite(Z))return Z;let J=Q.match(O0);if(!J)throw Error(`Invalid size format: ${$}`);let X=Number(J[1]),K=J[2].toLowerCase(),z=1024;if(K.startsWith("m"))z=1048576;else if(K.startsWith("g"))z=1073741824;return Math.floor(X*z)},D0=($)=>{let Q=$.trim().match(_0);if(!Q)throw Error(`Invalid interval format: ${$}`);let Z=Number(Q[1]),J=Q[2].toLowerCase(),X=3600000;if(J==="d")X=86400000;else if(J==="w")X=604800000;return Z*X},e=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:D0($)}},$0=async($,Q)=>{try{return(await n.stat($)).size>Q}catch{return!1}},u=async($)=>{let Q=M0($),Z=U0($),J;try{J=await n.readdir(Q)}catch{return[]}return J.filter((X)=>X.startsWith(`${Z}.`)&&R0.test(X)).map((X)=>`${Q}/${X}`)};var T0=w0(A0),x=new Map,E0=($)=>{let Q=x.get($)??Promise.resolve(),Z,J=new Promise((X)=>{Z=X});return Q.then(()=>{return x.set($,J),()=>{if(Z(),x.get($)===J)x.delete($)}})},T=($)=>String($).padStart(2,"0"),S0=($,Q)=>{let Z=Q.getFullYear(),J=T(Q.getMonth()+1),X=T(Q.getDate()),K=T(Q.getHours()),z=T(Q.getMinutes()),Y=T(Q.getSeconds()),B=String(Q.getMilliseconds()).padStart(3,"0");return`${$}.${Z}-${J}-${X}-${K}-${z}-${Y}-${B}`},L0=async($)=>{try{if((await M.stat($)).size===0)return""}catch{return""}let Z=`${S0($,new Date)}-${process.hrtime.bigint()}`;return await M.rename($,Z),Z},y0=async($)=>{let Q=await E0($);try{try{await M.access($)}catch{return}let Z=await M.readFile($),J=await T0(Z);await M.writeFile(`${$}.gz`,J),await M.rm($,{force:!0})}catch(Z){throw console.error(`[logixlysia] Failed to compress file ${$}:`,Z),Z}finally{Q()}},Q0=async($,Q)=>{if(Q.maxSize===void 0)return!1;let Z=t(Q.maxSize);return await $0($,Z)},k0=async($,Q)=>{let Z=await u($);if(Z.length<=Q)return;let X=(await Promise.allSettled(Z.map(async(Y)=>({path:Y,stat:await M.stat(Y)})))).filter((Y)=>Y.status==="fulfilled").map((Y)=>Y.value);if(X.length<=Q)return;X.sort((Y,B)=>B.stat.mtimeMs-Y.stat.mtimeMs);let K=X.slice(Q);(await Promise.allSettled(K.map(({path:Y})=>M.rm(Y,{force:!0})))).forEach((Y,B)=>{if(Y.status==="rejected")console.error(`[logixlysia] Failed to delete rotated log ${K[B].path}:`,Y.reason)})},f0=async($,Q)=>{let Z=await u($);if(Z.length===0)return;let J=Date.now(),z=(await Promise.allSettled(Z.map(async(B)=>({path:B,stat:await M.stat(B)})))).filter((B)=>B.status==="fulfilled").map((B)=>B.value).filter(({stat:B})=>J-B.mtimeMs>Q);(await Promise.allSettled(z.map(({path:B})=>M.rm(B,{force:!0})))).forEach((B,W)=>{if(B.status==="rejected")console.error(`[logixlysia] Failed to delete old log ${z[W].path}:`,B.reason)})},Z0=async($,Q)=>{let Z=await L0($);if(!Z)return;if(Q.compress===!0){if((Q.compression??"gzip")==="gzip")await y0(Z)}if(Q.maxFiles!==void 0){let X=e(Q.maxFiles);if(X.type==="count")await k0($,X.value);else await f0($,X.value)}};var C=new Map,C0=($)=>{let Q=C.get($)??Promise.resolve(),Z,J=new Promise((X)=>{Z=X});return Q.then(()=>{return C.set($,J),()=>{if(Z(),C.get($)===J)C.delete($)}})},m=async(...$)=>{let Q=typeof $[0]==="string"?(()=>{let[N,j,b,D,R,w]=$;return{filePath:N,level:j,request:b,data:D,store:R,options:w}})():$[0],{filePath:Z,level:J,request:X,data:K,store:z,options:Y}=Q,B=Y.config,W=B?.useTransportsOnly===!0,H=B?.disableFileLogging===!0;if(W||H)return;let I=typeof K.message==="string"?K.message:"",U=z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-z.beforeTime)/1e6,V="/";try{V=new URL(X.url).pathname}catch{V=X.url}let O=`${J} ${U.toFixed(2)}ms ${X.method} ${V} ${I}
3
+ `,F=await C0(Z);try{try{await a(x0(Z)),await q0(Z,O,{encoding:"utf-8"})}catch(b){throw console.error(`[logixlysia] Failed to write to log file ${Z}:`,b),b}let N=B?.logRotation;if(!N)return;if(await Q0(Z,N))try{await Z0(Z,N)}catch(b){console.error(`[logixlysia] Failed to rotate log file ${Z}:`,b)}}finally{F()}};var m0=/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g,P0=/\b(?:\d{1,3}\.){3}\d{1,3}\b/g,c0=/\b(?:\d[ -]*?){13,19}\b/g,h0=/eyJ[a-zA-Z0-9_-]+\.eyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+/g;var i=($)=>_($).replaceAll("[REDACTED]","redacted"),v0=($)=>{try{let Q=new URL($);if(Q.username!=="")Q.username=i(Q.username);if(Q.password!=="")Q.password=i(Q.password);return Q.hostname=i(Q.hostname),Q.pathname=_(Q.pathname),Q.search=_(Q.search),Q.hash=_(Q.hash),Q.toString()}catch{return _($).replaceAll("[REDACTED]","redacted")}},p0=($)=>{if($.length<13||$.length>19)return!1;let Q=0,Z=!1;for(let J=$.length-1;J>=0;J--){let X=$.charCodeAt(J);if(X<48||X>57)return!1;let K=X-48;if(Z){if(K*=2,K>9)K-=9}Q+=K,Z=!Z}return Q%10===0},g0=($)=>$.replace(c0,(Q)=>{let Z=Q.replace(/\D/g,"");if(Z.length>=13&&Z.length<=19&&p0(Z))return"[REDACTED]";return Q}),_=($)=>{let Q=$;return Q=Q.replace(m0,"[REDACTED]"),Q=Q.replace(P0,"[REDACTED]"),Q=g0(Q),Q=Q.replace(h0,"[REDACTED]"),Q},d0=($,Q)=>{let Z=_($.message),J=Object.getPrototypeOf($),X=Object.create(J);if(X.message=Z,X.name=$.name,$.stack!==void 0)X.stack=_($.stack);let K=$;for(let z of Object.keys(K))if(z!=="message"&&z!=="name"&&z!=="stack")X[z]=P(K[z],Q);return X},n0=($,Q)=>{let Z=Array.from({length:$.length});for(let J=0;J<$.length;J++)Z[J]=P($[J],Q);return Z},u0=($,Q)=>{let Z={};for(let J of Object.keys($))Z[J]=P($[J],Q);return Z},o=($,Q,Z)=>{Q.add($);try{return Z()}finally{Q.delete($)}},P=($,Q)=>{if($===null||$===void 0)return $;if(typeof $==="string")return _($);if(typeof $!=="object")return $;if($ instanceof Date)return new Date($.getTime());let J=$;if(Q.has(J))return"[Circular]";if($ instanceof Error)return o(J,Q,()=>d0($,Q));if(Array.isArray($))return o(J,Q,()=>n0($,Q));return o(J,Q,()=>u0($,Q))},c=($)=>P($,new WeakSet),h=($)=>{let Q=v0($.url),Z=new Headers,J=!1;for(let[B,W]of $.headers.entries()){let H=_(W);if(H!==W)J=!0;Z.set(B,H)}let X=_($.method),K=Q!==$.url,z=X!==$.method;if(!(K||J||z))return $;let Y={method:X,headers:Z,redirect:$.redirect,signal:$.signal};if($.body!==null)Y.body=$.body,Y.duplex="half";return new Request(Q,Y)};import{STATUS_CODES as Q$}from"node:http";import G from"chalk";import{StatusMap as i0}from"elysia";var o0=/^\d+$/,s0=/[_-]+/g,l0=/([a-z0-9])([A-Z])/g,r0=/([A-Z])([A-Z][a-z])/g,a0=/['’]/g,t0=/[^a-z0-9\s]+/g,e0=/\s+/g,J0=($)=>{let Q=$.trim();if(!Q)return"";return Q.replace(s0," ").replace(l0,"$1 $2").replace(r0,"$1 $2").replace(a0,"").toLowerCase().replace(t0," ").replace(e0," ").trim()},$$=(()=>{let $=new Map;for(let[Q,Z]of Object.entries(i0))$.set(J0(Q),Z);return $})(),X0=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let Q=$.trim();if(o0.test(Q))return Number(Q);return $$.get(J0(Q))??500}return 500};var v=($)=>{let Q="An error occurred";if($ instanceof Error)Q=$.message;else if($&&typeof $==="object"&&"message"in $)Q=$.message;else Q=String($);return Q};var E=($)=>String($).padStart(2,"0"),Z$=($)=>String($).padStart(3,"0"),J$=500,X$=1000,z$=7,K$="{now} {service}{icon} {method} {pathname} {status} {duration} {message}{speed}",z0=($)=>{let Z=$.config?.useColors??!0,J=typeof process<"u"&&process.stdout?.isTTY===!0;return Z&&J},Y$=($,Q)=>{if(!Q)return $.toISOString();let Z=String($.getFullYear()),J=E($.getMonth()+1),X=E($.getDate()),K=E($.getHours()),z=E($.getMinutes()),Y=E($.getSeconds()),B=Z$($.getMilliseconds());return Q.replaceAll("yyyy",Z).replaceAll("mm",J).replaceAll("dd",X).replaceAll("HH",K).replaceAll("MM",z).replaceAll("ss",Y).replaceAll("SSS",B)},B$=($)=>{let Q=$.headers.get("x-forwarded-for");if(Q)return Q.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},G$=($)=>{if($>=1000){let Q=$/1000;if(Q>=10)return`${Math.round(Q)}s`;let Z=Q.toFixed(1);return Z.endsWith(".0")?`${Math.round(Q)}s`:`${Z}s`}if($>0&&$<1)return`${$.toFixed(2)}ms`;return`${Math.round($)}ms`},N$=($)=>{let Q=$.config;return{slow:Q?.slowThreshold??J$,verySlow:Q?.verySlowThreshold??X$}},b$=($,Q,Z)=>{let J=G$($),{slow:X,verySlow:K}=N$(Z),z=$>=K;if(!Q)return{text:J,isVerySlow:z};let Y=J;if($<X)Y=G.green(J);else if($<K)Y=G.yellow(J);else Y=G.red.bold(J);return{text:Y,isVerySlow:z}},j$=($,Q)=>{if(!$)return"";let Z="⚡ slow";if(!Q)return` ${Z}`;return` ${G.yellow(Z)}`},W$=($,Q)=>{if(!Q)return"\uD83E\uDD8A";if($==="ERROR")return G.bgRed.black(" \uD83E\uDD8A ");if($==="WARNING")return G.bgYellow.black(" \uD83E\uDD8A ");if($==="DEBUG")return G.bgBlue.black(" \uD83E\uDD8A ");return G.bgGreen.black(" \uD83E\uDD8A ")},H$=($,Q)=>{if(!Q)return $;if($==="ERROR")return G.bgRed.black($);if($==="WARNING")return G.bgYellow.black($);if($==="DEBUG")return G.bgBlue.black($);return G.bgGreen.black($)},I$=($,Q)=>{if(!Q)return $;let Z=$.toUpperCase();if(Z==="GET")return G.green.bold(Z);if(Z==="POST")return G.blue.bold(Z);if(Z==="PUT")return G.yellow.bold(Z);if(Z==="PATCH")return G.yellowBright.bold(Z);if(Z==="DELETE")return G.red.bold(Z);if(Z==="OPTIONS")return G.cyan.bold(Z);if(Z==="HEAD")return G.greenBright.bold(Z);if(Z==="TRACE")return G.magenta.bold(Z);if(Z==="CONNECT")return G.cyanBright.bold(Z);return G.white.bold(Z)},V$=($,Q)=>{if(!Q)return $;let Z=Number.parseInt($,10);if(!Number.isFinite(Z))return $;if(Z>=500)return G.red($);if(Z>=400)return G.yellow($);if(Z>=300)return G.cyan($);if(Z>=200)return G.green($);return G.gray($)},F$=($,Q)=>{if(!Q)return $;return G.gray($)},U$=($,Q)=>{if(!Q)return $;return G.whiteBright($)},M$=($)=>{return Q$[$]??""},O$=($,Q)=>{let Z=$.config?.service?.trim();if(!Z)return"";let J=`[${Z}]`;if(!Q)return`${J} `;return`${G.dim(J)} `},_$=($)=>{if($===null)return"null";if($===void 0)return"undefined";if(typeof $==="string")return $;if(typeof $==="number"||typeof $==="boolean")return String($);if($ instanceof Error)return $.message;try{return JSON.stringify($)}catch{return String($)}},R$=($)=>$!==null&&typeof $==="object"&&!Array.isArray($)&&!($ instanceof Error)&&!($ instanceof Date),K0=($,Q,Z)=>{let J=[];for(let[X,K]of Object.entries($)){let z=Q?`${Q}.${X}`:X;if(R$(K)&&Z>1)J.push(...K0(K,z,Z-1));else J.push([z,_$(K)])}return J},D$=($,Q)=>{if($.length===0)return[];let Z=[],J=$.length-1;for(let X=0;X<$.length;X++){let K=X===J?"└─":"├─",z=$[X];if(!z)continue;let[Y,B]=z,W=Q?G.cyan(Y):Y,H=Q?G.white(B):B;Z.push(` ${K} ${W} ${H}`)}return Z};var w$=($,Q,Z)=>{if(Z.config?.showContextTree===!1)return[];let J=z0(Z),X=Z.config?.contextDepth??1,K=[],z=Q.context;if(z&&typeof z==="object"&&!Array.isArray(z)&&Object.keys(z).length>0&&X>=1)K.push(...K0(z,"",X));if($==="ERROR"&&"error"in Q&&Q.error!==void 0){let Y=v(Q.error);if(Y)K.push(["error",Y])}return D$(K,J)},A$=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},p=({level:$,request:Q,data:Z,store:J,options:X})=>{let K=X.config,z=z0(X),Y=K?.customLogFormat??K$,B=new Date,W=String(B.getTime()),H=Y$(B,K?.timestamp?.translateTime),I=F$(H,z),U=typeof Z.message==="string"?Z.message:"",V=J.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-J.beforeTime)/1e6,O=new URL(Q.url).pathname,F=Z.status,N=F===null||F===void 0?200:X0(F),j=String(N),b=K?.ip===!0?B$(Q):"",R=K?.showContextTree!==!1&&Z.context&&typeof Z.context==="object"&&!Array.isArray(Z.context)&&Object.keys(Z.context).length>0?"":A$(Z.context),w=H$($,z),S=Q.method.toUpperCase().padEnd(z$),g=I$(S,z),L=U$(O,z),y=V$(j,z),{text:k,isVerySlow:A}=b$(V,z,X),f=j$(A,z),G0=W$($,z),N0=M$(N),b0=O$(X,z),j0=Y.replaceAll("{now}",I).replaceAll("{epoch}",W).replaceAll("{level}",w).replaceAll("{icon}",G0).replaceAll("{duration}",k).replaceAll("{method}",g).replaceAll("{pathname}",L).replaceAll("{path}",L).replaceAll("{status}",y).replaceAll("{statusText}",N0).replaceAll("{message}",U).replaceAll("{ip}",b).replaceAll("{context}",R).replaceAll("{service}",b0).replaceAll("{speed}",f),W0=w$($,Z,X);return{main:j0,contextLines:W0}};var T$=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",Y0=($,Q,Z,J)=>{let X=J.config,K=X?.logFilter;if(K?.level&&K.level.length>0&&!K.level.includes("ERROR"))return;let z=X?.useTransportsOnly===!0,Y=X?.disableInternalLogger===!0,B=X?.disableFileLogging===!0,W=T$(Q)?Q.status:500,H=v(Q),I="ERROR",U={status:W,message:H,error:Q},V=X?.autoRedact===!0?c(U):U,O=X?.autoRedact===!0?h($):$;if(q({level:I,request:O,data:V,store:Z,options:J}),!(z||B)){let b=X?.logFilePath;if(b)m({filePath:b,level:I,request:O,data:V,store:Z,options:J}).catch(()=>{})}if(z||Y)return;let{main:F,contextLines:N}=p({level:I,request:O,data:V,store:Z,options:J}),j=N.length>0?`${F}
4
+ ${N.join(`
5
+ `)}`:F;console.error(j)};var B0=($={},Q=E$)=>{let Z=$.config,J=Z?.pino,{prettyPrint:X,...K}=J??{},z=typeof X==="object"&&X!==null?X:void 0,B=(X===!0||z!==void 0)&&K.transport===void 0,W=z?.messageKey??K.messageKey,H=z?.errorKey??K.errorKey,I=B?{target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:Z?.timestamp?.translateTime,...z,messageKey:W,errorKey:H}}:K.transport,U=Q({...K,level:K.level??"info",messageKey:W,errorKey:H,transport:I}),V=(N,j)=>{if(!j?.level||j.level.length===0)return!0;return j.level.includes(N)},O=(N,j,b,D)=>{if(!V(N,Z?.logFilter))return;let R=Z?.autoRedact===!0?c(b):b,w=Z?.autoRedact===!0?h(j):j;q({level:N,request:w,data:R,store:D,options:$});let S=Z?.useTransportsOnly===!0,g=Z?.disableInternalLogger===!0,L=Z?.disableFileLogging===!0;if(!(S||L)){let f=Z?.logFilePath;if(f)m({filePath:f,level:N,request:w,data:R,store:D,options:$}).catch(()=>{})}if(S||g)return;let{main:y,contextLines:k}=p({level:N,request:w,data:R,store:D,options:$}),A=k.length>0?`${y}
6
+ ${k.join(`
7
+ `)}`:y;switch(N){case"DEBUG":{console.debug(A);break}case"INFO":{console.info(A);break}case"WARNING":{console.warn(A);break}case"ERROR":{console.error(A);break}default:{console.log(A);break}}},F=(N,j,b,D)=>{let R={beforeTime:process.hrtime.bigint()};O(N,j,{message:b,context:D},R)};return{pino:U,log:O,handleHttpError:(N,j,b)=>{Y0(N,j,b,$)},debug:(N,j,b)=>{F("DEBUG",N,j,b)},info:(N,j,b)=>{F("INFO",N,j,b)},warn:(N,j,b)=>{F("WARNING",N,j,b)},error:(N,j,b)=>{F("ERROR",N,j,b)}}};var L$=($={})=>{let Q=new WeakSet,Z=B0($),J={...Z,debug:(K,z,Y)=>{Q.add(K),Z.debug(K,z,Y)},info:(K,z,Y)=>{Q.add(K),Z.info(K,z,Y)},warn:(K,z,Y)=>{Q.add(K),Z.warn(K,z,Y)},error:(K,z,Y)=>{Q.add(K),Z.error(K,z,Y)}};return new S$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",J).state("pino",J.pino).state("beforeTime",BigInt(0)).onStart(({server:K})=>{if(K)d(K,$);else{let z=Number(process.env.PORT)||3000,Y=process.env.HOST||"localhost";d({port:z,hostname:Y,protocol:"http"},$)}}).onRequest(({store:K})=>{K.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:K,set:z,store:Y})=>{if(Q.has(K))return;let B=typeof z.status==="number"?z.status:200,W="INFO";if(B>=500)W="ERROR";else if(B>=400)W="WARNING";J.log(W,K,{status:B},Y)}).onError(({request:K,error:z,store:Y})=>{J.handleHttpError(K,z,Y)}).as("scoped")},R2=L$;export{L$ as logixlysia,R2 as default};
8
8
 
9
- //# debugId=F8359047E2C71CA864756E2164756E21
10
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvbG9nZ2VyL2NyZWF0ZS1sb2dnZXIudHMiLCAic3JjL2hlbHBlcnMvc3RhdHVzLnRzIiwgInNyYy91dGlscy9lcnJvci50cyIsICJzcmMvbG9nZ2VyL2hhbmRsZS1odHRwLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSB9IGZyb20gJ2VseXNpYSdcbmltcG9ydCB7IHN0YXJ0U2VydmVyIH0gZnJvbSAnLi9leHRlbnNpb25zJ1xuaW1wb3J0IHR5cGUgeyBMb2dpeGx5c2lhU3RvcmUsIE9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlcidcblxuLyoqXG4gKiBFbXB0eSBzaW5nbGV0b24gc2xvdHMgbXVzdCBub3QgdXNlIGBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5gOiBpbnRlcnNlY3RpbmcgdGhhdCB3aXRoIEVseXNpYSdzIGBDb250ZXh0YFxuICogbWFrZXMgZXZlcnkga2V5IChpbmNsdWRpbmcgYHN0b3JlYCkgYmVjb21lIGBuZXZlcmAgYmVjYXVzZSBlYWNoIGtleSBpcyBtZXJnZWQgd2l0aCBgbmV2ZXJgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcHR5RWx5c2lhU2xvdCB7XG4gIHJlYWRvbmx5IF9fbG9naXhseXNpYUVtcHR5PzogbmV2ZXJcbn1cblxuLyoqXG4gKiBFeHBsaWNpdCBzaW5nbGV0b24gd2l0aG91dCBFbHlzaWEncyBgU2luZ2xldG9uQmFzZWAgYFJlY29yZDxzdHJpbmcsIHVua25vd24+YCBvbiBkZWNvcmF0b3IvZGVyaXZlL3Jlc29sdmUgc29cbiAqIG1lcmdlZCBgQ29udGV4dGAgYW5kIFdlYlNvY2tldCBgd3MuZGF0YWAga2VlcCBwcmVjaXNlIGtleXMgYWZ0ZXIgYC51c2UobG9naXhseXNpYSgpKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9naXhseXNpYVNpbmdsZXRvbiB7XG4gIGRlY29yYXRvcjogRW1wdHlFbHlzaWFTbG90XG4gIGRlcml2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHJlc29sdmU6IEVtcHR5RWx5c2lhU2xvdFxuICBzdG9yZTogTG9naXhseXNpYVN0b3JlXG59XG5cbi8vIEVseXNpYSdzIGBTaW5nbGV0b25CYXNlLnN0b3JlYCBpcyBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gOyBgTG9naXhseXNpYVN0b3JlYCBpcyBpbnRlbnRpb25hbGx5IGNsb3NlZCAoc2VlICMyMjApLlxuLy8gQHRzLWV4cGVjdC1lcnJvciDigJQgY2xvc2VkIHN0b3JlIGlzIGNvcnJlY3QgYXQgcnVudGltZSBhbmQgZm9yIG1lcmdlZCBgd3MuZGF0YWAgaW5mZXJlbmNlLlxuZXhwb3J0IHR5cGUgTG9naXhseXNpYSA9IEVseXNpYTwnJywgTG9naXhseXNpYVNpbmdsZXRvbj5cblxuZXhwb3J0IGNvbnN0IGxvZ2l4bHlzaWEgPSAob3B0aW9uczogT3B0aW9ucyA9IHt9KTogTG9naXhseXNpYSA9PiB7XG4gIGNvbnN0IGRpZEN1c3RvbUxvZyA9IG5ldyBXZWFrU2V0PFJlcXVlc3Q+KClcbiAgY29uc3QgYmFzZUxvZ2dlciA9IGNyZWF0ZUxvZ2dlcihvcHRpb25zKVxuICBjb25zdCBsb2dnZXIgPSB7XG4gICAgLi4uYmFzZUxvZ2dlcixcbiAgICBkZWJ1ZzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5kZWJ1ZyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5pbmZvKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLndhcm4ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGVycm9yOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmVycm9yKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXBwID0gbmV3IEVseXNpYSh7XG4gICAgbmFtZTogJ0xvZ2l4bHlzaWEnLFxuICAgIGRldGFpbDoge1xuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdMb2dpeGx5c2lhIGlzIGEgcGx1Z2luIGZvciBFbHlzaWEgdGhhdCBwcm92aWRlcyBhIGxvZ2dlciBhbmQgcGlubyBsb2dnZXIuJyxcbiAgICAgIHRhZ3M6IFsnbG9nZ2luZycsICdwaW5vJ11cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIChcbiAgICBhcHBcbiAgICAgIC5zdGF0ZSgnbG9nZ2VyJywgbG9nZ2VyKVxuICAgICAgLnN0YXRlKCdwaW5vJywgbG9nZ2VyLnBpbm8pXG4gICAgICAuc3RhdGUoJ2JlZm9yZVRpbWUnLCBCaWdJbnQoMCkpXG4gICAgICAub25TdGFydCgoeyBzZXJ2ZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2VydmVyKSB7XG4gICAgICAgICAgc3RhcnRTZXJ2ZXIoc2VydmVyLCBvcHRpb25zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vZGUgYWRhcHRlciBmYWxsYmFja1xuICAgICAgICAgIGNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMFxuICAgICAgICAgIGNvbnN0IGhvc3RuYW1lID0gcHJvY2Vzcy5lbnYuSE9TVCB8fCAnbG9jYWxob3N0J1xuICAgICAgICAgIHN0YXJ0U2VydmVyKHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sOiAnaHR0cCcgfSwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vblJlcXVlc3QoKHsgc3RvcmUgfSkgPT4ge1xuICAgICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIH0pXG4gICAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCB7IHN0YXR1cyB9LCBzdG9yZSlcbiAgICAgIH0pXG4gICAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgc3RvcmUgfSkgPT4ge1xuICAgICAgICBsb2dnZXIuaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSlcbiAgICAgIH0pXG4gICAgICAvLyBFbnN1cmUgcGx1Z2luIGxpZmVjeWNsZSBob29rcyAob25SZXF1ZXN0L29uQWZ0ZXJIYW5kbGUvb25FcnJvcikgYXBwbHkgdG8gdGhlIHBhcmVudCBhcHAuXG4gICAgICAuYXMoJ3Njb3BlZCcpIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG5leHBvcnQgdHlwZSB7XG4gIExvZ2dlcixcbiAgTG9naXhseXNpYUNvbnRleHQsXG4gIExvZ2l4bHlzaWFTdG9yZSxcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YSxcbiAgVHJhbnNwb3J0XG59IGZyb20gJy4vaW50ZXJmYWNlcydcblxuZXhwb3J0IGRlZmF1bHQgbG9naXhseXNpYVxuIiwKICAgICJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnXG5cbmNvbnN0IGVseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnZWx5c2lhL3BhY2thZ2UuanNvbicpIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fVxuICB9XG59KSgpXG5cbmNvbnN0IGxvZ2l4bHlzaWFQa2c6IHsgdmVyc2lvbj86IHN0cmluZyB9ID0gKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXG4gICAgcmV0dXJuIHJlcXVpcmUoJy4uLy4uL3BhY2thZ2UuanNvbicpIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fVxuICB9XG59KSgpXG5cbmNvbnN0IGNlbnRlclRleHQgPSAodGV4dDogc3RyaW5nLCB3aWR0aDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKHRleHQubGVuZ3RoID49IHdpZHRoKSB7XG4gICAgcmV0dXJuIHRleHQuc2xpY2UoMCwgd2lkdGgpXG4gIH1cblxuICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcigod2lkdGggLSB0ZXh0Lmxlbmd0aCkgLyAyKVxuICBjb25zdCByaWdodCA9IHdpZHRoIC0gdGV4dC5sZW5ndGggLSBsZWZ0XG4gIHJldHVybiBgJHsnICcucmVwZWF0KGxlZnQpfSR7dGV4dH0keycgJy5yZXBlYXQocmlnaHQpfWBcbn1cblxudHlwZSBSb3dTcGVjID1cbiAgfCB7IGtpbmQ6ICdlbXB0eScgfVxuICB8IHsga2luZDogJ2NlbnRlcic7IHRleHQ6IHN0cmluZyB9XG4gIHwgeyBraW5kOiAnbGVmdCc7IHRleHQ6IHN0cmluZyB9XG5cbi8qKlxuICogQm94IGJhbm5lcjogRWx5c2lhIHZlcnNpb24gKGNlbnRlcmVkKSwgVVJMIGxpbmUsIG9wdGlvbmFsIGxvZ2l4bHlzaWEgdmVyc2lvbiBsaW5lLlxuICovXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKFxuICB1cmxEaXNwbGF5TGluZTogc3RyaW5nLFxuICBsb2dpeGx5c2lhTGluZTogc3RyaW5nIHwgbnVsbFxuKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdmVyc2lvbiA9IGVseXNpYVBrZy52ZXJzaW9uXG4gIGNvbnN0IHZlcnNpb25MaW5lID0gdmVyc2lvbiA/IGBFbHlzaWEgdiR7dmVyc2lvbn1gIDogJ0VseXNpYSdcblxuICBjb25zdCByb3dzOiBSb3dTcGVjW10gPSBbXG4gICAgeyBraW5kOiAnZW1wdHknIH0sXG4gICAgeyBraW5kOiAnY2VudGVyJywgdGV4dDogdmVyc2lvbkxpbmUgfSxcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdsZWZ0JywgdGV4dDogdXJsRGlzcGxheUxpbmUgfVxuICBdXG4gIGlmIChsb2dpeGx5c2lhTGluZSkge1xuICAgIHJvd3MucHVzaCh7IGtpbmQ6ICdsZWZ0JywgdGV4dDogbG9naXhseXNpYUxpbmUgfSlcbiAgfVxuICByb3dzLnB1c2goeyBraW5kOiAnZW1wdHknIH0pXG5cbiAgY29uc3QgY29udGVudFdpZHRoID0gTWF0aC5tYXgoXG4gICAgdmVyc2lvbkxpbmUubGVuZ3RoLFxuICAgIHVybERpc3BsYXlMaW5lLmxlbmd0aCxcbiAgICAuLi4obG9naXhseXNpYUxpbmUgPyBbbG9naXhseXNpYUxpbmUubGVuZ3RoXSA6IFswXSlcbiAgKVxuICBjb25zdCBpbm5lcldpZHRoID0gY29udGVudFdpZHRoICsgNFxuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5Um93ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFt0b3BdXG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBpZiAocm93LmtpbmQgPT09ICdlbXB0eScpIHtcbiAgICAgIG91dC5wdXNoKGVtcHR5Um93KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHJvdy5raW5kID09PSAnY2VudGVyJykge1xuICAgICAgb3V0LnB1c2goYOKUgiR7Y2VudGVyVGV4dChyb3cudGV4dCwgaW5uZXJXaWR0aCl94pSCYClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IHRleHQgPSByb3cudGV4dFxuICAgIGNvbnN0IHBhZGRpbmcgPSBNYXRoLm1heCgwLCBpbm5lcldpZHRoIC0gdGV4dC5sZW5ndGggLSA0KVxuICAgIG91dC5wdXNoKGDilIIgICR7dGV4dH0keycgJy5yZXBlYXQocGFkZGluZyl9ICDilIJgKVxuICB9XG4gIG91dC5wdXNoKGJvdClcbiAgcmV0dXJuIG91dC5qb2luKCdcXG4nKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lID0gKCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCB2ID0gbG9naXhseXNpYVBrZy52ZXJzaW9uXG4gIGlmICghdikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgcmV0dXJuIGAgICAgIGxvZ2l4bHlzaWEgdiR7dn1gXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUsIHJlbmRlckJhbm5lciB9IGZyb20gJy4vYmFubmVyJ1xuXG5leHBvcnQgY29uc3Qgc3RhcnRTZXJ2ZXIgPSAoXG4gIHNlcnZlcjogeyBwb3J0PzogbnVtYmVyOyBob3N0bmFtZT86IHN0cmluZzsgcHJvdG9jb2w/OiBzdHJpbmcgfCBudWxsIH0sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHZvaWQgPT4ge1xuICBjb25zdCBzaG93U3RhcnR1cE1lc3NhZ2UgPSBvcHRpb25zLmNvbmZpZz8uc2hvd1N0YXJ0dXBNZXNzYWdlID8/IHRydWVcbiAgaWYgKCFzaG93U3RhcnR1cE1lc3NhZ2UpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgcG9ydCwgaG9zdG5hbWUsIHByb3RvY29sIH0gPSBzZXJ2ZXJcbiAgaWYgKHBvcnQgPT09IHVuZGVmaW5lZCB8fCAhaG9zdG5hbWUgfHwgIXByb3RvY29sKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3RuYW1lfToke3BvcnR9YFxuICBjb25zdCBtZXNzYWdlID0gYPCfpoogRWx5c2lhIGlzIHJ1bm5pbmcgYXQgJHt1cmx9YFxuICBjb25zdCB1cmxEaXNwbGF5TGluZSA9IGDwn6aKICAke3VybH1gXG5cbiAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5jb25maWc/LnN0YXJ0dXBNZXNzYWdlRm9ybWF0ID8/ICdiYW5uZXInXG4gIGlmIChmb3JtYXQgPT09ICdzaW1wbGUnKSB7XG4gICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnNvbGUubG9nKHJlbmRlckJhbm5lcih1cmxEaXNwbGF5TGluZSwgZ2V0TG9naXhseXNpYVZlcnNpb25MaW5lKCkpKVxufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFJlcXVlc3RJbmZvLFxuICBTdG9yZURhdGFcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChcbiAgb3B0aW9uczogT3B0aW9ucyA9IHt9LFxuICBwaW5vRmFjdG9yeTogdHlwZW9mIHBpbm8gPSBwaW5vXG4pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBwcmV0dHlQcmludE9wdGlvbnMgPVxuICAgIHR5cGVvZiBwcmV0dHlQcmludCA9PT0gJ29iamVjdCcgJiYgcHJldHR5UHJpbnQgIT09IG51bGxcbiAgICAgID8gKHByZXR0eVByaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgOiB1bmRlZmluZWRcblxuICBjb25zdCBlbmFibGVQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgfHwgcHJldHR5UHJpbnRPcHRpb25zICE9PSB1bmRlZmluZWRcblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgZW5hYmxlUHJldHR5UHJpbnQgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCBtZXNzYWdlS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5tZXNzYWdlS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz9cbiAgICBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5XG4gIGNvbnN0IGVycm9yS2V5ID1cbiAgICAocHJldHR5UHJpbnRPcHRpb25zPy5lcnJvcktleSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IHBpbm9PcHRpb25zLmVycm9yS2V5XG5cbiAgY29uc3QgdHJhbnNwb3J0ID0gc2hvdWxkUHJldHR5UHJpbnRcbiAgICA/IHtcbiAgICAgICAgdGFyZ2V0OiAncGluby1wcmV0dHknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY29sb3JpemU6IHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZSxcbiAgICAgICAgICB0cmFuc2xhdGVUaW1lOiBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSxcbiAgICAgICAgICAuLi5wcmV0dHlQcmludE9wdGlvbnMsXG4gICAgICAgICAgbWVzc2FnZUtleSxcbiAgICAgICAgICBlcnJvcktleVxuICAgICAgICB9XG4gICAgICB9XG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlub0ZhY3Rvcnkoe1xuICAgIC4uLnBpbm9PcHRpb25zLFxuICAgIGxldmVsOiBwaW5vT3B0aW9ucy5sZXZlbCA/PyAnaW5mbycsXG4gICAgbWVzc2FnZUtleSxcbiAgICBlcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgc3RvcmU6IFN0b3JlRGF0YVxuICApOiB2b2lkID0+IHtcbiAgICAvLyBDaGVjayBpZiB0aGlzIGxvZyBsZXZlbCBzaG91bGQgYmUgZmlsdGVyZWRcbiAgICBpZiAoIXNob3VsZExvZyhsZXZlbCwgY29uZmlnPy5sb2dGaWx0ZXIpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICAgIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGRpc2FibGVJbnRlcm5hbExvZ2dlciA9IGNvbmZpZz8uZGlzYWJsZUludGVybmFsTG9nZ2VyID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICAgIGlmICghKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgIGxvZ1RvRmlsZSh7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSkuY2F0Y2goXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgICAgbGV2ZWwsXG4gICAgICByZXF1ZXN0LFxuICAgICAgZGF0YSxcbiAgICAgIHN0b3JlLFxuICAgICAgb3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucylcbiAgICB9LFxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0SW5mbywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFN0b3JlRGF0YSwgT3B0aW9uc11cbik6IHZvaWQgPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9UcmFuc3BvcnRzSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyB7XG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgcmVxdWVzdDogYXJnc1sxXSxcbiAgICAgICAgICBkYXRhOiBhcmdzWzJdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdLFxuICAgICAgICAgIG9wdGlvbnM6IGFyZ3NbNF1cbiAgICAgICAgfVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IHRyYW5zcG9ydHMgPSBvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXVxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGJlZm9yZVRpbWU6IHN0b3JlLmJlZm9yZVRpbWVcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRyYW5zcG9ydCBmYWlsdXJlcyBtdXN0IG5ldmVyIGNyYXNoIGFwcGxpY2F0aW9uIGxvZ2dpbmcuXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7bmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICBhd2FpdCBhcHBlbmRGaWxlKGZpbGVQYXRoLCBsaW5lLCB7IGVuY29kaW5nOiAndXRmLTgnIH0pXG5cbiAgY29uc3Qgcm90YXRpb24gPSBjb25maWc/LmxvZ1JvdGF0aW9uXG4gIGlmICghcm90YXRpb24pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZCA9IGF3YWl0IHNob3VsZFJvdGF0ZShmaWxlUGF0aCwgcm90YXRpb24pXG4gIGlmIChzaG91bGQpIHtcbiAgICBhd2FpdCBwZXJmb3JtUm90YXRpb24oZmlsZVBhdGgsIHJvdGF0aW9uKVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcblxuZXhwb3J0IGNvbnN0IGVuc3VyZURpciA9IGFzeW5jIChkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgYXdhaXQgZnMubWtkaXIoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuaW1wb3J0IHsgZ3ppcCB9IGZyb20gJ25vZGU6emxpYidcbmltcG9ydCB0eXBlIHsgTG9nUm90YXRpb25Db25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHtcbiAgZ2V0Um90YXRlZEZpbGVzLFxuICBwYXJzZVJldGVudGlvbixcbiAgcGFyc2VTaXplLFxuICBzaG91bGRSb3RhdGVCeVNpemVcbn0gZnJvbSAnLi4vdXRpbHMvcm90YXRpb24nXG5cbmNvbnN0IGd6aXBBc3luYyA9IHByb21pc2lmeShnemlwKVxuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZU5hbWUgPSAoZmlsZVBhdGg6IHN0cmluZywgZGF0ZTogRGF0ZSk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKClcbiAgY29uc3QgbW0gPSBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpXG4gIGNvbnN0IGRkID0gcGFkMihkYXRlLmdldERhdGUoKSlcbiAgY29uc3QgSEggPSBwYWQyKGRhdGUuZ2V0SG91cnMoKSlcbiAgY29uc3QgTU0gPSBwYWQyKGRhdGUuZ2V0TWludXRlcygpKVxuICBjb25zdCBzcyA9IHBhZDIoZGF0ZS5nZXRTZWNvbmRzKCkpXG4gIHJldHVybiBgJHtmaWxlUGF0aH0uJHt5eXl5fS0ke21tfS0ke2RkfS0ke0hIfS0ke01NfS0ke3NzfWBcbn1cblxuZXhwb3J0IGNvbnN0IHJvdGF0ZUZpbGUgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgaWYgKHN0YXQuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IHJvdGF0ZWQgPSBnZXRSb3RhdGVkRmlsZU5hbWUoZmlsZVBhdGgsIG5ldyBEYXRlKCkpXG4gIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZClcbiAgcmV0dXJuIHJvdGF0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IGd6aXBBc3luYyhjb250ZW50KVxuICBhd2FpdCBmcy53cml0ZUZpbGUoYCR7ZmlsZVBhdGh9Lmd6YCwgY29tcHJlc3NlZClcbiAgYXdhaXQgZnMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHNob3VsZFJvdGF0ZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGlmIChjb25maWcubWF4U2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgY29uc3QgbWF4U2l6ZSA9IHBhcnNlU2l6ZShjb25maWcubWF4U2l6ZSlcbiAgcmV0dXJuIGF3YWl0IHNob3VsZFJvdGF0ZUJ5U2l6ZShmaWxlUGF0aCwgbWF4U2l6ZSlcbn1cblxuY29uc3QgY2xlYW51cEJ5Q291bnQgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEZpbGVzOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHN0YXRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgc3RhdHMuc29ydCgoYSwgYikgPT4gYi5zdGF0Lm10aW1lTXMgLSBhLnN0YXQubXRpbWVNcylcbiAgY29uc3QgdG9EZWxldGUgPSBzdGF0cy5zbGljZShtYXhGaWxlcylcbiAgYXdhaXQgUHJvbWlzZS5hbGwodG9EZWxldGUubWFwKCh7IHBhdGggfSkgPT4gZnMucm0ocGF0aCwgeyBmb3JjZTogdHJ1ZSB9KSkpXG59XG5cbmNvbnN0IGNsZWFudXBCeVRpbWUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heEFnZU1zOiBudW1iZXJcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgZ2V0Um90YXRlZEZpbGVzKGZpbGVQYXRoKVxuICBpZiAocm90YXRlZC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLmZpbHRlcigoeyBzdGF0IH0pID0+IG5vdyAtIHN0YXQubXRpbWVNcyA+IG1heEFnZU1zKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuZXhwb3J0IGNvbnN0IHBlcmZvcm1Sb3RhdGlvbiA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgY29uZmlnOiBMb2dSb3RhdGlvbkNvbmZpZ1xuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCByb3RhdGVGaWxlKGZpbGVQYXRoKVxuICBpZiAoIXJvdGF0ZWQpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHNob3VsZENvbXByZXNzID0gY29uZmlnLmNvbXByZXNzID09PSB0cnVlXG4gIGlmIChzaG91bGRDb21wcmVzcykge1xuICAgIGNvbnN0IGFsZ28gPSBjb25maWcuY29tcHJlc3Npb24gPz8gJ2d6aXAnXG4gICAgaWYgKGFsZ28gPT09ICdnemlwJykge1xuICAgICAgYXdhaXQgY29tcHJlc3NGaWxlKHJvdGF0ZWQpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNvbmZpZy5tYXhGaWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0ZW50aW9uID0gcGFyc2VSZXRlbnRpb24oY29uZmlnLm1heEZpbGVzKVxuICAgIGlmIChyZXRlbnRpb24udHlwZSA9PT0gJ2NvdW50Jykge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5Q291bnQoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgY2xlYW51cEJ5VGltZShmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIC8vIE9wdGlvbmFsIGludGVydmFsLWJhc2VkIHJvdGF0aW9uIGNsZWFudXAgKGNyZWF0ZSBpbnRlcnZhbCBkaXJlY3RvcmllcyAvIG5hbWluZykgaXMgbm90IHJlcXVpcmVkIGJ5IHRlc3RzLlxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcblxuY29uc3QgU0laRV9SRUdFWCA9IC9eKFxcZCsoPzpcXC5cXGQrKT8pKGt8a2J8bXxtYnxnfGdiKSQvaVxuY29uc3QgSU5URVJWQUxfUkVHRVggPSAvXihcXGQrKShofGR8dykkL2lcbmNvbnN0IFJPVEFURURfUkVHRVggPSAvXFwuKFxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9KSg/OlxcLmd6KT8kL1xuXG5leHBvcnQgY29uc3QgcGFyc2VTaXplID0gKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBjb25zdCBhc051bWJlciA9IE51bWJlcih0cmltbWVkKVxuICBpZiAoTnVtYmVyLmlzRmluaXRlKGFzTnVtYmVyKSkge1xuICAgIHJldHVybiBhc051bWJlclxuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB0cmltbWVkLm1hdGNoKFNJWkVfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2l6ZSBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgYmFzZSA9IDEwMjRcbiAgaWYgKHVuaXQuc3RhcnRzV2l0aCgnbScpKSB7XG4gICAgYmFzZSA9IDEwMjQgKiAxMDI0XG4gIH0gZWxzZSBpZiAodW5pdC5zdGFydHNXaXRoKCdnJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjQgKiAxMDI0XG4gIH1cblxuICByZXR1cm4gTWF0aC5mbG9vcihhbW91bnQgKiBiYXNlKVxufVxuXG5leHBvcnQgY29uc3QgcGFyc2VJbnRlcnZhbCA9ICh2YWx1ZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgbWF0Y2ggPSB2YWx1ZS50cmltKCkubWF0Y2goSU5URVJWQUxfUkVHRVgpXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZXJ2YWwgZm9ybWF0OiAke3ZhbHVlfWApXG4gIH1cblxuICBjb25zdCBhbW91bnQgPSBOdW1iZXIobWF0Y2hbMV0pXG4gIGNvbnN0IHVuaXQgPSBtYXRjaFsyXS50b0xvd2VyQ2FzZSgpXG5cbiAgbGV0IG1zID0gNjAgKiA2MCAqIDEwMDBcbiAgaWYgKHVuaXQgPT09ICdkJykge1xuICAgIG1zID0gMjQgKiA2MCAqIDYwICogMTAwMFxuICB9IGVsc2UgaWYgKHVuaXQgPT09ICd3Jykge1xuICAgIG1zID0gNyAqIDI0ICogNjAgKiA2MCAqIDEwMDBcbiAgfVxuXG4gIHJldHVybiBhbW91bnQgKiBtc1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXRlbnRpb24gPSAoXG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmdcbik6IHsgdHlwZTogJ2NvdW50JyB8ICd0aW1lJzsgdmFsdWU6IG51bWJlciB9ID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4geyB0eXBlOiAnY291bnQnLCB2YWx1ZSB9XG4gIH1cbiAgcmV0dXJuIHsgdHlwZTogJ3RpbWUnLCB2YWx1ZTogcGFyc2VJbnRlcnZhbCh2YWx1ZSkgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlQnlTaXplID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhTaXplQnl0ZXM6IG51bWJlclxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpXG4gICAgcmV0dXJuIHN0YXQuc2l6ZSA+IG1heFNpemVCeXRlc1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVzID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiB7XG4gIGNvbnN0IGRpciA9IGRpcm5hbWUoZmlsZVBhdGgpXG4gIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlUGF0aClcblxuICBsZXQgZW50cmllczogc3RyaW5nW11cbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihkaXIpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgcmV0dXJuIGVudHJpZXNcbiAgICAuZmlsdGVyKG5hbWUgPT4gbmFtZS5zdGFydHNXaXRoKGAke2Jhc2V9LmApICYmIFJPVEFURURfUkVHRVgudGVzdChuYW1lKSlcbiAgICAubWFwKG5hbWUgPT4gYCR7ZGlyfS8ke25hbWV9YClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU1RBVFVTX0NPREVTIH0gZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xuaW1wb3J0IHsgZ2V0U3RhdHVzQ29kZSB9IGZyb20gJy4uL2hlbHBlcnMvc3RhdHVzJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IERFRkFVTFRfU0xPV19NUyA9IDUwMFxuY29uc3QgREVGQVVMVF9WRVJZX1NMT1dfTVMgPSAxMDAwXG5jb25zdCBNRVRIT0RfUEFEID0gN1xuXG5jb25zdCBERUZBVUxUX0xPR19GT1JNQVQgPVxuICAne25vd30ge3NlcnZpY2V9e2ljb259IHttZXRob2R9IHtwYXRobmFtZX0ge3N0YXR1c30ge2R1cmF0aW9ufSB7bWVzc2FnZX17c3BlZWR9J1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRlZExvZ091dHB1dCB7XG4gIGNvbnRleHRMaW5lczogc3RyaW5nW11cbiAgbWFpbjogc3RyaW5nXG59XG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbi8qKiBSZXNvbHZlcyBjbGllbnQgSVAgZnJvbSB4LWZvcndhcmRlZC1mb3IgKGZpcnN0IElQKSBvciB4LXJlYWwtaXAuIEVtcHR5IHdoZW4gbmVpdGhlciBoZWFkZXIgaXMgc2V0IChlLmcuIGxvY2FsaG9zdCkuICovXG5jb25zdCBnZXRJcCA9IChyZXF1ZXN0OiBSZXF1ZXN0SW5mbyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGZvcndhcmRlZCA9IHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtZm9yd2FyZGVkLWZvcicpXG4gIGlmIChmb3J3YXJkZWQpIHtcbiAgICByZXR1cm4gZm9yd2FyZGVkLnNwbGl0KCcsJylbMF0/LnRyaW0oKSA/PyAnJ1xuICB9XG4gIHJldHVybiByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LXJlYWwtaXAnKSA/PyAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0RHVyYXRpb24gPSAobXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGlmIChtcyA+PSAxMDAwKSB7XG4gICAgY29uc3Qgc2VjID0gbXMgLyAxMDAwXG4gICAgaWYgKHNlYyA+PSAxMCkge1xuICAgICAgcmV0dXJuIGAke01hdGgucm91bmQoc2VjKX1zYFxuICAgIH1cbiAgICBjb25zdCBvbmVEZWNpbWFsID0gc2VjLnRvRml4ZWQoMSlcbiAgICByZXR1cm4gb25lRGVjaW1hbC5lbmRzV2l0aCgnLjAnKSA/IGAke01hdGgucm91bmQoc2VjKX1zYCA6IGAke29uZURlY2ltYWx9c2BcbiAgfVxuICBpZiAobXMgPiAwICYmIG1zIDwgMSkge1xuICAgIHJldHVybiBgJHttcy50b0ZpeGVkKDIpfW1zYFxuICB9XG4gIHJldHVybiBgJHtNYXRoLnJvdW5kKG1zKX1tc2Bcbn1cblxuY29uc3QgZ2V0U2xvd1RocmVzaG9sZHMgPSAoXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgc2xvdzogbnVtYmVyOyB2ZXJ5U2xvdzogbnVtYmVyIH0gPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICByZXR1cm4ge1xuICAgIHNsb3c6IGNvbmZpZz8uc2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1NMT1dfTVMsXG4gICAgdmVyeVNsb3c6IGNvbmZpZz8udmVyeVNsb3dUaHJlc2hvbGQgPz8gREVGQVVMVF9WRVJZX1NMT1dfTVNcbiAgfVxufVxuXG5jb25zdCBjb2xvckR1cmF0aW9uVGV4dCA9IChcbiAgbXM6IG51bWJlcixcbiAgdXNlQ29sb3JzOiBib29sZWFuLFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB7IHRleHQ6IHN0cmluZzsgaXNWZXJ5U2xvdzogYm9vbGVhbiB9ID0+IHtcbiAgY29uc3QgcmF3ID0gZm9ybWF0RHVyYXRpb24obXMpXG4gIGNvbnN0IHsgc2xvdywgdmVyeVNsb3cgfSA9IGdldFNsb3dUaHJlc2hvbGRzKG9wdGlvbnMpXG4gIGNvbnN0IGlzVmVyeVNsb3cgPSBtcyA+PSB2ZXJ5U2xvd1xuXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHsgdGV4dDogcmF3LCBpc1ZlcnlTbG93IH1cbiAgfVxuXG4gIGxldCBjb2xvcmVkID0gcmF3XG4gIGlmIChtcyA8IHNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsuZ3JlZW4ocmF3KVxuICB9IGVsc2UgaWYgKG1zIDwgdmVyeVNsb3cpIHtcbiAgICBjb2xvcmVkID0gY2hhbGsueWVsbG93KHJhdylcbiAgfSBlbHNlIHtcbiAgICBjb2xvcmVkID0gY2hhbGsucmVkLmJvbGQocmF3KVxuICB9XG5cbiAgcmV0dXJuIHsgdGV4dDogY29sb3JlZCwgaXNWZXJ5U2xvdyB9XG59XG5cbmNvbnN0IGdldFNwZWVkVG9rZW4gPSAoaXNWZXJ5U2xvdzogYm9vbGVhbiwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCFpc1ZlcnlTbG93KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cbiAgY29uc3QgYmFkZ2UgPSAn4pqhIHNsb3cnXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAgJHtiYWRnZX1gXG4gIH1cbiAgcmV0dXJuIGAgJHtjaGFsay55ZWxsb3coYmFkZ2UpfWBcbn1cblxuLyoqIExvZ2l4bHlzaWEgYnJhbmQ6IGZveCBlbW9qaSB3aXRoIGxldmVsLWNvbG9yZWQgYmFja2dyb3VuZCB3aGVuIGNvbG9ycyBhcmUgZW5hYmxlZC4gKi9cbmNvbnN0IGdldExldmVsSWNvbiA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuICfwn6aKJ1xuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjaygnIPCfpoogJylcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKCcg8J+miiAnKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTGV2ZWwgPSAobGV2ZWw6IExvZ0xldmVsLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBsZXZlbFxuICB9XG5cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKGxldmVsKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2sobGV2ZWwpXG4gIH1cblxuICByZXR1cm4gY2hhbGsuYmdHcmVlbi5ibGFjayhsZXZlbClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZE1ldGhvZCA9IChtZXRob2Q6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbWV0aG9kXG4gIH1cblxuICBjb25zdCB1cHBlciA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gIGlmICh1cHBlciA9PT0gJ0dFVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQT1NUJykge1xuICAgIHJldHVybiBjaGFsay5ibHVlLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUFVUJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3cuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQQVRDSCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93QnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnREVMRVRFJykge1xuICAgIHJldHVybiBjaGFsay5yZWQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdPUFRJT05TJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnSEVBRCcpIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdUUkFDRScpIHtcbiAgICByZXR1cm4gY2hhbGsubWFnZW50YS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0NPTk5FQ1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW5CcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZS5ib2xkKHVwcGVyKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkU3RhdHVzID0gKHN0YXR1czogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGNvbnN0IG51bWVyaWMgPSBOdW1iZXIucGFyc2VJbnQoc3RhdHVzLCAxMClcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtZXJpYykpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpZiAobnVtZXJpYyA+PSA1MDApIHtcbiAgICByZXR1cm4gY2hhbGsucmVkKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSA0MDApIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93KHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAzMDApIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMjAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuKHN0YXR1cylcbiAgfVxuICByZXR1cm4gY2hhbGsuZ3JheShzdGF0dXMpXG59XG5cbmNvbnN0IGdldENvbG9yZWRUaW1lc3RhbXAgPSAodGltZXN0YW1wOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmdyYXkodGltZXN0YW1wKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkUGF0aG5hbWUgPSAocGF0aG5hbWU6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gcGF0aG5hbWVcbiAgfVxuXG4gIHJldHVybiBjaGFsay53aGl0ZUJyaWdodChwYXRobmFtZSlcbn1cblxuY29uc3QgZ2V0U3RhdHVzVGV4dCA9IChzdGF0dXNDb2RlOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0ZXh0ID0gU1RBVFVTX0NPREVTW3N0YXR1c0NvZGVdXG4gIHJldHVybiB0ZXh0ID8/ICcnXG59XG5cbmNvbnN0IGdldFNlcnZpY2VUb2tlbiA9IChvcHRpb25zOiBPcHRpb25zLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBuYW1lID0gb3B0aW9ucy5jb25maWc/LnNlcnZpY2U/LnRyaW0oKVxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBicmFja2V0ZWQgPSBgWyR7bmFtZX1dYFxuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBgJHticmFja2V0ZWR9IGBcbiAgfVxuICByZXR1cm4gYCR7Y2hhbGsuZGltKGJyYWNrZXRlZCl9IGBcbn1cblxuY29uc3Qgc3RyaW5naWZ5VHJlZVZhbHVlID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJ1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnXG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXR1cm4gdmFsdWUubWVzc2FnZVxuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxuICB9XG59XG5cbi8qKiBOZXN0ZWQgb2JqZWN0cyB0byBleHBhbmQgaW4gdGhlIGNvbnRleHQgdHJlZSAoZXhjbHVkZXMgQXJyYXlzLCBFcnJvciwgRGF0ZSkuICovXG5jb25zdCBpc0V4cGFuZGFibGVPYmplY3QgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAhKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKVxuXG5jb25zdCBjb2xsZWN0Q29udGV4dEVudHJpZXMgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHByZWZpeDogc3RyaW5nLFxuICBkZXB0aFJlbWFpbmluZzogbnVtYmVyXG4pOiBbc3RyaW5nLCBzdHJpbmddW10gPT4ge1xuICBjb25zdCBvdXQ6IFtzdHJpbmcsIHN0cmluZ11bXSA9IFtdXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBjb25zdCBrZXkgPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a31gIDoga1xuICAgIGNvbnN0IGV4cGFuZGFibGUgPSBpc0V4cGFuZGFibGVPYmplY3QodikgJiYgZGVwdGhSZW1haW5pbmcgPiAxXG5cbiAgICBpZiAoZXhwYW5kYWJsZSkge1xuICAgICAgb3V0LnB1c2goLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKHYsIGtleSwgZGVwdGhSZW1haW5pbmcgLSAxKSlcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goW2tleSwgc3RyaW5naWZ5VHJlZVZhbHVlKHYpXSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMgPSAoXG4gIGVudHJpZXM6IFtzdHJpbmcsIHN0cmluZ11bXSxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgbGFzdCA9IGVudHJpZXMubGVuZ3RoIC0gMVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBicmFuY2ggPSBpID09PSBsYXN0ID8gJ+KUlOKUgCcgOiAn4pSc4pSAJ1xuICAgIGNvbnN0IHBhaXIgPSBlbnRyaWVzW2ldXG4gICAgaWYgKCFwYWlyKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBbaywgdl0gPSBwYWlyXG4gICAgY29uc3Qga2V5UGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLmN5YW4oaykgOiBrXG4gICAgY29uc3QgdmFsUGFydCA9IHVzZUNvbG9ycyA/IGNoYWxrLndoaXRlKHYpIDogdlxuICAgIGxpbmVzLnB1c2goYCAgJHticmFuY2h9ICR7a2V5UGFydH0gICR7dmFsUGFydH1gKVxuICB9XG4gIHJldHVybiBsaW5lc1xufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQ29udGV4dFRyZWVMaW5lcyA9IChcbiAgY3R4OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0aW9uczogT3B0aW9ucyxcbiAgdXNlQ29sb3JzOiBib29sZWFuXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG4gIGlmIChkZXB0aCA8IDEpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBjb2xsZWN0Q29udGV4dEVudHJpZXMoY3R4LCAnJywgZGVwdGgpXG4gIHJldHVybiBmb3JtYXRFbnRyaWVzVG9UcmVlTGluZXMoZW50cmllcywgdXNlQ29sb3JzKVxufVxuXG5leHBvcnQgY29uc3QgYnVpbGRDb250ZXh0VHJlZUxpbmVzID0gKFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiBzdHJpbmdbXSA9PiB7XG4gIGlmIChvcHRpb25zLmNvbmZpZz8uc2hvd0NvbnRleHRUcmVlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgdXNlQ29sb3JzID0gc2hvdWxkVXNlQ29sb3JzKG9wdGlvbnMpXG4gIGNvbnN0IGRlcHRoID0gb3B0aW9ucy5jb25maWc/LmNvbnRleHREZXB0aCA/PyAxXG5cbiAgY29uc3QgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdID0gW11cblxuICBjb25zdCBjdHggPSBkYXRhLmNvbnRleHRcbiAgaWYgKFxuICAgIGN0eCAmJlxuICAgIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoY3R4KSAmJlxuICAgIE9iamVjdC5rZXlzKGN0eCBhcyBvYmplY3QpLmxlbmd0aCA+IDAgJiZcbiAgICBkZXB0aCA+PSAxXG4gICkge1xuICAgIGVudHJpZXMucHVzaChcbiAgICAgIC4uLmNvbGxlY3RDb250ZXh0RW50cmllcyhjdHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICcnLCBkZXB0aClcbiAgICApXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicgJiYgJ2Vycm9yJyBpbiBkYXRhICYmIGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1zZyA9IHBhcnNlRXJyb3IoZGF0YS5lcnJvcilcbiAgICBpZiAobXNnKSB7XG4gICAgICBlbnRyaWVzLnB1c2goWydlcnJvcicsIG1zZ10pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TG9nT3V0cHV0ID0gKHtcbiAgbGV2ZWwsXG4gIHJlcXVlc3QsXG4gIGRhdGEsXG4gIHN0b3JlLFxuICBvcHRpb25zXG59OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBGb3JtYXR0ZWRMb2dPdXRwdXQgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID0gY29uZmlnPy5jdXN0b21Mb2dGb3JtYXQgPz8gREVGQVVMVF9MT0dfRk9STUFUXG5cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICBjb25zdCBlcG9jaCA9IFN0cmluZyhub3cuZ2V0VGltZSgpKVxuICBjb25zdCByYXdUaW1lc3RhbXAgPSBmb3JtYXRUaW1lc3RhbXAobm93LCBjb25maWc/LnRpbWVzdGFtcD8udHJhbnNsYXRlVGltZSlcbiAgY29uc3QgdGltZXN0YW1wID0gZ2V0Q29sb3JlZFRpbWVzdGFtcChyYXdUaW1lc3RhbXAsIHVzZUNvbG9ycylcblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IHBhdGhuYW1lID0gbmV3IFVSTChyZXF1ZXN0LnVybCkucGF0aG5hbWVcbiAgY29uc3Qgc3RhdHVzVmFsdWUgPSBkYXRhLnN0YXR1c1xuICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICBzdGF0dXNWYWx1ZSA9PT0gbnVsbCB8fCBzdGF0dXNWYWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICA/IDIwMFxuICAgICAgOiBnZXRTdGF0dXNDb2RlKHN0YXR1c1ZhbHVlKVxuICBjb25zdCBzdGF0dXMgPSBTdHJpbmcoc3RhdHVzQ29kZSlcbiAgY29uc3QgaXAgPSBjb25maWc/LmlwID09PSB0cnVlID8gZ2V0SXAocmVxdWVzdCkgOiAnJ1xuXG4gIGNvbnN0IHNob3dUcmVlID0gY29uZmlnPy5zaG93Q29udGV4dFRyZWUgIT09IGZhbHNlXG4gIGNvbnN0IGN0eFN0cmluZyA9XG4gICAgc2hvd1RyZWUgJiZcbiAgICBkYXRhLmNvbnRleHQgJiZcbiAgICB0eXBlb2YgZGF0YS5jb250ZXh0ID09PSAnb2JqZWN0JyAmJlxuICAgICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dCkgJiZcbiAgICBPYmplY3Qua2V5cyhkYXRhLmNvbnRleHQgYXMgb2JqZWN0KS5sZW5ndGggPiAwXG4gICAgICA/ICcnXG4gICAgICA6IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuXG4gIGNvbnN0IGNvbG9yZWRMZXZlbCA9IGdldENvbG9yZWRMZXZlbChsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBtZXRob2RQYWRkZWQgPSByZXF1ZXN0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpLnBhZEVuZChNRVRIT0RfUEFEKVxuICBjb25zdCBjb2xvcmVkTWV0aG9kID0gZ2V0Q29sb3JlZE1ldGhvZChtZXRob2RQYWRkZWQsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCB7IHRleHQ6IGNvbG9yZWREdXJhdGlvbiwgaXNWZXJ5U2xvdyB9ID0gY29sb3JEdXJhdGlvblRleHQoXG4gICAgZHVyYXRpb25NcyxcbiAgICB1c2VDb2xvcnMsXG4gICAgb3B0aW9uc1xuICApXG4gIGNvbnN0IHNwZWVkVG9rZW4gPSBnZXRTcGVlZFRva2VuKGlzVmVyeVNsb3csIHVzZUNvbG9ycylcbiAgY29uc3QgaWNvbiA9IGdldExldmVsSWNvbihsZXZlbCwgdXNlQ29sb3JzKVxuICBjb25zdCBzdGF0dXNUZXh0ID0gZ2V0U3RhdHVzVGV4dChzdGF0dXNDb2RlKVxuICBjb25zdCBzZXJ2aWNlVG9rZW4gPSBnZXRTZXJ2aWNlVG9rZW4ob3B0aW9ucywgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1haW4gPSBmb3JtYXRcbiAgICAucmVwbGFjZUFsbCgne25vd30nLCB0aW1lc3RhbXApXG4gICAgLnJlcGxhY2VBbGwoJ3tlcG9jaH0nLCBlcG9jaClcbiAgICAucmVwbGFjZUFsbCgne2xldmVsfScsIGNvbG9yZWRMZXZlbClcbiAgICAucmVwbGFjZUFsbCgne2ljb259JywgaWNvbilcbiAgICAucmVwbGFjZUFsbCgne2R1cmF0aW9ufScsIGNvbG9yZWREdXJhdGlvbilcbiAgICAucmVwbGFjZUFsbCgne21ldGhvZH0nLCBjb2xvcmVkTWV0aG9kKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aG5hbWV9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aH0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3tzdGF0dXN9JywgY29sb3JlZFN0YXR1cylcbiAgICAucmVwbGFjZUFsbCgne3N0YXR1c1RleHR9Jywgc3RhdHVzVGV4dClcbiAgICAucmVwbGFjZUFsbCgne21lc3NhZ2V9JywgbWVzc2FnZSlcbiAgICAucmVwbGFjZUFsbCgne2lwfScsIGlwKVxuICAgIC5yZXBsYWNlQWxsKCd7Y29udGV4dH0nLCBjdHhTdHJpbmcpXG4gICAgLnJlcGxhY2VBbGwoJ3tzZXJ2aWNlfScsIHNlcnZpY2VUb2tlbilcbiAgICAucmVwbGFjZUFsbCgne3NwZWVkfScsIHNwZWVkVG9rZW4pXG5cbiAgY29uc3QgY29udGV4dExpbmVzID0gYnVpbGRDb250ZXh0VHJlZUxpbmVzKGxldmVsLCBkYXRhLCBvcHRpb25zKVxuXG4gIHJldHVybiB7IG1haW4sIGNvbnRleHRMaW5lcyB9XG59XG5cbi8qKiBAZGVwcmVjYXRlZCBQcmVmZXIge0BsaW5rIGZvcm1hdExvZ091dHB1dH0gZm9yIG11bHRpLWxpbmUgY29udGV4dCB0cmVlcy4gUmV0dXJucyB0aGUgbWFpbiBsaW5lIG9ubHkuICovXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9IChpbnB1dDoge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgc3RvcmU6IFN0b3JlRGF0YVxuICBvcHRpb25zOiBPcHRpb25zXG59KTogc3RyaW5nID0+XG4gIGZvcm1hdExvZ091dHB1dCh7XG4gICAgLi4uaW5wdXQsXG4gICAgb3B0aW9uczoge1xuICAgICAgLi4uaW5wdXQub3B0aW9ucyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAuLi4oaW5wdXQub3B0aW9ucy5jb25maWcgPz8ge30pLFxuICAgICAgICBzaG93Q29udGV4dFRyZWU6IGZhbHNlXG4gICAgICB9XG4gICAgfVxuICB9KS5tYWluXG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiZXhwb3J0IGNvbnN0IHBhcnNlRXJyb3IgPSAoZXJyb3I6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBsZXQgbWVzc2FnZSA9ICdBbiBlcnJvciBvY2N1cnJlZCdcblxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlXG4gIH0gZWxzZSBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnbWVzc2FnZScgaW4gZXJyb3IpIHtcbiAgICBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSBhcyBzdHJpbmdcbiAgfSBlbHNlIHtcbiAgICBtZXNzYWdlID0gU3RyaW5nKGVycm9yKVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2Vcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBsb2dUb1RyYW5zcG9ydHMgfSBmcm9tICcuLi9vdXRwdXQnXG5pbXBvcnQgeyBsb2dUb0ZpbGUgfSBmcm9tICcuLi9vdXRwdXQvZmlsZSdcbmltcG9ydCB7IHBhcnNlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvcidcbmltcG9ydCB7IGZvcm1hdExvZ091dHB1dCB9IGZyb20gJy4vY3JlYXRlLWxvZ2dlcidcblxuY29uc3QgaXNFcnJvcldpdGhTdGF0dXMgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyB7IHN0YXR1czogbnVtYmVyOyBtZXNzYWdlPzogc3RyaW5nIH0gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAnc3RhdHVzJyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgKHZhbHVlIGFzIHsgc3RhdHVzPzogdW5rbm93biB9KS5zdGF0dXMgPT09ICdudW1iZXInXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvLFxuICBlcnJvcjogdW5rbm93bixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgbG9nRmlsdGVyID0gY29uZmlnPy5sb2dGaWx0ZXJcbiAgaWYgKFxuICAgIGxvZ0ZpbHRlcj8ubGV2ZWwgJiZcbiAgICBsb2dGaWx0ZXIubGV2ZWwubGVuZ3RoID4gMCAmJlxuICAgICFsb2dGaWx0ZXIubGV2ZWwuaW5jbHVkZXMoJ0VSUk9SJylcbiAgKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcblxuICBjb25zdCBzdGF0dXMgPSBpc0Vycm9yV2l0aFN0YXR1cyhlcnJvcikgPyBlcnJvci5zdGF0dXMgOiA1MDBcbiAgY29uc3QgbWVzc2FnZSA9IHBhcnNlRXJyb3IoZXJyb3IpXG5cbiAgY29uc3QgbGV2ZWw6IExvZ0xldmVsID0gJ0VSUk9SJ1xuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgc3RhdHVzLCBtZXNzYWdlLCBlcnJvciB9XG5cbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG5cbiAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gY29uZmlnPy5sb2dGaWxlUGF0aFxuICAgIGlmIChmaWxlUGF0aCkge1xuICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgIGxldmVsLFxuICAgIHJlcXVlc3QsXG4gICAgZGF0YSxcbiAgICBzdG9yZSxcbiAgICBvcHRpb25zXG4gIH0pXG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPVxuICAgIGNvbnRleHRMaW5lcy5sZW5ndGggPiAwID8gYCR7bWFpbn1cXG4ke2NvbnRleHRMaW5lcy5qb2luKCdcXG4nKX1gIDogbWFpblxuICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UpXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNBVCx3QkFBUyxvQkFFVCxJQUFNLElBQW1DLElBQU0sQ0FDN0MsR0FBSSxDQUVGLE9BRGdCLEVBQWMsWUFBWSxHQUFHLEVBQzlCLHFCQUFxQixFQUNwQyxLQUFNLENBQ04sTUFBTyxDQUFDLEtBRVQsRUFFRyxJQUF1QyxJQUFNLENBQ2pELEdBQUksQ0FFRixPQURnQixFQUFjLFlBQVksR0FBRyxFQUM5QixvQkFBb0IsRUFDbkMsS0FBTSxDQUNOLE1BQU8sQ0FBQyxLQUVULEVBRUcsR0FBYSxDQUFDLEVBQWMsSUFBMEIsQ0FDMUQsR0FBSSxFQUFLLFFBQVUsRUFDakIsT0FBTyxFQUFLLE1BQU0sRUFBRyxDQUFLLEVBRzVCLElBQU0sRUFBTyxLQUFLLE9BQU8sRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUMzQyxFQUFRLEVBQVEsRUFBSyxPQUFTLEVBQ3BDLE1BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxJQUFJLElBQU8sSUFBSSxPQUFPLENBQUssS0FXekMsRUFBZSxDQUMxQixFQUNBLElBQ1csQ0FDWCxJQUFNLEVBQVUsR0FBVSxRQUNwQixFQUFjLEVBQVUsV0FBVyxJQUFZLFNBRS9DLEVBQWtCLENBQ3RCLENBQUUsS0FBTSxPQUFRLEVBQ2hCLENBQUUsS0FBTSxTQUFVLEtBQU0sQ0FBWSxFQUNwQyxDQUFFLEtBQU0sT0FBUSxFQUNoQixDQUFFLEtBQU0sT0FBUSxLQUFNLENBQWUsQ0FDdkMsRUFDQSxHQUFJLEVBQ0YsRUFBSyxLQUFLLENBQUUsS0FBTSxPQUFRLEtBQU0sQ0FBZSxDQUFDLEVBRWxELEVBQUssS0FBSyxDQUFFLEtBQU0s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LENBQ3JCLEtBQU0sYUFDTixPQUFRLENBQ04sWUFDRSw0RUFDRixLQUFNLENBQUMsVUFBVyxNQUFNLENBQzFCLENBQ0YsQ0FBQyxFQUlJLE1BQU0sU0FBVSxDQUFNLEVBQ3RCLE1BQU0sT0FBUSxFQUFPLElBQUksRUFDekIsTUFBTSxhQUFjLE9BQU8sQ0FBQyxDQUFDLEVBQzdCLFFBQVEsRUFBRyxZQUFtQixDQUM3QixHQUFJLEVBQ0YsRUFBWSxFQUFRLENBQU8sRUFDdEIsS0FFTCxJQUFNLEVBQU8sT0FBTyxRQUFRLElBQUksSUFBSSxHQUFLLEtBQ25DLEVBQVcsUUFBUSxJQUFJLE1BQVEsWUFDckMsRUFBWSxDQUFFLE9BQU0sV0FBVSxTQUFVLE1BQU8sRUFBRyxDQUFPLEdBRTVELEVBQ0EsVUFBVSxFQUFHLFdBQVksQ0FDeEIsRUFBTSxXQUFhLFFBQVEsT0FBTyxPQUFPLEVBQzFDLEVBQ0EsY0FBYyxFQUFHLFVBQVMsTUFBSyxXQUFZLENBQzFDLEdBQUksRUFBYSxJQUFJLENBQU8sRUFDMUIsT0FHRixJQUFNLEVBQVMsT0FBTyxFQUFJLFNBQVcsU0FBVyxFQUFJLE9BQVMsSUFDekQsRUFBc0MsT0FDMUMsR0FBSSxHQUFVLElBQ1osRUFBUSxRQUNILFFBQUksR0FBVSxJQUNuQixFQUFRLFVBR1YsRUFBTyxJQUFJLEVBQU8sRUFBUyxDQUFFLFFBQU8sRUFBRyxDQUFLLEVBQzdDLEVBQ0EsUUFBUSxFQUFHLFVBQVMsUUFBTyxXQUFZLENBQ3RDLEVBQU8sZ0JBQWdCLEVBQVMsRUFBTyxDQUFLLEVBQzdDLEVBRUEsR0FBRyxRQUFRLEdBZUgiLAogICJkZWJ1Z0lkIjogIkY4MzU5MDQ3RTJDNzFDQTg2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
9
+ //# debugId=5ECC4ED287A03C9864756E2164756E21
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIiwgInNyYy9leHRlbnNpb25zL2Jhbm5lci50cyIsICJzcmMvZXh0ZW5zaW9ucy9pbmRleC50cyIsICJzcmMvbG9nZ2VyL2luZGV4LnRzIiwgInNyYy9vdXRwdXQvaW5kZXgudHMiLCAic3JjL291dHB1dC9maWxlLnRzIiwgInNyYy9vdXRwdXQvZnMudHMiLCAic3JjL291dHB1dC9yb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyYy91dGlscy9yb3RhdGlvbi50cyIsICJzcmMvdXRpbHMvcmVkYWN0LnRzIiwgInNyYy9sb2dnZXIvY3JlYXRlLWxvZ2dlci50cyIsICJzcmMvaGVscGVycy9zdGF0dXMudHMiLCAic3JjL3V0aWxzL2Vycm9yLnRzIiwgInNyYy9sb2dnZXIvaGFuZGxlLWh0dHAtZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgRWx5c2lhIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuXG4vKipcbiAqIEVtcHR5IHNpbmdsZXRvbiBzbG90cyBtdXN0IG5vdCB1c2UgYFJlY29yZDxzdHJpbmcsIG5ldmVyPmA6IGludGVyc2VjdGluZyB0aGF0IHdpdGggRWx5c2lhJ3MgYENvbnRleHRgXG4gKiBtYWtlcyBldmVyeSBrZXkgKGluY2x1ZGluZyBgc3RvcmVgKSBiZWNvbWUgYG5ldmVyYCBiZWNhdXNlIGVhY2gga2V5IGlzIG1lcmdlZCB3aXRoIGBuZXZlcmAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wdHlFbHlzaWFTbG90IHtcbiAgcmVhZG9ubHkgX19sb2dpeGx5c2lhRW1wdHk/OiBuZXZlclxufVxuXG4vKipcbiAqIEV4cGxpY2l0IHNpbmdsZXRvbiB3aXRob3V0IEVseXNpYSdzIGBTaW5nbGV0b25CYXNlYCBgUmVjb3JkPHN0cmluZywgdW5rbm93bj5gIG9uIGRlY29yYXRvci9kZXJpdmUvcmVzb2x2ZSBzb1xuICogbWVyZ2VkIGBDb250ZXh0YCBhbmQgV2ViU29ja2V0IGB3cy5kYXRhYCBrZWVwIHByZWNpc2Uga2V5cyBhZnRlciBgLnVzZShsb2dpeGx5c2lhKCkpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpeGx5c2lhU2luZ2xldG9uIHtcbiAgZGVjb3JhdG9yOiBFbXB0eUVseXNpYVNsb3RcbiAgZGVyaXZlOiBFbXB0eUVseXNpYVNsb3RcbiAgcmVzb2x2ZTogRW1wdHlFbHlzaWFTbG90XG4gIHN0b3JlOiBMb2dpeGx5c2lhU3RvcmVcbn1cblxuLy8gRWx5c2lhJ3MgYFNpbmdsZXRvbkJhc2Uuc3RvcmVgIGlzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmA7IGBMb2dpeGx5c2lhU3RvcmVgIGlzIGludGVudGlvbmFsbHkgY2xvc2VkIChzZWUgIzIyMCkuXG4vLyBAdHMtZXhwZWN0LWVycm9yIOKAlCBjbG9zZWQgc3RvcmUgaXMgY29ycmVjdCBhdCBydW50aW1lIGFuZCBmb3IgbWVyZ2VkIGB3cy5kYXRhYCBpbmZlcmVuY2UuXG5leHBvcnQgdHlwZSBMb2dpeGx5c2lhID0gRWx5c2lhPCcnLCBMb2dpeGx5c2lhU2luZ2xldG9uPlxuXG5leHBvcnQgY29uc3QgbG9naXhseXNpYSA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dpeGx5c2lhID0+IHtcbiAgY29uc3QgZGlkQ3VzdG9tTG9nID0gbmV3IFdlYWtTZXQ8UmVxdWVzdD4oKVxuICBjb25zdCBiYXNlTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKG9wdGlvbnMpXG4gIGNvbnN0IGxvZ2dlciA9IHtcbiAgICAuLi5iYXNlTG9nZ2VyLFxuICAgIGRlYnVnOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmRlYnVnKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBpbmZvOiAoXG4gICAgICByZXF1ZXN0OiBSZXF1ZXN0LFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgKSA9PiB7XG4gICAgICBkaWRDdXN0b21Mb2cuYWRkKHJlcXVlc3QpXG4gICAgICBiYXNlTG9nZ2VyLmluZm8ocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIud2FybihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZXJyb3IocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9XG4gIH1cblxuICBjb25zdCBhcHAgPSBuZXcgRWx5c2lhKHtcbiAgICBuYW1lOiAnTG9naXhseXNpYScsXG4gICAgZGV0YWlsOiB7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0xvZ2l4bHlzaWEgaXMgYSBwbHVnaW4gZm9yIEVseXNpYSB0aGF0IHByb3ZpZGVzIGEgbG9nZ2VyIGFuZCBwaW5vIGxvZ2dlci4nLFxuICAgICAgdGFnczogWydsb2dnaW5nJywgJ3Bpbm8nXVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4gKFxuICAgIGFwcFxuICAgICAgLnN0YXRlKCdsb2dnZXInLCBsb2dnZXIpXG4gICAgICAuc3RhdGUoJ3Bpbm8nLCBsb2dnZXIucGlubylcbiAgICAgIC5zdGF0ZSgnYmVmb3JlVGltZScsIEJpZ0ludCgwKSlcbiAgICAgIC5vblN0YXJ0KCh7IHNlcnZlciB9KTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgICAgICBzdGFydFNlcnZlcihzZXJ2ZXIsIG9wdGlvbnMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm9kZSBhZGFwdGVyIGZhbGxiYWNrXG4gICAgICAgICAgY29uc3QgcG9ydCA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwXG4gICAgICAgICAgY29uc3QgaG9zdG5hbWUgPSBwcm9jZXNzLmVudi5IT1NUIHx8ICdsb2NhbGhvc3QnXG4gICAgICAgICAgc3RhcnRTZXJ2ZXIoeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2w6ICdodHRwJyB9LCBvcHRpb25zKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLm9uUmVxdWVzdCgoeyBzdG9yZSB9KSA9PiB7XG4gICAgICAgIHN0b3JlLmJlZm9yZVRpbWUgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKVxuICAgICAgfSlcbiAgICAgIC5vbkFmdGVySGFuZGxlKCh7IHJlcXVlc3QsIHNldCwgc3RvcmUgfSkgPT4ge1xuICAgICAgICBpZiAoZGlkQ3VzdG9tTG9nLmhhcyhyZXF1ZXN0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdHlwZW9mIHNldC5zdGF0dXMgPT09ICdudW1iZXInID8gc2V0LnN0YXR1cyA6IDIwMFxuICAgICAgICBsZXQgbGV2ZWw6ICdJTkZPJyB8ICdXQVJOSU5HJyB8ICdFUlJPUicgPSAnSU5GTydcbiAgICAgICAgaWYgKHN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICBsZXZlbCA9ICdFUlJPUidcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnV0FSTklORydcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIHJlcXVlc3QsIHsgc3RhdHVzIH0sIHN0b3JlKVxuICAgICAgfSlcbiAgICAgIC5vbkVycm9yKCh7IHJlcXVlc3QsIGVycm9yLCBzdG9yZSB9KSA9PiB7XG4gICAgICAgIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuICAgICAgfSlcbiAgICAgIC8vIEVuc3VyZSBwbHVnaW4gbGlmZWN5Y2xlIGhvb2tzIChvblJlcXVlc3Qvb25BZnRlckhhbmRsZS9vbkVycm9yKSBhcHBseSB0byB0aGUgcGFyZW50IGFwcC5cbiAgICAgIC5hcygnc2NvcGVkJykgYXMgTG9naXhseXNpYVxuICApXG59XG5cbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSdcblxuY29uc3QgZWx5c2lhUGtnOiB7IHZlcnNpb24/OiBzdHJpbmcgfSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVxuICAgIHJldHVybiByZXF1aXJlKCdlbHlzaWEvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgbG9naXhseXNpYVBrZzogeyB2ZXJzaW9uPzogc3RyaW5nIH0gPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybClcbiAgICByZXR1cm4gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHt9XG4gIH1cbn0pKClcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG50eXBlIFJvd1NwZWMgPVxuICB8IHsga2luZDogJ2VtcHR5JyB9XG4gIHwgeyBraW5kOiAnY2VudGVyJzsgdGV4dDogc3RyaW5nIH1cbiAgfCB7IGtpbmQ6ICdsZWZ0JzsgdGV4dDogc3RyaW5nIH1cblxuLyoqXG4gKiBCb3ggYmFubmVyOiBFbHlzaWEgdmVyc2lvbiAoY2VudGVyZWQpLCBVUkwgbGluZSwgb3B0aW9uYWwgbG9naXhseXNpYSB2ZXJzaW9uIGxpbmUuXG4gKi9cbmV4cG9ydCBjb25zdCByZW5kZXJCYW5uZXIgPSAoXG4gIHVybERpc3BsYXlMaW5lOiBzdHJpbmcsXG4gIGxvZ2l4bHlzaWFMaW5lOiBzdHJpbmcgfCBudWxsXG4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCB2ZXJzaW9uID0gZWx5c2lhUGtnLnZlcnNpb25cbiAgY29uc3QgdmVyc2lvbkxpbmUgPSB2ZXJzaW9uID8gYEVseXNpYSB2JHt2ZXJzaW9ufWAgOiAnRWx5c2lhJ1xuXG4gIGNvbnN0IHJvd3M6IFJvd1NwZWNbXSA9IFtcbiAgICB7IGtpbmQ6ICdlbXB0eScgfSxcbiAgICB7IGtpbmQ6ICdjZW50ZXInLCB0ZXh0OiB2ZXJzaW9uTGluZSB9LFxuICAgIHsga2luZDogJ2VtcHR5JyB9LFxuICAgIHsga2luZDogJ2xlZnQnLCB0ZXh0OiB1cmxEaXNwbGF5TGluZSB9XG4gIF1cbiAgaWYgKGxvZ2l4bHlzaWFMaW5lKSB7XG4gICAgcm93cy5wdXNoKHsga2luZDogJ2xlZnQnLCB0ZXh0OiBsb2dpeGx5c2lhTGluZSB9KVxuICB9XG4gIHJvd3MucHVzaCh7IGtpbmQ6ICdlbXB0eScgfSlcblxuICBjb25zdCBjb250ZW50V2lkdGggPSBNYXRoLm1heChcbiAgICB2ZXJzaW9uTGluZS5sZW5ndGgsXG4gICAgdXJsRGlzcGxheUxpbmUubGVuZ3RoLFxuICAgIC4uLihsb2dpeGx5c2lhTGluZSA/IFtsb2dpeGx5c2lhTGluZS5sZW5ndGhdIDogWzBdKVxuICApXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0XG5cbiAgY29uc3QgdG9wID0gYOKUjCR7J+KUgCcucmVwZWF0KGlubmVyV2lkdGgpfeKUkGBcbiAgY29uc3QgYm90ID0gYOKUlCR7J+KUgCcucmVwZWF0KGlubmVyV2lkdGgpfeKUmGBcbiAgY29uc3QgZW1wdHlSb3cgPSBg4pSCJHsnICcucmVwZWF0KGlubmVyV2lkdGgpfeKUgmBcblxuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW3RvcF1cbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGlmIChyb3cua2luZCA9PT0gJ2VtcHR5Jykge1xuICAgICAgb3V0LnB1c2goZW1wdHlSb3cpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAocm93LmtpbmQgPT09ICdjZW50ZXInKSB7XG4gICAgICBvdXQucHVzaChg4pSCJHtjZW50ZXJUZXh0KHJvdy50ZXh0LCBpbm5lcldpZHRoKX3ilIJgKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgY29uc3QgdGV4dCA9IHJvdy50ZXh0XG4gICAgY29uc3QgcGFkZGluZyA9IE1hdGgubWF4KDAsIGlubmVyV2lkdGggLSB0ZXh0Lmxlbmd0aCAtIDQpXG4gICAgb3V0LnB1c2goYOKUgiAgJHt0ZXh0fSR7JyAnLnJlcGVhdChwYWRkaW5nKX0gIOKUgmApXG4gIH1cbiAgb3V0LnB1c2goYm90KVxuICByZXR1cm4gb3V0LmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUgPSAoKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHYgPSBsb2dpeGx5c2lhUGtnLnZlcnNpb25cbiAgaWYgKCF2KSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICByZXR1cm4gYCAgICAgbG9naXhseXNpYSB2JHt2fWBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGdldExvZ2l4bHlzaWFWZXJzaW9uTGluZSwgcmVuZGVyQmFubmVyIH0gZnJvbSAnLi9iYW5uZXInXG5cbmV4cG9ydCBjb25zdCBzdGFydFNlcnZlciA9IChcbiAgc2VydmVyOiB7IHBvcnQ/OiBudW1iZXI7IGhvc3RuYW1lPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZyB8IG51bGwgfSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNob3dTdGFydHVwTWVzc2FnZSA9IG9wdGlvbnMuY29uZmlnPy5zaG93U3RhcnR1cE1lc3NhZ2UgPz8gdHJ1ZVxuICBpZiAoIXNob3dTdGFydHVwTWVzc2FnZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBwb3J0LCBob3N0bmFtZSwgcHJvdG9jb2wgfSA9IHNlcnZlclxuICBpZiAocG9ydCA9PT0gdW5kZWZpbmVkIHx8ICFob3N0bmFtZSB8fCAhcHJvdG9jb2wpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdG5hbWV9OiR7cG9ydH1gXG4gIGNvbnN0IG1lc3NhZ2UgPSBg8J+miiBFbHlzaWEgaXMgcnVubmluZyBhdCAke3VybH1gXG4gIGNvbnN0IHVybERpc3BsYXlMaW5lID0gYPCfpoogICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKHVybERpc3BsYXlMaW5lLCBnZXRMb2dpeGx5c2lhVmVyc2lvbkxpbmUoKSkpXG59XG4iLAogICAgImltcG9ydCBwaW5vIGZyb20gJ3Bpbm8nXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0ZpbHRlcixcbiAgTG9nZ2VyLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgUmVxdWVzdEluZm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyByZWRhY3QsIHJlZGFjdFJlcXVlc3QgfSBmcm9tICcuLi91dGlscy9yZWRhY3QnXG5pbXBvcnQgeyBmb3JtYXRMb2dPdXRwdXQgfSBmcm9tICcuL2NyZWF0ZS1sb2dnZXInXG5pbXBvcnQgeyBoYW5kbGVIdHRwRXJyb3IgfSBmcm9tICcuL2hhbmRsZS1odHRwLWVycm9yJ1xuXG5leHBvcnQgY29uc3QgY3JlYXRlTG9nZ2VyID0gKFxuICBvcHRpb25zOiBPcHRpb25zID0ge30sXG4gIHBpbm9GYWN0b3J5OiB0eXBlb2YgcGlubyA9IHBpbm9cbik6IExvZ2dlciA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG5cbiAgY29uc3QgcGlub0NvbmZpZyA9IGNvbmZpZz8ucGlub1xuICBjb25zdCB7IHByZXR0eVByaW50LCAuLi5waW5vT3B0aW9ucyB9ID0gcGlub0NvbmZpZyA/PyB7fVxuXG4gIGNvbnN0IHByZXR0eVByaW50T3B0aW9ucyA9XG4gICAgdHlwZW9mIHByZXR0eVByaW50ID09PSAnb2JqZWN0JyAmJiBwcmV0dHlQcmludCAhPT0gbnVsbFxuICAgICAgPyAocHJldHR5UHJpbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGVuYWJsZVByZXR0eVByaW50ID1cbiAgICBwcmV0dHlQcmludCA9PT0gdHJ1ZSB8fCBwcmV0dHlQcmludE9wdGlvbnMgIT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNob3VsZFByZXR0eVByaW50ID1cbiAgICBlbmFibGVQcmV0dHlQcmludCAmJiBwaW5vT3B0aW9ucy50cmFuc3BvcnQgPT09IHVuZGVmaW5lZFxuXG4gIGNvbnN0IG1lc3NhZ2VLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/Lm1lc3NhZ2VLZXkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/P1xuICAgIHBpbm9PcHRpb25zLm1lc3NhZ2VLZXlcbiAgY29uc3QgZXJyb3JLZXkgPVxuICAgIChwcmV0dHlQcmludE9wdGlvbnM/LmVycm9yS2V5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gcGlub09wdGlvbnMuZXJyb3JLZXlcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8ge1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIC4uLnByZXR0eVByaW50T3B0aW9ucyxcbiAgICAgICAgICBtZXNzYWdlS2V5LFxuICAgICAgICAgIGVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICA6IHBpbm9PcHRpb25zLnRyYW5zcG9ydFxuXG4gIGNvbnN0IHBpbm9Mb2dnZXI6IFBpbm8gPSBwaW5vRmFjdG9yeSh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5LFxuICAgIHRyYW5zcG9ydFxuICB9KVxuXG4gIGNvbnN0IHNob3VsZExvZyA9IChsZXZlbDogTG9nTGV2ZWwsIGxvZ0ZpbHRlcj86IExvZ0ZpbHRlcik6IGJvb2xlYW4gPT4ge1xuICAgIGlmICghbG9nRmlsdGVyPy5sZXZlbCB8fCBsb2dGaWx0ZXIubGV2ZWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gbG9nRmlsdGVyLmxldmVsLmluY2x1ZGVzKGxldmVsKVxuICB9XG5cbiAgY29uc3QgbG9nID0gKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICByZXF1ZXN0OiBSZXF1ZXN0SW5mbyxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxvZ0RhdGEgPSBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3QoZGF0YSkgOiBkYXRhXG4gICAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgICBjb25maWc/LmF1dG9SZWRhY3QgPT09IHRydWUgPyByZWRhY3RSZXF1ZXN0KHJlcXVlc3QpIDogcmVxdWVzdFxuXG4gICAgbG9nVG9UcmFuc3BvcnRzKHtcbiAgICAgIGxldmVsLFxuICAgICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICBzdG9yZSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHtcbiAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgICAgc3RvcmUsXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHsgbWFpbiwgY29udGV4dExpbmVzIH0gPSBmb3JtYXRMb2dPdXRwdXQoe1xuICAgICAgbGV2ZWwsXG4gICAgICByZXF1ZXN0OiBsb2dSZXF1ZXN0LFxuICAgICAgZGF0YTogbG9nRGF0YSxcbiAgICAgIHN0b3JlLFxuICAgICAgb3B0aW9uc1xuICAgIH0pXG4gICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCBzdG9yZTogU3RvcmVEYXRhID0geyBiZWZvcmVUaW1lOiBwcm9jZXNzLmhydGltZS5iaWdpbnQoKSB9XG4gICAgbG9nKGxldmVsLCByZXF1ZXN0LCB7IG1lc3NhZ2UsIGNvbnRleHQgfSwgc3RvcmUpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBpbm86IHBpbm9Mb2dnZXIsXG4gICAgbG9nLFxuICAgIGhhbmRsZUh0dHBFcnJvcjogKHJlcXVlc3QsIGVycm9yLCBzdG9yZSkgPT4ge1xuICAgICAgaGFuZGxlSHR0cEVycm9yKHJlcXVlc3QsIGVycm9yLCBzdG9yZSwgb3B0aW9ucylcbiAgICB9LFxuICAgIGRlYnVnOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ0RFQlVHJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnSU5GTycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICB3YXJuOiAocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dCkgPT4ge1xuICAgICAgbG9nV2l0aENvbnRleHQoJ1dBUk5JTkcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgZXJyb3I6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnRVJST1InLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcblxuaW50ZXJmYWNlIExvZ1RvVHJhbnNwb3J0c0lucHV0IHtcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgbGV2ZWw6IExvZ0xldmVsXG4gIG9wdGlvbnM6IE9wdGlvbnNcbiAgcmVxdWVzdDogUmVxdWVzdEluZm9cbiAgc3RvcmU6IFN0b3JlRGF0YVxufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0SW5mbywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFN0b3JlRGF0YSwgT3B0aW9uc11cbik6IHZvaWQgPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9UcmFuc3BvcnRzSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyB7XG4gICAgICAgICAgbGV2ZWw6IGFyZ3NbMF0sXG4gICAgICAgICAgcmVxdWVzdDogYXJnc1sxXSxcbiAgICAgICAgICBkYXRhOiBhcmdzWzJdLFxuICAgICAgICAgIHN0b3JlOiBhcmdzWzNdLFxuICAgICAgICAgIG9wdGlvbnM6IGFyZ3NbNF1cbiAgICAgICAgfVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IHRyYW5zcG9ydHMgPSBvcHRpb25zLmNvbmZpZz8udHJhbnNwb3J0cyA/PyBbXVxuICBpZiAodHJhbnNwb3J0cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJlcXVlc3Q6IHtcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICB1cmw6IHJlcXVlc3QudXJsXG4gICAgfSxcbiAgICAuLi5kYXRhLFxuICAgIGJlZm9yZVRpbWU6IHN0b3JlLmJlZm9yZVRpbWVcbiAgfVxuXG4gIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRyYW5zcG9ydHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdHJhbnNwb3J0LmxvZyhsZXZlbCwgbWVzc2FnZSwgbWV0YSlcbiAgICAgIGlmIChcbiAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgIHR5cGVvZiAocmVzdWx0IGFzIHsgY2F0Y2g/OiB1bmtub3duIH0pLmNhdGNoID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgOyhyZXN1bHQgYXMgUHJvbWlzZTx2b2lkPikuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRyYW5zcG9ydCBmYWlsdXJlcyBtdXN0IG5ldmVyIGNyYXNoIGFwcGxpY2F0aW9uIGxvZ2dpbmcuXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB7IGFwcGVuZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJ1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gJ25vZGU6cGF0aCdcbmltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3RJbmZvLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgZW5zdXJlRGlyIH0gZnJvbSAnLi9mcydcbmltcG9ydCB7IHBlcmZvcm1Sb3RhdGlvbiwgc2hvdWxkUm90YXRlIH0gZnJvbSAnLi9yb3RhdGlvbi1tYW5hZ2VyJ1xuXG4vLyBQZXItZmlsZSBtdXRleCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgcm90YXRpb25cbmNvbnN0IGZpbGVMb2NrcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpXG5cbmNvbnN0IGFjcXVpcmVMb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBmaWxlTG9ja3MuZ2V0KGZpbGVQYXRoKSA/PyBQcm9taXNlLnJlc29sdmUoKVxuXG4gIGxldCByZXNvbHZlTG9jazogKCkgPT4gdm9pZFxuICBjb25zdCBuZXdMb2NrID0gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgcmVzb2x2ZUxvY2sgPSByZXNvbHZlXG4gIH0pXG5cbiAgcmV0dXJuIHByaW9yLnRoZW4oKCkgPT4ge1xuICAgIC8vIE9ubHkgc2V0IHRoZSBsb2NrIGFmdGVyIGFjcXVpcmluZyB0aGUgcHJpb3IgbG9jayB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIGZpbGVMb2Nrcy5zZXQoZmlsZVBhdGgsIG5ld0xvY2spXG5cbiAgICAvLyBDcml0aWNhbCBzZWN0aW9uIGNhbiBub3cgcHJvY2VlZFxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICByZXNvbHZlTG9jayEoKVxuICAgICAgaWYgKGZpbGVMb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGZpbGVMb2Nrcy5kZWxldGUoZmlsZVBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9KVxufVxuXG5pbnRlcmZhY2UgTG9nVG9GaWxlSW5wdXQge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBmaWxlUGF0aDogc3RyaW5nXG4gIGxldmVsOiBMb2dMZXZlbFxuICBvcHRpb25zOiBPcHRpb25zXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIHN0b3JlOiBTdG9yZURhdGFcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1RvRmlsZSA9IGFzeW5jIChcbiAgLi4uYXJnczpcbiAgICB8IFtMb2dUb0ZpbGVJbnB1dF1cbiAgICB8IFtcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBMb2dMZXZlbCxcbiAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBTdG9yZURhdGEsXG4gICAgICAgIE9wdGlvbnNcbiAgICAgIF1cbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBpbnB1dDogTG9nVG9GaWxlSW5wdXQgPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJ1xuICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtcbiAgICAgICAgICAgIGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWxBcmcsXG4gICAgICAgICAgICByZXF1ZXN0QXJnLFxuICAgICAgICAgICAgZGF0YUFyZyxcbiAgICAgICAgICAgIHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uc0FyZ1xuICAgICAgICAgIF0gPSBhcmdzIGFzIFtcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIExvZ0xldmVsLFxuICAgICAgICAgICAgUmVxdWVzdEluZm8sXG4gICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgICAgIE9wdGlvbnNcbiAgICAgICAgICBdXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpbGVQYXRoOiBmaWxlUGF0aEFyZyxcbiAgICAgICAgICAgIGxldmVsOiBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3Q6IHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhOiBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlQXJnLFxuICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc0FyZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgICAgOiBhcmdzWzBdXG5cbiAgY29uc3QgeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0gPSBpbnB1dFxuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VUcmFuc3BvcnRzT25seSA9IGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgPT09IHRydWVcbiAgY29uc3QgZGlzYWJsZUZpbGVMb2dnaW5nID0gY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcgPT09IHRydWVcbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVGaWxlTG9nZ2luZykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgZHVyYXRpb25NcyA9XG4gICAgc3RvcmUuYmVmb3JlVGltZSA9PT0gQmlnSW50KDApXG4gICAgICA/IDBcbiAgICAgIDogTnVtYmVyKHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIC0gc3RvcmUuYmVmb3JlVGltZSkgLyAxXzAwMF8wMDBcblxuICAvLyBTYWZlbHkgcGFyc2UgVVJMIHRvIGF2b2lkIGNyYXNoZXMgb24gbWFsZm9ybWVkIFVSTHNcbiAgbGV0IHBhdGhuYW1lID0gJy8nXG4gIHRyeSB7XG4gICAgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsYmFjayB0byByYXcgVVJMIGlmIHBhcnNpbmcgZmFpbHNcbiAgICBwYXRobmFtZSA9IHJlcXVlc3QudXJsXG4gIH1cblxuICBjb25zdCBsaW5lID0gYCR7bGV2ZWx9ICR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zICR7cmVxdWVzdC5tZXRob2R9ICR7cGF0aG5hbWV9ICR7bWVzc2FnZX1cXG5gXG5cbiAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBhbnkgZmlsZSBvcGVyYXRpb25zIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gIGNvbnN0IHJlbGVhc2VMb2NrID0gYXdhaXQgYWNxdWlyZUxvY2soZmlsZVBhdGgpXG5cbiAgdHJ5IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZW5zdXJlRGlyKGRpcm5hbWUoZmlsZVBhdGgpKVxuICAgICAgYXdhaXQgYXBwZW5kRmlsZShmaWxlUGF0aCwgbGluZSwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZmlsZSB3cml0ZSBlcnJvcnMgdG8gc3RkZXJyIHNvIHRoZXkncmUgbm90IGNvbXBsZXRlbHkgc2lsZW50XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW2xvZ2l4bHlzaWFdIEZhaWxlZCB0byB3cml0ZSB0byBsb2cgZmlsZSAke2ZpbGVQYXRofTpgLFxuICAgICAgICBlcnJvclxuICAgICAgKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGQgPSBhd2FpdCBzaG91bGRSb3RhdGUoZmlsZVBhdGgsIHJvdGF0aW9uKVxuICAgIGlmIChzaG91bGQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgcm90YXRpb24gZXJyb3JzIGJ1dCBkb24ndCBjcmFzaCAtIGxvZyBlbnRyeSB3YXMgYWxyZWFkeSB3cml0dGVuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gcm90YXRlIGxvZyBmaWxlICR7ZmlsZVBhdGh9OmAsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZWxlYXNlIGxvY2tcbiAgICByZWxlYXNlTG9jaygpXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbi8vIENvbXByZXNzaW9uIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGNvbXByZXNzaW9uIG9mIHRoZSBzYW1lIGZpbGVcbmNvbnN0IGNvbXByZXNzaW9uTG9ja3MgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKVxuXG5jb25zdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrID0gKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPCgpID0+IHZvaWQ+ID0+IHtcbiAgY29uc3QgcHJpb3IgPSBjb21wcmVzc2lvbkxvY2tzLmdldChmaWxlUGF0aCkgPz8gUHJvbWlzZS5yZXNvbHZlKClcblxuICBsZXQgcmVzb2x2ZUxvY2s6ICgpID0+IHZvaWRcbiAgY29uc3QgbmV3TG9jayA9IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHJlc29sdmVMb2NrID0gcmVzb2x2ZVxuICB9KVxuXG4gIHJldHVybiBwcmlvci50aGVuKCgpID0+IHtcbiAgICAvLyBPbmx5IHNldCB0aGUgbG9jayBhZnRlciBhY3F1aXJpbmcgdGhlIHByaW9yIGxvY2sgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICBjb21wcmVzc2lvbkxvY2tzLnNldChmaWxlUGF0aCwgbmV3TG9jaylcblxuICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gY2FuIG5vdyBwcm9jZWVkXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHJlc29sdmVMb2NrISgpXG4gICAgICBpZiAoY29tcHJlc3Npb25Mb2Nrcy5nZXQoZmlsZVBhdGgpID09PSBuZXdMb2NrKSB7XG4gICAgICAgIGNvbXByZXNzaW9uTG9ja3MuZGVsZXRlKGZpbGVQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgcGFkMiA9ICh2YWx1ZTogbnVtYmVyKTogc3RyaW5nID0+IFN0cmluZyh2YWx1ZSkucGFkU3RhcnQoMiwgJzAnKVxuXG5leHBvcnQgY29uc3QgZ2V0Um90YXRlZEZpbGVOYW1lID0gKGZpbGVQYXRoOiBzdHJpbmcsIGRhdGU6IERhdGUpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBTdHJpbmcoZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSkucGFkU3RhcnQoMywgJzAnKVxuICByZXR1cm4gYCR7ZmlsZVBhdGh9LiR7eXl5eX0tJHttbX0tJHtkZH0tJHtISH0tJHtNTX0tJHtzc30tJHtTU1N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3QgYmFzZVJvdGF0ZWQgPSBnZXRSb3RhdGVkRmlsZU5hbWUoZmlsZVBhdGgsIG5ldyBEYXRlKCkpXG4gIGNvbnN0IHJvdGF0ZWQgPSBgJHtiYXNlUm90YXRlZH0tJHtwcm9jZXNzLmhydGltZS5iaWdpbnQoKX1gXG4gIGF3YWl0IGZzLnJlbmFtZShmaWxlUGF0aCwgcm90YXRlZClcbiAgcmV0dXJuIHJvdGF0ZWRcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXByZXNzRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCBhY3F1aXJlQ29tcHJlc3Npb25Mb2NrKGZpbGVQYXRoKVxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGZpbGUgc3RpbGwgZXhpc3RzIChtaWdodCBoYXZlIGJlZW4gY29tcHJlc3NlZCBieSBhbm90aGVyIHByb2Nlc3MpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aClcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgYWxyZWFkeSBjb21wcmVzc2VkIG9yIGRlbGV0ZWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aClcbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGAke2ZpbGVQYXRofS5nemAsIGNvbXByZXNzZWQpXG4gICAgYXdhaXQgZnMucm0oZmlsZVBhdGgsIHsgZm9yY2U6IHRydWUgfSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbbG9naXhseXNpYV0gRmFpbGVkIHRvIGNvbXByZXNzIGZpbGUgJHtmaWxlUGF0aH06YCwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfSBmaW5hbGx5IHtcbiAgICByZWxlYXNlKClcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzLCBpZ25vcmUgZmlsZXMgdGhhdCB3ZXJlIGRlbGV0ZWQgY29uY3VycmVudGx5XG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzXG4gICAgLmZpbHRlcihcbiAgICAgIChcbiAgICAgICAgcmVzdWx0XG4gICAgICApOiByZXN1bHQgaXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDx7XG4gICAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgICBzdGF0OiBpbXBvcnQoJ25vZGU6ZnMnKS5TdGF0c1xuICAgICAgfT4gPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdcbiAgICApXG4gICAgLm1hcChyZXN1bHQgPT4gcmVzdWx0LnZhbHVlKVxuXG4gIGlmIChzdGF0cy5sZW5ndGggPD0gbWF4RmlsZXMpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIHN0YXRzLnNvcnQoKGEsIGIpID0+IGIuc3RhdC5tdGltZU1zIC0gYS5zdGF0Lm10aW1lTXMpXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuc2xpY2UobWF4RmlsZXMpXG5cbiAgLy8gRGVsZXRlIGZpbGVzIGluZGl2aWR1YWxseSwgY29udGludWluZyBldmVuIGlmIHNvbWUgZmFpbFxuICBjb25zdCBkZWxldGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpXG4gIClcblxuICAvLyBMb2cgZmFpbHVyZXMgYnV0IGRvbid0IGNyYXNoXG4gIGRlbGV0ZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpZHgpID0+IHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gZGVsZXRlIHJvdGF0ZWQgbG9nICR7dG9EZWxldGVbaWR4XS5wYXRofTpgLFxuICAgICAgICByZXN1bHQucmVhc29uXG4gICAgICApXG4gICAgfVxuICB9KVxufVxuXG5jb25zdCBjbGVhbnVwQnlUaW1lID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBtYXhBZ2VNczogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IGdldFJvdGF0ZWRGaWxlcyhmaWxlUGF0aClcbiAgaWYgKHJvdGF0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgLy8gVXNlIFByb21pc2UuYWxsU2V0dGxlZCB0byBoYW5kbGUgaW5kaXZpZHVhbCBmaWxlIHN0YXQgZmFpbHVyZXMgZ3JhY2VmdWxseVxuICBjb25zdCBzdGF0c1Jlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcm90YXRlZC5tYXAoYXN5bmMgcCA9PiAoeyBwYXRoOiBwLCBzdGF0OiBhd2FpdCBmcy5zdGF0KHApIH0pKVxuICApXG5cbiAgLy8gRXh0cmFjdCBzdWNjZXNzZnVsIHN0YXRzXG4gIGNvbnN0IHN0YXRzID0gc3RhdHNSZXN1bHRzXG4gICAgLmZpbHRlcihcbiAgICAgIChcbiAgICAgICAgcmVzdWx0XG4gICAgICApOiByZXN1bHQgaXMgUHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDx7XG4gICAgICAgIHBhdGg6IHN0cmluZ1xuICAgICAgICBzdGF0OiBpbXBvcnQoJ25vZGU6ZnMnKS5TdGF0c1xuICAgICAgfT4gPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCdcbiAgICApXG4gICAgLm1hcChyZXN1bHQgPT4gcmVzdWx0LnZhbHVlKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG5cbiAgLy8gRGVsZXRlIGZpbGVzIGluZGl2aWR1YWxseSwgY29udGludWluZyBldmVuIGlmIHNvbWUgZmFpbFxuICBjb25zdCBkZWxldGVSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgIHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpXG4gIClcblxuICAvLyBMb2cgZmFpbHVyZXMgYnV0IGRvbid0IGNyYXNoXG4gIGRlbGV0ZVJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpZHgpID0+IHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFtsb2dpeGx5c2lhXSBGYWlsZWQgdG8gZGVsZXRlIG9sZCBsb2cgJHt0b0RlbGV0ZVtpZHhdLnBhdGh9OmAsXG4gICAgICAgIHJlc3VsdC5yZWFzb25cbiAgICAgIClcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwZXJmb3JtUm90YXRpb24gPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZzogTG9nUm90YXRpb25Db25maWdcbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCByb3RhdGVkID0gYXdhaXQgcm90YXRlRmlsZShmaWxlUGF0aClcbiAgaWYgKCFyb3RhdGVkKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBzaG91bGRDb21wcmVzcyA9IGNvbmZpZy5jb21wcmVzcyA9PT0gdHJ1ZVxuICBpZiAoc2hvdWxkQ29tcHJlc3MpIHtcbiAgICBjb25zdCBhbGdvID0gY29uZmlnLmNvbXByZXNzaW9uID8/ICdnemlwJ1xuICAgIGlmIChhbGdvID09PSAnZ3ppcCcpIHtcbiAgICAgIGF3YWl0IGNvbXByZXNzRmlsZShyb3RhdGVkKVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb25maWcubWF4RmlsZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IHJldGVudGlvbiA9IHBhcnNlUmV0ZW50aW9uKGNvbmZpZy5tYXhGaWxlcylcbiAgICBpZiAocmV0ZW50aW9uLnR5cGUgPT09ICdjb3VudCcpIHtcbiAgICAgIGF3YWl0IGNsZWFudXBCeUNvdW50KGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGNsZWFudXBCeVRpbWUoZmlsZVBhdGgsIHJldGVudGlvbi52YWx1ZSlcbiAgICB9XG4gIH1cblxuICAvLyBPcHRpb25hbCBpbnRlcnZhbC1iYXNlZCByb3RhdGlvbiBjbGVhbnVwIChjcmVhdGUgaW50ZXJ2YWwgZGlyZWN0b3JpZXMgLyBuYW1pbmcpIGlzIG5vdCByZXF1aXJlZCBieSB0ZXN0cy5cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnXG5cbmNvbnN0IFNJWkVfUkVHRVggPSAvXihcXGQrKD86XFwuXFxkKyk/KShrfGtifG18bWJ8Z3xnYikkL2lcbmNvbnN0IElOVEVSVkFMX1JFR0VYID0gL14oXFxkKykoaHxkfHcpJC9pXG5jb25zdCBST1RBVEVEX1JFR0VYID1cbiAgL1xcLihcXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfSg/Oi1cXGR7M30pPyg/Oi1cXGQrKT8pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJjb25zdCBFTUFJTF9SRUdFWCA9IC9bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfS9nXG5jb25zdCBJUFY0X1JFR0VYID0gL1xcYig/OlxcZHsxLDN9XFwuKXszfVxcZHsxLDN9XFxiL2dcbi8qKiBEaWdpdCBydW5zIHRoYXQgbWF5IGJlIGZvcm1hdHRlZCBQQU5zIChzcGFjZXMvZGFzaGVzKTsgdmFsaWRhdGVkIHdpdGggTHVobiBiZWZvcmUgcmVkYWN0aW5nLiAqL1xuY29uc3QgQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYID0gL1xcYig/OlxcZFsgLV0qPyl7MTMsMTl9XFxiL2dcbmNvbnN0IEpXVF9SRUdFWCA9IC9leUpbYS16QS1aMC05Xy1dK1xcLmV5SlthLXpBLVowLTlfLV0rXFwuW2EtekEtWjAtOV8tXSsvZ1xuXG5jb25zdCBQQU5fTUlOX0xFTiA9IDEzXG5jb25zdCBQQU5fTUFYX0xFTiA9IDE5XG5cbmNvbnN0IFJFREFDVEVEX1RFWFQgPSAnW1JFREFDVEVEXSdcbmNvbnN0IENJUkNVTEFSX1JFRiA9ICdbQ2lyY3VsYXJdJ1xuXG4vKipcbiAqIEhvc3QgYW5kIHVzZXJpbmZvIGNhbm5vdCBjb250YWluIGBbUkVEQUNURURdYCDigJQgYFtgIGJlZ2lucyBhbiBJUHY2IGxpdGVyYWwgaW4gVVJMcyBhbmQgYnJlYWtzIHBhcnNpbmcuXG4gKi9cbmNvbnN0IFVSTF9TQUZFX1JFREFDVCA9ICdyZWRhY3RlZCdcblxuY29uc3QgcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHJlZGFjdFN0cmluZyh2YWx1ZSkucmVwbGFjZUFsbChSRURBQ1RFRF9URVhULCBVUkxfU0FGRV9SRURBQ1QpXG5cbi8qKiBBcHBseSBQSUkgcmVkYWN0aW9uIHRvIGEgcmVxdWVzdCBVUkwgd2hpbGUga2VlcGluZyB0aGUgcmVzdWx0IHBhcnNlYWJsZSBieSB0aGUgVVJML1JlcXVlc3QgY29uc3RydWN0b3JzLiAqL1xuY29uc3QgcmVkYWN0UmVxdWVzdFVybCA9ICh1cmxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdSA9IG5ldyBVUkwodXJsU3RyaW5nKVxuICAgIGlmICh1LnVzZXJuYW1lICE9PSAnJykge1xuICAgICAgdS51c2VybmFtZSA9IHJlZGFjdFVybEF1dGhvcml0eVNlZ21lbnQodS51c2VybmFtZSlcbiAgICB9XG4gICAgaWYgKHUucGFzc3dvcmQgIT09ICcnKSB7XG4gICAgICB1LnBhc3N3b3JkID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1LnBhc3N3b3JkKVxuICAgIH1cbiAgICB1Lmhvc3RuYW1lID0gcmVkYWN0VXJsQXV0aG9yaXR5U2VnbWVudCh1Lmhvc3RuYW1lKVxuICAgIHUucGF0aG5hbWUgPSByZWRhY3RTdHJpbmcodS5wYXRobmFtZSlcbiAgICB1LnNlYXJjaCA9IHJlZGFjdFN0cmluZyh1LnNlYXJjaClcbiAgICB1Lmhhc2ggPSByZWRhY3RTdHJpbmcodS5oYXNoKVxuICAgIHJldHVybiB1LnRvU3RyaW5nKClcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHJlZGFjdFN0cmluZyh1cmxTdHJpbmcpLnJlcGxhY2VBbGwoUkVEQUNURURfVEVYVCwgVVJMX1NBRkVfUkVEQUNUKVxuICB9XG59XG5cbi8qKiBMdWhuIGNoZWNrc3VtOyBgZGlnaXRzYCBtdXN0IGNvbnRhaW4gb25seSBgMC05YCBhbmQgbGVuZ3RoIGluIFBBTiByYW5nZS4gKi9cbmNvbnN0IHBhc3Nlc0x1aG4gPSAoZGlnaXRzOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgaWYgKGRpZ2l0cy5sZW5ndGggPCBQQU5fTUlOX0xFTiB8fCBkaWdpdHMubGVuZ3RoID4gUEFOX01BWF9MRU4pIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxldCBzdW0gPSAwXG4gIGxldCBhbHRlcm5hdGUgPSBmYWxzZVxuXG4gIGZvciAobGV0IGkgPSBkaWdpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSlcbiAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiA1Nykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGxldCBuID0gY29kZSAtIDQ4XG4gICAgaWYgKGFsdGVybmF0ZSkge1xuICAgICAgbiAqPSAyXG4gICAgICBpZiAobiA+IDkpIHtcbiAgICAgICAgbiAtPSA5XG4gICAgICB9XG4gICAgfVxuICAgIHN1bSArPSBuXG4gICAgYWx0ZXJuYXRlID0gIWFsdGVybmF0ZVxuICB9XG5cbiAgcmV0dXJuIHN1bSAlIDEwID09PSAwXG59XG5cbmNvbnN0IHJlZGFjdENyZWRpdENhcmRDYW5kaWRhdGVzID0gKHRleHQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICB0ZXh0LnJlcGxhY2UoQ1JFRElUX0NBUkRfQ0FORElEQVRFX1JFR0VYLCBtYXRjaCA9PiB7XG4gICAgY29uc3QgZGlnaXRzID0gbWF0Y2gucmVwbGFjZSgvXFxEL2csICcnKVxuICAgIGlmIChcbiAgICAgIGRpZ2l0cy5sZW5ndGggPj0gUEFOX01JTl9MRU4gJiZcbiAgICAgIGRpZ2l0cy5sZW5ndGggPD0gUEFOX01BWF9MRU4gJiZcbiAgICAgIHBhc3Nlc0x1aG4oZGlnaXRzKVxuICAgICkge1xuICAgICAgcmV0dXJuIFJFREFDVEVEX1RFWFRcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoXG4gIH0pXG5cbmV4cG9ydCBjb25zdCByZWRhY3RTdHJpbmcgPSAodGV4dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRleHRcblxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShFTUFJTF9SRUdFWCwgUkVEQUNURURfVEVYVClcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoSVBWNF9SRUdFWCwgUkVEQUNURURfVEVYVClcbiAgcmVzdWx0ID0gcmVkYWN0Q3JlZGl0Q2FyZENhbmRpZGF0ZXMocmVzdWx0KVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShKV1RfUkVHRVgsIFJFREFDVEVEX1RFWFQpXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5jb25zdCByZWRhY3RFcnJvckNsb25lID0gKFxuICBvcmlnaW5hbEVycm9yOiBFcnJvcixcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiBFcnJvciAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHtcbiAgY29uc3QgcmVkYWN0ZWRNZXNzYWdlID0gcmVkYWN0U3RyaW5nKG9yaWdpbmFsRXJyb3IubWVzc2FnZSlcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWxFcnJvcikgYXMgb2JqZWN0XG4gIGNvbnN0IG5ld0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90bykgYXMgRXJyb3IgJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIG5ld0Vycm9yLm1lc3NhZ2UgPSByZWRhY3RlZE1lc3NhZ2VcbiAgbmV3RXJyb3IubmFtZSA9IG9yaWdpbmFsRXJyb3IubmFtZVxuXG4gIGlmIChvcmlnaW5hbEVycm9yLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICBuZXdFcnJvci5zdGFjayA9IHJlZGFjdFN0cmluZyhvcmlnaW5hbEVycm9yLnN0YWNrKVxuICB9XG5cbiAgY29uc3QgZXJyb3JSZWNvcmQgPSBvcmlnaW5hbEVycm9yIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cblxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlcnJvclJlY29yZCkpIHtcbiAgICBpZiAoa2V5ICE9PSAnbWVzc2FnZScgJiYga2V5ICE9PSAnbmFtZScgJiYga2V5ICE9PSAnc3RhY2snKSB7XG4gICAgICBuZXdFcnJvcltrZXldID0gcmVkYWN0SW5uZXIoZXJyb3JSZWNvcmRba2V5XSwgaW5Qcm9ncmVzcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3RXJyb3Jcbn1cblxuY29uc3QgcmVkYWN0QXJyYXlJdGVtcyA9IChcbiAgdmFsdWU6IHVua25vd25bXSxcbiAgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+XG4pOiB1bmtub3duW10gPT4ge1xuICBjb25zdCByZWRhY3RlZEFycmF5OiB1bmtub3duW10gPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiB2YWx1ZS5sZW5ndGggfSlcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHJlZGFjdGVkQXJyYXlbaV0gPSByZWRhY3RJbm5lcih2YWx1ZVtpXSwgaW5Qcm9ncmVzcylcbiAgfVxuICByZXR1cm4gcmVkYWN0ZWRBcnJheVxufVxuXG5jb25zdCByZWRhY3RSZWNvcmRFbnRyaWVzID0gKFxuICByZWNvcmRWYWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZWRhY3RlZFJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmRWYWx1ZSkpIHtcbiAgICByZWRhY3RlZFJlY29yZFtrZXldID0gcmVkYWN0SW5uZXIocmVjb3JkVmFsdWVba2V5XSwgaW5Qcm9ncmVzcylcbiAgfVxuICByZXR1cm4gcmVkYWN0ZWRSZWNvcmRcbn1cblxuY29uc3Qgd2l0aFJlZW50cmFuY3lHdWFyZCA9IDxUPihcbiAgb2JqOiBvYmplY3QsXG4gIGluUHJvZ3Jlc3M6IFdlYWtTZXQ8b2JqZWN0PixcbiAgcnVuOiAoKSA9PiBUXG4pOiBUID0+IHtcbiAgaW5Qcm9ncmVzcy5hZGQob2JqKVxuICB0cnkge1xuICAgIHJldHVybiBydW4oKVxuICB9IGZpbmFsbHkge1xuICAgIGluUHJvZ3Jlc3MuZGVsZXRlKG9iailcbiAgfVxufVxuXG5jb25zdCByZWRhY3RJbm5lciA9IDxUPih2YWx1ZTogVCwgaW5Qcm9ncmVzczogV2Vha1NldDxvYmplY3Q+KTogVCA9PiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiByZWRhY3RTdHJpbmcodmFsdWUpIGFzIHVua25vd24gYXMgVFxuICB9XG5cbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUuZ2V0VGltZSgpKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IHZhbHVlIGFzIG9iamVjdFxuICBpZiAoaW5Qcm9ncmVzcy5oYXMob2JqKSkge1xuICAgIHJldHVybiBDSVJDVUxBUl9SRUYgYXMgdW5rbm93biBhcyBUXG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgIHJlZGFjdEVycm9yQ2xvbmUodmFsdWUsIGluUHJvZ3Jlc3MpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICAgIHJlZGFjdEFycmF5SXRlbXModmFsdWUsIGluUHJvZ3Jlc3MpXG4gICAgKSBhcyB1bmtub3duIGFzIFRcbiAgfVxuXG4gIHJldHVybiB3aXRoUmVlbnRyYW5jeUd1YXJkKG9iaiwgaW5Qcm9ncmVzcywgKCkgPT5cbiAgICByZWRhY3RSZWNvcmRFbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBpblByb2dyZXNzKVxuICApIGFzIHVua25vd24gYXMgVFxufVxuXG5leHBvcnQgY29uc3QgcmVkYWN0ID0gPFQ+KHZhbHVlOiBUKTogVCA9PiByZWRhY3RJbm5lcih2YWx1ZSwgbmV3IFdlYWtTZXQoKSlcblxuLyoqXG4gKiBDbG9uZSByZXF1ZXN0IFVSTCBhbmQgaGVhZGVycyBmb3IgbG9nZ2luZyB3aXRoIHRoZSBzYW1lIHN0cmluZyByZWRhY3Rpb24gYXMge0BsaW5rIHJlZGFjdH0uXG4gKiBQcmVzZXJ2ZXMgYm9keSBhbmQgc2lnbmFsIHNvIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGlzIHN0aWxsIHVzYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlZGFjdFJlcXVlc3QgPSAocmVxdWVzdDogUmVxdWVzdCk6IFJlcXVlc3QgPT4ge1xuICBjb25zdCByZWRhY3RlZFVybCA9IHJlZGFjdFJlcXVlc3RVcmwocmVxdWVzdC51cmwpXG4gIGNvbnN0IG5leHRIZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICBsZXQgaGVhZGVyc0NoYW5nZWQgPSBmYWxzZVxuXG4gIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiByZXF1ZXN0LmhlYWRlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgcmVkYWN0ZWQgPSByZWRhY3RTdHJpbmcodmFsdWUpXG4gICAgaWYgKHJlZGFjdGVkICE9PSB2YWx1ZSkge1xuICAgICAgaGVhZGVyc0NoYW5nZWQgPSB0cnVlXG4gICAgfVxuICAgIG5leHRIZWFkZXJzLnNldChuYW1lLCByZWRhY3RlZClcbiAgfVxuXG4gIGNvbnN0IHJlZGFjdGVkTWV0aG9kID0gcmVkYWN0U3RyaW5nKHJlcXVlc3QubWV0aG9kKVxuICBjb25zdCB1cmxDaGFuZ2VkID0gcmVkYWN0ZWRVcmwgIT09IHJlcXVlc3QudXJsXG4gIGNvbnN0IG1ldGhvZENoYW5nZWQgPSByZWRhY3RlZE1ldGhvZCAhPT0gcmVxdWVzdC5tZXRob2RcblxuICBpZiAoISh1cmxDaGFuZ2VkIHx8IGhlYWRlcnNDaGFuZ2VkIHx8IG1ldGhvZENoYW5nZWQpKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RcbiAgfVxuXG4gIGNvbnN0IGluaXQ6IFJlcXVlc3RJbml0ICYgeyBkdXBsZXg/OiAnaGFsZicgfSA9IHtcbiAgICBtZXRob2Q6IHJlZGFjdGVkTWV0aG9kLFxuICAgIGhlYWRlcnM6IG5leHRIZWFkZXJzLFxuICAgIHJlZGlyZWN0OiByZXF1ZXN0LnJlZGlyZWN0LFxuICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWxcbiAgfVxuXG4gIGlmIChyZXF1ZXN0LmJvZHkgIT09IG51bGwpIHtcbiAgICBpbml0LmJvZHkgPSByZXF1ZXN0LmJvZHlcbiAgICBpbml0LmR1cGxleCA9ICdoYWxmJ1xuICB9XG5cbiAgcmV0dXJuIG5ldyBSZXF1ZXN0KHJlZGFjdGVkVXJsLCBpbml0KVxufVxuIiwKICAgICJpbXBvcnQgeyBTVEFUVVNfQ09ERVMgfSBmcm9tICdub2RlOmh0dHAnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7XG4gIExvZ0xldmVsLFxuICBPcHRpb25zLFxuICBQaW5vLFxuICBSZXF1ZXN0SW5mbyxcbiAgU3RvcmVEYXRhXG59IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBwYXJzZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3InXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcbmNvbnN0IHBhZDMgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDMsICcwJylcblxuY29uc3QgREVGQVVMVF9TTE9XX01TID0gNTAwXG5jb25zdCBERUZBVUxUX1ZFUllfU0xPV19NUyA9IDEwMDBcbmNvbnN0IE1FVEhPRF9QQUQgPSA3XG5cbmNvbnN0IERFRkFVTFRfTE9HX0ZPUk1BVCA9XG4gICd7bm93fSB7c2VydmljZX17aWNvbn0ge21ldGhvZH0ge3BhdGhuYW1lfSB7c3RhdHVzfSB7ZHVyYXRpb259IHttZXNzYWdlfXtzcGVlZH0nXG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkTG9nT3V0cHV0IHtcbiAgY29udGV4dExpbmVzOiBzdHJpbmdbXVxuICBtYWluOiBzdHJpbmdcbn1cblxuY29uc3Qgc2hvdWxkVXNlQ29sb3JzID0gKG9wdGlvbnM6IE9wdGlvbnMpOiBib29sZWFuID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcbiAgY29uc3QgZW5hYmxlZEJ5Q29uZmlnID0gY29uZmlnPy51c2VDb2xvcnMgPz8gdHJ1ZVxuXG4gIC8vIEF2b2lkIEFOU0kgc2VxdWVuY2VzIGluIG5vbi1pbnRlcmFjdGl2ZSBvdXRwdXQgKHBpcGVzLCBDSSBsb2dzLCBmaWxlcykuXG4gIGNvbnN0IGlzVHR5ID0gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3Muc3Rkb3V0Py5pc1RUWSA9PT0gdHJ1ZVxuICByZXR1cm4gZW5hYmxlZEJ5Q29uZmlnICYmIGlzVHR5XG59XG5cbmNvbnN0IGZvcm1hdFRpbWVzdGFtcCA9IChkYXRlOiBEYXRlLCBwYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFwYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKVxuICB9XG5cbiAgY29uc3QgeXl5eSA9IFN0cmluZyhkYXRlLmdldEZ1bGxZZWFyKCkpXG4gIGNvbnN0IG1tID0gcGFkMihkYXRlLmdldE1vbnRoKCkgKyAxKVxuICBjb25zdCBkZCA9IHBhZDIoZGF0ZS5nZXREYXRlKCkpXG4gIGNvbnN0IEhIID0gcGFkMihkYXRlLmdldEhvdXJzKCkpXG4gIGNvbnN0IE1NID0gcGFkMihkYXRlLmdldE1pbnV0ZXMoKSlcbiAgY29uc3Qgc3MgPSBwYWQyKGRhdGUuZ2V0U2Vjb25kcygpKVxuICBjb25zdCBTU1MgPSBwYWQzKGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpXG5cbiAgcmV0dXJuIHBhdHRlcm5cbiAgICAucmVwbGFjZUFsbCgneXl5eScsIHl5eXkpXG4gICAgLnJlcGxhY2VBbGwoJ21tJywgbW0pXG4gICAgLnJlcGxhY2VBbGwoJ2RkJywgZGQpXG4gICAgLnJlcGxhY2VBbGwoJ0hIJywgSEgpXG4gICAgLnJlcGxhY2VBbGwoJ01NJywgTU0pXG4gICAgLnJlcGxhY2VBbGwoJ3NzJywgc3MpXG4gICAgLnJlcGxhY2VBbGwoJ1NTUycsIFNTUylcbn1cblxuLyoqIFJlc29sdmVzIGNsaWVudCBJUCBmcm9tIHgtZm9yd2FyZGVkLWZvciAoZmlyc3QgSVApIG9yIHgtcmVhbC1pcC4gRW1wdHkgd2hlbiBuZWl0aGVyIGhlYWRlciBpcyBzZXQgKGUuZy4gbG9jYWxob3N0KS4gKi9cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3RJbmZvKTogc3RyaW5nID0+IHtcbiAgY29uc3QgZm9yd2FyZGVkID0gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1mb3J3YXJkZWQtZm9yJylcbiAgaWYgKGZvcndhcmRlZCkge1xuICAgIHJldHVybiBmb3J3YXJkZWQuc3BsaXQoJywnKVswXT8udHJpbSgpID8/ICcnXG4gIH1cbiAgcmV0dXJuIHJlcXVlc3QuaGVhZGVycy5nZXQoJ3gtcmVhbC1pcCcpID8/ICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXREdXJhdGlvbiA9IChtczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgaWYgKG1zID49IDEwMDApIHtcbiAgICBjb25zdCBzZWMgPSBtcyAvIDEwMDBcbiAgICBpZiAoc2VjID49IDEwKSB7XG4gICAgICByZXR1cm4gYCR7TWF0aC5yb3VuZChzZWMpfXNgXG4gICAgfVxuICAgIGNvbnN0IG9uZURlY2ltYWwgPSBzZWMudG9GaXhlZCgxKVxuICAgIHJldHVybiBvbmVEZWNpbWFsLmVuZHNXaXRoKCcuMCcpID8gYCR7TWF0aC5yb3VuZChzZWMpfXNgIDogYCR7b25lRGVjaW1hbH1zYFxuICB9XG4gIGlmIChtcyA+IDAgJiYgbXMgPCAxKSB7XG4gICAgcmV0dXJuIGAke21zLnRvRml4ZWQoMil9bXNgXG4gIH1cbiAgcmV0dXJuIGAke01hdGgucm91bmQobXMpfW1zYFxufVxuXG5jb25zdCBnZXRTbG93VGhyZXNob2xkcyA9IChcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogeyBzbG93OiBudW1iZXI7IHZlcnlTbG93OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIHJldHVybiB7XG4gICAgc2xvdzogY29uZmlnPy5zbG93VGhyZXNob2xkID8/IERFRkFVTFRfU0xPV19NUyxcbiAgICB2ZXJ5U2xvdzogY29uZmlnPy52ZXJ5U2xvd1RocmVzaG9sZCA/PyBERUZBVUxUX1ZFUllfU0xPV19NU1xuICB9XG59XG5cbmNvbnN0IGNvbG9yRHVyYXRpb25UZXh0ID0gKFxuICBtczogbnVtYmVyLFxuICB1c2VDb2xvcnM6IGJvb2xlYW4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHsgdGV4dDogc3RyaW5nOyBpc1ZlcnlTbG93OiBib29sZWFuIH0gPT4ge1xuICBjb25zdCByYXcgPSBmb3JtYXREdXJhdGlvbihtcylcbiAgY29uc3QgeyBzbG93LCB2ZXJ5U2xvdyB9ID0gZ2V0U2xvd1RocmVzaG9sZHMob3B0aW9ucylcbiAgY29uc3QgaXNWZXJ5U2xvdyA9IG1zID49IHZlcnlTbG93XG5cbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4geyB0ZXh0OiByYXcsIGlzVmVyeVNsb3cgfVxuICB9XG5cbiAgbGV0IGNvbG9yZWQgPSByYXdcbiAgaWYgKG1zIDwgc2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay5ncmVlbihyYXcpXG4gIH0gZWxzZSBpZiAobXMgPCB2ZXJ5U2xvdykge1xuICAgIGNvbG9yZWQgPSBjaGFsay55ZWxsb3cocmF3KVxuICB9IGVsc2Uge1xuICAgIGNvbG9yZWQgPSBjaGFsay5yZWQuYm9sZChyYXcpXG4gIH1cblxuICByZXR1cm4geyB0ZXh0OiBjb2xvcmVkLCBpc1ZlcnlTbG93IH1cbn1cblxuY29uc3QgZ2V0U3BlZWRUb2tlbiA9IChpc1ZlcnlTbG93OiBib29sZWFuLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmVyeVNsb3cpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuICBjb25zdCBiYWRnZSA9ICfimqEgc2xvdydcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gYCAke2JhZGdlfWBcbiAgfVxuICByZXR1cm4gYCAke2NoYWxrLnllbGxvdyhiYWRnZSl9YFxufVxuXG4vKiogTG9naXhseXNpYSBicmFuZDogZm94IGVtb2ppIHdpdGggbGV2ZWwtY29sb3JlZCBiYWNrZ3JvdW5kIHdoZW4gY29sb3JzIGFyZSBlbmFibGVkLiAqL1xuY29uc3QgZ2V0TGV2ZWxJY29uID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gJ/CfpoonXG4gIH1cbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnUmVkLmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ1dBUk5JTkcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnWWVsbG93LmJsYWNrKCcg8J+miiAnKVxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIHJldHVybiBjaGFsay5iZ0JsdWUuYmxhY2soJyDwn6aKICcpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2soJyDwn6aKICcpXG59XG5cbmNvbnN0IGdldENvbG9yZWRMZXZlbCA9IChsZXZlbDogTG9nTGV2ZWwsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGxldmVsXG4gIH1cblxuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdSZWQuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdZZWxsb3cuYmxhY2sobGV2ZWwpXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJnQmx1ZS5ibGFjayhsZXZlbClcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0dyZWVuLmJsYWNrKGxldmVsKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkTWV0aG9kID0gKG1ldGhvZDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBtZXRob2RcbiAgfVxuXG4gIGNvbnN0IHVwcGVyID0gbWV0aG9kLnRvVXBwZXJDYXNlKClcbiAgaWYgKHVwcGVyID09PSAnR0VUJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BPU1QnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmJsdWUuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdQVVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdy5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BBVENIJykge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3dCcmlnaHQuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdERUxFVEUnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ09QVElPTlMnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4uYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdIRUFEJykge1xuICAgIHJldHVybiBjaGFsay5ncmVlbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1RSQUNFJykge1xuICAgIHJldHVybiBjaGFsay5tYWdlbnRhLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnQ09OTkVDVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbkJyaWdodC5ib2xkKHVwcGVyKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlLmJvbGQodXBwZXIpXG59XG5cbmNvbnN0IGdldENvbG9yZWRTdGF0dXMgPSAoc3RhdHVzOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgY29uc3QgbnVtZXJpYyA9IE51bWJlci5wYXJzZUludChzdGF0dXMsIDEwKVxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1lcmljKSkge1xuICAgIHJldHVybiBzdGF0dXNcbiAgfVxuXG4gIGlmIChudW1lcmljID49IDUwMCkge1xuICAgIHJldHVybiBjaGFsay5yZWQoc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDQwMCkge1xuICAgIHJldHVybiBjaGFsay55ZWxsb3coc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDMwMCkge1xuICAgIHJldHVybiBjaGFsay5jeWFuKHN0YXR1cylcbiAgfVxuICBpZiAobnVtZXJpYyA+PSAyMDApIHtcbiAgICByZXR1cm4gY2hhbGsuZ3JlZW4oc3RhdHVzKVxuICB9XG4gIHJldHVybiBjaGFsay5ncmF5KHN0YXR1cylcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFRpbWVzdGFtcCA9ICh0aW1lc3RhbXA6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gdGltZXN0YW1wXG4gIH1cblxuICByZXR1cm4gY2hhbGsuZ3JheSh0aW1lc3RhbXApXG59XG5cbmNvbnN0IGdldENvbG9yZWRQYXRobmFtZSA9IChwYXRobmFtZTogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiBwYXRobmFtZVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLndoaXRlQnJpZ2h0KHBhdGhuYW1lKVxufVxuXG5jb25zdCBnZXRTdGF0dXNUZXh0ID0gKHN0YXR1c0NvZGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRleHQgPSBTVEFUVVNfQ09ERVNbc3RhdHVzQ29kZV1cbiAgcmV0dXJuIHRleHQgPz8gJydcbn1cblxuY29uc3QgZ2V0U2VydmljZVRva2VuID0gKG9wdGlvbnM6IE9wdGlvbnMsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IG5hbWUgPSBvcHRpb25zLmNvbmZpZz8uc2VydmljZT8udHJpbSgpXG4gIGlmICghbmFtZSkge1xuICAgIHJldHVybiAnJ1xuICB9XG4gIGNvbnN0IGJyYWNrZXRlZCA9IGBbJHtuYW1lfV1gXG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIGAke2JyYWNrZXRlZH0gYFxuICB9XG4gIHJldHVybiBgJHtjaGFsay5kaW0oYnJhY2tldGVkKX0gYFxufVxuXG5jb25zdCBzdHJpbmdpZnlUcmVlVmFsdWUgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnXG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCdcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbiAgfVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB2YWx1ZS5tZXNzYWdlXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpXG4gIH1cbn1cblxuLyoqIE5lc3RlZCBvYmplY3RzIHRvIGV4cGFuZCBpbiB0aGUgY29udGV4dCB0cmVlIChleGNsdWRlcyBBcnJheXMsIEVycm9yLCBEYXRlKS4gKi9cbmNvbnN0IGlzRXhwYW5kYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHZhbHVlICE9PSBudWxsICYmXG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICEodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikgJiZcbiAgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpXG5cbmNvbnN0IGNvbGxlY3RDb250ZXh0RW50cmllcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGRlcHRoUmVtYWluaW5nOiBudW1iZXJcbik6IFtzdHJpbmcsIHN0cmluZ11bXSA9PiB7XG4gIGNvbnN0IG91dDogW3N0cmluZywgc3RyaW5nXVtdID0gW11cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgIGNvbnN0IGtleSA9IHByZWZpeCA/IGAke3ByZWZpeH0uJHtrfWAgOiBrXG4gICAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZU9iamVjdCh2KSAmJiBkZXB0aFJlbWFpbmluZyA+IDFcblxuICAgIGlmIChleHBhbmRhYmxlKSB7XG4gICAgICBvdXQucHVzaCguLi5jb2xsZWN0Q29udGV4dEVudHJpZXModiwga2V5LCBkZXB0aFJlbWFpbmluZyAtIDEpKVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChba2V5LCBzdHJpbmdpZnlUcmVlVmFsdWUodildKVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyA9IChcbiAgZW50cmllczogW3N0cmluZywgc3RyaW5nXVtdLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBsYXN0ID0gZW50cmllcy5sZW5ndGggLSAxXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGJyYW5jaCA9IGkgPT09IGxhc3QgPyAn4pSU4pSAJyA6ICfilJzilIAnXG4gICAgY29uc3QgcGFpciA9IGVudHJpZXNbaV1cbiAgICBpZiAoIXBhaXIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IFtrLCB2XSA9IHBhaXJcbiAgICBjb25zdCBrZXlQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsuY3lhbihrKSA6IGtcbiAgICBjb25zdCB2YWxQYXJ0ID0gdXNlQ29sb3JzID8gY2hhbGsud2hpdGUodikgOiB2XG4gICAgbGluZXMucHVzaChgICAke2JyYW5jaH0gJHtrZXlQYXJ0fSAgJHt2YWxQYXJ0fWApXG4gIH1cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmV4cG9ydCBjb25zdCByZW5kZXJDb250ZXh0VHJlZUxpbmVzID0gKFxuICBjdHg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBvcHRpb25zOiBPcHRpb25zLFxuICB1c2VDb2xvcnM6IGJvb2xlYW5cbik6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcbiAgaWYgKGRlcHRoIDwgMSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgZW50cmllcyA9IGNvbGxlY3RDb250ZXh0RW50cmllcyhjdHgsICcnLCBkZXB0aClcbiAgcmV0dXJuIGZvcm1hdEVudHJpZXNUb1RyZWVMaW5lcyhlbnRyaWVzLCB1c2VDb2xvcnMpXG59XG5cbmV4cG9ydCBjb25zdCBidWlsZENvbnRleHRUcmVlTGluZXMgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IE9wdGlvbnNcbik6IHN0cmluZ1tdID0+IHtcbiAgaWYgKG9wdGlvbnMuY29uZmlnPy5zaG93Q29udGV4dFRyZWUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZGVwdGggPSBvcHRpb25zLmNvbmZpZz8uY29udGV4dERlcHRoID8/IDFcblxuICBjb25zdCBlbnRyaWVzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXVxuXG4gIGNvbnN0IGN0eCA9IGRhdGEuY29udGV4dFxuICBpZiAoXG4gICAgY3R4ICYmXG4gICAgdHlwZW9mIGN0eCA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheShjdHgpICYmXG4gICAgT2JqZWN0LmtleXMoY3R4IGFzIG9iamVjdCkubGVuZ3RoID4gMCAmJlxuICAgIGRlcHRoID49IDFcbiAgKSB7XG4gICAgZW50cmllcy5wdXNoKFxuICAgICAgLi4uY29sbGVjdENvbnRleHRFbnRyaWVzKGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgJycsIGRlcHRoKVxuICAgIClcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJyAmJiAnZXJyb3InIGluIGRhdGEgJiYgZGF0YS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbXNnID0gcGFyc2VFcnJvcihkYXRhLmVycm9yKVxuICAgIGlmIChtc2cpIHtcbiAgICAgIGVudHJpZXMucHVzaChbJ2Vycm9yJywgbXNnXSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm9ybWF0RW50cmllc1RvVHJlZUxpbmVzKGVudHJpZXMsIHVzZUNvbG9ycylcbn1cblxuY29uc3QgZ2V0Q29udGV4dFN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuICcnXG59XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb2dPdXRwdXQgPSAoe1xuICBsZXZlbCxcbiAgcmVxdWVzdCxcbiAgZGF0YSxcbiAgc3RvcmUsXG4gIG9wdGlvbnNcbn06IHtcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufSk6IEZvcm1hdHRlZExvZ091dHB1dCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZUNvbG9ycyA9IHNob3VsZFVzZUNvbG9ycyhvcHRpb25zKVxuICBjb25zdCBmb3JtYXQgPSBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/PyBERUZBVUxUX0xPR19GT1JNQVRcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gU3RyaW5nKG5vdy5nZXRUaW1lKCkpXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXG5cbiAgY29uc3Qgc2hvd1RyZWUgPSBjb25maWc/LnNob3dDb250ZXh0VHJlZSAhPT0gZmFsc2VcbiAgY29uc3QgY3R4U3RyaW5nID1cbiAgICBzaG93VHJlZSAmJlxuICAgIGRhdGEuY29udGV4dCAmJlxuICAgIHR5cGVvZiBkYXRhLmNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgIUFycmF5LmlzQXJyYXkoZGF0YS5jb250ZXh0KSAmJlxuICAgIE9iamVjdC5rZXlzKGRhdGEuY29udGV4dCBhcyBvYmplY3QpLmxlbmd0aCA+IDBcbiAgICAgID8gJydcbiAgICAgIDogZ2V0Q29udGV4dFN0cmluZyhkYXRhLmNvbnRleHQpXG5cbiAgY29uc3QgY29sb3JlZExldmVsID0gZ2V0Q29sb3JlZExldmVsKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IG1ldGhvZFBhZGRlZCA9IHJlcXVlc3QubWV0aG9kLnRvVXBwZXJDYXNlKCkucGFkRW5kKE1FVEhPRF9QQUQpXG4gIGNvbnN0IGNvbG9yZWRNZXRob2QgPSBnZXRDb2xvcmVkTWV0aG9kKG1ldGhvZFBhZGRlZCwgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkUGF0aG5hbWUgPSBnZXRDb2xvcmVkUGF0aG5hbWUocGF0aG5hbWUsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFN0YXR1cyA9IGdldENvbG9yZWRTdGF0dXMoc3RhdHVzLCB1c2VDb2xvcnMpXG4gIGNvbnN0IHsgdGV4dDogY29sb3JlZER1cmF0aW9uLCBpc1ZlcnlTbG93IH0gPSBjb2xvckR1cmF0aW9uVGV4dChcbiAgICBkdXJhdGlvbk1zLFxuICAgIHVzZUNvbG9ycyxcbiAgICBvcHRpb25zXG4gIClcbiAgY29uc3Qgc3BlZWRUb2tlbiA9IGdldFNwZWVkVG9rZW4oaXNWZXJ5U2xvdywgdXNlQ29sb3JzKVxuICBjb25zdCBpY29uID0gZ2V0TGV2ZWxJY29uKGxldmVsLCB1c2VDb2xvcnMpXG4gIGNvbnN0IHN0YXR1c1RleHQgPSBnZXRTdGF0dXNUZXh0KHN0YXR1c0NvZGUpXG4gIGNvbnN0IHNlcnZpY2VUb2tlbiA9IGdldFNlcnZpY2VUb2tlbihvcHRpb25zLCB1c2VDb2xvcnMpXG5cbiAgY29uc3QgbWFpbiA9IGZvcm1hdFxuICAgIC5yZXBsYWNlQWxsKCd7bm93fScsIHRpbWVzdGFtcClcbiAgICAucmVwbGFjZUFsbCgne2Vwb2NofScsIGVwb2NoKVxuICAgIC5yZXBsYWNlQWxsKCd7bGV2ZWx9JywgY29sb3JlZExldmVsKVxuICAgIC5yZXBsYWNlQWxsKCd7aWNvbn0nLCBpY29uKVxuICAgIC5yZXBsYWNlQWxsKCd7ZHVyYXRpb259JywgY29sb3JlZER1cmF0aW9uKVxuICAgIC5yZXBsYWNlQWxsKCd7bWV0aG9kfScsIGNvbG9yZWRNZXRob2QpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRobmFtZX0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3twYXRofScsIGNvbG9yZWRQYXRobmFtZSlcbiAgICAucmVwbGFjZUFsbCgne3N0YXR1c30nLCBjb2xvcmVkU3RhdHVzKVxuICAgIC5yZXBsYWNlQWxsKCd7c3RhdHVzVGV4dH0nLCBzdGF0dXNUZXh0KVxuICAgIC5yZXBsYWNlQWxsKCd7bWVzc2FnZX0nLCBtZXNzYWdlKVxuICAgIC5yZXBsYWNlQWxsKCd7aXB9JywgaXApXG4gICAgLnJlcGxhY2VBbGwoJ3tjb250ZXh0fScsIGN0eFN0cmluZylcbiAgICAucmVwbGFjZUFsbCgne3NlcnZpY2V9Jywgc2VydmljZVRva2VuKVxuICAgIC5yZXBsYWNlQWxsKCd7c3BlZWR9Jywgc3BlZWRUb2tlbilcblxuICBjb25zdCBjb250ZXh0TGluZXMgPSBidWlsZENvbnRleHRUcmVlTGluZXMobGV2ZWwsIGRhdGEsIG9wdGlvbnMpXG5cbiAgcmV0dXJuIHsgbWFpbiwgY29udGV4dExpbmVzIH1cbn1cblxuLyoqIEBkZXByZWNhdGVkIFByZWZlciB7QGxpbmsgZm9ybWF0TG9nT3V0cHV0fSBmb3IgbXVsdGktbGluZSBjb250ZXh0IHRyZWVzLiBSZXR1cm5zIHRoZSBtYWluIGxpbmUgb25seS4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRMaW5lID0gKGlucHV0OiB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0SW5mb1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT5cbiAgZm9ybWF0TG9nT3V0cHV0KHtcbiAgICAuLi5pbnB1dCxcbiAgICBvcHRpb25zOiB7XG4gICAgICAuLi5pbnB1dC5vcHRpb25zLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC4uLihpbnB1dC5vcHRpb25zLmNvbmZpZyA/PyB7fSksXG4gICAgICAgIHNob3dDb250ZXh0VHJlZTogZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gIH0pLm1haW5cblxuZXhwb3J0IGNvbnN0IGxvZ1dpdGhQaW5vID0gKFxuICBsb2dnZXI6IFBpbm8sXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHZvaWQgPT4ge1xuICBpZiAobGV2ZWwgPT09ICdFUlJPUicpIHtcbiAgICBsb2dnZXIuZXJyb3IoZGF0YSlcbiAgICByZXR1cm5cbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIGxvZ2dlci53YXJuKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnREVCVUcnKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgbG9nZ2VyLmluZm8oZGF0YSlcbn1cbiIsCiAgICAiaW1wb3J0IHsgU3RhdHVzTWFwIH0gZnJvbSAnZWx5c2lhJ1xuXG5jb25zdCBESUdJVFNfT05MWSA9IC9eXFxkKyQvXG5jb25zdCBERUxJTUlURVJTID0gL1tfLV0rL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzEgPSAvKFthLXowLTldKShbQS1aXSkvZ1xuY29uc3QgQ0FNRUxfQk9VTkRBUllfMiA9IC8oW0EtWl0pKFtBLVpdW2Etel0pL2dcbmNvbnN0IEFQT1NUUk9QSEVTID0gL1sn4oCZXS9nXG5jb25zdCBOT05fQUxQSEFOVU1FUklDID0gL1teYS16MC05XFxzXSsvZ1xuY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMrL2dcblxuY29uc3Qgbm9ybWFsaXplU3RhdHVzTmFtZSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgLy8gSGFuZGxlcyBjb21tb24gdmFyaWFudHM6XG4gIC8vIC0gY2FzZSBkaWZmZXJlbmNlczogXCJub3QgZm91bmRcIiB2cyBcIk5vdCBGb3VuZFwiXG4gIC8vIC0gc3BhY2luZy9wdW5jdHVhdGlvbjogXCJOb3QtRm91bmRcIiwgXCJub3RfZm91bmRcIlxuICAvLyAtIGNhbWVsQ2FzZS9QYXNjYWxDYXNlOiBcIkludGVybmFsU2VydmVyRXJyb3JcIlxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGlmICghdHJpbW1lZCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgcmV0dXJuIHRyaW1tZWRcbiAgICAucmVwbGFjZShERUxJTUlURVJTLCAnICcpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMSwgJyQxICQyJylcbiAgICAucmVwbGFjZShDQU1FTF9CT1VOREFSWV8yLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKEFQT1NUUk9QSEVTLCAnJylcbiAgICAudG9Mb3dlckNhc2UoKVxuICAgIC5yZXBsYWNlKE5PTl9BTFBIQU5VTUVSSUMsICcgJylcbiAgICAucmVwbGFjZShXSElURVNQQUNFLCAnICcpXG4gICAgLnRyaW0oKVxufVxuXG5jb25zdCBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FID0gKCgpID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgW25hbWUsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKFN0YXR1c01hcCkpIHtcbiAgICBtYXAuc2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUobmFtZSksIGNvZGUpXG4gIH1cblxuICByZXR1cm4gbWFwXG59KSgpXG5cbmV4cG9ydCBjb25zdCBnZXRTdGF0dXNDb2RlID0gKHZhbHVlOiB1bmtub3duKTogbnVtYmVyID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gICAgaWYgKERJR0lUU19PTkxZLnRlc3QodHJpbW1lZCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodHJpbW1lZClcbiAgICB9XG5cbiAgICBjb25zdCBrbm93biA9IFNUQVRVU19CWV9OT1JNQUxJWkVEX05BTUUuZ2V0KG5vcm1hbGl6ZVN0YXR1c05hbWUodHJpbW1lZCkpXG4gICAgcmV0dXJuIGtub3duID8/IDUwMFxuICB9XG5cbiAgcmV0dXJuIDUwMFxufVxuIiwKICAgICJleHBvcnQgY29uc3QgcGFyc2VFcnJvciA9IChlcnJvcjogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGxldCBtZXNzYWdlID0gJ0FuIGVycm9yIG9jY3VycmVkJ1xuXG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2VcbiAgfSBlbHNlIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIGFzIHN0cmluZ1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBTdHJpbmcoZXJyb3IpXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBSZXF1ZXN0SW5mbywgU3RvcmVEYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGxvZ1RvVHJhbnNwb3J0cyB9IGZyb20gJy4uL291dHB1dCdcbmltcG9ydCB7IGxvZ1RvRmlsZSB9IGZyb20gJy4uL291dHB1dC9maWxlJ1xuaW1wb3J0IHsgcGFyc2VFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yJ1xuaW1wb3J0IHsgcmVkYWN0LCByZWRhY3RSZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVkYWN0J1xuaW1wb3J0IHsgZm9ybWF0TG9nT3V0cHV0IH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9IChcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXI7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUh0dHBFcnJvciA9IChcbiAgcmVxdWVzdDogUmVxdWVzdEluZm8sXG4gIGVycm9yOiB1bmtub3duLFxuICBzdG9yZTogU3RvcmVEYXRhLFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgY29uZmlnID0gb3B0aW9ucy5jb25maWdcblxuICBjb25zdCBsb2dGaWx0ZXIgPSBjb25maWc/LmxvZ0ZpbHRlclxuICBpZiAoXG4gICAgbG9nRmlsdGVyPy5sZXZlbCAmJlxuICAgIGxvZ0ZpbHRlci5sZXZlbC5sZW5ndGggPiAwICYmXG4gICAgIWxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcygnRVJST1InKVxuICApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlSW50ZXJuYWxMb2dnZXIgPSBjb25maWc/LmRpc2FibGVJbnRlcm5hbExvZ2dlciA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gcGFyc2VFcnJvcihlcnJvcilcblxuICBjb25zdCBsZXZlbDogTG9nTGV2ZWwgPSAnRVJST1InXG4gIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0geyBzdGF0dXMsIG1lc3NhZ2UsIGVycm9yIH1cbiAgY29uc3QgbG9nRGF0YSA9IGNvbmZpZz8uYXV0b1JlZGFjdCA9PT0gdHJ1ZSA/IHJlZGFjdChkYXRhKSA6IGRhdGFcbiAgY29uc3QgbG9nUmVxdWVzdCA9XG4gICAgY29uZmlnPy5hdXRvUmVkYWN0ID09PSB0cnVlID8gcmVkYWN0UmVxdWVzdChyZXF1ZXN0KSA6IHJlcXVlc3RcblxuICBsb2dUb1RyYW5zcG9ydHMoeyBsZXZlbCwgcmVxdWVzdDogbG9nUmVxdWVzdCwgZGF0YTogbG9nRGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICBpZiAoISh1c2VUcmFuc3BvcnRzT25seSB8fCBkaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoe1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgbGV2ZWwsXG4gICAgICAgIHJlcXVlc3Q6IGxvZ1JlcXVlc3QsXG4gICAgICAgIGRhdGE6IGxvZ0RhdGEsXG4gICAgICAgIHN0b3JlLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIC8vIElnbm9yZSBlcnJvcnNcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgeyBtYWluLCBjb250ZXh0TGluZXMgfSA9IGZvcm1hdExvZ091dHB1dCh7XG4gICAgbGV2ZWwsXG4gICAgcmVxdWVzdDogbG9nUmVxdWVzdCxcbiAgICBkYXRhOiBsb2dEYXRhLFxuICAgIHN0b3JlLFxuICAgIG9wdGlvbnNcbiAgfSlcblxuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID1cbiAgICBjb250ZXh0TGluZXMubGVuZ3RoID4gMCA/IGAke21haW59XFxuJHtjb250ZXh0TGluZXMuam9pbignXFxuJyl9YCA6IG1haW5cbiAgY29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsaUJBQVMsZ0JDQVQsd0JBQVMsb0JBRVQsSUFBTSxJQUFtQyxJQUFNLENBQzdDLEdBQUksQ0FFRixPQURnQixFQUFjLFlBQVksR0FBRyxFQUM5QixxQkFBcUIsRUFDcEMsS0FBTSxDQUNOLE1BQU8sQ0FBQyxLQUVULEVBRUcsSUFBdUMsSUFBTSxDQUNqRCxHQUFJLENBRUYsT0FEZ0IsRUFBYyxZQUFZLEdBQUcsRUFDOUIsb0JBQW9CLEVBQ25DLEtBQU0sQ0FDTixNQUFPLENBQUMsS0FFVCxFQUVHLEdBQWEsQ0FBQyxFQUFjLElBQTBCLENBQzFELEdBQUksRUFBSyxRQUFVLEVBQ2pCLE9BQU8sRUFBSyxNQUFNLEVBQUcsQ0FBSyxFQUc1QixJQUFNLEVBQU8sS0FBSyxPQUFPLEVBQVEsRUFBSyxRQUFVLENBQUMsRUFDM0MsRUFBUSxFQUFRLEVBQUssT0FBUyxFQUNwQyxNQUFPLEdBQUcsSUFBSSxPQUFPLENBQUksSUFBSSxJQUFP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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logixlysia",
3
- "version": "6.3.0",
3
+ "version": "6.3.2",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",