@pori15/logixlysia 6.0.2 → 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -36,9 +36,62 @@ declare class ProblemError extends Error {
36
36
  constructor(type: string | undefined, title: string, status: number, detail?: string, instance?: string, extensions?: Record<string, unknown>);
37
37
  toJSON(): ProblemDocument;
38
38
  }
39
- declare const HttpError: {};
39
+ declare class BadRequest extends ProblemError {
40
+ constructor(detail?: string, extensions?: Record<string, any>);
41
+ }
42
+ declare class Unauthorized extends ProblemError {
43
+ constructor(detail?: string, extensions?: Record<string, any>);
44
+ }
45
+ declare class Forbidden extends ProblemError {
46
+ constructor(detail?: string, extensions?: Record<string, any>);
47
+ }
48
+ declare class NotFound extends ProblemError {
49
+ constructor(detail?: string, extensions?: Record<string, any>);
50
+ }
51
+ declare class Conflict extends ProblemError {
52
+ constructor(detail?: string, extensions?: Record<string, any>);
53
+ }
54
+ declare class PaymentRequired extends ProblemError {
55
+ constructor(detail?: string, extensions?: Record<string, any>);
56
+ }
57
+ declare class MethodNotAllowed extends ProblemError {
58
+ constructor(detail?: string, extensions?: Record<string, any>);
59
+ }
60
+ declare class NotAcceptable extends ProblemError {
61
+ constructor(detail?: string, extensions?: Record<string, any>);
62
+ }
63
+ declare class InternalServerError extends ProblemError {
64
+ constructor(detail?: string, extensions?: Record<string, any>);
65
+ }
66
+ declare class NotImplemented extends ProblemError {
67
+ constructor(detail?: string, extensions?: Record<string, any>);
68
+ }
69
+ declare class BadGateway extends ProblemError {
70
+ constructor(detail?: string, extensions?: Record<string, any>);
71
+ }
72
+ declare class ServiceUnavailable extends ProblemError {
73
+ constructor(detail?: string, extensions?: Record<string, any>);
74
+ }
75
+ declare class GatewayTimeout extends ProblemError {
76
+ constructor(detail?: string, extensions?: Record<string, any>);
77
+ }
78
+ interface HttpErrorConstructor {
79
+ BadRequest: typeof BadRequest;
80
+ Unauthorized: typeof Unauthorized;
81
+ PaymentRequired: typeof PaymentRequired;
82
+ Forbidden: typeof Forbidden;
83
+ NotFound: typeof NotFound;
84
+ MethodNotAllowed: typeof MethodNotAllowed;
85
+ NotAcceptable: typeof NotAcceptable;
86
+ Conflict: typeof Conflict;
87
+ InternalServerError: typeof InternalServerError;
88
+ NotImplemented: typeof NotImplemented;
89
+ BadGateway: typeof BadGateway;
90
+ ServiceUnavailable: typeof ServiceUnavailable;
91
+ GatewayTimeout: typeof GatewayTimeout;
92
+ }
93
+ declare const HttpError: HttpErrorConstructor;
40
94
  type Code = number | "PROBLEM_ERROR" | "UNKNOWN" | "VALIDATION" | "NOT_FOUND" | "PARSE" | "INTERNAL_SERVER_ERROR" | "INVALID_COOKIE_SIGNATURE" | "INVALID_FILE_TYPE";
41
- type HttpErrorType = keyof typeof HttpError;
42
95
  interface ErrorContext {
43
96
  request: Request;
44
97
  path: string;
@@ -182,4 +235,4 @@ type Logixlysia = Elysia<"Logixlysia", SingletonBase & {
182
235
  store: LogixlysiaStore;
183
236
  }>;
184
237
  declare const logixlysia: (options?: Options) => Logixlysia;
185
- export { toProblemJson, normalizeToProblem, logixlysia, formatProblemJsonLog, logixlysia as default, Transport, StoreData, ProblemJsonOptions, ProblemJson, ProblemError, ProblemDocument, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel, HttpProblemJsonOptions, HttpErrorType, HttpError, ErrorContext, Code };
238
+ export { toProblemJson, normalizeToProblem, logixlysia, formatProblemJsonLog, logixlysia as default, Transport, StoreData, ProblemJsonOptions, ProblemJson, ProblemError, ProblemDocument, Pino, Options, LogixlysiaStore, LogixlysiaContext, Logixlysia, Logger, LogLevel, HttpProblemJsonOptions, HttpErrorConstructor, HttpError, ErrorContext, Code };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import{Elysia as R$}from"elysia";import J0 from"elysia/package.json";var V0=($,R)=>{if($.length>=R)return $.slice(0,R);let X=Math.floor((R-$.length)/2),w=R-$.length-X;return`${" ".repeat(X)}${$}${" ".repeat(w)}`},c=($)=>{let R=`Elysia v${J0.version}`,w=Math.max($.length,R.length)+4,K=`┌${"─".repeat(w)}┐`,Q=`└${"─".repeat(w)}┘`,Z=`│${" ".repeat(w)}│`,G=`│${V0(R,w)}│`,V=`│ ${$}${" ".repeat(Math.max(0,w-$.length-4))} │`;return[K,Z,G,Z,V,Z,Q].join(`
2
- `)};var b=($,R)=>{if(!(R.config?.showStartupMessage??!0))return;let{port:w,hostname:K,protocol:Q}=$;if(w===void 0||!K||!Q)return;let G=`\uD83E\uDD8A Elysia is running at ${`${Q}://${K}:${w}`}`;if((R.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(c(G))};import u from"pino";var U=(...$)=>{let R=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:X,request:w,data:K,store:Q,options:Z}=R,G=Z.config?.transports??[];if(G.length===0)return;let V=typeof K.message==="string"?K.message:"",_={request:{method:w.method,url:w.url},...K,beforeTime:Q.beforeTime};for(let z of G)try{let J=z.log(X,V,_);if(J&&typeof J.catch==="function")J.catch(()=>{})}catch{}};import{appendFile as U0}from"node:fs/promises";import{dirname as T0}from"node:path";import{promises as j0}from"node:fs";var x=async($)=>{await j0.mkdir($,{recursive:!0})};import{promises as W}from"node:fs";import{promisify as W0}from"node:util";import{gzip as O0}from"node:zlib";import{promises as y}from"node:fs";import{basename as Y0,dirname as D0}from"node:path";var I0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,_0=/^(\d+)(h|d|w)$/i,z0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,P=($)=>{if(typeof $==="number")return $;let R=$.trim(),X=Number(R);if(Number.isFinite(X))return X;let w=R.match(I0);if(!w)throw Error(`Invalid size format: ${$}`);let K=Number(w[1]),Q=w[2].toLowerCase(),Z=1024;if(Q.startsWith("m"))Z=1048576;else if(Q.startsWith("g"))Z=1073741824;return Math.floor(K*Z)},H0=($)=>{let R=$.trim().match(_0);if(!R)throw Error(`Invalid interval format: ${$}`);let X=Number(R[1]),w=R[2].toLowerCase(),K=3600000;if(w==="d")K=86400000;else if(w==="w")K=604800000;return X*K},q=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:H0($)}},h=async($,R)=>{try{return(await y.stat($)).size>R}catch{return!1}},f=async($)=>{let R=D0($),X=Y0($),w;try{w=await y.readdir(R)}catch{return[]}return w.filter((K)=>K.startsWith(`${X}.`)&&z0.test(K)).map((K)=>`${R}/${K}`)};var F0=W0(O0),B=($)=>String($).padStart(2,"0"),L0=($,R)=>{let X=R.getFullYear(),w=B(R.getMonth()+1),K=B(R.getDate()),Q=B(R.getHours()),Z=B(R.getMinutes()),G=B(R.getSeconds());return`${$}.${X}-${w}-${K}-${Q}-${Z}-${G}`},M0=async($)=>{try{if((await W.stat($)).size===0)return""}catch{return""}let R=L0($,new Date);return await W.rename($,R),R},A0=async($)=>{let R=await W.readFile($),X=await F0(R);await W.writeFile(`${$}.gz`,X),await W.rm($,{force:!0})},v=async($,R)=>{if(R.maxSize===void 0)return!1;let X=P(R.maxSize);return await h($,X)},B0=async($,R)=>{let X=await f($);if(X.length<=R)return;let w=await Promise.all(X.map(async(Q)=>({path:Q,stat:await W.stat(Q)})));w.sort((Q,Z)=>Z.stat.mtimeMs-Q.stat.mtimeMs);let K=w.slice(R);await Promise.all(K.map(({path:Q})=>W.rm(Q,{force:!0})))},N0=async($,R)=>{let X=await f($);if(X.length===0)return;let w=Date.now(),Q=(await Promise.all(X.map(async(Z)=>({path:Z,stat:await W.stat(Z)})))).filter(({stat:Z})=>w-Z.mtimeMs>R);await Promise.all(Q.map(({path:Z})=>W.rm(Z,{force:!0})))},g=async($,R)=>{let X=await M0($);if(!X)return;if(R.compress===!0){if((R.compression??"gzip")==="gzip")await A0(X)}if(R.maxFiles!==void 0){let K=q(R.maxFiles);if(K.type==="count")await B0($,K.value);else await N0($,K.value)}};var T=async(...$)=>{let R=typeof $[0]==="string"?(()=>{let[M,A,F,L,k,S]=$;return{filePath:M,level:A,request:F,data:L,store:k,options:S}})():$[0],{filePath:X,level:w,request:K,data:Q,store:Z,options:G}=R,V=G.config,_=V?.useTransportsOnly===!0,z=V?.disableFileLogging===!0;if(_||z)return;let J=typeof Q.message==="string"?Q.message:"",j=Z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Z.beforeTime)/1e6,I=`${w} ${j.toFixed(2)}ms ${K.method} ${new URL(K.url).pathname} ${J}
3
- `;await x(T0(X)),await U0(X,I,{encoding:"utf-8"});let H=V?.logRotation;if(!H)return;if(await v(X,H))await g(X,H)};import Y from"chalk";import{StatusMap as k0}from"elysia";var S0=/^\d+$/,y0=/[_-]+/g,f0=/([a-z0-9])([A-Z])/g,E0=/([A-Z])([A-Z][a-z])/g,C0=/['’]/g,c0=/[^a-z0-9\s]+/g,b0=/\s+/g,m=($)=>{let R=$.trim();if(!R)return"";return R.replace(y0," ").replace(f0,"$1 $2").replace(E0,"$1 $2").replace(C0,"").toLowerCase().replace(c0," ").replace(b0," ").trim()},x0=(()=>{let $=new Map;for(let[R,X]of Object.entries(k0))$.set(m(R),X);return $})(),n=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let R=$.trim();if(S0.test(R))return Number(R);return x0.get(m(R))??500}return 500};var N=($)=>String($).padStart(2,"0"),P0=($)=>String($).padStart(3,"0"),q0=($)=>{let X=$.config?.useColors??!0,w=typeof process<"u"&&process.stdout?.isTTY===!0;return X&&w},h0=($,R)=>{if(!R)return $.toISOString();let X=String($.getFullYear()),w=N($.getMonth()+1),K=N($.getDate()),Q=N($.getHours()),Z=N($.getMinutes()),G=N($.getSeconds()),V=P0($.getMilliseconds());return R.replaceAll("yyyy",X).replaceAll("mm",w).replaceAll("dd",K).replaceAll("HH",Q).replaceAll("MM",Z).replaceAll("ss",G).replaceAll("SSS",V)},v0=($)=>{let R=$.headers.get("x-forwarded-for");if(R)return R.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},g0=($,R)=>{if(!R)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},m0=($,R)=>{if(!R)return $;let X=$.toUpperCase();if(X==="GET")return Y.green.bold(X);if(X==="POST")return Y.blue.bold(X);if(X==="PUT")return Y.yellow.bold(X);if(X==="PATCH")return Y.yellowBright.bold(X);if(X==="DELETE")return Y.red.bold(X);if(X==="OPTIONS")return Y.cyan.bold(X);if(X==="HEAD")return Y.greenBright.bold(X);if(X==="TRACE")return Y.magenta.bold(X);if(X==="CONNECT")return Y.cyanBright.bold(X);return Y.white.bold(X)},n0=($,R)=>{if(!R)return $;let X=Number.parseInt($,10);if(!Number.isFinite(X))return $;if(X>=500)return Y.red($);if(X>=400)return Y.yellow($);if(X>=300)return Y.cyan($);if(X>=200)return Y.green($);return Y.gray($)},d0=($,R)=>{if(!R)return $;return Y.gray($)},p0=($,R)=>{if(!R)return $;return Y.bgHex("#FFA500").black($)},u0=($,R)=>{if(!R)return $;return Y.whiteBright($)},i0=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},d=({level:$,request:R,data:X,store:w,options:K})=>{let Q=K.config,Z=q0(K),G=Q?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",V=new Date,_=String(V.getTime()),z=h0(V,Q?.timestamp?.translateTime),J=p0(z,Z),j=typeof X.message==="string"?X.message:"",I=w.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-w.beforeTime)/1e6,H=new URL(R.url).pathname,O=X.status,M=O===null||O===void 0?200:n(O),A=String(M),F=Q?.ip===!0?v0(R):"",L=i0(X.context),k=g0($,Z),S=m0(R.method,Z),C=u0(H,Z),Z0=n0(A,Z),G0=d0(`${I.toFixed(2)}ms`,Z);return G.replaceAll("{now}",J).replaceAll("{epoch}",_).replaceAll("{level}",k).replaceAll("{duration}",G0).replaceAll("{method}",S).replaceAll("{pathname}",C).replaceAll("{path}",C).replaceAll("{status}",Z0).replaceAll("{message}",j).replaceAll("{ip}",F).replaceAll("{context}",L)};var p=($,R,X,w)=>{let K=w.config,Q="ERROR",Z=R.toJSON(),G={status:R.status,message:R.detail||R.title,...Z};if(U({level:"ERROR",request:$,data:G,store:X,options:w}),!(K?.useTransportsOnly||K?.disableFileLogging)){let j=K?.logFilePath;if(j)T({filePath:j,level:"ERROR",request:$,data:G,store:X,options:w}).catch(()=>{})}if(K?.useTransportsOnly||K?.disableInternalLogger)return;let V="";if(K?.timestamp)V=`[${new Date().toISOString()}] `;let _=typeof $==="string"?"REQ":$.method,z=typeof $==="string"?$:$.url,J;try{J=z.includes("://")?new URL(z).pathname:z}catch{J=z}console.error(`${V}ERROR ${_} ${J} ${R.status} - ${R.title}`)};var i=($={})=>{let R=$.config,X=R?.pino,{prettyPrint:w,...K}=X??{},Z=w===!0&&K.transport===void 0?u.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:R?.timestamp?.translateTime,messageKey:K.messageKey,errorKey:K.errorKey}}):K.transport,G=u({...K,level:K.level??"info",messageKey:K.messageKey,errorKey:K.errorKey,transport:Z}),V=(J,j)=>{if(!j?.level||j.level.length===0)return!0;return j.level.includes(J)},_=(J,j,I,H)=>{if(!V(J,R?.logFilter))return;U({level:J,request:j,data:I,store:H,options:$});let O=R?.useTransportsOnly===!0,M=R?.disableInternalLogger===!0,A=R?.disableFileLogging===!0;if(!(O||A)){let L=R?.logFilePath;if(L)T({filePath:L,level:J,request:j,data:I,store:H,options:$}).catch(()=>{})}if(O||M)return;let F=d({level:J,request:j,data:I,store:H,options:$});switch(J){case"DEBUG":{console.debug(F);break}case"INFO":{console.info(F);break}case"WARNING":{console.warn(F);break}case"ERROR":{console.error(F);break}default:{console.log(F);break}}},z=(J,j,I,H)=>{let O={beforeTime:process.hrtime.bigint()};_(J,j,{message:I,context:H},O)};return{pino:G,log:_,handleHttpError:(J,j,I)=>{p(J,j,I,$)},debug:(J,j,I)=>{z("DEBUG",J,j,I)},info:(J,j,I)=>{z("INFO",J,j,I)},warn:(J,j,I)=>{z("WARNING",J,j,I)},error:(J,j,I)=>{z("ERROR",J,j,I)}}};class D extends Error{status;title;type;detail;instance;extensions;constructor($="about:blank",R,X,w,K,Q={}){super(w||R);Object.setPrototypeOf(this,D.prototype),this.status=X,this.title=R,this.type=$,this.detail=w,this.instance=K,this.extensions=Q}toJSON(){return{type:this.type,title:this.title,status:this.status,...this.detail?{detail:this.detail}:{},...this.instance?{instance:this.instance}:{},...this.extensions}}}class l extends D{constructor($,R){super("https://httpstatuses.com/400","Bad Request",400,$,void 0,R)}}class a extends D{constructor($,R){super("https://httpstatuses.com/401","Unauthorized",401,$,void 0,R)}}class s extends D{constructor($,R){super("https://httpstatuses.com/403","Forbidden",403,$,void 0,R)}}class o extends D{constructor($,R){super("https://httpstatuses.com/404","Not Found",404,$,void 0,R)}}class r extends D{constructor($,R){super("https://httpstatuses.com/409","Conflict",409,$,void 0,R)}}class t extends D{constructor($,R){super("https://httpstatuses.com/402","Payment Required",402,$,void 0,R)}}class e extends D{constructor($,R){super("https://httpstatuses.com/405","Method Not Allowed",405,$,void 0,R)}}class $0 extends D{constructor($,R){super("https://httpstatuses.com/406","Not Acceptable",406,$,void 0,R)}}class R0 extends D{constructor($,R){super("https://httpstatuses.com/500","Internal Server Error",500,$,void 0,R)}}class X0 extends D{constructor($,R){super("https://httpstatuses.com/501","Not Implemented",501,$,void 0,R)}}class w0 extends D{constructor($,R){super("https://httpstatuses.com/502","Bad Gateway",502,$,void 0,R)}}class K0 extends D{constructor($,R){super("https://httpstatuses.com/503","Service Unavailable",503,$,void 0,R)}}class Q0 extends D{constructor($,R){super("https://httpstatuses.com/504","Gateway Timeout",504,$,void 0,R)}}var l0={BadRequest:l,Unauthorized:a,PaymentRequired:t,Forbidden:s,NotFound:o,MethodNotAllowed:e,NotAcceptable:$0,Conflict:r,InternalServerError:R0,NotImplemented:X0,BadGateway:w0,ServiceUnavailable:K0,GatewayTimeout:Q0};var a0={400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",409:"Conflict",422:"Unprocessable Entity",500:"Internal Server Error",503:"Service Unavailable"},E=($,R,X,w="about:blank")=>{if($ instanceof D)return $.instance?$:new D($.type,$.title,$.status,$.detail,X,$.extensions);let K=500,Q="Internal Server Error",Z=$ instanceof Error?$.message:String($),G={};switch(R){case"VALIDATION":K=400,Q="Validation Failed",G={errors:$.all||[]};break;case"NOT_FOUND":K=404,Q="Resource Not Found";break;case"PARSE":K=400,Q="Invalid Payload",Z="The request body could not be parsed as valid JSON.";break;case"INVALID_COOKIE_SIGNATURE":K=401,Q="Invalid Credentials";break;default:if(typeof $?.status==="number")K=$.status,Q=a0[K]||"Unknown Error";break}return new D(w==="about:blank"?w:`${w}/${R}`,Q,K,Z,X,G)},s0=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",o0=($)=>$ instanceof Error||typeof $==="object"&&$!==null&&("message"in $)&&typeof $.message==="string";function r0($,R,X={}){if(X.format){let G=X.format($,R);if(G)return G}let w=new URL(R.url),K=s0($)?$.status:500,Q=o0($)?$.message:String($??"Unknown Error"),Z={type:X.typeBaseUrl?`${X.typeBaseUrl}/${K}`:"about:blank",title:t0(K),status:K,detail:Q,instance:w.pathname+w.search};if(typeof $==="object"&&$!==null){let G=$;if("type"in G||"title"in G){if(G.type)Z.type=G.type;if(G.title)Z.title=G.title}for(let[V,_]of Object.entries(G))if(!["status","message","type","title","detail","instance"].includes(V))Z[V]=_}return Z}function t0($){return{400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"}[$]||"Error"}function e0($,R){let X=new URL(R.url),w=[],K=$.status.toString(),Q=$$($.status);if(w.push(`
1
+ import{Elysia as $$}from"elysia";import J0 from"elysia/package.json";var V0=($,R)=>{if($.length>=R)return $.slice(0,R);let X=Math.floor((R-$.length)/2),w=R-$.length-X;return`${" ".repeat(X)}${$}${" ".repeat(w)}`},c=($)=>{let R=`Elysia v${J0.version}`,w=Math.max($.length,R.length)+4,K=`┌${"─".repeat(w)}┐`,Q=`└${"─".repeat(w)}┘`,Z=`│${" ".repeat(w)}│`,G=`│${V0(R,w)}│`,V=`│ ${$}${" ".repeat(Math.max(0,w-$.length-4))} │`;return[K,Z,G,Z,V,Z,Q].join(`
2
+ `)};var b=($,R)=>{if(!(R.config?.showStartupMessage??!0))return;let{port:w,hostname:K,protocol:Q}=$;if(w===void 0||!K||!Q)return;let G=`\uD83E\uDD8A Elysia is running at ${`${Q}://${K}:${w}`}`;if((R.config?.startupMessageFormat??"banner")==="simple"){console.log(G);return}console.log(c(G))};import u from"pino";var U=(...$)=>{let R=typeof $[0]==="string"?{level:$[0],request:$[1],data:$[2],store:$[3],options:$[4]}:$[0],{level:X,request:w,data:K,store:Q,options:Z}=R,G=Z.config?.transports??[];if(G.length===0)return;let V=typeof K.message==="string"?K.message:"",_={request:{method:w.method,url:w.url},...K,beforeTime:Q.beforeTime};for(let z of G)try{let J=z.log(X,V,_);if(J&&typeof J.catch==="function")J.catch(()=>{})}catch{}};import{appendFile as U0}from"node:fs/promises";import{dirname as T0}from"node:path";import{promises as j0}from"node:fs";var x=async($)=>{await j0.mkdir($,{recursive:!0})};import{promises as W}from"node:fs";import{promisify as W0}from"node:util";import{gzip as O0}from"node:zlib";import{promises as y}from"node:fs";import{basename as Y0,dirname as D0}from"node:path";var I0=/^(\d+(?:\.\d+)?)(k|kb|m|mb|g|gb)$/i,_0=/^(\d+)(h|d|w)$/i,z0=/\.(\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2})(?:\.gz)?$/,P=($)=>{if(typeof $==="number")return $;let R=$.trim(),X=Number(R);if(Number.isFinite(X))return X;let w=R.match(I0);if(!w)throw Error(`Invalid size format: ${$}`);let K=Number(w[1]),Q=w[2].toLowerCase(),Z=1024;if(Q.startsWith("m"))Z=1048576;else if(Q.startsWith("g"))Z=1073741824;return Math.floor(K*Z)},H0=($)=>{let R=$.trim().match(_0);if(!R)throw Error(`Invalid interval format: ${$}`);let X=Number(R[1]),w=R[2].toLowerCase(),K=3600000;if(w==="d")K=86400000;else if(w==="w")K=604800000;return X*K},q=($)=>{if(typeof $==="number")return{type:"count",value:$};return{type:"time",value:H0($)}},h=async($,R)=>{try{return(await y.stat($)).size>R}catch{return!1}},f=async($)=>{let R=D0($),X=Y0($),w;try{w=await y.readdir(R)}catch{return[]}return w.filter((K)=>K.startsWith(`${X}.`)&&z0.test(K)).map((K)=>`${R}/${K}`)};var F0=W0(O0),B=($)=>String($).padStart(2,"0"),L0=($,R)=>{let X=R.getFullYear(),w=B(R.getMonth()+1),K=B(R.getDate()),Q=B(R.getHours()),Z=B(R.getMinutes()),G=B(R.getSeconds());return`${$}.${X}-${w}-${K}-${Q}-${Z}-${G}`},M0=async($)=>{try{if((await W.stat($)).size===0)return""}catch{return""}let R=L0($,new Date);return await W.rename($,R),R},A0=async($)=>{let R=await W.readFile($),X=await F0(R);await W.writeFile(`${$}.gz`,X),await W.rm($,{force:!0})},v=async($,R)=>{if(R.maxSize===void 0)return!1;let X=P(R.maxSize);return await h($,X)},B0=async($,R)=>{let X=await f($);if(X.length<=R)return;let w=await Promise.all(X.map(async(Q)=>({path:Q,stat:await W.stat(Q)})));w.sort((Q,Z)=>Z.stat.mtimeMs-Q.stat.mtimeMs);let K=w.slice(R);await Promise.all(K.map(({path:Q})=>W.rm(Q,{force:!0})))},N0=async($,R)=>{let X=await f($);if(X.length===0)return;let w=Date.now(),Q=(await Promise.all(X.map(async(Z)=>({path:Z,stat:await W.stat(Z)})))).filter(({stat:Z})=>w-Z.mtimeMs>R);await Promise.all(Q.map(({path:Z})=>W.rm(Z,{force:!0})))},g=async($,R)=>{let X=await M0($);if(!X)return;if(R.compress===!0){if((R.compression??"gzip")==="gzip")await A0(X)}if(R.maxFiles!==void 0){let K=q(R.maxFiles);if(K.type==="count")await B0($,K.value);else await N0($,K.value)}};var T=async(...$)=>{let R=typeof $[0]==="string"?(()=>{let[M,A,F,L,k,S]=$;return{filePath:M,level:A,request:F,data:L,store:k,options:S}})():$[0],{filePath:X,level:w,request:K,data:Q,store:Z,options:G}=R,V=G.config,_=V?.useTransportsOnly===!0,z=V?.disableFileLogging===!0;if(_||z)return;let J=typeof Q.message==="string"?Q.message:"",j=Z.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-Z.beforeTime)/1e6,D=`${w} ${j.toFixed(2)}ms ${K.method} ${new URL(K.url).pathname} ${J}
3
+ `;await x(T0(X)),await U0(X,D,{encoding:"utf-8"});let H=V?.logRotation;if(!H)return;if(await v(X,H))await g(X,H)};import Y from"chalk";import{StatusMap as k0}from"elysia";var S0=/^\d+$/,y0=/[_-]+/g,f0=/([a-z0-9])([A-Z])/g,E0=/([A-Z])([A-Z][a-z])/g,C0=/['’]/g,c0=/[^a-z0-9\s]+/g,b0=/\s+/g,m=($)=>{let R=$.trim();if(!R)return"";return R.replace(y0," ").replace(f0,"$1 $2").replace(E0,"$1 $2").replace(C0,"").toLowerCase().replace(c0," ").replace(b0," ").trim()},x0=(()=>{let $=new Map;for(let[R,X]of Object.entries(k0))$.set(m(R),X);return $})(),n=($)=>{if(typeof $==="number"&&Number.isFinite($))return $;if(typeof $==="string"){let R=$.trim();if(S0.test(R))return Number(R);return x0.get(m(R))??500}return 500};var N=($)=>String($).padStart(2,"0"),P0=($)=>String($).padStart(3,"0"),q0=($)=>{let X=$.config?.useColors??!0,w=typeof process<"u"&&process.stdout?.isTTY===!0;return X&&w},h0=($,R)=>{if(!R)return $.toISOString();let X=String($.getFullYear()),w=N($.getMonth()+1),K=N($.getDate()),Q=N($.getHours()),Z=N($.getMinutes()),G=N($.getSeconds()),V=P0($.getMilliseconds());return R.replaceAll("yyyy",X).replaceAll("mm",w).replaceAll("dd",K).replaceAll("HH",Q).replaceAll("MM",Z).replaceAll("ss",G).replaceAll("SSS",V)},v0=($)=>{let R=$.headers.get("x-forwarded-for");if(R)return R.split(",")[0]?.trim()??"";return $.headers.get("x-real-ip")??""},g0=($,R)=>{if(!R)return $;if($==="ERROR")return Y.bgRed.black($);if($==="WARNING")return Y.bgYellow.black($);if($==="DEBUG")return Y.bgBlue.black($);return Y.bgGreen.black($)},m0=($,R)=>{if(!R)return $;let X=$.toUpperCase();if(X==="GET")return Y.green.bold(X);if(X==="POST")return Y.blue.bold(X);if(X==="PUT")return Y.yellow.bold(X);if(X==="PATCH")return Y.yellowBright.bold(X);if(X==="DELETE")return Y.red.bold(X);if(X==="OPTIONS")return Y.cyan.bold(X);if(X==="HEAD")return Y.greenBright.bold(X);if(X==="TRACE")return Y.magenta.bold(X);if(X==="CONNECT")return Y.cyanBright.bold(X);return Y.white.bold(X)},n0=($,R)=>{if(!R)return $;let X=Number.parseInt($,10);if(!Number.isFinite(X))return $;if(X>=500)return Y.red($);if(X>=400)return Y.yellow($);if(X>=300)return Y.cyan($);if(X>=200)return Y.green($);return Y.gray($)},d0=($,R)=>{if(!R)return $;return Y.gray($)},p0=($,R)=>{if(!R)return $;return Y.bgHex("#FFA500").black($)},u0=($,R)=>{if(!R)return $;return Y.whiteBright($)},i0=($)=>{if(typeof $==="object"&&$!==null)return JSON.stringify($);return""},d=({level:$,request:R,data:X,store:w,options:K})=>{let Q=K.config,Z=q0(K),G=Q?.customLogFormat??"\uD83E\uDD8A {now} {level} {duration} {method} {pathname} {status} {message} {ip} {context}",V=new Date,_=String(V.getTime()),z=h0(V,Q?.timestamp?.translateTime),J=p0(z,Z),j=typeof X.message==="string"?X.message:"",D=w.beforeTime===BigInt(0)?0:Number(process.hrtime.bigint()-w.beforeTime)/1e6,H=new URL(R.url).pathname,O=X.status,M=O===null||O===void 0?200:n(O),A=String(M),F=Q?.ip===!0?v0(R):"",L=i0(X.context),k=g0($,Z),S=m0(R.method,Z),C=u0(H,Z),Z0=n0(A,Z),G0=d0(`${D.toFixed(2)}ms`,Z);return G.replaceAll("{now}",J).replaceAll("{epoch}",_).replaceAll("{level}",k).replaceAll("{duration}",G0).replaceAll("{method}",S).replaceAll("{pathname}",C).replaceAll("{path}",C).replaceAll("{status}",Z0).replaceAll("{message}",j).replaceAll("{ip}",F).replaceAll("{context}",L)};var p=($,R,X,w)=>{let K=w.config,Q="ERROR",Z=R.toJSON(),G={status:R.status,message:R.detail||R.title,...Z};if(U({level:"ERROR",request:$,data:G,store:X,options:w}),!(K?.useTransportsOnly||K?.disableFileLogging)){let j=K?.logFilePath;if(j)T({filePath:j,level:"ERROR",request:$,data:G,store:X,options:w}).catch(()=>{})}if(K?.useTransportsOnly||K?.disableInternalLogger)return;let V="";if(K?.timestamp)V=`[${new Date().toISOString()}] `;let _=typeof $==="string"?"REQ":$.method,z=typeof $==="string"?$:$.url,J;try{J=z.includes("://")?new URL(z).pathname:z}catch{J=z}console.error(`${V}ERROR ${_} ${J} ${R.status} - ${R.title}`)};var i=($={})=>{let R=$.config,X=R?.pino,{prettyPrint:w,...K}=X??{},Z=w===!0&&K.transport===void 0?u.transport({target:"pino-pretty",options:{colorize:process.stdout?.isTTY===!0,translateTime:R?.timestamp?.translateTime,messageKey:K.messageKey,errorKey:K.errorKey}}):K.transport,G=u({...K,level:K.level??"info",messageKey:K.messageKey,errorKey:K.errorKey,transport:Z}),V=(J,j)=>{if(!j?.level||j.level.length===0)return!0;return j.level.includes(J)},_=(J,j,D,H)=>{if(!V(J,R?.logFilter))return;U({level:J,request:j,data:D,store:H,options:$});let O=R?.useTransportsOnly===!0,M=R?.disableInternalLogger===!0,A=R?.disableFileLogging===!0;if(!(O||A)){let L=R?.logFilePath;if(L)T({filePath:L,level:J,request:j,data:D,store:H,options:$}).catch(()=>{})}if(O||M)return;let F=d({level:J,request:j,data:D,store:H,options:$});switch(J){case"DEBUG":{console.debug(F);break}case"INFO":{console.info(F);break}case"WARNING":{console.warn(F);break}case"ERROR":{console.error(F);break}default:{console.log(F);break}}},z=(J,j,D,H)=>{let O={beforeTime:process.hrtime.bigint()};_(J,j,{message:D,context:H},O)};return{pino:G,log:_,handleHttpError:(J,j,D)=>{p(J,j,D,$)},debug:(J,j,D)=>{z("DEBUG",J,j,D)},info:(J,j,D)=>{z("INFO",J,j,D)},warn:(J,j,D)=>{z("WARNING",J,j,D)},error:(J,j,D)=>{z("ERROR",J,j,D)}}};class I extends Error{status;title;type;detail;instance;extensions;constructor($="about:blank",R,X,w,K,Q={}){super(w||R);Object.setPrototypeOf(this,I.prototype),this.status=X,this.title=R,this.type=$,this.detail=w,this.instance=K,this.extensions=Q}toJSON(){return{type:this.type,title:this.title,status:this.status,...this.detail?{detail:this.detail}:{},...this.instance?{instance:this.instance}:{},...this.extensions}}}class l extends I{constructor($,R){super("https://httpstatuses.com/400","Bad Request",400,$,void 0,R)}}class a extends I{constructor($,R){super("https://httpstatuses.com/401","Unauthorized",401,$,void 0,R)}}class s extends I{constructor($,R){super("https://httpstatuses.com/403","Forbidden",403,$,void 0,R)}}class o extends I{constructor($,R){super("https://httpstatuses.com/404","Not Found",404,$,void 0,R)}}class r extends I{constructor($,R){super("https://httpstatuses.com/409","Conflict",409,$,void 0,R)}}class t extends I{constructor($,R){super("https://httpstatuses.com/402","Payment Required",402,$,void 0,R)}}class e extends I{constructor($,R){super("https://httpstatuses.com/405","Method Not Allowed",405,$,void 0,R)}}class $0 extends I{constructor($,R){super("https://httpstatuses.com/406","Not Acceptable",406,$,void 0,R)}}class R0 extends I{constructor($,R){super("https://httpstatuses.com/500","Internal Server Error",500,$,void 0,R)}}class X0 extends I{constructor($,R){super("https://httpstatuses.com/501","Not Implemented",501,$,void 0,R)}}class w0 extends I{constructor($,R){super("https://httpstatuses.com/502","Bad Gateway",502,$,void 0,R)}}class K0 extends I{constructor($,R){super("https://httpstatuses.com/503","Service Unavailable",503,$,void 0,R)}}class Q0 extends I{constructor($,R){super("https://httpstatuses.com/504","Gateway Timeout",504,$,void 0,R)}}var P$={BadRequest:l,Unauthorized:a,PaymentRequired:t,Forbidden:s,NotFound:o,MethodNotAllowed:e,NotAcceptable:$0,Conflict:r,InternalServerError:R0,NotImplemented:X0,BadGateway:w0,ServiceUnavailable:K0,GatewayTimeout:Q0};var l0={400:"Bad Request",401:"Unauthorized",403:"Forbidden",404:"Not Found",409:"Conflict",422:"Unprocessable Entity",500:"Internal Server Error",503:"Service Unavailable"},E=($,R,X,w="about:blank")=>{if($ instanceof I)return $.instance?$:new I($.type,$.title,$.status,$.detail,X,$.extensions);let K=500,Q="Internal Server Error",Z=$ instanceof Error?$.message:String($),G={};switch(R){case"VALIDATION":K=400,Q="Validation Failed",G={errors:$.all||[]};break;case"NOT_FOUND":K=404,Q="Resource Not Found";break;case"PARSE":K=400,Q="Invalid Payload",Z="The request body could not be parsed as valid JSON.";break;case"INVALID_COOKIE_SIGNATURE":K=401,Q="Invalid Credentials";break;default:if(typeof $?.status==="number")K=$.status,Q=l0[K]||"Unknown Error";break}return new I(w==="about:blank"?w:`${w}/${R}`,Q,K,Z,X,G)},a0=($)=>typeof $==="object"&&$!==null&&("status"in $)&&typeof $.status==="number",s0=($)=>$ instanceof Error||typeof $==="object"&&$!==null&&("message"in $)&&typeof $.message==="string";function o0($,R,X={}){if(X.format){let G=X.format($,R);if(G)return G}let w=new URL(R.url),K=a0($)?$.status:500,Q=s0($)?$.message:String($??"Unknown Error"),Z={type:X.typeBaseUrl?`${X.typeBaseUrl}/${K}`:"about:blank",title:r0(K),status:K,detail:Q,instance:w.pathname+w.search};if(typeof $==="object"&&$!==null){let G=$;if("type"in G||"title"in G){if(G.type)Z.type=G.type;if(G.title)Z.title=G.title}for(let[V,_]of Object.entries(G))if(!["status","message","type","title","detail","instance"].includes(V))Z[V]=_}return Z}function r0($){return{400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a teapot",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"}[$]||"Error"}function t0($,R){let X=new URL(R.url),w=[],K=$.status.toString(),Q=e0($.status);if(w.push(`
4
4
  ${Q} [HTTP ${K}] ${R.method} ${X.pathname}`),w.push(` Type: ${$.type}`),w.push(` Title: ${$.title}`),$.detail)w.push(` Detail: ${$.detail}`);if($.instance)w.push(` Instance: ${$.instance}`);let Z=Object.entries($).filter(([G])=>!["type","title","status","detail","instance"].includes(G));if(Z.length>0){w.push(" Extensions:");for(let[G,V]of Z)w.push(` ${G}: ${JSON.stringify(V)}`)}return w.join(`
5
- `)}function $$($){if($>=500)return"\uD83D\uDD34";if($>=400)return"\uD83D\uDFE1";if($>=300)return"\uD83D\uDD35";if($>=200)return"\uD83D\uDFE2";return"⚪"}var X$=($={})=>{let R=new WeakSet,X=i($),w={...X,debug:(Q,Z,G)=>{R.add(Q),X.debug(Q,Z,G)},info:(Q,Z,G)=>{R.add(Q),X.info(Q,Z,G)},warn:(Q,Z,G)=>{R.add(Q),X.warn(Q,Z,G)},error:(Q,Z,G)=>{R.add(Q),X.error(Q,Z,G)}};return new R$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",w).state("pino",w.pino).state("beforeTime",BigInt(0)).onStart(({server:Q})=>{if(Q)b(Q,$)}).onRequest(({store:Q})=>{Q.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:Q,set:Z,store:G})=>{if(R.has(Q))return;let V=typeof Z.status==="number"?Z.status:200,_="INFO";if(V>=500)_="ERROR";else if(V>=400)_="WARNING";w.log(_,Q,{status:V},G)}).onError(({request:Q,error:Z,code:G,path:V,store:_,set:z})=>{let J=$.transform?$.transform(Z,{request:Q,code:G,path:V}):Z,j=E(J,G,V,$.config?.error?.problemJson?.typeBaseUrl);return w.handleHttpError(Q,j,_,$),z.status=j.status,z.headers["content-type"]="application/problem+json",j.toJSON()}).as("scoped")},a$=X$;export{r0 as toProblemJson,E as normalizeToProblem,X$ as logixlysia,e0 as formatProblemJsonLog,a$ as default,D as ProblemError,l0 as HttpError};
5
+ `)}function e0($){if($>=500)return"\uD83D\uDD34";if($>=400)return"\uD83D\uDFE1";if($>=300)return"\uD83D\uDD35";if($>=200)return"\uD83D\uDFE2";return"⚪"}var R$=($={})=>{let R=new WeakSet,X=i($),w={...X,debug:(Q,Z,G)=>{R.add(Q),X.debug(Q,Z,G)},info:(Q,Z,G)=>{R.add(Q),X.info(Q,Z,G)},warn:(Q,Z,G)=>{R.add(Q),X.warn(Q,Z,G)},error:(Q,Z,G)=>{R.add(Q),X.error(Q,Z,G)}};return new $$({name:"Logixlysia",detail:{description:"Logixlysia is a plugin for Elysia that provides a logger and pino logger.",tags:["logging","pino"]}}).state("logger",w).state("pino",w.pino).state("beforeTime",BigInt(0)).onStart(({server:Q})=>{if(Q)b(Q,$)}).onRequest(({store:Q})=>{Q.beforeTime=process.hrtime.bigint()}).onAfterHandle(({request:Q,set:Z,store:G})=>{if(R.has(Q))return;let V=typeof Z.status==="number"?Z.status:200,_="INFO";if(V>=500)_="ERROR";else if(V>=400)_="WARNING";w.log(_,Q,{status:V},G)}).onError(({request:Q,error:Z,code:G,path:V,store:_,set:z})=>{let J=$.transform?$.transform(Z,{request:Q,code:G,path:V}):Z,j=E(J,G,V,$.config?.error?.problemJson?.typeBaseUrl);return w.handleHttpError(Q,j,_,$),z.status=j.status,z.headers["content-type"]="application/problem+json",j.toJSON()}).as("scoped")},a$=R$;export{o0 as toProblemJson,E as normalizeToProblem,R$ as logixlysia,t0 as formatProblemJsonLog,a$ as default,I as ProblemError,P$ as HttpError};
6
6
 
7
- //# debugId=489216AEAA0DBF5064756E2164756E21
8
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxpbmRleC50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGJhbm5lci50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGluZGV4LnRzIiwgInNyY1xcbG9nZ2VyXFxpbmRleC50cyIsICJzcmNcXG91dHB1dFxcaW5kZXgudHMiLCAic3JjXFxvdXRwdXRcXGZpbGUudHMiLCAic3JjXFxvdXRwdXRcXGZzLnRzIiwgInNyY1xcb3V0cHV0XFxyb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyY1xcdXRpbHNcXHJvdGF0aW9uLnRzIiwgInNyY1xcbG9nZ2VyXFxjcmVhdGUtbG9nZ2VyLnRzIiwgInNyY1xcaGVscGVyc1xcc3RhdHVzLnRzIiwgInNyY1xcbG9nZ2VyXFxoYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmNcXEVycm9yXFxlcnJvcnMudHMiLCAic3JjXFx1dGlsc1xcaGFuZGxlLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgbm9ybWFsaXplVG9Qcm9ibGVtIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8XG4gICdMb2dpeGx5c2lhJyxcbiAgU2luZ2xldG9uQmFzZSAmIHsgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZSB9XG4+XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWEgPT4ge1xuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVMb2dnZXIob3B0aW9ucylcbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuaW5mbyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci53YXJuKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5lcnJvcihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTG9naXhseXNpYSBpcyBhIHBsdWdpbiBmb3IgRWx5c2lhIHRoYXQgcHJvdmlkZXMgYSBsb2dnZXIgYW5kIHBpbm8gbG9nZ2VyLicsXG4gICAgICB0YWdzOiBbJ2xvZ2dpbmcnLCAncGlubyddXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgYXBwXG4gICAgICAuc3RhdGUoJ2xvZ2dlcicsIGxvZ2dlcilcbiAgICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vblJlcXVlc3QoKHsgc3RvcmUgfSkgPT4ge1xuICAgICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIH0pXG4gICAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCB7IHN0YXR1cyB9LCBzdG9yZSlcbiAgICAgIH0pXG4gICAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgY29kZSwgcGF0aCwgc3RvcmUsIHNldCB9KSA9PiB7XG4gICAgICAgIC8vIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAxOiBUcmFuc2Zvcm0gKOi9rOaNoilcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybShlcnJvciwgeyByZXF1ZXN0LCBjb2RlLCBwYXRoIH0pXG4gICAgICAgICAgOiBlcnJvclxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAyOiBOb3JtYWxpemF0aW9uICjop4TojIPljJYpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDnu5/kuIDovazkuLogUHJvYmxlbUVycm9yIOWunuS+i1xuICAgICAgICBjb25zdCBwcm9ibGVtID0gbm9ybWFsaXplVG9Qcm9ibGVtKFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgb3B0aW9ucy5jb25maWc/LmVycm9yPy5wcm9ibGVtSnNvbj8udHlwZUJhc2VVcmxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAzOiBMb2dnaW5nICjml6Xlv5cpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDosIPnlKjkuIrpnaLmlLnpgKDlkI7nmoTlh73mlbDvvIzlroPnjrDlnKjlj6rotJ/otKPorrDlvZXvvIzkuI3otJ/otKPpgLvovpHliKTmlq1cbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBwcm9ibGVtLCBzdG9yZSwgb3B0aW9ucylcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gUGhhc2UgNDogUmVzcG9uc2UgKOWTjeW6lClcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIOe7n+S4gOiuvue9riBIZWFkZXIg5ZKMIFN0YXR1c1xuICAgICAgICBzZXQuc3RhdHVzID0gcHJvYmxlbS5zdGF0dXNcbiAgICAgICAgc2V0LmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3Byb2JsZW0ranNvbidcblxuICAgICAgICAvLyDov5Tlm57nrKblkIggUkZDIOagh+WHhueahCBKU09OXG4gICAgICAgIHJldHVybiBwcm9ibGVtLnRvSlNPTigpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIEV4cG9ydHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHsgSHR0cEVycm9yLCBQcm9ibGVtRXJyb3IgfSBmcm9tICcuL0Vycm9yL2Vycm9ycydcbmV4cG9ydCB0eXBlIHsgUHJvYmxlbURvY3VtZW50IH0gZnJvbSAnLi9FcnJvci9lcnJvcnMnXG5leHBvcnQgdHlwZSB7XG4gIENvZGUsXG4gIEh0dHBFcnJvclR5cGUsXG4gIEVycm9yQ29udGV4dCxcbiAgSHR0cFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL0Vycm9yL3R5cGUnXG5leHBvcnQgeyBub3JtYWxpemVUb1Byb2JsZW0gfSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB0eXBlIHtcbiAgUHJvYmxlbUpzb24sXG4gIFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB7IGZvcm1hdFByb2JsZW1Kc29uTG9nLCB0b1Byb2JsZW1Kc29uIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29yZSBFeHBvcnRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCBlbHlzaWFQa2cgZnJvbSAnZWx5c2lhL3BhY2thZ2UuanNvbidcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb25MaW5lID0gYEVseXNpYSB2JHtlbHlzaWFQa2cudmVyc2lvbn1gXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KG1lc3NhZ2UubGVuZ3RoLCB2ZXJzaW9uTGluZS5sZW5ndGgpXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0IC8vIDIgc3BhY2VzIHBhZGRpbmcgb24gYm90aCBzaWRlc1xuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3QgdmVyc2lvblJvdyA9IGDilIIke2NlbnRlclRleHQodmVyc2lvbkxpbmUsIGlubmVyV2lkdGgpfeKUgmBcbiAgY29uc3QgbWVzc2FnZVJvdyA9IGDilIIgICR7bWVzc2FnZX0keycgJy5yZXBlYXQoTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIG1lc3NhZ2UubGVuZ3RoIC0gNCkpfSAg4pSCYFxuXG4gIHJldHVybiBbdG9wLCBlbXB0eSwgdmVyc2lvblJvdywgZW1wdHksIG1lc3NhZ2VSb3csIGVtcHR5LCBib3RdLmpvaW4oJ1xcbicpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKG1lc3NhZ2UpKVxufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBmb3JtYXRMaW5lIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8gcGluby50cmFuc3BvcnQoe1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlubyh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdExpbmUoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgbWVzc2FnZSwgY29udGV4dCB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGlubzogcGlub0xvZ2dlcixcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3QsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcblxuICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgaWYgKHNob3VsZCkge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBQaW5vLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gZHVyYXRpb25cbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0hleCgnI0ZGQTUwMCcpLmJsYWNrKHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID1cbiAgICBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/P1xuICAgICfwn6aKIHtub3d9IHtsZXZlbH0ge2R1cmF0aW9ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHttZXNzYWdlfSB7aXB9IHtjb250ZXh0fSdcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gU3RyaW5nKG5vdy5nZXRUaW1lKCkpXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXG4gIGNvbnN0IGN0eFN0cmluZyA9IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkRHVyYXRpb24gPSBnZXRDb2xvcmVkRHVyYXRpb24oXG4gICAgYCR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zYCxcbiAgICB1c2VDb2xvcnNcbiAgKVxuXG4gIHJldHVybiBmb3JtYXRcbiAgICAucmVwbGFjZUFsbCgne25vd30nLCB0aW1lc3RhbXApXG4gICAgLnJlcGxhY2VBbGwoJ3tlcG9jaH0nLCBlcG9jaClcbiAgICAucmVwbGFjZUFsbCgne2xldmVsfScsIGNvbG9yZWRMZXZlbClcbiAgICAucmVwbGFjZUFsbCgne2R1cmF0aW9ufScsIGNvbG9yZWREdXJhdGlvbilcbiAgICAucmVwbGFjZUFsbCgne21ldGhvZH0nLCBjb2xvcmVkTWV0aG9kKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aG5hbWV9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aH0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3tzdGF0dXN9JywgY29sb3JlZFN0YXR1cylcbiAgICAucmVwbGFjZUFsbCgne21lc3NhZ2V9JywgbWVzc2FnZSlcbiAgICAucmVwbGFjZUFsbCgne2lwfScsIGlwKVxuICAgIC5yZXBsYWNlQWxsKCd7Y29udGV4dH0nLCBjdHhTdHJpbmcpXG59XG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuLi9FcnJvci9lcnJvcnMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIHByb2JsZW06IFByb2JsZW1FcnJvcixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIC8vIDEuIOWHhuWkh+aXpeW/l+aVsOaNru+8muWwhiBSRkMg5qCH5YeG5a2X5q615LiO5pel5b+X5YWD5pWw5o2u5ZCI5bm2XG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUidcbiAgY29uc3QgcmZjRGF0YSA9IHByb2JsZW0udG9KU09OKClcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzdGF0dXM6IHByb2JsZW0uc3RhdHVzLFxuICAgIG1lc3NhZ2U6IHByb2JsZW0uZGV0YWlsIHx8IHByb2JsZW0udGl0bGUsXG4gICAgLi4ucmZjRGF0YVxuICB9XG4gIC8vIDIuIOmYtuaute+8muS8oOi+k+WxgiAoVHJhbnNwb3J0cylcbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG4gIC8vIDMuIOmYtuaute+8muaMgeS5heWMliAoRmlsZSBMb2dnaW5nKVxuICAvLyDljLnphY3kvaDnmoTmjqXlj6PvvJp1c2VUcmFuc3BvcnRzT25seSDlkowgZGlzYWJsZUZpbGVMb2dnaW5nIOebtOaOpeWcqCBjb25maWcg5LiLXG4gIGlmICghKGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgfHwgY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAoKSA9PiB7fVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIOmYtuaute+8muaOp+WItuWPsOi+k+WHuiAoQ29uc29sZS9JbnRlcm5hbClcbiAgaWYgKGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgfHwgY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHJldHVyblxuXG4gIC8vIOWkhOeQhuaXtumXtOaIs+aYvuekuumAu+i+kVxuICBsZXQgdGltZXN0YW1wID0gJydcbiAgaWYgKGNvbmZpZz8udGltZXN0YW1wKSB7XG4gICAgdGltZXN0YW1wID0gYFske25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1dIGBcbiAgfVxuXG4gIC8vIDEuIOWuieWFqOaPkOWPliBNZXRob2Qg5ZKMIFBhdGhcbiAgY29uc3QgbWV0aG9kID0gdHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnID8gJ1JFUScgOiByZXF1ZXN0Lm1ldGhvZFxuICBjb25zdCB1cmxTdHJpbmcgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycgPyByZXF1ZXN0IDogcmVxdWVzdC51cmxcblxuICBsZXQgcGF0aDogc3RyaW5nXG4gIHRyeSB7XG4gICAgLy8g5aaC5p6c5piv5a6M5pW0IFVSTCDliJnmj5Dlj5YgcGF0aG5hbWXvvIzlpoLmnpzmmK/nm7jlr7not6/lvoTliJnnm7TmjqXkvb/nlKhcbiAgICBwYXRoID0gdXJsU3RyaW5nLmluY2x1ZGVzKCc6Ly8nKSA/IG5ldyBVUkwodXJsU3RyaW5nKS5wYXRobmFtZSA6IHVybFN0cmluZ1xuICB9IGNhdGNoIHtcbiAgICBwYXRoID0gdXJsU3RyaW5nXG4gIH1cblxuICAvLyAyLiDor63kuYnljJbnu4jnq6/miZPljbBcbiAgLy8g546w5Zyo55qE5Luj56CB5a+5IHN0cmluZyDlkowgUmVxdWVzdCDnsbvlnovpg73nmb7liIbkuYvnmb7lronlhajkuoZcbiAgY29uc29sZS5lcnJvcihcbiAgICBgJHt0aW1lc3RhbXB9JHtsZXZlbH0gJHttZXRob2R9ICR7cGF0aH0gJHtwcm9ibGVtLnN0YXR1c30gLSAke3Byb2JsZW0udGl0bGV9YFxuICApXG59XG4iLAogICAgIi8vIHNyYy9saWJzL2VseXNpYS1odHRwLXByb2JsZW0tanNvbi9lcnJvcnMudHNcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtRG9jdW1lbnQge1xuICB0eXBlOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBzdGF0dXM/OiBudW1iZXJcbiAgZGV0YWlsPzogc3RyaW5nXG4gIGluc3RhbmNlPzogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuLyoqXG4gKiBSRkMgOTQ1NyBQcm9ibGVtIERldGFpbHMgRXJyb3IgQmFzZSBDbGFzc1xuICpcbiAqIENvcmUgbWVtYmVycyBhcyBwZXIgUkZDIDk0NTc6XG4gKiAtIHR5cGU6IEEgVVJJIHJlZmVyZW5jZSBbUkZDMzk4Nl0gdGhhdCBpZGVudGlmaWVzIHRoZSBwcm9ibGVtIHR5cGUuXG4gKiAgICAgICAgIERlZmF1bHRzIHRvIFwiYWJvdXQ6YmxhbmtcIiB3aGVuIG9taXR0ZWQuXG4gKiAtIHRpdGxlOiBBIHNob3J0LCBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHRoZSBwcm9ibGVtIHR5cGUuXG4gKiAtIHN0YXR1czogVGhlIEhUVFAgc3RhdHVzIGNvZGUgKFtSRkM3MjMxXSwgU2VjdGlvbiA2KS5cbiAqIC0gZGV0YWlsOiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHNwZWNpZmljIHRvIHRoaXMgb2NjdXJyZW5jZSBvZiB0aGUgcHJvYmxlbS5cbiAqIC0gaW5zdGFuY2U6IEEgVVJJIHJlZmVyZW5jZSB0aGF0IGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIG9jY3VycmVuY2Ugb2YgdGhlIHByb2JsZW0uXG4gKlxuICogRXh0ZW5zaW9uIG1lbWJlcnM6IEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgYWRkZWQgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQuXG4gKiBUaGVzZSBhcmUgc2VyaWFsaXplZCBhcy1pcyBpbiB0aGUgSlNPTiByZXNwb25zZS5cbiAqL1xuLyoqXG4gKiBSRkMgOTQ1NyBFcnJvciBCYXNlIENsYXNzXG4gKiAqIOS/ruaUueaAnei3r++8muebtOaOpeS9v+eUqCBwdWJsaWMgcmVhZG9ubHkg5bGe5oCn77yM5ouS57ud5bWM5aWX77yM5ouS57udIEdldHRlcuOAglxuICovXG5leHBvcnQgY2xhc3MgUHJvYmxlbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvLyAxLiDnm7TmjqXlo7DmmI7lhazlvIDlsZ7mgKdcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGRldGFpbD86IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2U/OiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHR5cGUgPSAnYWJvdXQ6YmxhbmsnLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgZGV0YWlsPzogc3RyaW5nLFxuICAgIGluc3RhbmNlPzogc3RyaW5nLFxuICAgIGV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKSB7XG4gICAgc3VwZXIoZGV0YWlsIHx8IHRpdGxlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBQcm9ibGVtRXJyb3IucHJvdG90eXBlKVxuXG4gICAgLy8gMi4g55u05o6l6LWL5YC857uZIHRoaXNcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmRldGFpbCA9IGRldGFpbFxuICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZVxuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnNcbiAgfVxuXG4gIC8vIDMuIHRvSlNPTiDnmoTml7blgJnliqjmgIHnu4Too4XkuIDkuIvljbPlj69cbiAgdG9KU09OKCk6IFByb2JsZW1Eb2N1bWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIC4uLih0aGlzLmRldGFpbCA/IHsgZGV0YWlsOiB0aGlzLmRldGFpbCB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuaW5zdGFuY2UgPyB7IGluc3RhbmNlOiB0aGlzLmluc3RhbmNlIH0gOiB7fSksXG4gICAgICAvLyDmiormianlsZXlrZfmrrXlsZXlvIAgKGV4dGVuc2lvbnMpXG4gICAgICAuLi50aGlzLmV4dGVuc2lvbnNcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tIDQwWCBFcnJvcnMgLS0tXG5jbGFzcyBCYWRSZXF1ZXN0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDAnLFxuICAgICAgJ0JhZCBSZXF1ZXN0JyxcbiAgICAgIDQwMCxcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgVW5hdXRob3JpemVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDEnLFxuICAgICAgJ1VuYXV0aG9yaXplZCcsXG4gICAgICA0MDEsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIEZvcmJpZGRlbiBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAzJyxcbiAgICAgICdGb3JiaWRkZW4nLFxuICAgICAgNDAzLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RGb3VuZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA0JyxcbiAgICAgICdOb3QgRm91bmQnLFxuICAgICAgNDA0LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBDb25mbGljdCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA5JyxcbiAgICAgICdDb25mbGljdCcsXG4gICAgICA0MDksXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIFBheW1lbnRSZXF1aXJlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAyJyxcbiAgICAgICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAgIDQwMixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgTWV0aG9kTm90QWxsb3dlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA1JyxcbiAgICAgICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICAgICAgNDA1LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RBY2NlcHRhYmxlIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDYnLFxuICAgICAgJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAgIDQwNixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuLy8gNTBYIEVycm9yc1xuY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvciBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAwJyxcbiAgICAgICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgICAgNTAwLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RJbXBsZW1lbnRlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAxJyxcbiAgICAgICdOb3QgSW1wbGVtZW50ZWQnLFxuICAgICAgNTAxLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBCYWRHYXRld2F5IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDInLFxuICAgICAgJ0JhZCBHYXRld2F5JyxcbiAgICAgIDUwMixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgU2VydmljZVVuYXZhaWxhYmxlIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDMnLFxuICAgICAgJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICAgICAgNTAzLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBHYXRld2F5VGltZW91dCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTA0JyxcbiAgICAgICdHYXRld2F5IFRpbWVvdXQnLFxuICAgICAgNTA0LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSHR0cEVycm9yID0ge1xuICBCYWRSZXF1ZXN0LFxuICBVbmF1dGhvcml6ZWQsXG4gIFBheW1lbnRSZXF1aXJlZCxcbiAgRm9yYmlkZGVuLFxuICBOb3RGb3VuZCxcbiAgTWV0aG9kTm90QWxsb3dlZCxcbiAgTm90QWNjZXB0YWJsZSxcbiAgQ29uZmxpY3QsXG4gIEludGVybmFsU2VydmVyRXJyb3IsXG4gIE5vdEltcGxlbWVudGVkLFxuICBCYWRHYXRld2F5LFxuICBTZXJ2aWNlVW5hdmFpbGFibGUsXG4gIEdhdGV3YXlUaW1lb3V0XG59IGFzIGNvbnN0XG4iLAogICAgIi8qKlxuICogUkZDIDk0NTcgUHJvYmxlbSBKU09OIOagvOW8j+WMluW3peWFt1xuICogQHNlZSBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTQ1Ny5odG1sXG4gKi9cblxuaW1wb3J0IHsgUHJvYmxlbUVycm9yIH0gZnJvbSAnLi4vRXJyb3IvZXJyb3JzJ1xuaW1wb3J0IHR5cGUgeyBDb2RlIH0gZnJvbSAnLi4vRXJyb3IvdHlwZSdcblxuLyoqXG4gKiDpu5jorqTnmoTnirbmgIHnoIHkuI7moIfpopjmmKDlsITooaggKFJGQyDmoIflh4bmjqjojZApXG4gKi9cbmNvbnN0IERFRkFVTFRfVElUTEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gIDQwMzogJ0ZvcmJpZGRlbicsXG4gIDQwNDogJ05vdCBGb3VuZCcsXG4gIDQwOTogJ0NvbmZsaWN0JyxcbiAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxuICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJ1xufVxuXG5leHBvcnQgY29uc3Qgbm9ybWFsaXplVG9Qcm9ibGVtID0gKFxuICBlcnJvcjogYW55LFxuICBjb2RlOiBDb2RlLFxuICBwYXRoOiBzdHJpbmcsXG4gIHR5cGVCYXNlVXJsID0gJ2Fib3V0OmJsYW5rJ1xuKTogUHJvYmxlbUVycm9yID0+IHtcbiAgLy8gMS4g5aaC5p6c5bey57uP5pivIFByb2JsZW1FcnJvcu+8jOebtOaOpeihpeWFhSBpbnN0YW5jZSDlubbov5Tlm55cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgUHJvYmxlbUVycm9yKSB7XG4gICAgLy8g5aaC5p6c5rKh5pyJIGluc3RhbmNl77yM6Ieq5Yqo6KGl5YWo5Li65b2T5YmN6K+35rGC6Lev5b6EXG4gICAgcmV0dXJuIGVycm9yLmluc3RhbmNlXG4gICAgICA/IGVycm9yXG4gICAgICA6IG5ldyBQcm9ibGVtRXJyb3IoXG4gICAgICAgICAgZXJyb3IudHlwZSxcbiAgICAgICAgICBlcnJvci50aXRsZSxcbiAgICAgICAgICBlcnJvci5zdGF0dXMsXG4gICAgICAgICAgZXJyb3IuZGV0YWlsLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgZXJyb3IuZXh0ZW5zaW9uc1xuICAgICAgICApXG4gIH1cblxuICAvLyAyLiDliJ3lp4vljJbpu5jorqTlgLxcbiAgbGV0IHN0YXR1cyA9IDUwMFxuICBsZXQgdGl0bGUgPSAnSW50ZXJuYWwgU2VydmVyIEVycm9yJ1xuICBsZXQgZGV0YWlsID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gIGxldCBleHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG5cbiAgLy8gMy4g6K+G5YirIEVseXNpYSDlhoXnva7plJnor6/noIHlubbigJzlr7npvZDigJ3moIflh4ZcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAnVkFMSURBVElPTic6XG4gICAgICBzdGF0dXMgPSA0MDBcbiAgICAgIHRpdGxlID0gJ1ZhbGlkYXRpb24gRmFpbGVkJ1xuICAgICAgLy8g5o+Q5Y+WIEVseXNpYSDnmoTmoKHpqoznu4boioJcbiAgICAgIGV4dGVuc2lvbnMgPSB7IGVycm9yczogZXJyb3IuYWxsIHx8IFtdIH1cbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnTk9UX0ZPVU5EJzpcbiAgICAgIHN0YXR1cyA9IDQwNFxuICAgICAgdGl0bGUgPSAnUmVzb3VyY2UgTm90IEZvdW5kJ1xuICAgICAgYnJlYWtcbiAgICBjYXNlICdQQVJTRSc6XG4gICAgICBzdGF0dXMgPSA0MDBcbiAgICAgIHRpdGxlID0gJ0ludmFsaWQgUGF5bG9hZCdcbiAgICAgIGRldGFpbCA9ICdUaGUgcmVxdWVzdCBib2R5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYXMgdmFsaWQgSlNPTi4nXG4gICAgICBicmVha1xuICAgIGNhc2UgJ0lOVkFMSURfQ09PS0lFX1NJR05BVFVSRSc6XG4gICAgICBzdGF0dXMgPSA0MDFcbiAgICAgIHRpdGxlID0gJ0ludmFsaWQgQ3JlZGVudGlhbHMnXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyDlpoLmnpzplJnor6/lr7nosaHmnKzouqvluKbmnInnirbmgIHnoIHvvIjmr5TlpoLmn5DkupvlupPmipvlh7rnmoTvvIlcbiAgICAgIGlmICh0eXBlb2YgZXJyb3I/LnN0YXR1cyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc3RhdHVzID0gZXJyb3Iuc3RhdHVzXG4gICAgICAgIHRpdGxlID0gREVGQVVMVF9USVRMRVNbc3RhdHVzXSB8fCAnVW5rbm93biBFcnJvcidcbiAgICAgIH1cbiAgICAgIGJyZWFrXG4gIH1cblxuICAvLyA0LiDmnoTpgKDlubbov5Tlm57moIflh4bnmoQgUHJvYmxlbUVycm9yXG4gIHJldHVybiBuZXcgUHJvYmxlbUVycm9yKFxuICAgIHR5cGVCYXNlVXJsID09PSAnYWJvdXQ6YmxhbmsnID8gdHlwZUJhc2VVcmwgOiBgJHt0eXBlQmFzZVVybH0vJHtjb2RlfWAsXG4gICAgdGl0bGUsXG4gICAgc3RhdHVzLFxuICAgIGRldGFpbCxcbiAgICBwYXRoLFxuICAgIGV4dGVuc2lvbnNcbiAgKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2JsZW1Kc29uIHtcbiAgdHlwZT86IHN0cmluZ1xuICB0aXRsZTogc3RyaW5nXG4gIHN0YXR1czogbnVtYmVyXG4gIGRldGFpbD86IHN0cmluZ1xuICBpbnN0YW5jZT86IHN0cmluZ1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvYmxlbUpzb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIOWfuuehgCBVUkzvvIznlKjkuo7nlJ/miJDplJnor6/nsbvlnovnmoTpk77mjqVcbiAgICogQGV4YW1wbGUgJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tL2Vycm9ycydcbiAgICovXG4gIHR5cGVCYXNlVXJsPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIOaYr+WQpuWcqOaXpeW/l+S4reaYvuekuuWujOaVtOeahCBQcm9ibGVtIEpTT05cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW5cblxuICAvKipcbiAgICog6Ieq5a6a5LmJ5qC85byP5YyW5Ye95pWwXG4gICAqL1xuICBmb3JtYXQ/OiAoZXJyb3I6IHVua25vd24sIHJlcXVlc3Q6IFJlcXVlc3QpID0+IFByb2JsZW1Kc29uIHwgbnVsbFxufVxuXG5jb25zdCBpc0Vycm9yV2l0aFN0YXR1cyA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHsgc3RhdHVzOiBudW1iZXIgfSA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gIHZhbHVlICE9PSBudWxsICYmXG4gICdzdGF0dXMnIGluIHZhbHVlICYmXG4gIHR5cGVvZiAodmFsdWUgYXMgeyBzdGF0dXM/OiB1bmtub3duIH0pLnN0YXR1cyA9PT0gJ251bWJlcidcblxuY29uc3QgaXNFcnJvckxpa2UgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBFcnJvciA9PlxuICB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAnbWVzc2FnZScgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIHsgbWVzc2FnZT86IHVua25vd24gfSkubWVzc2FnZSA9PT0gJ3N0cmluZycpXG5cbi8qKlxuICog5bCG6ZSZ6K+v6L2s5o2i5Li6IFJGQyA5NDU3IFByb2JsZW0gSlNPTiDmoLzlvI9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJvYmxlbUpzb24oXG4gIGVycm9yOiB1bmtub3duLFxuICByZXF1ZXN0OiBSZXF1ZXN0LFxuICBvcHRpb25zOiBQcm9ibGVtSnNvbk9wdGlvbnMgPSB7fVxuKTogUHJvYmxlbUpzb24ge1xuICAvLyDlpoLmnpzmj5Dkvpvkuoboh6rlrprkuYnmoLzlvI/ljJblh73mlbDvvIzkvb/nlKjlroNcbiAgaWYgKG9wdGlvbnMuZm9ybWF0KSB7XG4gICAgY29uc3QgY3VzdG9tID0gb3B0aW9ucy5mb3JtYXQoZXJyb3IsIHJlcXVlc3QpXG4gICAgaWYgKGN1c3RvbSkge1xuICAgICAgcmV0dXJuIGN1c3RvbVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gIGNvbnN0IHN0YXR1cyA9IGlzRXJyb3JXaXRoU3RhdHVzKGVycm9yKSA/IGVycm9yLnN0YXR1cyA6IDUwMFxuICBjb25zdCBtZXNzYWdlID0gaXNFcnJvckxpa2UoZXJyb3IpXG4gICAgPyBlcnJvci5tZXNzYWdlXG4gICAgOiBTdHJpbmcoZXJyb3IgPz8gJ1Vua25vd24gRXJyb3InKVxuXG4gIC8vIOm7mOiupOeahCBQcm9ibGVtIEpTT04g57uT5p6EXG4gIGNvbnN0IHByb2JsZW06IFByb2JsZW1Kc29uID0ge1xuICAgIHR5cGU6IG9wdGlvbnMudHlwZUJhc2VVcmxcbiAgICAgID8gYCR7b3B0aW9ucy50eXBlQmFzZVVybH0vJHtzdGF0dXN9YFxuICAgICAgOiAnYWJvdXQ6YmxhbmsnLFxuICAgIHRpdGxlOiBnZXREZWZhdWx0VGl0bGUoc3RhdHVzKSxcbiAgICBzdGF0dXMsXG4gICAgZGV0YWlsOiBtZXNzYWdlLFxuICAgIGluc3RhbmNlOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gIH1cblxuICAvLyDlsJ3or5Xku47plJnor6/lr7nosaHkuK3mj5Dlj5bpop3lpJbnmoTkv6Hmga9cbiAgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gICAgLy8g5aaC5p6c6ZSZ6K+v5bey57uP5pyJIFByb2JsZW0gSlNPTiDnu5PmnoTvvIznm7TmjqXkvb/nlKhcbiAgICBpZiAoJ3R5cGUnIGluIGVyciB8fCAndGl0bGUnIGluIGVycikge1xuICAgICAgaWYgKGVyci50eXBlKSBwcm9ibGVtLnR5cGUgPSBlcnIudHlwZSBhcyBzdHJpbmdcbiAgICAgIGlmIChlcnIudGl0bGUpIHByb2JsZW0udGl0bGUgPSBlcnIudGl0bGUgYXMgc3RyaW5nXG4gICAgfVxuXG4gICAgLy8g5re75Yqg5YW25LuW5omp5bGV5a2X5q6177yI5o6S6Zmk5qCH5YeG5a2X5q6177yJXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZXJyKSkge1xuICAgICAgaWYgKFxuICAgICAgICAhWydzdGF0dXMnLCAnbWVzc2FnZScsICd0eXBlJywgJ3RpdGxlJywgJ2RldGFpbCcsICdpbnN0YW5jZSddLmluY2x1ZGVzKFxuICAgICAgICAgIGtleVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcHJvYmxlbVtrZXldID0gdmFsdWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcHJvYmxlbVxufVxuXG4vKipcbiAqIOagueaNrueKtuaAgeeggeiOt+WPlum7mOiupOagh+mimFxuICovXG5mdW5jdGlvbiBnZXREZWZhdWx0VGl0bGUoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZXM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gICAgNDAwOiAnQmFkIFJlcXVlc3QnLFxuICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsXG4gICAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsXG4gICAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgICA0MDQ6ICdOb3QgRm91bmQnLFxuICAgIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsXG4gICAgNDA2OiAnTm90IEFjY2VwdGFibGUnLFxuICAgIDQwNzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJyxcbiAgICA0MDg6ICdSZXF1ZXN0IFRpbWVvdXQnLFxuICAgIDQwOTogJ0NvbmZsaWN0JyxcbiAgICA0MTA6ICdHb25lJyxcbiAgICA0MTE6ICdMZW5ndGggUmVxdWlyZWQnLFxuICAgIDQxMjogJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLFxuICAgIDQxMzogJ1BheWxvYWQgVG9vIExhcmdlJyxcbiAgICA0MTQ6ICdVUkkgVG9vIExvbmcnLFxuICAgIDQxNTogJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLFxuICAgIDQxNjogJ1JhbmdlIE5vdCBTYXRpc2ZpYWJsZScsXG4gICAgNDE3OiAnRXhwZWN0YXRpb24gRmFpbGVkJyxcbiAgICA0MTg6IFwiSSdtIGEgdGVhcG90XCIsXG4gICAgNDIyOiAnVW5wcm9jZXNzYWJsZSBFbnRpdHknLFxuICAgIDQyMzogJ0xvY2tlZCcsXG4gICAgNDI0OiAnRmFpbGVkIERlcGVuZGVuY3knLFxuICAgIDQyNTogJ1RvbyBFYXJseScsXG4gICAgNDI2OiAnVXBncmFkZSBSZXF1aXJlZCcsXG4gICAgNDI4OiAnUHJlY29uZGl0aW9uIFJlcXVpcmVkJyxcbiAgICA0Mjk6ICdUb28gTWFueSBSZXF1ZXN0cycsXG4gICAgNDMxOiAnUmVxdWVzdCBIZWFkZXIgRmllbGRzIFRvbyBMYXJnZScsXG4gICAgNDUxOiAnVW5hdmFpbGFibGUgRm9yIExlZ2FsIFJlYXNvbnMnLFxuICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgNTAxOiAnTm90IEltcGxlbWVudGVkJyxcbiAgICA1MDI6ICdCYWQgR2F0ZXdheScsXG4gICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsXG4gICAgNTA0OiAnR2F0ZXdheSBUaW1lb3V0JyxcbiAgICA1MDU6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsXG4gICAgNTA2OiAnVmFyaWFudCBBbHNvIE5lZ290aWF0ZXMnLFxuICAgIDUwNzogJ0luc3VmZmljaWVudCBTdG9yYWdlJyxcbiAgICA1MDg6ICdMb29wIERldGVjdGVkJyxcbiAgICA1MTA6ICdOb3QgRXh0ZW5kZWQnLFxuICAgIDUxMTogJ05ldHdvcmsgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnXG4gIH1cblxuICByZXR1cm4gdGl0bGVzW3N0YXR1c10gfHwgJ0Vycm9yJ1xufVxuXG4vKipcbiAqIOWwhiBQcm9ibGVtIEpTT04g5qC85byP5YyW5Li65pel5b+X5a2X56ym5LiyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRQcm9ibGVtSnNvbkxvZyhcbiAgcHJvYmxlbTogUHJvYmxlbUpzb24sXG4gIHJlcXVlc3Q6IFJlcXVlc3Rcbik6IHN0cmluZyB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgLy8g5qCH6aKY6KGMXG4gIGNvbnN0IHN0YXR1c1N0ciA9IHByb2JsZW0uc3RhdHVzLnRvU3RyaW5nKClcbiAgY29uc3QgZW1vamkgPSBnZXRTdGF0dXNFbW9qaShwcm9ibGVtLnN0YXR1cylcbiAgcGFydHMucHVzaChgXFxuJHtlbW9qaX0gW0hUVFAgJHtzdGF0dXNTdHJ9XSAke3JlcXVlc3QubWV0aG9kfSAke3VybC5wYXRobmFtZX1gKVxuXG4gIC8vIFByb2JsZW0gSlNPTiDlhoXlrrlcbiAgcGFydHMucHVzaChgICBUeXBlOiAgICAke3Byb2JsZW0udHlwZX1gKVxuICBwYXJ0cy5wdXNoKGAgIFRpdGxlOiAgICR7cHJvYmxlbS50aXRsZX1gKVxuICBpZiAocHJvYmxlbS5kZXRhaWwpIHtcbiAgICBwYXJ0cy5wdXNoKGAgIERldGFpbDogICR7cHJvYmxlbS5kZXRhaWx9YClcbiAgfVxuICBpZiAocHJvYmxlbS5pbnN0YW5jZSkge1xuICAgIHBhcnRzLnB1c2goYCAgSW5zdGFuY2U6ICR7cHJvYmxlbS5pbnN0YW5jZX1gKVxuICB9XG5cbiAgLy8g5omp5bGV5a2X5q61XG4gIGNvbnN0IGV4dGVuc2lvbnMgPSBPYmplY3QuZW50cmllcyhwcm9ibGVtKS5maWx0ZXIoXG4gICAgKFtrZXldKSA9PiAhWyd0eXBlJywgJ3RpdGxlJywgJ3N0YXR1cycsICdkZXRhaWwnLCAnaW5zdGFuY2UnXS5pbmNsdWRlcyhrZXkpXG4gIClcbiAgaWYgKGV4dGVuc2lvbnMubGVuZ3RoID4gMCkge1xuICAgIHBhcnRzLnB1c2goJyAgRXh0ZW5zaW9uczonKVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIHBhcnRzLnB1c2goYCAgICAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJ1xcbicpXG59XG5cbmZ1bmN0aW9uIGdldFN0YXR1c0Vtb2ppKHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHN0YXR1cyA+PSA1MDApIHJldHVybiAn8J+UtCdcbiAgaWYgKHN0YXR1cyA+PSA0MDApIHJldHVybiAn8J+foSdcbiAgaWYgKHN0YXR1cyA+PSAzMDApIHJldHVybiAn8J+UtSdcbiAgaWYgKHN0YXR1cyA+PSAyMDApIHJldHVybiAn8J+foidcbiAgcmV0dXJuICfimqonXG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSxpQkFBUyxnQkNBVCxvQ0FFQSxJQUFNLEdBQWEsQ0FBQyxFQUFjLElBQTBCLENBQzFE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QUFPLENBQ3JCLEtBQU0sYUFDTixPQUFRLENBQ04sWUFDRSw0RUFDRixLQUFNLENBQUMsVUFBVyxNQUFNLENBQzFCLENBQ0YsQ0FBQyxFQUlJLE1BQU0sU0FBVSxDQUFNLEVBQ3RCLE1BQU0sT0FBUSxFQUFPLElBQUksRUFDekIsTUFBTSxhQUFjLE9BQU8sQ0FBQyxDQUFDLEVBQzdCLFFBQVEsRUFBRyxZQUFhLENBQ3ZCLEdBQUksRUFDRixFQUFZLEVBQVEsQ0FBTyxFQUU5QixFQUNBLFVBQVUsRUFBRyxXQUFZLENBQ3hCLEVBQU0sV0FBYSxRQUFRLE9BQU8sT0FBTyxFQUMxQyxFQUNBLGNBQWMsRUFBRyxVQUFTLE1BQUssV0FBWSxDQUMxQyxHQUFJLEVBQWEsSUFBSSxDQUFPLEVBQzFCLE9BR0YsSUFBTSxFQUFTLE9BQU8sRUFBSSxTQUFXLFNBQVcsRUFBSSxPQUFTLElBQ3pELEVBQXNDLE9BQzFDLEdBQUksR0FBVSxJQUNaLEVBQVEsUUFDSCxRQUFJLEdBQVUsSUFDbkIsRUFBUSxVQUdWLEVBQU8sSUFBSSxFQUFPLEVBQVMsQ0FBRSxRQUFPLEVBQUcsQ0FBSyxFQUM3QyxFQUNBLFFBQVEsRUFBRyxVQUFTLFFBQU8sT0FBTSxPQUFNLFFBQU8sU0FBVSxDQU12RCxJQUFNLEVBQVMsRUFBUSxVQUNuQixFQUFRLFVBQVUsRUFBTyxDQUFFLFVBQVMsT0FBTSxNQUFLLENBQUMsRUFDaEQsRUFNRSxFQUFVLEVBQ2QsRUFDQSxFQUNBLEVBQ0EsRUFBUSxRQUFRLE9BQU8sYUFBYSxXQUN0QyxFQWdCQSxPQVZBLEVBQU8sZ0JBQWdCLEVBQVMsRUFBUyxFQUFPLENBQU8sRUFNdkQsRUFBSSxPQUFTLEVBQVEsT0FDckIsRUFBSSxRQUFRLGdCQUFrQiwyQkFHdkIsRUFBUSxPQUFPLEVBQ3ZCLEVBRUEsR0FBRyxRQUFRLEdBb0NIIiwKICAiZGVidWdJZCI6ICI0ODkyMTZBRUFBMERCRjUwNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
7
+ //# debugId=2CEFE7DE093D26AD64756E2164756E21
8
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjXFxpbmRleC50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGJhbm5lci50cyIsICJzcmNcXGV4dGVuc2lvbnNcXGluZGV4LnRzIiwgInNyY1xcbG9nZ2VyXFxpbmRleC50cyIsICJzcmNcXG91dHB1dFxcaW5kZXgudHMiLCAic3JjXFxvdXRwdXRcXGZpbGUudHMiLCAic3JjXFxvdXRwdXRcXGZzLnRzIiwgInNyY1xcb3V0cHV0XFxyb3RhdGlvbi1tYW5hZ2VyLnRzIiwgInNyY1xcdXRpbHNcXHJvdGF0aW9uLnRzIiwgInNyY1xcbG9nZ2VyXFxjcmVhdGUtbG9nZ2VyLnRzIiwgInNyY1xcaGVscGVyc1xcc3RhdHVzLnRzIiwgInNyY1xcbG9nZ2VyXFxoYW5kbGUtaHR0cC1lcnJvci50cyIsICJzcmNcXEVycm9yXFxlcnJvcnMudHMiLCAic3JjXFx1dGlsc1xcaGFuZGxlLWVycm9yLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IEVseXNpYSwgdHlwZSBTaW5nbGV0b25CYXNlIH0gZnJvbSAnZWx5c2lhJ1xuaW1wb3J0IHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL2V4dGVuc2lvbnMnXG5pbXBvcnQgdHlwZSB7IExvZ2l4bHlzaWFTdG9yZSwgT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcydcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJ1xuaW1wb3J0IHsgbm9ybWFsaXplVG9Qcm9ibGVtIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbmV4cG9ydCB0eXBlIExvZ2l4bHlzaWEgPSBFbHlzaWE8XG4gICdMb2dpeGx5c2lhJyxcbiAgU2luZ2xldG9uQmFzZSAmIHsgc3RvcmU6IExvZ2l4bHlzaWFTdG9yZSB9XG4+XG5cbmV4cG9ydCBjb25zdCBsb2dpeGx5c2lhID0gKG9wdGlvbnM6IE9wdGlvbnMgPSB7fSk6IExvZ2l4bHlzaWEgPT4ge1xuICBjb25zdCBkaWRDdXN0b21Mb2cgPSBuZXcgV2Vha1NldDxSZXF1ZXN0PigpXG4gIGNvbnN0IGJhc2VMb2dnZXIgPSBjcmVhdGVMb2dnZXIob3B0aW9ucylcbiAgY29uc3QgbG9nZ2VyID0ge1xuICAgIC4uLmJhc2VMb2dnZXIsXG4gICAgZGVidWc6IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuZGVidWcocmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIGluZm86IChcbiAgICAgIHJlcXVlc3Q6IFJlcXVlc3QsXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGRpZEN1c3RvbUxvZy5hZGQocmVxdWVzdClcbiAgICAgIGJhc2VMb2dnZXIuaW5mbyhyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgd2FybjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci53YXJuKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKFxuICAgICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvbnRleHQ/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4ge1xuICAgICAgZGlkQ3VzdG9tTG9nLmFkZChyZXF1ZXN0KVxuICAgICAgYmFzZUxvZ2dlci5lcnJvcihyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFwcCA9IG5ldyBFbHlzaWEoe1xuICAgIG5hbWU6ICdMb2dpeGx5c2lhJyxcbiAgICBkZXRhaWw6IHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnTG9naXhseXNpYSBpcyBhIHBsdWdpbiBmb3IgRWx5c2lhIHRoYXQgcHJvdmlkZXMgYSBsb2dnZXIgYW5kIHBpbm8gbG9nZ2VyLicsXG4gICAgICB0YWdzOiBbJ2xvZ2dpbmcnLCAncGlubyddXG4gICAgfVxuICB9KVxuXG4gIHJldHVybiAoXG4gICAgYXBwXG4gICAgICAuc3RhdGUoJ2xvZ2dlcicsIGxvZ2dlcilcbiAgICAgIC5zdGF0ZSgncGlubycsIGxvZ2dlci5waW5vKVxuICAgICAgLnN0YXRlKCdiZWZvcmVUaW1lJywgQmlnSW50KDApKVxuICAgICAgLm9uU3RhcnQoKHsgc2VydmVyIH0pID0+IHtcbiAgICAgICAgaWYgKHNlcnZlcikge1xuICAgICAgICAgIHN0YXJ0U2VydmVyKHNlcnZlciwgb3B0aW9ucylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5vblJlcXVlc3QoKHsgc3RvcmUgfSkgPT4ge1xuICAgICAgICBzdG9yZS5iZWZvcmVUaW1lID0gcHJvY2Vzcy5ocnRpbWUuYmlnaW50KClcbiAgICAgIH0pXG4gICAgICAub25BZnRlckhhbmRsZSgoeyByZXF1ZXN0LCBzZXQsIHN0b3JlIH0pID0+IHtcbiAgICAgICAgaWYgKGRpZEN1c3RvbUxvZy5oYXMocmVxdWVzdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHR5cGVvZiBzZXQuc3RhdHVzID09PSAnbnVtYmVyJyA/IHNldC5zdGF0dXMgOiAyMDBcbiAgICAgICAgbGV0IGxldmVsOiAnSU5GTycgfCAnV0FSTklORycgfCAnRVJST1InID0gJ0lORk8nXG4gICAgICAgIGlmIChzdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgbGV2ZWwgPSAnRVJST1InXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICAgIGxldmVsID0gJ1dBUk5JTkcnXG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIubG9nKGxldmVsLCByZXF1ZXN0LCB7IHN0YXR1cyB9LCBzdG9yZSlcbiAgICAgIH0pXG4gICAgICAub25FcnJvcigoeyByZXF1ZXN0LCBlcnJvciwgY29kZSwgcGF0aCwgc3RvcmUsIHNldCB9KSA9PiB7XG4gICAgICAgIC8vIGxvZ2dlci5oYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAxOiBUcmFuc2Zvcm0gKOi9rOaNoilcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMudHJhbnNmb3JtXG4gICAgICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybShlcnJvciwgeyByZXF1ZXN0LCBjb2RlLCBwYXRoIH0pXG4gICAgICAgICAgOiBlcnJvclxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAyOiBOb3JtYWxpemF0aW9uICjop4TojIPljJYpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDnu5/kuIDovazkuLogUHJvYmxlbUVycm9yIOWunuS+i1xuICAgICAgICBjb25zdCBwcm9ibGVtID0gbm9ybWFsaXplVG9Qcm9ibGVtKFxuICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICBjb2RlLFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgb3B0aW9ucy5jb25maWc/LmVycm9yPy5wcm9ibGVtSnNvbj8udHlwZUJhc2VVcmxcbiAgICAgICAgKVxuXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyBQaGFzZSAzOiBMb2dnaW5nICjml6Xlv5cpXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAvLyDosIPnlKjkuIrpnaLmlLnpgKDlkI7nmoTlh73mlbDvvIzlroPnjrDlnKjlj6rotJ/otKPorrDlvZXvvIzkuI3otJ/otKPpgLvovpHliKTmlq1cbiAgICAgICAgbG9nZ2VyLmhhbmRsZUh0dHBFcnJvcihyZXF1ZXN0LCBwcm9ibGVtLCBzdG9yZSwgb3B0aW9ucylcblxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgLy8gUGhhc2UgNDogUmVzcG9uc2UgKOWTjeW6lClcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIC8vIOe7n+S4gOiuvue9riBIZWFkZXIg5ZKMIFN0YXR1c1xuICAgICAgICBzZXQuc3RhdHVzID0gcHJvYmxlbS5zdGF0dXNcbiAgICAgICAgc2V0LmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL3Byb2JsZW0ranNvbidcblxuICAgICAgICAvLyDov5Tlm57nrKblkIggUkZDIOagh+WHhueahCBKU09OXG4gICAgICAgIHJldHVybiBwcm9ibGVtLnRvSlNPTigpXG4gICAgICB9KVxuICAgICAgLy8gRW5zdXJlIHBsdWdpbiBsaWZlY3ljbGUgaG9va3MgKG9uUmVxdWVzdC9vbkFmdGVySGFuZGxlL29uRXJyb3IpIGFwcGx5IHRvIHRoZSBwYXJlbnQgYXBwLlxuICAgICAgLmFzKCdzY29wZWQnKSBhcyB1bmtub3duIGFzIExvZ2l4bHlzaWFcbiAgKVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVycm9yIEV4cG9ydHNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgKiBmcm9tIFwiLi9FcnJvci9lcnJvcnNcIjtcbmV4cG9ydCB0eXBlIHsgUHJvYmxlbURvY3VtZW50IH0gZnJvbSAnLi9FcnJvci9lcnJvcnMnXG5leHBvcnQgdHlwZSB7XG4gIENvZGUsXG4gIEVycm9yQ29udGV4dCxcbiAgSHR0cFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL0Vycm9yL3R5cGUnXG5leHBvcnQgeyBub3JtYWxpemVUb1Byb2JsZW0gfSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB0eXBlIHtcbiAgUHJvYmxlbUpzb24sXG4gIFByb2JsZW1Kc29uT3B0aW9uc1xufSBmcm9tICcuL3V0aWxzL2hhbmRsZS1lcnJvcidcbmV4cG9ydCB7IGZvcm1hdFByb2JsZW1Kc29uTG9nLCB0b1Byb2JsZW1Kc29uIH0gZnJvbSAnLi91dGlscy9oYW5kbGUtZXJyb3InXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29yZSBFeHBvcnRzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB0eXBlIHtcbiAgTG9nZ2VyLFxuICBMb2dpeGx5c2lhQ29udGV4dCxcbiAgTG9naXhseXNpYVN0b3JlLFxuICBMb2dMZXZlbCxcbiAgT3B0aW9ucyxcbiAgUGlubyxcbiAgU3RvcmVEYXRhLFxuICBUcmFuc3BvcnRcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJ1xuXG5leHBvcnQgZGVmYXVsdCBsb2dpeGx5c2lhXG4iLAogICAgImltcG9ydCBlbHlzaWFQa2cgZnJvbSAnZWx5c2lhL3BhY2thZ2UuanNvbidcblxuY29uc3QgY2VudGVyVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBpZiAodGV4dC5sZW5ndGggPj0gd2lkdGgpIHtcbiAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB3aWR0aClcbiAgfVxuXG4gIGNvbnN0IGxlZnQgPSBNYXRoLmZsb29yKCh3aWR0aCAtIHRleHQubGVuZ3RoKSAvIDIpXG4gIGNvbnN0IHJpZ2h0ID0gd2lkdGggLSB0ZXh0Lmxlbmd0aCAtIGxlZnRcbiAgcmV0dXJuIGAkeycgJy5yZXBlYXQobGVmdCl9JHt0ZXh0fSR7JyAnLnJlcGVhdChyaWdodCl9YFxufVxuXG5leHBvcnQgY29uc3QgcmVuZGVyQmFubmVyID0gKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHZlcnNpb25MaW5lID0gYEVseXNpYSB2JHtlbHlzaWFQa2cudmVyc2lvbn1gXG4gIGNvbnN0IGNvbnRlbnRXaWR0aCA9IE1hdGgubWF4KG1lc3NhZ2UubGVuZ3RoLCB2ZXJzaW9uTGluZS5sZW5ndGgpXG4gIGNvbnN0IGlubmVyV2lkdGggPSBjb250ZW50V2lkdGggKyA0IC8vIDIgc3BhY2VzIHBhZGRpbmcgb24gYm90aCBzaWRlc1xuXG4gIGNvbnN0IHRvcCA9IGDilIwkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJBgXG4gIGNvbnN0IGJvdCA9IGDilJQkeyfilIAnLnJlcGVhdChpbm5lcldpZHRoKX3ilJhgXG4gIGNvbnN0IGVtcHR5ID0gYOKUgiR7JyAnLnJlcGVhdChpbm5lcldpZHRoKX3ilIJgXG5cbiAgY29uc3QgdmVyc2lvblJvdyA9IGDilIIke2NlbnRlclRleHQodmVyc2lvbkxpbmUsIGlubmVyV2lkdGgpfeKUgmBcbiAgY29uc3QgbWVzc2FnZVJvdyA9IGDilIIgICR7bWVzc2FnZX0keycgJy5yZXBlYXQoTWF0aC5tYXgoMCwgaW5uZXJXaWR0aCAtIG1lc3NhZ2UubGVuZ3RoIC0gNCkpfSAg4pSCYFxuXG4gIHJldHVybiBbdG9wLCBlbXB0eSwgdmVyc2lvblJvdywgZW1wdHksIG1lc3NhZ2VSb3csIGVtcHR5LCBib3RdLmpvaW4oJ1xcbicpXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyByZW5kZXJCYW5uZXIgfSBmcm9tICcuL2Jhbm5lcidcblxuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gKFxuICBzZXJ2ZXI6IHsgcG9ydD86IG51bWJlcjsgaG9zdG5hbWU/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nIHwgbnVsbCB9LFxuICBvcHRpb25zOiBPcHRpb25zXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2hvd1N0YXJ0dXBNZXNzYWdlID0gb3B0aW9ucy5jb25maWc/LnNob3dTdGFydHVwTWVzc2FnZSA/PyB0cnVlXG4gIGlmICghc2hvd1N0YXJ0dXBNZXNzYWdlKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHBvcnQsIGhvc3RuYW1lLCBwcm90b2NvbCB9ID0gc2VydmVyXG4gIGlmIChwb3J0ID09PSB1bmRlZmluZWQgfHwgIWhvc3RuYW1lIHx8ICFwcm90b2NvbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgdXJsID0gYCR7cHJvdG9jb2x9Oi8vJHtob3N0bmFtZX06JHtwb3J0fWBcbiAgY29uc3QgbWVzc2FnZSA9IGDwn6aKIEVseXNpYSBpcyBydW5uaW5nIGF0ICR7dXJsfWBcblxuICBjb25zdCBmb3JtYXQgPSBvcHRpb25zLmNvbmZpZz8uc3RhcnR1cE1lc3NhZ2VGb3JtYXQgPz8gJ2Jhbm5lcidcbiAgaWYgKGZvcm1hdCA9PT0gJ3NpbXBsZScpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc29sZS5sb2cocmVuZGVyQmFubmVyKG1lc3NhZ2UpKVxufVxuIiwKICAgICJpbXBvcnQgcGlubyBmcm9tICdwaW5vJ1xuaW1wb3J0IHR5cGUge1xuICBMb2dGaWx0ZXIsXG4gIExvZ2dlcixcbiAgTG9nTGV2ZWwsXG4gIE9wdGlvbnMsXG4gIFBpbm8sXG4gIFN0b3JlRGF0YVxufSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5pbXBvcnQgeyBmb3JtYXRMaW5lIH0gZnJvbSAnLi9jcmVhdGUtbG9nZ2VyJ1xuaW1wb3J0IHsgaGFuZGxlSHR0cEVycm9yIH0gZnJvbSAnLi9oYW5kbGUtaHR0cC1lcnJvcidcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxvZ2dlciA9IChvcHRpb25zOiBPcHRpb25zID0ge30pOiBMb2dnZXIgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuXG4gIGNvbnN0IHBpbm9Db25maWcgPSBjb25maWc/LnBpbm9cbiAgY29uc3QgeyBwcmV0dHlQcmludCwgLi4ucGlub09wdGlvbnMgfSA9IHBpbm9Db25maWcgPz8ge31cblxuICBjb25zdCBzaG91bGRQcmV0dHlQcmludCA9XG4gICAgcHJldHR5UHJpbnQgPT09IHRydWUgJiYgcGlub09wdGlvbnMudHJhbnNwb3J0ID09PSB1bmRlZmluZWRcblxuICBjb25zdCB0cmFuc3BvcnQgPSBzaG91bGRQcmV0dHlQcmludFxuICAgID8gcGluby50cmFuc3BvcnQoe1xuICAgICAgICB0YXJnZXQ6ICdwaW5vLXByZXR0eScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjb2xvcml6ZTogcHJvY2Vzcy5zdGRvdXQ/LmlzVFRZID09PSB0cnVlLFxuICAgICAgICAgIHRyYW5zbGF0ZVRpbWU6IGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lLFxuICAgICAgICAgIG1lc3NhZ2VLZXk6IHBpbm9PcHRpb25zLm1lc3NhZ2VLZXksXG4gICAgICAgICAgZXJyb3JLZXk6IHBpbm9PcHRpb25zLmVycm9yS2V5XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwaW5vT3B0aW9ucy50cmFuc3BvcnRcblxuICBjb25zdCBwaW5vTG9nZ2VyOiBQaW5vID0gcGlubyh7XG4gICAgLi4ucGlub09wdGlvbnMsXG4gICAgbGV2ZWw6IHBpbm9PcHRpb25zLmxldmVsID8/ICdpbmZvJyxcbiAgICBtZXNzYWdlS2V5OiBwaW5vT3B0aW9ucy5tZXNzYWdlS2V5LFxuICAgIGVycm9yS2V5OiBwaW5vT3B0aW9ucy5lcnJvcktleSxcbiAgICB0cmFuc3BvcnRcbiAgfSlcblxuICBjb25zdCBzaG91bGRMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBsb2dGaWx0ZXI/OiBMb2dGaWx0ZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWxvZ0ZpbHRlcj8ubGV2ZWwgfHwgbG9nRmlsdGVyLmxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGxvZ0ZpbHRlci5sZXZlbC5pbmNsdWRlcyhsZXZlbClcbiAgfVxuXG4gIGNvbnN0IGxvZyA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdG9yZTogU3RvcmVEYXRhXG4gICk6IHZvaWQgPT4ge1xuICAgIC8vIENoZWNrIGlmIHRoaXMgbG9nIGxldmVsIHNob3VsZCBiZSBmaWx0ZXJlZFxuICAgIGlmICghc2hvdWxkTG9nKGxldmVsLCBjb25maWc/LmxvZ0ZpbHRlcikpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxvZ1RvVHJhbnNwb3J0cyh7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KVxuXG4gICAgY29uc3QgdXNlVHJhbnNwb3J0c09ubHkgPSBjb25maWc/LnVzZVRyYW5zcG9ydHNPbmx5ID09PSB0cnVlXG4gICAgY29uc3QgZGlzYWJsZUludGVybmFsTG9nZ2VyID0gY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIgPT09IHRydWVcbiAgICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuXG4gICAgaWYgKCEodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgICBpZiAoZmlsZVBhdGgpIHtcbiAgICAgICAgbG9nVG9GaWxlKHsgZmlsZVBhdGgsIGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9KS5jYXRjaChcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHVzZVRyYW5zcG9ydHNPbmx5IHx8IGRpc2FibGVJbnRlcm5hbExvZ2dlcikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdExpbmUoeyBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSlcblxuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ0RFQlVHJzoge1xuICAgICAgICBjb25zb2xlLmRlYnVnKG1lc3NhZ2UpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdJTkZPJzoge1xuICAgICAgICBjb25zb2xlLmluZm8obWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1dBUk5JTkcnOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2dXaXRoQ29udGV4dCA9IChcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgcmVxdWVzdDogUmVxdWVzdCxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY29udGV4dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHN0b3JlOiBTdG9yZURhdGEgPSB7IGJlZm9yZVRpbWU6IHByb2Nlc3MuaHJ0aW1lLmJpZ2ludCgpIH1cbiAgICBsb2cobGV2ZWwsIHJlcXVlc3QsIHsgbWVzc2FnZSwgY29udGV4dCB9LCBzdG9yZSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGlubzogcGlub0xvZ2dlcixcbiAgICBsb2csXG4gICAgaGFuZGxlSHR0cEVycm9yOiAocmVxdWVzdCwgZXJyb3IsIHN0b3JlKSA9PiB7XG4gICAgICBoYW5kbGVIdHRwRXJyb3IocmVxdWVzdCwgZXJyb3IsIHN0b3JlLCBvcHRpb25zKVxuICAgIH0sXG4gICAgZGVidWc6IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnREVCVUcnLCByZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KVxuICAgIH0sXG4gICAgaW5mbzogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdJTkZPJywgcmVxdWVzdCwgbWVzc2FnZSwgY29udGV4dClcbiAgICB9LFxuICAgIHdhcm46IChyZXF1ZXN0LCBtZXNzYWdlLCBjb250ZXh0KSA9PiB7XG4gICAgICBsb2dXaXRoQ29udGV4dCgnV0FSTklORycsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfSxcbiAgICBlcnJvcjogKHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgIGxvZ1dpdGhDb250ZXh0KCdFUlJPUicsIHJlcXVlc3QsIG1lc3NhZ2UsIGNvbnRleHQpXG4gICAgfVxuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgTG9nTGV2ZWwsIE9wdGlvbnMsIFJlcXVlc3QsIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5cbmludGVyZmFjZSBMb2dUb1RyYW5zcG9ydHNJbnB1dCB7XG4gIGxldmVsOiBMb2dMZXZlbFxuICByZXF1ZXN0OiBSZXF1ZXN0XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9UcmFuc3BvcnRzID0gKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvVHJhbnNwb3J0c0lucHV0XVxuICAgIHwgW0xvZ0xldmVsLCBSZXF1ZXN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgU3RvcmVEYXRhLCBPcHRpb25zXVxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb1RyYW5zcG9ydHNJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/IHtcbiAgICAgICAgICBsZXZlbDogYXJnc1swXSxcbiAgICAgICAgICByZXF1ZXN0OiBhcmdzWzFdLFxuICAgICAgICAgIGRhdGE6IGFyZ3NbMl0sXG4gICAgICAgICAgc3RvcmU6IGFyZ3NbM10sXG4gICAgICAgICAgb3B0aW9uczogYXJnc1s0XVxuICAgICAgICB9XG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGxldmVsLCByZXF1ZXN0LCBkYXRhLCBzdG9yZSwgb3B0aW9ucyB9ID0gaW5wdXRcbiAgY29uc3QgdHJhbnNwb3J0cyA9IG9wdGlvbnMuY29uZmlnPy50cmFuc3BvcnRzID8/IFtdXG4gIGlmICh0cmFuc3BvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gZGF0YS5tZXNzYWdlIDogJydcbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgcmVxdWVzdDoge1xuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgIHVybDogcmVxdWVzdC51cmxcbiAgICB9LFxuICAgIC4uLmRhdGEsXG4gICAgYmVmb3JlVGltZTogc3RvcmUuYmVmb3JlVGltZVxuICB9XG5cbiAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdHJhbnNwb3J0cykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0cmFuc3BvcnQubG9nKGxldmVsLCBtZXNzYWdlLCBtZXRhKVxuICAgICAgaWYgKFxuICAgICAgICByZXN1bHQgJiZcbiAgICAgICAgdHlwZW9mIChyZXN1bHQgYXMgeyBjYXRjaD86IHVua25vd24gfSkuY2F0Y2ggPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICA7KHJlc3VsdCBhcyBQcm9taXNlPHZvaWQ+KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gSWdub3JlIGVycm9yc1xuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVHJhbnNwb3J0IGZhaWx1cmVzIG11c3QgbmV2ZXIgY3Jhc2ggYXBwbGljYXRpb24gbG9nZ2luZy5cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgYXBwZW5kRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuaW1wb3J0IHR5cGUgeyBMb2dMZXZlbCwgT3B0aW9ucywgUmVxdWVzdEluZm8sIFN0b3JlRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQgeyBlbnN1cmVEaXIgfSBmcm9tICcuL2ZzJ1xuaW1wb3J0IHsgcGVyZm9ybVJvdGF0aW9uLCBzaG91bGRSb3RhdGUgfSBmcm9tICcuL3JvdGF0aW9uLW1hbmFnZXInXG5cbmludGVyZmFjZSBMb2dUb0ZpbGVJbnB1dCB7XG4gIGZpbGVQYXRoOiBzdHJpbmdcbiAgbGV2ZWw6IExvZ0xldmVsXG4gIHJlcXVlc3Q6IFJlcXVlc3RJbmZvXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHN0b3JlOiBTdG9yZURhdGFcbiAgb3B0aW9uczogT3B0aW9uc1xufVxuXG5leHBvcnQgY29uc3QgbG9nVG9GaWxlID0gYXN5bmMgKFxuICAuLi5hcmdzOlxuICAgIHwgW0xvZ1RvRmlsZUlucHV0XVxuICAgIHwgW1xuICAgICAgICBzdHJpbmcsXG4gICAgICAgIExvZ0xldmVsLFxuICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgIFN0b3JlRGF0YSxcbiAgICAgICAgT3B0aW9uc1xuICAgICAgXVxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGlucHV0OiBMb2dUb0ZpbGVJbnB1dCA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnXG4gICAgICA/ICgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgW1xuICAgICAgICAgICAgZmlsZVBhdGhBcmcsXG4gICAgICAgICAgICBsZXZlbEFyZyxcbiAgICAgICAgICAgIHJlcXVlc3RBcmcsXG4gICAgICAgICAgICBkYXRhQXJnLFxuICAgICAgICAgICAgc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zQXJnXG4gICAgICAgICAgXSA9IGFyZ3MgYXMgW1xuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgTG9nTGV2ZWwsXG4gICAgICAgICAgICBSZXF1ZXN0SW5mbyxcbiAgICAgICAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgU3RvcmVEYXRhLFxuICAgICAgICAgICAgT3B0aW9uc1xuICAgICAgICAgIF1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZmlsZVBhdGg6IGZpbGVQYXRoQXJnLFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsQXJnLFxuICAgICAgICAgICAgcmVxdWVzdDogcmVxdWVzdEFyZyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFBcmcsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVBcmcsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zQXJnXG4gICAgICAgICAgfVxuICAgICAgICB9KSgpXG4gICAgICA6IGFyZ3NbMF1cblxuICBjb25zdCB7IGZpbGVQYXRoLCBsZXZlbCwgcmVxdWVzdCwgZGF0YSwgc3RvcmUsIG9wdGlvbnMgfSA9IGlucHV0XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IHVzZVRyYW5zcG9ydHNPbmx5ID0gY29uZmlnPy51c2VUcmFuc3BvcnRzT25seSA9PT0gdHJ1ZVxuICBjb25zdCBkaXNhYmxlRmlsZUxvZ2dpbmcgPSBjb25maWc/LmRpc2FibGVGaWxlTG9nZ2luZyA9PT0gdHJ1ZVxuICBpZiAodXNlVHJhbnNwb3J0c09ubHkgfHwgZGlzYWJsZUZpbGVMb2dnaW5nKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ3N0cmluZycgPyBkYXRhLm1lc3NhZ2UgOiAnJ1xuICBjb25zdCBkdXJhdGlvbk1zID1cbiAgICBzdG9yZS5iZWZvcmVUaW1lID09PSBCaWdJbnQoMClcbiAgICAgID8gMFxuICAgICAgOiBOdW1iZXIocHJvY2Vzcy5ocnRpbWUuYmlnaW50KCkgLSBzdG9yZS5iZWZvcmVUaW1lKSAvIDFfMDAwXzAwMFxuXG4gIGNvbnN0IGxpbmUgPSBgJHtsZXZlbH0gJHtkdXJhdGlvbk1zLnRvRml4ZWQoMil9bXMgJHtyZXF1ZXN0Lm1ldGhvZH0gJHtuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZX0gJHttZXNzYWdlfVxcbmBcblxuICBhd2FpdCBlbnN1cmVEaXIoZGlybmFtZShmaWxlUGF0aCkpXG4gIGF3YWl0IGFwcGVuZEZpbGUoZmlsZVBhdGgsIGxpbmUsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSlcblxuICBjb25zdCByb3RhdGlvbiA9IGNvbmZpZz8ubG9nUm90YXRpb25cbiAgaWYgKCFyb3RhdGlvbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkID0gYXdhaXQgc2hvdWxkUm90YXRlKGZpbGVQYXRoLCByb3RhdGlvbilcbiAgaWYgKHNob3VsZCkge1xuICAgIGF3YWl0IHBlcmZvcm1Sb3RhdGlvbihmaWxlUGF0aCwgcm90YXRpb24pXG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdub2RlOmZzJ1xuXG5leHBvcnQgY29uc3QgZW5zdXJlRGlyID0gYXN5bmMgKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KVxufVxuIiwKICAgICJpbXBvcnQgeyBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBnemlwIH0gZnJvbSAnbm9kZTp6bGliJ1xuaW1wb3J0IHR5cGUgeyBMb2dSb3RhdGlvbkNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMnXG5pbXBvcnQge1xuICBnZXRSb3RhdGVkRmlsZXMsXG4gIHBhcnNlUmV0ZW50aW9uLFxuICBwYXJzZVNpemUsXG4gIHNob3VsZFJvdGF0ZUJ5U2l6ZVxufSBmcm9tICcuLi91dGlscy9yb3RhdGlvbidcblxuY29uc3QgZ3ppcEFzeW5jID0gcHJvbWlzaWZ5KGd6aXApXG5cbmNvbnN0IHBhZDIgPSAodmFsdWU6IG51bWJlcik6IHN0cmluZyA9PiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KDIsICcwJylcblxuZXhwb3J0IGNvbnN0IGdldFJvdGF0ZWRGaWxlTmFtZSA9IChmaWxlUGF0aDogc3RyaW5nLCBkYXRlOiBEYXRlKTogc3RyaW5nID0+IHtcbiAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgcmV0dXJuIGAke2ZpbGVQYXRofS4ke3l5eXl9LSR7bW19LSR7ZGR9LSR7SEh9LSR7TU19LSR7c3N9YFxufVxuXG5leHBvcnQgY29uc3Qgcm90YXRlRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICBpZiAoc3RhdC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgY29uc3Qgcm90YXRlZCA9IGdldFJvdGF0ZWRGaWxlTmFtZShmaWxlUGF0aCwgbmV3IERhdGUoKSlcbiAgYXdhaXQgZnMucmVuYW1lKGZpbGVQYXRoLCByb3RhdGVkKVxuICByZXR1cm4gcm90YXRlZFxufVxuXG5leHBvcnQgY29uc3QgY29tcHJlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKVxuICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgZ3ppcEFzeW5jKGNvbnRlbnQpXG4gIGF3YWl0IGZzLndyaXRlRmlsZShgJHtmaWxlUGF0aH0uZ3pgLCBjb21wcmVzc2VkKVxuICBhd2FpdCBmcy5ybShmaWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2hvdWxkUm90YXRlID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgaWYgKGNvbmZpZy5tYXhTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICBjb25zdCBtYXhTaXplID0gcGFyc2VTaXplKGNvbmZpZy5tYXhTaXplKVxuICByZXR1cm4gYXdhaXQgc2hvdWxkUm90YXRlQnlTaXplKGZpbGVQYXRoLCBtYXhTaXplKVxufVxuXG5jb25zdCBjbGVhbnVwQnlDb3VudCA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4RmlsZXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA8PSBtYXhGaWxlcykge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc3RhdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICByb3RhdGVkLm1hcChhc3luYyBwID0+ICh7IHBhdGg6IHAsIHN0YXQ6IGF3YWl0IGZzLnN0YXQocCkgfSkpXG4gIClcblxuICBzdGF0cy5zb3J0KChhLCBiKSA9PiBiLnN0YXQubXRpbWVNcyAtIGEuc3RhdC5tdGltZU1zKVxuICBjb25zdCB0b0RlbGV0ZSA9IHN0YXRzLnNsaWNlKG1heEZpbGVzKVxuICBhd2FpdCBQcm9taXNlLmFsbCh0b0RlbGV0ZS5tYXAoKHsgcGF0aCB9KSA9PiBmcy5ybShwYXRoLCB7IGZvcmNlOiB0cnVlIH0pKSlcbn1cblxuY29uc3QgY2xlYW51cEJ5VGltZSA9IGFzeW5jIChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgbWF4QWdlTXM6IG51bWJlclxuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IHJvdGF0ZWQgPSBhd2FpdCBnZXRSb3RhdGVkRmlsZXMoZmlsZVBhdGgpXG4gIGlmIChyb3RhdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBzdGF0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHJvdGF0ZWQubWFwKGFzeW5jIHAgPT4gKHsgcGF0aDogcCwgc3RhdDogYXdhaXQgZnMuc3RhdChwKSB9KSlcbiAgKVxuXG4gIGNvbnN0IHRvRGVsZXRlID0gc3RhdHMuZmlsdGVyKCh7IHN0YXQgfSkgPT4gbm93IC0gc3RhdC5tdGltZU1zID4gbWF4QWdlTXMpXG4gIGF3YWl0IFByb21pc2UuYWxsKHRvRGVsZXRlLm1hcCgoeyBwYXRoIH0pID0+IGZzLnJtKHBhdGgsIHsgZm9yY2U6IHRydWUgfSkpKVxufVxuXG5leHBvcnQgY29uc3QgcGVyZm9ybVJvdGF0aW9uID0gYXN5bmMgKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBjb25maWc6IExvZ1JvdGF0aW9uQ29uZmlnXG4pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgcm90YXRlZCA9IGF3YWl0IHJvdGF0ZUZpbGUoZmlsZVBhdGgpXG4gIGlmICghcm90YXRlZCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3Qgc2hvdWxkQ29tcHJlc3MgPSBjb25maWcuY29tcHJlc3MgPT09IHRydWVcbiAgaWYgKHNob3VsZENvbXByZXNzKSB7XG4gICAgY29uc3QgYWxnbyA9IGNvbmZpZy5jb21wcmVzc2lvbiA/PyAnZ3ppcCdcbiAgICBpZiAoYWxnbyA9PT0gJ2d6aXAnKSB7XG4gICAgICBhd2FpdCBjb21wcmVzc0ZpbGUocm90YXRlZClcbiAgICB9XG4gIH1cblxuICBpZiAoY29uZmlnLm1heEZpbGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXRlbnRpb24gPSBwYXJzZVJldGVudGlvbihjb25maWcubWF4RmlsZXMpXG4gICAgaWYgKHJldGVudGlvbi50eXBlID09PSAnY291bnQnKSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlDb3VudChmaWxlUGF0aCwgcmV0ZW50aW9uLnZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBjbGVhbnVwQnlUaW1lKGZpbGVQYXRoLCByZXRlbnRpb24udmFsdWUpXG4gICAgfVxuICB9XG5cbiAgLy8gT3B0aW9uYWwgaW50ZXJ2YWwtYmFzZWQgcm90YXRpb24gY2xlYW51cCAoY3JlYXRlIGludGVydmFsIGRpcmVjdG9yaWVzIC8gbmFtaW5nKSBpcyBub3QgcmVxdWlyZWQgYnkgdGVzdHMuXG59XG4iLAogICAgImltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnbm9kZTpmcydcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJ1xuXG5jb25zdCBTSVpFX1JFR0VYID0gL14oXFxkKyg/OlxcLlxcZCspPykoa3xrYnxtfG1ifGd8Z2IpJC9pXG5jb25zdCBJTlRFUlZBTF9SRUdFWCA9IC9eKFxcZCspKGh8ZHx3KSQvaVxuY29uc3QgUk9UQVRFRF9SRUdFWCA9IC9cXC4oXFxkezR9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0pKD86XFwuZ3opPyQvXG5cbmV4cG9ydCBjb25zdCBwYXJzZVNpemUgPSAodmFsdWU6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICBjb25zdCB0cmltbWVkID0gdmFsdWUudHJpbSgpXG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHRyaW1tZWQpXG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpKSB7XG4gICAgcmV0dXJuIGFzTnVtYmVyXG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goU0laRV9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzaXplIGZvcm1hdDogJHt2YWx1ZX1gKVxuICB9XG5cbiAgY29uc3QgYW1vdW50ID0gTnVtYmVyKG1hdGNoWzFdKVxuICBjb25zdCB1bml0ID0gbWF0Y2hbMl0udG9Mb3dlckNhc2UoKVxuXG4gIGxldCBiYXNlID0gMTAyNFxuICBpZiAodW5pdC5zdGFydHNXaXRoKCdtJykpIHtcbiAgICBiYXNlID0gMTAyNCAqIDEwMjRcbiAgfSBlbHNlIGlmICh1bml0LnN0YXJ0c1dpdGgoJ2cnKSkge1xuICAgIGJhc2UgPSAxMDI0ICogMTAyNCAqIDEwMjRcbiAgfVxuXG4gIHJldHVybiBNYXRoLmZsb29yKGFtb3VudCAqIGJhc2UpXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZUludGVydmFsID0gKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICBjb25zdCBtYXRjaCA9IHZhbHVlLnRyaW0oKS5tYXRjaChJTlRFUlZBTF9SRUdFWClcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlcnZhbCBmb3JtYXQ6ICR7dmFsdWV9YClcbiAgfVxuXG4gIGNvbnN0IGFtb3VudCA9IE51bWJlcihtYXRjaFsxXSlcbiAgY29uc3QgdW5pdCA9IG1hdGNoWzJdLnRvTG93ZXJDYXNlKClcblxuICBsZXQgbXMgPSA2MCAqIDYwICogMTAwMFxuICBpZiAodW5pdCA9PT0gJ2QnKSB7XG4gICAgbXMgPSAyNCAqIDYwICogNjAgKiAxMDAwXG4gIH0gZWxzZSBpZiAodW5pdCA9PT0gJ3cnKSB7XG4gICAgbXMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMFxuICB9XG5cbiAgcmV0dXJuIGFtb3VudCAqIG1zXG59XG5cbmV4cG9ydCBjb25zdCBwYXJzZVJldGVudGlvbiA9IChcbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZ1xuKTogeyB0eXBlOiAnY291bnQnIHwgJ3RpbWUnOyB2YWx1ZTogbnVtYmVyIH0gPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB7IHR5cGU6ICdjb3VudCcsIHZhbHVlIH1cbiAgfVxuICByZXR1cm4geyB0eXBlOiAndGltZScsIHZhbHVlOiBwYXJzZUludGVydmFsKHZhbHVlKSB9XG59XG5cbmV4cG9ydCBjb25zdCBzaG91bGRSb3RhdGVCeVNpemUgPSBhc3luYyAoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIG1heFNpemVCeXRlczogbnVtYmVyXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aClcbiAgICByZXR1cm4gc3RhdC5zaXplID4gbWF4U2l6ZUJ5dGVzXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRSb3RhdGVkRmlsZXMgPSBhc3luYyAoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+ID0+IHtcbiAgY29uc3QgZGlyID0gZGlybmFtZShmaWxlUGF0aClcbiAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKGZpbGVQYXRoKVxuXG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXVxuICB0cnkge1xuICAgIGVudHJpZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpcilcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICByZXR1cm4gZW50cmllc1xuICAgIC5maWx0ZXIobmFtZSA9PiBuYW1lLnN0YXJ0c1dpdGgoYCR7YmFzZX0uYCkgJiYgUk9UQVRFRF9SRUdFWC50ZXN0KG5hbWUpKVxuICAgIC5tYXAobmFtZSA9PiBgJHtkaXJ9LyR7bmFtZX1gKVxufVxuIiwKICAgICJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgeyBnZXRTdGF0dXNDb2RlIH0gZnJvbSAnLi4vaGVscGVycy9zdGF0dXMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBQaW5vLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuXG5jb25zdCBwYWQyID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgyLCAnMCcpXG5jb25zdCBwYWQzID0gKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcgPT4gU3RyaW5nKHZhbHVlKS5wYWRTdGFydCgzLCAnMCcpXG5cbmNvbnN0IHNob3VsZFVzZUNvbG9ycyA9IChvcHRpb25zOiBPcHRpb25zKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIGNvbnN0IGVuYWJsZWRCeUNvbmZpZyA9IGNvbmZpZz8udXNlQ29sb3JzID8/IHRydWVcblxuICAvLyBBdm9pZCBBTlNJIHNlcXVlbmNlcyBpbiBub24taW50ZXJhY3RpdmUgb3V0cHV0IChwaXBlcywgQ0kgbG9ncywgZmlsZXMpLlxuICBjb25zdCBpc1R0eSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnN0ZG91dD8uaXNUVFkgPT09IHRydWVcbiAgcmV0dXJuIGVuYWJsZWRCeUNvbmZpZyAmJiBpc1R0eVxufVxuXG5jb25zdCBmb3JtYXRUaW1lc3RhbXAgPSAoZGF0ZTogRGF0ZSwgcGF0dGVybj86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghcGF0dGVybikge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIGNvbnN0IHl5eXkgPSBTdHJpbmcoZGF0ZS5nZXRGdWxsWWVhcigpKVxuICBjb25zdCBtbSA9IHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSlcbiAgY29uc3QgZGQgPSBwYWQyKGRhdGUuZ2V0RGF0ZSgpKVxuICBjb25zdCBISCA9IHBhZDIoZGF0ZS5nZXRIb3VycygpKVxuICBjb25zdCBNTSA9IHBhZDIoZGF0ZS5nZXRNaW51dGVzKCkpXG4gIGNvbnN0IHNzID0gcGFkMihkYXRlLmdldFNlY29uZHMoKSlcbiAgY29uc3QgU1NTID0gcGFkMyhkYXRlLmdldE1pbGxpc2Vjb25kcygpKVxuXG4gIHJldHVybiBwYXR0ZXJuXG4gICAgLnJlcGxhY2VBbGwoJ3l5eXknLCB5eXl5KVxuICAgIC5yZXBsYWNlQWxsKCdtbScsIG1tKVxuICAgIC5yZXBsYWNlQWxsKCdkZCcsIGRkKVxuICAgIC5yZXBsYWNlQWxsKCdISCcsIEhIKVxuICAgIC5yZXBsYWNlQWxsKCdNTScsIE1NKVxuICAgIC5yZXBsYWNlQWxsKCdzcycsIHNzKVxuICAgIC5yZXBsYWNlQWxsKCdTU1MnLCBTU1MpXG59XG5cbmNvbnN0IGdldElwID0gKHJlcXVlc3Q6IFJlcXVlc3QpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBmb3J3YXJkZWQgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KCd4LWZvcndhcmRlZC1mb3InKVxuICBpZiAoZm9yd2FyZGVkKSB7XG4gICAgcmV0dXJuIGZvcndhcmRlZC5zcGxpdCgnLCcpWzBdPy50cmltKCkgPz8gJydcbiAgfVxuICByZXR1cm4gcmVxdWVzdC5oZWFkZXJzLmdldCgneC1yZWFsLWlwJykgPz8gJydcbn1cblxuY29uc3QgZ2V0Q29sb3JlZExldmVsID0gKGxldmVsOiBMb2dMZXZlbCwgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gbGV2ZWxcbiAgfVxuXG4gIGlmIChsZXZlbCA9PT0gJ0VSUk9SJykge1xuICAgIHJldHVybiBjaGFsay5iZ1JlZC5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdXQVJOSU5HJykge1xuICAgIHJldHVybiBjaGFsay5iZ1llbGxvdy5ibGFjayhsZXZlbClcbiAgfVxuICBpZiAobGV2ZWwgPT09ICdERUJVRycpIHtcbiAgICByZXR1cm4gY2hhbGsuYmdCbHVlLmJsYWNrKGxldmVsKVxuICB9XG5cbiAgcmV0dXJuIGNoYWxrLmJnR3JlZW4uYmxhY2sobGV2ZWwpXG59XG5cbmNvbnN0IGdldENvbG9yZWRNZXRob2QgPSAobWV0aG9kOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIG1ldGhvZFxuICB9XG5cbiAgY29uc3QgdXBwZXIgPSBtZXRob2QudG9VcHBlckNhc2UoKVxuICBpZiAodXBwZXIgPT09ICdHRVQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUE9TVCcpIHtcbiAgICByZXR1cm4gY2hhbGsuYmx1ZS5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ1BVVCcpIHtcbiAgICByZXR1cm4gY2hhbGsueWVsbG93LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnUEFUQ0gnKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvd0JyaWdodC5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0RFTEVURScpIHtcbiAgICByZXR1cm4gY2hhbGsucmVkLmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnT1BUSU9OUycpIHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbi5ib2xkKHVwcGVyKVxuICB9XG4gIGlmICh1cHBlciA9PT0gJ0hFQUQnKSB7XG4gICAgcmV0dXJuIGNoYWxrLmdyZWVuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cbiAgaWYgKHVwcGVyID09PSAnVFJBQ0UnKSB7XG4gICAgcmV0dXJuIGNoYWxrLm1hZ2VudGEuYm9sZCh1cHBlcilcbiAgfVxuICBpZiAodXBwZXIgPT09ICdDT05ORUNUJykge1xuICAgIHJldHVybiBjaGFsay5jeWFuQnJpZ2h0LmJvbGQodXBwZXIpXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGUuYm9sZCh1cHBlcilcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFN0YXR1cyA9IChzdGF0dXM6IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBjb25zdCBudW1lcmljID0gTnVtYmVyLnBhcnNlSW50KHN0YXR1cywgMTApXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWVyaWMpKSB7XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaWYgKG51bWVyaWMgPj0gNTAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnJlZChzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gNDAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLnllbGxvdyhzdGF0dXMpXG4gIH1cbiAgaWYgKG51bWVyaWMgPj0gMzAwKSB7XG4gICAgcmV0dXJuIGNoYWxrLmN5YW4oc3RhdHVzKVxuICB9XG4gIGlmIChudW1lcmljID49IDIwMCkge1xuICAgIHJldHVybiBjaGFsay5ncmVlbihzdGF0dXMpXG4gIH1cbiAgcmV0dXJuIGNoYWxrLmdyYXkoc3RhdHVzKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkRHVyYXRpb24gPSAoZHVyYXRpb246IHN0cmluZywgdXNlQ29sb3JzOiBib29sZWFuKTogc3RyaW5nID0+IHtcbiAgaWYgKCF1c2VDb2xvcnMpIHtcbiAgICByZXR1cm4gZHVyYXRpb25cbiAgfVxuXG4gIHJldHVybiBjaGFsay5ncmF5KGR1cmF0aW9uKVxufVxuXG5jb25zdCBnZXRDb2xvcmVkVGltZXN0YW1wID0gKHRpbWVzdGFtcDogc3RyaW5nLCB1c2VDb2xvcnM6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXVzZUNvbG9ycykge1xuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgfVxuXG4gIHJldHVybiBjaGFsay5iZ0hleCgnI0ZGQTUwMCcpLmJsYWNrKHRpbWVzdGFtcClcbn1cblxuY29uc3QgZ2V0Q29sb3JlZFBhdGhuYW1lID0gKHBhdGhuYW1lOiBzdHJpbmcsIHVzZUNvbG9yczogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIGlmICghdXNlQ29sb3JzKSB7XG4gICAgcmV0dXJuIHBhdGhuYW1lXG4gIH1cblxuICByZXR1cm4gY2hhbGsud2hpdGVCcmlnaHQocGF0aG5hbWUpXG59XG5cbmNvbnN0IGdldENvbnRleHRTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiAnJ1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0TGluZSA9ICh7XG4gIGxldmVsLFxuICByZXF1ZXN0LFxuICBkYXRhLFxuICBzdG9yZSxcbiAgb3B0aW9uc1xufToge1xuICBsZXZlbDogTG9nTGV2ZWxcbiAgcmVxdWVzdDogUmVxdWVzdFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICBzdG9yZTogU3RvcmVEYXRhXG4gIG9wdGlvbnM6IE9wdGlvbnNcbn0pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjb25maWcgPSBvcHRpb25zLmNvbmZpZ1xuICBjb25zdCB1c2VDb2xvcnMgPSBzaG91bGRVc2VDb2xvcnMob3B0aW9ucylcbiAgY29uc3QgZm9ybWF0ID1cbiAgICBjb25maWc/LmN1c3RvbUxvZ0Zvcm1hdCA/P1xuICAgICfwn6aKIHtub3d9IHtsZXZlbH0ge2R1cmF0aW9ufSB7bWV0aG9kfSB7cGF0aG5hbWV9IHtzdGF0dXN9IHttZXNzYWdlfSB7aXB9IHtjb250ZXh0fSdcblxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gIGNvbnN0IGVwb2NoID0gU3RyaW5nKG5vdy5nZXRUaW1lKCkpXG4gIGNvbnN0IHJhd1RpbWVzdGFtcCA9IGZvcm1hdFRpbWVzdGFtcChub3csIGNvbmZpZz8udGltZXN0YW1wPy50cmFuc2xhdGVUaW1lKVxuICBjb25zdCB0aW1lc3RhbXAgPSBnZXRDb2xvcmVkVGltZXN0YW1wKHJhd1RpbWVzdGFtcCwgdXNlQ29sb3JzKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGRhdGEubWVzc2FnZSA6ICcnXG4gIGNvbnN0IGR1cmF0aW9uTXMgPVxuICAgIHN0b3JlLmJlZm9yZVRpbWUgPT09IEJpZ0ludCgwKVxuICAgICAgPyAwXG4gICAgICA6IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0b3JlLmJlZm9yZVRpbWUpIC8gMV8wMDBfMDAwXG5cbiAgY29uc3QgcGF0aG5hbWUgPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZVxuICBjb25zdCBzdGF0dXNWYWx1ZSA9IGRhdGEuc3RhdHVzXG4gIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgIHN0YXR1c1ZhbHVlID09PSBudWxsIHx8IHN0YXR1c1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgID8gMjAwXG4gICAgICA6IGdldFN0YXR1c0NvZGUoc3RhdHVzVmFsdWUpXG4gIGNvbnN0IHN0YXR1cyA9IFN0cmluZyhzdGF0dXNDb2RlKVxuICBjb25zdCBpcCA9IGNvbmZpZz8uaXAgPT09IHRydWUgPyBnZXRJcChyZXF1ZXN0KSA6ICcnXG4gIGNvbnN0IGN0eFN0cmluZyA9IGdldENvbnRleHRTdHJpbmcoZGF0YS5jb250ZXh0KVxuICBjb25zdCBjb2xvcmVkTGV2ZWwgPSBnZXRDb2xvcmVkTGV2ZWwobGV2ZWwsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZE1ldGhvZCA9IGdldENvbG9yZWRNZXRob2QocmVxdWVzdC5tZXRob2QsIHVzZUNvbG9ycylcbiAgY29uc3QgY29sb3JlZFBhdGhuYW1lID0gZ2V0Q29sb3JlZFBhdGhuYW1lKHBhdGhuYW1lLCB1c2VDb2xvcnMpXG4gIGNvbnN0IGNvbG9yZWRTdGF0dXMgPSBnZXRDb2xvcmVkU3RhdHVzKHN0YXR1cywgdXNlQ29sb3JzKVxuICBjb25zdCBjb2xvcmVkRHVyYXRpb24gPSBnZXRDb2xvcmVkRHVyYXRpb24oXG4gICAgYCR7ZHVyYXRpb25Ncy50b0ZpeGVkKDIpfW1zYCxcbiAgICB1c2VDb2xvcnNcbiAgKVxuXG4gIHJldHVybiBmb3JtYXRcbiAgICAucmVwbGFjZUFsbCgne25vd30nLCB0aW1lc3RhbXApXG4gICAgLnJlcGxhY2VBbGwoJ3tlcG9jaH0nLCBlcG9jaClcbiAgICAucmVwbGFjZUFsbCgne2xldmVsfScsIGNvbG9yZWRMZXZlbClcbiAgICAucmVwbGFjZUFsbCgne2R1cmF0aW9ufScsIGNvbG9yZWREdXJhdGlvbilcbiAgICAucmVwbGFjZUFsbCgne21ldGhvZH0nLCBjb2xvcmVkTWV0aG9kKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aG5hbWV9JywgY29sb3JlZFBhdGhuYW1lKVxuICAgIC5yZXBsYWNlQWxsKCd7cGF0aH0nLCBjb2xvcmVkUGF0aG5hbWUpXG4gICAgLnJlcGxhY2VBbGwoJ3tzdGF0dXN9JywgY29sb3JlZFN0YXR1cylcbiAgICAucmVwbGFjZUFsbCgne21lc3NhZ2V9JywgbWVzc2FnZSlcbiAgICAucmVwbGFjZUFsbCgne2lwfScsIGlwKVxuICAgIC5yZXBsYWNlQWxsKCd7Y29udGV4dH0nLCBjdHhTdHJpbmcpXG59XG5cbmV4cG9ydCBjb25zdCBsb2dXaXRoUGlubyA9IChcbiAgbG9nZ2VyOiBQaW5vLFxuICBsZXZlbDogTG9nTGV2ZWwsXG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiB2b2lkID0+IHtcbiAgaWYgKGxldmVsID09PSAnRVJST1InKSB7XG4gICAgbG9nZ2VyLmVycm9yKGRhdGEpXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGxldmVsID09PSAnV0FSTklORycpIHtcbiAgICBsb2dnZXIud2FybihkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGlmIChsZXZlbCA9PT0gJ0RFQlVHJykge1xuICAgIGxvZ2dlci5kZWJ1ZyhkYXRhKVxuICAgIHJldHVyblxuICB9XG4gIGxvZ2dlci5pbmZvKGRhdGEpXG59XG4iLAogICAgImltcG9ydCB7IFN0YXR1c01hcCB9IGZyb20gJ2VseXNpYSdcblxuY29uc3QgRElHSVRTX09OTFkgPSAvXlxcZCskL1xuY29uc3QgREVMSU1JVEVSUyA9IC9bXy1dKy9nXG5jb25zdCBDQU1FTF9CT1VOREFSWV8xID0gLyhbYS16MC05XSkoW0EtWl0pL2dcbmNvbnN0IENBTUVMX0JPVU5EQVJZXzIgPSAvKFtBLVpdKShbQS1aXVthLXpdKS9nXG5jb25zdCBBUE9TVFJPUEhFUyA9IC9bJ+KAmV0vZ1xuY29uc3QgTk9OX0FMUEhBTlVNRVJJQyA9IC9bXmEtejAtOVxcc10rL2dcbmNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzKy9nXG5cbmNvbnN0IG5vcm1hbGl6ZVN0YXR1c05hbWUgPSAodmFsdWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIC8vIEhhbmRsZXMgY29tbW9uIHZhcmlhbnRzOlxuICAvLyAtIGNhc2UgZGlmZmVyZW5jZXM6IFwibm90IGZvdW5kXCIgdnMgXCJOb3QgRm91bmRcIlxuICAvLyAtIHNwYWNpbmcvcHVuY3R1YXRpb246IFwiTm90LUZvdW5kXCIsIFwibm90X2ZvdW5kXCJcbiAgLy8gLSBjYW1lbENhc2UvUGFzY2FsQ2FzZTogXCJJbnRlcm5hbFNlcnZlckVycm9yXCJcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICBpZiAoIXRyaW1tZWQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHJldHVybiB0cmltbWVkXG4gICAgLnJlcGxhY2UoREVMSU1JVEVSUywgJyAnKVxuICAgIC5yZXBsYWNlKENBTUVMX0JPVU5EQVJZXzEsICckMSAkMicpXG4gICAgLnJlcGxhY2UoQ0FNRUxfQk9VTkRBUllfMiwgJyQxICQyJylcbiAgICAucmVwbGFjZShBUE9TVFJPUEhFUywgJycpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDLCAnICcpXG4gICAgLnJlcGxhY2UoV0hJVEVTUEFDRSwgJyAnKVxuICAgIC50cmltKClcbn1cblxuY29uc3QgU1RBVFVTX0JZX05PUk1BTElaRURfTkFNRSA9ICgoKSA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KClcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb2RlXSBvZiBPYmplY3QuZW50cmllcyhTdGF0dXNNYXApKSB7XG4gICAgbWFwLnNldChub3JtYWxpemVTdGF0dXNOYW1lKG5hbWUpLCBjb2RlKVxuICB9XG5cbiAgcmV0dXJuIG1hcFxufSkoKVxuXG5leHBvcnQgY29uc3QgZ2V0U3RhdHVzQ29kZSA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKVxuICAgIGlmIChESUdJVFNfT05MWS50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpXG4gICAgfVxuXG4gICAgY29uc3Qga25vd24gPSBTVEFUVVNfQllfTk9STUFMSVpFRF9OQU1FLmdldChub3JtYWxpemVTdGF0dXNOYW1lKHRyaW1tZWQpKVxuICAgIHJldHVybiBrbm93biA/PyA1MDBcbiAgfVxuXG4gIHJldHVybiA1MDBcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuLi9FcnJvci9lcnJvcnMnXG5pbXBvcnQgdHlwZSB7IExvZ0xldmVsLCBPcHRpb25zLCBTdG9yZURhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgbG9nVG9UcmFuc3BvcnRzIH0gZnJvbSAnLi4vb3V0cHV0J1xuaW1wb3J0IHsgbG9nVG9GaWxlIH0gZnJvbSAnLi4vb3V0cHV0L2ZpbGUnXG5cbmV4cG9ydCBjb25zdCBoYW5kbGVIdHRwRXJyb3IgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIHByb2JsZW06IFByb2JsZW1FcnJvcixcbiAgc3RvcmU6IFN0b3JlRGF0YSxcbiAgb3B0aW9uczogT3B0aW9uc1xuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IG9wdGlvbnMuY29uZmlnXG4gIC8vIDEuIOWHhuWkh+aXpeW/l+aVsOaNru+8muWwhiBSRkMg5qCH5YeG5a2X5q615LiO5pel5b+X5YWD5pWw5o2u5ZCI5bm2XG4gIGNvbnN0IGxldmVsOiBMb2dMZXZlbCA9ICdFUlJPUidcbiAgY29uc3QgcmZjRGF0YSA9IHByb2JsZW0udG9KU09OKClcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzdGF0dXM6IHByb2JsZW0uc3RhdHVzLFxuICAgIG1lc3NhZ2U6IHByb2JsZW0uZGV0YWlsIHx8IHByb2JsZW0udGl0bGUsXG4gICAgLi4ucmZjRGF0YVxuICB9XG4gIC8vIDIuIOmYtuaute+8muS8oOi+k+WxgiAoVHJhbnNwb3J0cylcbiAgbG9nVG9UcmFuc3BvcnRzKHsgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pXG4gIC8vIDMuIOmYtuaute+8muaMgeS5heWMliAoRmlsZSBMb2dnaW5nKVxuICAvLyDljLnphY3kvaDnmoTmjqXlj6PvvJp1c2VUcmFuc3BvcnRzT25seSDlkowgZGlzYWJsZUZpbGVMb2dnaW5nIOebtOaOpeWcqCBjb25maWcg5LiLXG4gIGlmICghKGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgfHwgY29uZmlnPy5kaXNhYmxlRmlsZUxvZ2dpbmcpKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBjb25maWc/LmxvZ0ZpbGVQYXRoXG4gICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICBsb2dUb0ZpbGUoeyBmaWxlUGF0aCwgbGV2ZWwsIHJlcXVlc3QsIGRhdGEsIHN0b3JlLCBvcHRpb25zIH0pLmNhdGNoKFxuICAgICAgICAoKSA9PiB7fVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8vIDQuIOmYtuaute+8muaOp+WItuWPsOi+k+WHuiAoQ29uc29sZS9JbnRlcm5hbClcbiAgaWYgKGNvbmZpZz8udXNlVHJhbnNwb3J0c09ubHkgfHwgY29uZmlnPy5kaXNhYmxlSW50ZXJuYWxMb2dnZXIpIHJldHVyblxuXG4gIC8vIOWkhOeQhuaXtumXtOaIs+aYvuekuumAu+i+kVxuICBsZXQgdGltZXN0YW1wID0gJydcbiAgaWYgKGNvbmZpZz8udGltZXN0YW1wKSB7XG4gICAgdGltZXN0YW1wID0gYFske25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1dIGBcbiAgfVxuXG4gIC8vIDEuIOWuieWFqOaPkOWPliBNZXRob2Qg5ZKMIFBhdGhcbiAgY29uc3QgbWV0aG9kID0gdHlwZW9mIHJlcXVlc3QgPT09ICdzdHJpbmcnID8gJ1JFUScgOiByZXF1ZXN0Lm1ldGhvZFxuICBjb25zdCB1cmxTdHJpbmcgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZycgPyByZXF1ZXN0IDogcmVxdWVzdC51cmxcblxuICBsZXQgcGF0aDogc3RyaW5nXG4gIHRyeSB7XG4gICAgLy8g5aaC5p6c5piv5a6M5pW0IFVSTCDliJnmj5Dlj5YgcGF0aG5hbWXvvIzlpoLmnpzmmK/nm7jlr7not6/lvoTliJnnm7TmjqXkvb/nlKhcbiAgICBwYXRoID0gdXJsU3RyaW5nLmluY2x1ZGVzKCc6Ly8nKSA/IG5ldyBVUkwodXJsU3RyaW5nKS5wYXRobmFtZSA6IHVybFN0cmluZ1xuICB9IGNhdGNoIHtcbiAgICBwYXRoID0gdXJsU3RyaW5nXG4gIH1cblxuICAvLyAyLiDor63kuYnljJbnu4jnq6/miZPljbBcbiAgLy8g546w5Zyo55qE5Luj56CB5a+5IHN0cmluZyDlkowgUmVxdWVzdCDnsbvlnovpg73nmb7liIbkuYvnmb7lronlhajkuoZcbiAgY29uc29sZS5lcnJvcihcbiAgICBgJHt0aW1lc3RhbXB9JHtsZXZlbH0gJHttZXRob2R9ICR7cGF0aH0gJHtwcm9ibGVtLnN0YXR1c30gLSAke3Byb2JsZW0udGl0bGV9YFxuICApXG59XG4iLAogICAgIi8vIHNyYy9saWJzL2VseXNpYS1odHRwLXByb2JsZW0tanNvbi9lcnJvcnMudHNcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtRG9jdW1lbnQge1xuICB0eXBlOiBzdHJpbmdcbiAgdGl0bGU6IHN0cmluZ1xuICBzdGF0dXM/OiBudW1iZXJcbiAgZGV0YWlsPzogc3RyaW5nXG4gIGluc3RhbmNlPzogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuLyoqXG4gKiBSRkMgOTQ1NyBQcm9ibGVtIERldGFpbHMgRXJyb3IgQmFzZSBDbGFzc1xuICpcbiAqIENvcmUgbWVtYmVycyBhcyBwZXIgUkZDIDk0NTc6XG4gKiAtIHR5cGU6IEEgVVJJIHJlZmVyZW5jZSBbUkZDMzk4Nl0gdGhhdCBpZGVudGlmaWVzIHRoZSBwcm9ibGVtIHR5cGUuXG4gKiAgICAgICAgIERlZmF1bHRzIHRvIFwiYWJvdXQ6YmxhbmtcIiB3aGVuIG9taXR0ZWQuXG4gKiAtIHRpdGxlOiBBIHNob3J0LCBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHRoZSBwcm9ibGVtIHR5cGUuXG4gKiAtIHN0YXR1czogVGhlIEhUVFAgc3RhdHVzIGNvZGUgKFtSRkM3MjMxXSwgU2VjdGlvbiA2KS5cbiAqIC0gZGV0YWlsOiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHNwZWNpZmljIHRvIHRoaXMgb2NjdXJyZW5jZSBvZiB0aGUgcHJvYmxlbS5cbiAqIC0gaW5zdGFuY2U6IEEgVVJJIHJlZmVyZW5jZSB0aGF0IGlkZW50aWZpZXMgdGhlIHNwZWNpZmljIG9jY3VycmVuY2Ugb2YgdGhlIHByb2JsZW0uXG4gKlxuICogRXh0ZW5zaW9uIG1lbWJlcnM6IEFkZGl0aW9uYWwgcHJvcGVydGllcyBjYW4gYmUgYWRkZWQgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQuXG4gKiBUaGVzZSBhcmUgc2VyaWFsaXplZCBhcy1pcyBpbiB0aGUgSlNPTiByZXNwb25zZS5cbiAqL1xuLyoqXG4gKiBSRkMgOTQ1NyBFcnJvciBCYXNlIENsYXNzXG4gKiAqIOS/ruaUueaAnei3r++8muebtOaOpeS9v+eUqCBwdWJsaWMgcmVhZG9ubHkg5bGe5oCn77yM5ouS57ud5bWM5aWX77yM5ouS57udIEdldHRlcuOAglxuICovXG5leHBvcnQgY2xhc3MgUHJvYmxlbUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvLyAxLiDnm7TmjqXlo7DmmI7lhazlvIDlsZ7mgKdcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGRldGFpbD86IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgaW5zdGFuY2U/OiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHR5cGUgPSAnYWJvdXQ6YmxhbmsnLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgZGV0YWlsPzogc3RyaW5nLFxuICAgIGluc3RhbmNlPzogc3RyaW5nLFxuICAgIGV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbiAgKSB7XG4gICAgc3VwZXIoZGV0YWlsIHx8IHRpdGxlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBQcm9ibGVtRXJyb3IucHJvdG90eXBlKVxuXG4gICAgLy8gMi4g55u05o6l6LWL5YC857uZIHRoaXNcbiAgICB0aGlzLnN0YXR1cyA9IHN0YXR1c1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZVxuICAgIHRoaXMudHlwZSA9IHR5cGVcbiAgICB0aGlzLmRldGFpbCA9IGRldGFpbFxuICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZVxuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnNcbiAgfVxuXG4gIC8vIDMuIHRvSlNPTiDnmoTml7blgJnliqjmgIHnu4Too4XkuIDkuIvljbPlj69cbiAgdG9KU09OKCk6IFByb2JsZW1Eb2N1bWVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIC4uLih0aGlzLmRldGFpbCA/IHsgZGV0YWlsOiB0aGlzLmRldGFpbCB9IDoge30pLFxuICAgICAgLi4uKHRoaXMuaW5zdGFuY2UgPyB7IGluc3RhbmNlOiB0aGlzLmluc3RhbmNlIH0gOiB7fSksXG4gICAgICAvLyDmiormianlsZXlrZfmrrXlsZXlvIAgKGV4dGVuc2lvbnMpXG4gICAgICAuLi50aGlzLmV4dGVuc2lvbnNcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0tIDQwWCBFcnJvcnMgLS0tXG5jbGFzcyBCYWRSZXF1ZXN0IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDAnLFxuICAgICAgJ0JhZCBSZXF1ZXN0JyxcbiAgICAgIDQwMCxcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgVW5hdXRob3JpemVkIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDEnLFxuICAgICAgJ1VuYXV0aG9yaXplZCcsXG4gICAgICA0MDEsXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIEZvcmJpZGRlbiBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAzJyxcbiAgICAgICdGb3JiaWRkZW4nLFxuICAgICAgNDAzLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RGb3VuZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA0JyxcbiAgICAgICdOb3QgRm91bmQnLFxuICAgICAgNDA0LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBDb25mbGljdCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA5JyxcbiAgICAgICdDb25mbGljdCcsXG4gICAgICA0MDksXG4gICAgICBkZXRhaWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBleHRlbnNpb25zXG4gICAgKVxuICB9XG59XG5cbmNsYXNzIFBheW1lbnRSZXF1aXJlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDAyJyxcbiAgICAgICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICAgIDQwMixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgTWV0aG9kTm90QWxsb3dlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNDA1JyxcbiAgICAgICdNZXRob2QgTm90IEFsbG93ZWQnLFxuICAgICAgNDA1LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RBY2NlcHRhYmxlIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS80MDYnLFxuICAgICAgJ05vdCBBY2NlcHRhYmxlJyxcbiAgICAgIDQwNixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuLy8gNTBYIEVycm9yc1xuY2xhc3MgSW50ZXJuYWxTZXJ2ZXJFcnJvciBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAwJyxcbiAgICAgICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLFxuICAgICAgNTAwLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBOb3RJbXBsZW1lbnRlZCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTAxJyxcbiAgICAgICdOb3QgSW1wbGVtZW50ZWQnLFxuICAgICAgNTAxLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBCYWRHYXRld2F5IGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDInLFxuICAgICAgJ0JhZCBHYXRld2F5JyxcbiAgICAgIDUwMixcbiAgICAgIGRldGFpbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGV4dGVuc2lvbnNcbiAgICApXG4gIH1cbn1cblxuY2xhc3MgU2VydmljZVVuYXZhaWxhYmxlIGV4dGVuZHMgUHJvYmxlbUVycm9yIHtcbiAgY29uc3RydWN0b3IoZGV0YWlsPzogc3RyaW5nLCBleHRlbnNpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFxuICAgICAgJ2h0dHBzOi8vaHR0cHN0YXR1c2VzLmNvbS81MDMnLFxuICAgICAgJ1NlcnZpY2UgVW5hdmFpbGFibGUnLFxuICAgICAgNTAzLFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5jbGFzcyBHYXRld2F5VGltZW91dCBleHRlbmRzIFByb2JsZW1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKGRldGFpbD86IHN0cmluZywgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBzdXBlcihcbiAgICAgICdodHRwczovL2h0dHBzdGF0dXNlcy5jb20vNTA0JyxcbiAgICAgICdHYXRld2F5IFRpbWVvdXQnLFxuICAgICAgNTA0LFxuICAgICAgZGV0YWlsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgZXh0ZW5zaW9uc1xuICAgIClcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvckNvbnN0cnVjdG9yIHtcbiAgQmFkUmVxdWVzdDogdHlwZW9mIEJhZFJlcXVlc3RcbiAgVW5hdXRob3JpemVkOiB0eXBlb2YgVW5hdXRob3JpemVkXG4gIFBheW1lbnRSZXF1aXJlZDogdHlwZW9mIFBheW1lbnRSZXF1aXJlZFxuICBGb3JiaWRkZW46IHR5cGVvZiBGb3JiaWRkZW5cbiAgTm90Rm91bmQ6IHR5cGVvZiBOb3RGb3VuZFxuICBNZXRob2ROb3RBbGxvd2VkOiB0eXBlb2YgTWV0aG9kTm90QWxsb3dlZFxuICBOb3RBY2NlcHRhYmxlOiB0eXBlb2YgTm90QWNjZXB0YWJsZVxuICBDb25mbGljdDogdHlwZW9mIENvbmZsaWN0XG4gIEludGVybmFsU2VydmVyRXJyb3I6IHR5cGVvZiBJbnRlcm5hbFNlcnZlckVycm9yXG4gIE5vdEltcGxlbWVudGVkOiB0eXBlb2YgTm90SW1wbGVtZW50ZWRcbiAgQmFkR2F0ZXdheTogdHlwZW9mIEJhZEdhdGV3YXlcbiAgU2VydmljZVVuYXZhaWxhYmxlOiB0eXBlb2YgU2VydmljZVVuYXZhaWxhYmxlXG4gIEdhdGV3YXlUaW1lb3V0OiB0eXBlb2YgR2F0ZXdheVRpbWVvdXRcbn1cblxuZXhwb3J0IGNvbnN0IEh0dHBFcnJvcjogSHR0cEVycm9yQ29uc3RydWN0b3IgPSB7XG4gIEJhZFJlcXVlc3QsXG4gIFVuYXV0aG9yaXplZCxcbiAgUGF5bWVudFJlcXVpcmVkLFxuICBGb3JiaWRkZW4sXG4gIE5vdEZvdW5kLFxuICBNZXRob2ROb3RBbGxvd2VkLFxuICBOb3RBY2NlcHRhYmxlLFxuICBDb25mbGljdCxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcixcbiAgTm90SW1wbGVtZW50ZWQsXG4gIEJhZEdhdGV3YXksXG4gIFNlcnZpY2VVbmF2YWlsYWJsZSxcbiAgR2F0ZXdheVRpbWVvdXRcbn1cbiIsCiAgICAiLyoqXG4gKiBSRkMgOTQ1NyBQcm9ibGVtIEpTT04g5qC85byP5YyW5bel5YW3XG4gKiBAc2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NDU3Lmh0bWxcbiAqL1xuXG5pbXBvcnQgeyBQcm9ibGVtRXJyb3IgfSBmcm9tICcuLi9FcnJvci9lcnJvcnMnXG5pbXBvcnQgdHlwZSB7IENvZGUgfSBmcm9tICcuLi9FcnJvci90eXBlJ1xuXG4vKipcbiAqIOm7mOiupOeahOeKtuaAgeeggeS4juagh+mimOaYoOWwhOihqCAoUkZDIOagh+WHhuaOqOiNkClcbiAqL1xuY29uc3QgREVGQVVMVF9USVRMRVM6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDQwMDogJ0JhZCBSZXF1ZXN0JyxcbiAgNDAxOiAnVW5hdXRob3JpemVkJyxcbiAgNDAzOiAnRm9yYmlkZGVuJyxcbiAgNDA0OiAnTm90IEZvdW5kJyxcbiAgNDA5OiAnQ29uZmxpY3QnLFxuICA0MjI6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnXG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUb1Byb2JsZW0gPSAoXG4gIGVycm9yOiBhbnksXG4gIGNvZGU6IENvZGUsXG4gIHBhdGg6IHN0cmluZyxcbiAgdHlwZUJhc2VVcmwgPSAnYWJvdXQ6YmxhbmsnXG4pOiBQcm9ibGVtRXJyb3IgPT4ge1xuICAvLyAxLiDlpoLmnpzlt7Lnu4/mmK8gUHJvYmxlbUVycm9y77yM55u05o6l6KGl5YWFIGluc3RhbmNlIOW5tui/lOWbnlxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBQcm9ibGVtRXJyb3IpIHtcbiAgICAvLyDlpoLmnpzmsqHmnIkgaW5zdGFuY2XvvIzoh6rliqjooaXlhajkuLrlvZPliY3or7fmsYLot6/lvoRcbiAgICByZXR1cm4gZXJyb3IuaW5zdGFuY2VcbiAgICAgID8gZXJyb3JcbiAgICAgIDogbmV3IFByb2JsZW1FcnJvcihcbiAgICAgICAgICBlcnJvci50eXBlLFxuICAgICAgICAgIGVycm9yLnRpdGxlLFxuICAgICAgICAgIGVycm9yLnN0YXR1cyxcbiAgICAgICAgICBlcnJvci5kZXRhaWwsXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBlcnJvci5leHRlbnNpb25zXG4gICAgICAgIClcbiAgfVxuXG4gIC8vIDIuIOWIneWni+WMlum7mOiupOWAvFxuICBsZXQgc3RhdHVzID0gNTAwXG4gIGxldCB0aXRsZSA9ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InXG4gIGxldCBkZXRhaWwgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgbGV0IGV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cblxuICAvLyAzLiDor4bliKsgRWx5c2lhIOWGhee9rumUmeivr+eggeW5tuKAnOWvuem9kOKAneagh+WHhlxuICBzd2l0Y2ggKGNvZGUpIHtcbiAgICBjYXNlICdWQUxJREFUSU9OJzpcbiAgICAgIHN0YXR1cyA9IDQwMFxuICAgICAgdGl0bGUgPSAnVmFsaWRhdGlvbiBGYWlsZWQnXG4gICAgICAvLyDmj5Dlj5YgRWx5c2lhIOeahOagoemqjOe7huiKglxuICAgICAgZXh0ZW5zaW9ucyA9IHsgZXJyb3JzOiBlcnJvci5hbGwgfHwgW10gfVxuICAgICAgYnJlYWtcbiAgICBjYXNlICdOT1RfRk9VTkQnOlxuICAgICAgc3RhdHVzID0gNDA0XG4gICAgICB0aXRsZSA9ICdSZXNvdXJjZSBOb3QgRm91bmQnXG4gICAgICBicmVha1xuICAgIGNhc2UgJ1BBUlNFJzpcbiAgICAgIHN0YXR1cyA9IDQwMFxuICAgICAgdGl0bGUgPSAnSW52YWxpZCBQYXlsb2FkJ1xuICAgICAgZGV0YWlsID0gJ1RoZSByZXF1ZXN0IGJvZHkgY291bGQgbm90IGJlIHBhcnNlZCBhcyB2YWxpZCBKU09OLidcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAnSU5WQUxJRF9DT09LSUVfU0lHTkFUVVJFJzpcbiAgICAgIHN0YXR1cyA9IDQwMVxuICAgICAgdGl0bGUgPSAnSW52YWxpZCBDcmVkZW50aWFscydcbiAgICAgIGJyZWFrXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIOWmguaenOmUmeivr+WvueixoeacrOi6q+W4puacieeKtuaAgeegge+8iOavlOWmguafkOS6m+W6k+aKm+WHuueahO+8iVxuICAgICAgaWYgKHR5cGVvZiBlcnJvcj8uc3RhdHVzID09PSAnbnVtYmVyJykge1xuICAgICAgICBzdGF0dXMgPSBlcnJvci5zdGF0dXNcbiAgICAgICAgdGl0bGUgPSBERUZBVUxUX1RJVExFU1tzdGF0dXNdIHx8ICdVbmtub3duIEVycm9yJ1xuICAgICAgfVxuICAgICAgYnJlYWtcbiAgfVxuXG4gIC8vIDQuIOaehOmAoOW5tui/lOWbnuagh+WHhueahCBQcm9ibGVtRXJyb3JcbiAgcmV0dXJuIG5ldyBQcm9ibGVtRXJyb3IoXG4gICAgdHlwZUJhc2VVcmwgPT09ICdhYm91dDpibGFuaycgPyB0eXBlQmFzZVVybCA6IGAke3R5cGVCYXNlVXJsfS8ke2NvZGV9YCxcbiAgICB0aXRsZSxcbiAgICBzdGF0dXMsXG4gICAgZGV0YWlsLFxuICAgIHBhdGgsXG4gICAgZXh0ZW5zaW9uc1xuICApXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvYmxlbUpzb24ge1xuICB0eXBlPzogc3RyaW5nXG4gIHRpdGxlOiBzdHJpbmdcbiAgc3RhdHVzOiBudW1iZXJcbiAgZGV0YWlsPzogc3RyaW5nXG4gIGluc3RhbmNlPzogc3RyaW5nXG4gIFtrZXk6IHN0cmluZ106IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ibGVtSnNvbk9wdGlvbnMge1xuICAvKipcbiAgICog5Z+656GAIFVSTO+8jOeUqOS6jueUn+aIkOmUmeivr+exu+Wei+eahOmTvuaOpVxuICAgKiBAZXhhbXBsZSAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vZXJyb3JzJ1xuICAgKi9cbiAgdHlwZUJhc2VVcmw/OiBzdHJpbmdcblxuICAvKipcbiAgICog5piv5ZCm5Zyo5pel5b+X5Lit5pi+56S65a6M5pW055qEIFByb2JsZW0gSlNPTlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBlbmFibGVkPzogYm9vbGVhblxuXG4gIC8qKlxuICAgKiDoh6rlrprkuYnmoLzlvI/ljJblh73mlbBcbiAgICovXG4gIGZvcm1hdD86IChlcnJvcjogdW5rbm93biwgcmVxdWVzdDogUmVxdWVzdCkgPT4gUHJvYmxlbUpzb24gfCBudWxsXG59XG5cbmNvbnN0IGlzRXJyb3JXaXRoU3RhdHVzID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgeyBzdGF0dXM6IG51bWJlciB9ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgJ3N0YXR1cycgaW4gdmFsdWUgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyB7IHN0YXR1cz86IHVua25vd24gfSkuc3RhdHVzID09PSAnbnVtYmVyJ1xuXG5jb25zdCBpc0Vycm9yTGlrZSA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEVycm9yID0+XG4gIHZhbHVlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICdtZXNzYWdlJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgeyBtZXNzYWdlPzogdW5rbm93biB9KS5tZXNzYWdlID09PSAnc3RyaW5nJylcblxuLyoqXG4gKiDlsIbplJnor6/ovazmjaLkuLogUkZDIDk0NTcgUHJvYmxlbSBKU09OIOagvOW8j1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Qcm9ibGVtSnNvbihcbiAgZXJyb3I6IHVua25vd24sXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIG9wdGlvbnM6IFByb2JsZW1Kc29uT3B0aW9ucyA9IHt9XG4pOiBQcm9ibGVtSnNvbiB7XG4gIC8vIOWmguaenOaPkOS+m+S6huiHquWumuS5ieagvOW8j+WMluWHveaVsO+8jOS9v+eUqOWug1xuICBpZiAob3B0aW9ucy5mb3JtYXQpIHtcbiAgICBjb25zdCBjdXN0b20gPSBvcHRpb25zLmZvcm1hdChlcnJvciwgcmVxdWVzdClcbiAgICBpZiAoY3VzdG9tKSB7XG4gICAgICByZXR1cm4gY3VzdG9tXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgY29uc3Qgc3RhdHVzID0gaXNFcnJvcldpdGhTdGF0dXMoZXJyb3IpID8gZXJyb3Iuc3RhdHVzIDogNTAwXG4gIGNvbnN0IG1lc3NhZ2UgPSBpc0Vycm9yTGlrZShlcnJvcilcbiAgICA/IGVycm9yLm1lc3NhZ2VcbiAgICA6IFN0cmluZyhlcnJvciA/PyAnVW5rbm93biBFcnJvcicpXG5cbiAgLy8g6buY6K6k55qEIFByb2JsZW0gSlNPTiDnu5PmnoRcbiAgY29uc3QgcHJvYmxlbTogUHJvYmxlbUpzb24gPSB7XG4gICAgdHlwZTogb3B0aW9ucy50eXBlQmFzZVVybFxuICAgICAgPyBgJHtvcHRpb25zLnR5cGVCYXNlVXJsfS8ke3N0YXR1c31gXG4gICAgICA6ICdhYm91dDpibGFuaycsXG4gICAgdGl0bGU6IGdldERlZmF1bHRUaXRsZShzdGF0dXMpLFxuICAgIHN0YXR1cyxcbiAgICBkZXRhaWw6IG1lc3NhZ2UsXG4gICAgaW5zdGFuY2U6IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgfVxuXG4gIC8vIOWwneivleS7jumUmeivr+WvueixoeS4reaPkOWPlumineWklueahOS/oeaBr1xuICBpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCkge1xuICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG5cbiAgICAvLyDlpoLmnpzplJnor6/lt7Lnu4/mnIkgUHJvYmxlbSBKU09OIOe7k+aehO+8jOebtOaOpeS9v+eUqFxuICAgIGlmICgndHlwZScgaW4gZXJyIHx8ICd0aXRsZScgaW4gZXJyKSB7XG4gICAgICBpZiAoZXJyLnR5cGUpIHByb2JsZW0udHlwZSA9IGVyci50eXBlIGFzIHN0cmluZ1xuICAgICAgaWYgKGVyci50aXRsZSkgcHJvYmxlbS50aXRsZSA9IGVyci50aXRsZSBhcyBzdHJpbmdcbiAgICB9XG5cbiAgICAvLyDmt7vliqDlhbbku5bmianlsZXlrZfmrrXvvIjmjpLpmaTmoIflh4blrZfmrrXvvIlcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhlcnIpKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFbJ3N0YXR1cycsICdtZXNzYWdlJywgJ3R5cGUnLCAndGl0bGUnLCAnZGV0YWlsJywgJ2luc3RhbmNlJ10uaW5jbHVkZXMoXG4gICAgICAgICAga2V5XG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBwcm9ibGVtW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwcm9ibGVtXG59XG5cbi8qKlxuICog5qC55o2u54q25oCB56CB6I635Y+W6buY6K6k5qCH6aKYXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRUaXRsZShzdGF0dXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHRpdGxlczogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICA0MDA6ICdCYWQgUmVxdWVzdCcsXG4gICAgNDAxOiAnVW5hdXRob3JpemVkJyxcbiAgICA0MDI6ICdQYXltZW50IFJlcXVpcmVkJyxcbiAgICA0MDM6ICdGb3JiaWRkZW4nLFxuICAgIDQwNDogJ05vdCBGb3VuZCcsXG4gICAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJyxcbiAgICA0MDY6ICdOb3QgQWNjZXB0YWJsZScsXG4gICAgNDA3OiAnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLFxuICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsXG4gICAgNDA5OiAnQ29uZmxpY3QnLFxuICAgIDQxMDogJ0dvbmUnLFxuICAgIDQxMTogJ0xlbmd0aCBSZXF1aXJlZCcsXG4gICAgNDEyOiAnUHJlY29uZGl0aW9uIEZhaWxlZCcsXG4gICAgNDEzOiAnUGF5bG9hZCBUb28gTGFyZ2UnLFxuICAgIDQxNDogJ1VSSSBUb28gTG9uZycsXG4gICAgNDE1OiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsXG4gICAgNDE2OiAnUmFuZ2UgTm90IFNhdGlzZmlhYmxlJyxcbiAgICA0MTc6ICdFeHBlY3RhdGlvbiBGYWlsZWQnLFxuICAgIDQxODogXCJJJ20gYSB0ZWFwb3RcIixcbiAgICA0MjI6ICdVbnByb2Nlc3NhYmxlIEVudGl0eScsXG4gICAgNDIzOiAnTG9ja2VkJyxcbiAgICA0MjQ6ICdGYWlsZWQgRGVwZW5kZW5jeScsXG4gICAgNDI1OiAnVG9vIEVhcmx5JyxcbiAgICA0MjY6ICdVcGdyYWRlIFJlcXVpcmVkJyxcbiAgICA0Mjg6ICdQcmVjb25kaXRpb24gUmVxdWlyZWQnLFxuICAgIDQyOTogJ1RvbyBNYW55IFJlcXVlc3RzJyxcbiAgICA0MzE6ICdSZXF1ZXN0IEhlYWRlciBGaWVsZHMgVG9vIExhcmdlJyxcbiAgICA0NTE6ICdVbmF2YWlsYWJsZSBGb3IgTGVnYWwgUmVhc29ucycsXG4gICAgNTAwOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICA1MDE6ICdOb3QgSW1wbGVtZW50ZWQnLFxuICAgIDUwMjogJ0JhZCBHYXRld2F5JyxcbiAgICA1MDM6ICdTZXJ2aWNlIFVuYXZhaWxhYmxlJyxcbiAgICA1MDQ6ICdHYXRld2F5IFRpbWVvdXQnLFxuICAgIDUwNTogJ0hUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkJyxcbiAgICA1MDY6ICdWYXJpYW50IEFsc28gTmVnb3RpYXRlcycsXG4gICAgNTA3OiAnSW5zdWZmaWNpZW50IFN0b3JhZ2UnLFxuICAgIDUwODogJ0xvb3AgRGV0ZWN0ZWQnLFxuICAgIDUxMDogJ05vdCBFeHRlbmRlZCcsXG4gICAgNTExOiAnTmV0d29yayBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCdcbiAgfVxuXG4gIHJldHVybiB0aXRsZXNbc3RhdHVzXSB8fCAnRXJyb3InXG59XG5cbi8qKlxuICog5bCGIFByb2JsZW0gSlNPTiDmoLzlvI/ljJbkuLrml6Xlv5flrZfnrKbkuLJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFByb2JsZW1Kc29uTG9nKFxuICBwcm9ibGVtOiBQcm9ibGVtSnNvbixcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybClcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW11cblxuICAvLyDmoIfpopjooYxcbiAgY29uc3Qgc3RhdHVzU3RyID0gcHJvYmxlbS5zdGF0dXMudG9TdHJpbmcoKVxuICBjb25zdCBlbW9qaSA9IGdldFN0YXR1c0Vtb2ppKHByb2JsZW0uc3RhdHVzKVxuICBwYXJ0cy5wdXNoKGBcXG4ke2Vtb2ppfSBbSFRUUCAke3N0YXR1c1N0cn1dICR7cmVxdWVzdC5tZXRob2R9ICR7dXJsLnBhdGhuYW1lfWApXG5cbiAgLy8gUHJvYmxlbSBKU09OIOWGheWuuVxuICBwYXJ0cy5wdXNoKGAgIFR5cGU6ICAgICR7cHJvYmxlbS50eXBlfWApXG4gIHBhcnRzLnB1c2goYCAgVGl0bGU6ICAgJHtwcm9ibGVtLnRpdGxlfWApXG4gIGlmIChwcm9ibGVtLmRldGFpbCkge1xuICAgIHBhcnRzLnB1c2goYCAgRGV0YWlsOiAgJHtwcm9ibGVtLmRldGFpbH1gKVxuICB9XG4gIGlmIChwcm9ibGVtLmluc3RhbmNlKSB7XG4gICAgcGFydHMucHVzaChgICBJbnN0YW5jZTogJHtwcm9ibGVtLmluc3RhbmNlfWApXG4gIH1cblxuICAvLyDmianlsZXlrZfmrrVcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IE9iamVjdC5lbnRyaWVzKHByb2JsZW0pLmZpbHRlcihcbiAgICAoW2tleV0pID0+ICFbJ3R5cGUnLCAndGl0bGUnLCAnc3RhdHVzJywgJ2RldGFpbCcsICdpbnN0YW5jZSddLmluY2x1ZGVzKGtleSlcbiAgKVxuICBpZiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgcGFydHMucHVzaCgnICBFeHRlbnNpb25zOicpXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZXh0ZW5zaW9ucykge1xuICAgICAgcGFydHMucHVzaChgICAgICR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignXFxuJylcbn1cblxuZnVuY3Rpb24gZ2V0U3RhdHVzRW1vamkoc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoc3RhdHVzID49IDUwMCkgcmV0dXJuICfwn5S0J1xuICBpZiAoc3RhdHVzID49IDQwMCkgcmV0dXJuICfwn5+hJ1xuICBpZiAoc3RhdHVzID49IDMwMCkgcmV0dXJuICfwn5S1J1xuICBpZiAoc3RhdHVzID49IDIwMCkgcmV0dXJuICfwn5+iJ1xuICByZXR1cm4gJ+Kaqidcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFBLGlCQUFTLGdCQ0FULG9DQUVBLElBQU0sR0FBYSxDQUFDLEVBQWMsSUFBMEIsQ0FDMUQsR0FBSSxFQUFLLFFBQVUsRUFDakIsT0FBTyxFQUFLLE1BQU0sRUFBRyxDQUFLLEVBRzVCLElBQU0sRUFBTyxLQUFLLE9BQU8sRUFBUSxFQUFLLFFBQVUsQ0FBQyxFQUMzQyxFQUFRLEVBQVEsRUFBSyxPQUFTLEVBQ3BDLE1BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxJQUFJLElBQU8sSUFBSSxPQUFPLENBQUssS0FHekMsRUFBZSxDQUFDLElBQTRCLENBQ3ZELElBQU0sRUFBYyxXQUFXLEdBQVUsVUFFbkMsRUFEZSxLQUFLLElBQUksRUFBUSxPQUFRLEVBQVksTUFBTSxFQUM5QixFQUU1QixFQUFNLElBQUcsSUFBSSxPQUFPLENBQVUsS0FDOUIsRUFBTSxJQUFHLElBQUksT0FBTyxDQUFVLEtBQzlCLEVBQVEsSUFBRyxJQUFJLE9BQU8sQ0FBVSxLQUVoQyxFQUFhLElBQUcs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QUN6RCxFQUFzQyxPQUMxQyxHQUFJLEdBQVUsSUFDWixFQUFRLFFBQ0gsUUFBSSxHQUFVLElBQ25CLEVBQVEsVUFHVixFQUFPLElBQUksRUFBTyxFQUFTLENBQUUsUUFBTyxFQUFHLENBQUssRUFDN0MsRUFDQSxRQUFRLEVBQUcsVUFBUyxRQUFPLE9BQU0sT0FBTSxRQUFPLFNBQVUsQ0FNdkQsSUFBTSxFQUFTLEVBQVEsVUFDbkIsRUFBUSxVQUFVLEVBQU8sQ0FBRSxVQUFTLE9BQU0sTUFBSyxDQUFDLEVBQ2hELEVBTUUsRUFBVSxFQUNkLEVBQ0EsRUFDQSxFQUNBLEVBQVEsUUFBUSxPQUFPLGFBQWEsV0FDdEMsRUFnQkEsT0FWQSxFQUFPLGdCQUFnQixFQUFTLEVBQVMsRUFBTyxDQUFPLEVBTXZELEVBQUksT0FBUyxFQUFRLE9BQ3JCLEVBQUksUUFBUSxnQkFBa0IsMkJBR3ZCLEVBQVEsT0FBTyxFQUN2QixFQUVBLEdBQUcsUUFBUSxHQW9DSCIsCiAgImRlYnVnSWQiOiAiMkNFRkU3REUwOTNEMjZBRDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pori15/logixlysia",
3
- "version": "6.0.2",
3
+ "version": "6.0.3",
4
4
  "description": "🦊 Logixlysia is a logger for Elysia",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -241,7 +241,23 @@ class GatewayTimeout extends ProblemError {
241
241
  }
242
242
  }
243
243
 
244
- export const HttpError = {
244
+ export interface HttpErrorConstructor {
245
+ BadRequest: typeof BadRequest
246
+ Unauthorized: typeof Unauthorized
247
+ PaymentRequired: typeof PaymentRequired
248
+ Forbidden: typeof Forbidden
249
+ NotFound: typeof NotFound
250
+ MethodNotAllowed: typeof MethodNotAllowed
251
+ NotAcceptable: typeof NotAcceptable
252
+ Conflict: typeof Conflict
253
+ InternalServerError: typeof InternalServerError
254
+ NotImplemented: typeof NotImplemented
255
+ BadGateway: typeof BadGateway
256
+ ServiceUnavailable: typeof ServiceUnavailable
257
+ GatewayTimeout: typeof GatewayTimeout
258
+ }
259
+
260
+ export const HttpError: HttpErrorConstructor = {
245
261
  BadRequest,
246
262
  Unauthorized,
247
263
  PaymentRequired,
@@ -255,4 +271,4 @@ export const HttpError = {
255
271
  BadGateway,
256
272
  ServiceUnavailable,
257
273
  GatewayTimeout
258
- } as const
274
+ }
package/src/Error/type.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/libs/elysia-http-problem-json/types.ts
2
2
 
3
- import type { HttpError, ProblemError } from './errors'
3
+ import { ProblemError } from "./errors"
4
4
 
5
5
  export type Code =
6
6
  | number
@@ -13,8 +13,6 @@ export type Code =
13
13
  | 'INVALID_COOKIE_SIGNATURE'
14
14
  | 'INVALID_FILE_TYPE'
15
15
 
16
- // 获取 HttpError 对象的所有 Key (例如 "BadRequest" | "NotFound")
17
- export type HttpErrorType = keyof typeof HttpError
18
16
 
19
17
  export interface ErrorContext {
20
18
  request: Request
package/src/index.ts CHANGED
@@ -130,11 +130,11 @@ export const logixlysia = (options: Options = {}): Logixlysia => {
130
130
  // ==========================================
131
131
  // Error Exports
132
132
  // ==========================================
133
- export { HttpError, ProblemError } from './Error/errors'
133
+
134
+ export * from "./Error/errors";
134
135
  export type { ProblemDocument } from './Error/errors'
135
136
  export type {
136
137
  Code,
137
- HttpErrorType,
138
138
  ErrorContext,
139
139
  HttpProblemJsonOptions
140
140
  } from './Error/type'