UNPKG

84.3 kBJavaScriptView Raw
1#!/usr/bin/env node
2var Ue=Object.create;var F=Object.defineProperty,We=Object.defineProperties,ze=Object.getOwnPropertyDescriptor,Ge=Object.getOwnPropertyDescriptors,Je=Object.getOwnPropertyNames,ae=Object.getOwnPropertySymbols,Ke=Object.getPrototypeOf,le=Object.prototype.hasOwnProperty,Qe=Object.prototype.propertyIsEnumerable;var ce=(e,t,o)=>t in e?F(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,h=(e,t)=>{for(var o in t||(t={}))le.call(t,o)&&ce(e,o,t[o]);if(ae)for(var o of ae(t))Qe.call(t,o)&&ce(e,o,t[o]);return e},k=(e,t)=>We(e,Ge(t)),pe=e=>F(e,"__esModule",{value:!0});var ue=(e,t)=>{pe(e);for(var o in t)F(e,o,{get:t[o],enumerable:!0})},Xe=(e,t,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Je(t))!le.call(e,s)&&s!=="default"&&F(e,s,{get:()=>t[s],enumerable:!(o=ze(t,s))||o.enumerable});return e},c=e=>Xe(pe(F(e!=null?Ue(Ke(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);ue(exports,{registerRuntime:()=>K});var Ae=c(require("path")),Ve=c(require("sade"));var Ye="presta",Ze="0.44.4",et="Hyper minimal framework for the modern web.",tt="./dist/index.js",rt="./dist/index.d.ts",ot={presta:"dist/bin.js"},st=["dist"],it={build:"node scripts/build && pnpx tsc --emitDeclarationOnly",cloc:"pnpm dlx cloc './lib/*.ts'",typecheck:"pnpx tsc --noEmit"},nt={type:"git",url:"git+ssh://git@github.com/sure-thing/presta.git"},at="estrattonbailey",lt="MIT",ct={url:"https://github.com/sure-thing/presta/issues"},pt="https://github.com/sure-thing/presta#readme",ut={"@presta/utils":"workspace:^0.1.2",chokidar:"^3.4.3","deep-extend":"^0.6.0",dotenv:"^10.0.0",esbuild:"^0.12.28","esbuild-register":"^2.6.0",filewatcher:"^3.0.1","fs-extra":"^9.0.1","get-port":"^5.1.1",kleur:"^4.1.4","lambda-types":"^1.0.0","mime-types":"^2.1.31","module-alias":"^2.2.2",ms:"^2.1.2",picomatch:"^2.3.0","query-string":"^6.14.1","raw-body":"^2.4.1",regexparam:"^1.3.0","route-sort":"^1.0.0",sade:"^1.7.3",sirv:"^1.0.7",statues:"^1.0.0-alpha1",statuses:"^2.0.1","tiny-glob":"^0.2.9","watch-dependency-graph":"^3.0.1",ws:"^8.4.0"},mt={"@netlify/functions":"^0.7.2","@types/deep-extend":"^0.4.32","@types/fs-extra":"^9.0.12","@types/mime-types":"^2.1.0","@types/picomatch":"^2.2.4","@types/sade":"^1.7.3","@types/statuses":"^2.0.0","@types/ws":"^8.2.2",proxyquire:"^2.1.3","supertest-fetch":"^1.4.3",typescript:"^4.5.2"},me={name:Ye,version:Ze,description:et,main:tt,types:rt,bin:ot,files:st,scripts:it,repository:nt,author:at,license:lt,bugs:ct,homepage:pt,dependencies:ut,devDependencies:mt};var Me=c(require("fs-extra")),$e=c(require("path")),ne=c(require("chokidar"));var X={};ue(X,{Levels:()=>w,colors:()=>D.default,debug:()=>d,error:()=>v,getLogs:()=>dt,info:()=>g,logger:()=>B,newline:()=>bt,raw:()=>gt,warn:()=>O});var D=c(require("kleur"));var y={PRODUCTION:"production",DEVELOPMENT:"development"};var w;(function(r){r.Debug="debug",r.Info="info",r.Warn="warn",r.Err="error"})(w||(w={}));var Q=[],ft={[w.Debug]:"magenta",[w.Info]:"blue",[w.Warn]:"yellow",[w.Err]:"red"};function dt(){if(!process.env.TESTING)throw new Error("Internal method was called outside test mode");return Q}function B(e){if(process.env.TESTING)Q.push(e);else{let t=process.env.PRESTA_DEBUG,o=process.env.PRESTA_ENV===y.PRODUCTION?"prod":"dev";if(!t&&e.level===w.Debug)return;console.log([D.default.gray(o),D.default[ft[e.level||"info"]](e.label),e.message,e.duration?D.default.gray("+"+e.duration):"",e.error?`
3
4${e.error.stack||e.error}
5
6`:""].filter(Boolean).join(" "))}}function d(e){B(h({level:w.Debug},e))}function g(e){B(h({level:w.Info},e))}function O(e){B(h({level:w.Warn},e))}function v(e){B(h({level:w.Err},e))}function gt(...e){process.env.TESTING?Q.push(e):console.log(...e)}function bt(){process.env.TESTING||console.log("")}var fe=c(require("fs")),E=c(require("path")),de=c(require("get-port"));var S="presta.config.js";function j(e){return(0,de.default)({port:parseInt(e,10)})}function L(e,t=!1){let o=E.default.resolve(e||S);try{return delete require.cache[o],require(o)}catch(s){return fe.default.existsSync(o)&&(v({label:"error",error:s}),t&&process.exit(1)),{}}}function M(e,t,o,s=process.cwd()){let r=h({env:e,output:"build",assets:"public",plugins:[],port:4e3,files:[]},o);return t._.length&&(r.files=t._),t.output&&(r.output=t.output),t.assets&&(r.assets=t.assets),t.port&&(r.port=t.port),r.files&&(r.files=[].concat(r.files).map(i=>E.default.resolve(s,i))),r.output&&(r.output=E.default.resolve(s,r.output)),r.assets&&(r.assets=E.default.resolve(s,r.assets)),k(h({},r),{staticOutputDir:E.default.join(r.output,"static"),functionsOutputDir:E.default.join(r.output,"functions"),functionsManifest:E.default.join(r.output,"routes.json")})}var te=c(require("fs-extra")),we=c(require("path")),Pe=c(require("watch-dependency-graph")),Ee=c(require("chokidar")),Se=c(require("picomatch")),Ce=c(require("deep-extend")),Oe=c(require("@presta/utils"));var $=c(require("fs-extra")),ge=c(require("path")),be=c(require("route-sort")),he=c(require("@presta/utils"));function ht(e){return e.replace(process.cwd(),"").split(".").reverse().slice(1).reverse().join("-").split("/").filter(Boolean).join("-")}function N(e,t){let o=e.map(i=>{try{let{route:n}=require(i),p=ht(i),a=ge.default.join(t.functionsOutputDir,t.env===y.PRODUCTION?p+"-"+(0,he.hashContent)($.default.readFileSync(i,"utf8"))+".js":p+".js");return d({label:"debug",message:`generating ${p} lambda`}),delete require.cache[i],delete require.cache[a],$.default.outputFileSync(a,`import { wrapHandler } from 'presta/dist/wrapHandler';
7 import * as file from '${i}';
8 export const route = file.route
9 export const handler = wrapHandler(file)`),[n,a]}catch(n){v({label:"error",error:n})}}).filter(Boolean),s=(0,be.default)(o.map(i=>i[0])),r={};for(let i of s){let n=o.find(p=>p[0]===i);n&&(r[i]=n[1])}return $.default.outputFileSync(t.functionsManifest,JSON.stringify(r)),o}var Y=c(require("fs-extra")),ye=c(require("path")),ve=c(require("tiny-glob/sync"));function H(e){return/export\s.+\sroute\s+\=/.test(Y.default.readFileSync(e,"utf-8"))}function q(e){return/export\s.+\sgetStaticPaths/.test(Y.default.readFileSync(e,"utf-8"))}function _(e){return[].concat(e).map(t=>(0,ve.default)(t)).flat().map(t=>ye.default.resolve(process.cwd(),t))}var Z=c(require("fs-extra")),ee=c(require("path")),xe=c(require("mime-types")),V=c(require("@presta/utils"));function yt(e){return typeof e=="object"?JSON.stringify(e):e}function vt(e){let t={};for(let o of Object.keys(e)){let s=o.toLowerCase(),r=e[o];t[s]=r||""}return t}function I(e){let{isBase64Encoded:t=!1,statusCode:o=200,headers:s={},multiValueHeaders:r={},body:i="",html:n=void 0,json:p=void 0,xml:a=void 0}=typeof e=="string"?{body:e}:e,l="text/html; charset=utf-8";p?l="application/json; charset=utf-8":a&&(l="application/xml; charset=utf-8");let m=vt(s),u=h({"content-type":l},m);return{isBase64Encoded:t,statusCode:o,headers:u,multiValueHeaders:r,body:yt(i||n||p||a||"")}}function A({port:e}){return`
10 <script>
11 (function (global) {
12 var socket = new WebSocket('ws://localhost:${e}');
13
14 socket.addEventListener('open', function (event) {
15 console.log('[presta] connected on port ${e}')
16 });
17
18 socket.addEventListener('message', function (event) {
19 console.log(\`'[presta] received \${event.data}\`)
20 if (event.data === 'refresh') {
21 global.location.reload();
22 }
23 });
24
25 socket.addEventListener('close', function () {
26 console.log('[presta] disconnected')
27 });
28 })(this);
29 <\/script>
30 `}function xt(e,t="html"){return ee.default.extname(e)?e:t==="html"?`${e}/index.html`:`${e}.${t}`}async function U(e){return d({label:"debug",message:`removing old static file ${e}`}),Z.default.remove(e)}async function wt(e){return Promise.all(e.map(U))}async function Pt(e,t,{footer:o}){let s=require(e),r=await s.getStaticPaths(),i=[];if(!r||!r.length)return i;for(let n of r){let p=(0,V.timer)(),a={path:n,pathParameters:s.route?(0,V.parsePathParameters)(n,s.route):{}},l=I(await s.handler(a,{})),m=((l==null?void 0:l.headers)||{})["content-type"],u=xe.default.extension(m)||"html",b=xt(n,u),x=l.body+(u==="html"?o:""),R=ee.default.join(t,b);Z.default.outputFileSync(R,x,"utf-8"),g({label:"built",message:n,duration:p()}),i.push(R)}return i}async function W(e,t,o={}){let s=t.env===y.DEVELOPMENT,r=t.staticOutputDir,i=s?A({port:t.port}):"";for(let n of e)try{let p=n.replace(process.cwd(),""),a=o[n]||[],l=await Pt(n,r,{footer:i});if(!l||!l.length){O({label:"paths",message:`${p} - no paths to render`}),wt(a);continue}for(let m of a)l.includes(m)||U(m);o[n]=l}catch(p){v({label:"error",error:p});break}return{staticFilesMap:o}}function Re(e,t){let o=(0,Oe.timer)();N(e,t),e.length&&g({label:"built",message:"lambdas",duration:o()})}function Et(e,t,o){return(0,Se.default)(t)(e)&&!o.includes(e)}async function ke(e,t){let o={},s=_(e.files);s.length||O({label:"paths",message:"no files configured"});async function r(a,l,m){if(delete require.cache[a],q(a)){let u=await W([a],m,o);o=(0,Ce.default)({},o,u.staticFilesMap)}Re(l.filter(H),m)}async function i(a,l,m){for(let u of a)await r(u,l,m)}await i(s,s,e),t.emitBrowserRefresh();let n=(0,Pe.create)({alias:{"@":process.cwd()}});n.onChange(async a=>{await i(a,s,e),t.emitBrowserRefresh()}),n.onRemove(async([a])=>{d({label:"watch",message:`removed ${a}`}),s.splice(s.indexOf(a),1),Re(s.filter(H),e),(o[a]||[]).forEach(l=>U(we.default.join(e.staticOutputDir,l))),t.emitBrowserRefresh()}),n.onError(a=>{v({label:"error",error:typeof a=="string"?new Error(a):a})}),await n.add(s);let p=Ee.default.watch(process.cwd(),{ignoreInitial:!0,ignored:[e.output,e.assets]});return p.on("add",async a=>{!te.default.existsSync(a)||te.default.lstatSync(a).isDirectory()||!Et(a,e.files,s)||(d({label:"watch",message:`add ${a}`}),s.push(a),await n.add(a),await r(a,s,e),t.emitBrowserRefresh())}),t.onBuildFile(async({file:a})=>{await r(a,s,e),t.emitBrowserRefresh()}),{async close(){await n.close(),await p.close()}}}async function z(e,t,o){let s=await Promise.all(e.map(r=>{try{return r(t,o)}catch(i){v({label:"error",error:i})}}).filter(Boolean));return{async cleanup(){return Promise.all(s.map(r=>r&&r.cleanup&&r.cleanup()))}}}var Fe;(function(s){s.PostBuild="post-build",s.BuildFile="build-file",s.BrowserRefresh="browser-refresh"})(Fe||(Fe={}));function G(){let e={};function t(i,...n){e[i]&&e[i].map(p=>p(...n))}function o(i,n){return e[i]=e[i]?e[i].concat(n):[n],()=>e[i].splice(e[i].indexOf(n),1)}function s(){e={}}function r(i){return e[i]||[]}return{emit:t,on:o,clear:s,listeners:r}}function J(e){return{emitPostBuild(t){e.emit("postBuild",t)},onPostBuild(t){return e.on("postBuild",t)},emitBuildFile(t){e.emit("buildFile",t)},onBuildFile(t){return e.on("buildFile",t)},emitBrowserRefresh(){e.emit("browserRefresh")},onBrowserRefresh(t){return e.on("browserRefresh",t)}}}var De=c(require("path")),re=c(require("fs-extra")),Be=c(require("esbuild")),C=c(require("@presta/utils"));async function He(e,t){let o=(0,C.timer)(),s=_(e.files),r=s.filter(q),i=s.filter(H);if(d({label:"build",message:"starting build"}),!r.length&&!i.length)O({label:"files",message:"no files were found, nothing to build"});else{let n="",p=0,a="",l="",m=await Promise.allSettled([(async()=>{if(r.length){let u=(0,C.timer)(),{staticFilesMap:b}=await W(r,e);n=u(),p=Object.keys(b).reduce((x,R)=>x+=b[R].length,0)}})(),(async()=>{if(i.length){let u=(0,C.timer)(),b=(0,C.requireSafe)(De.default.join(process.cwd(),"package.json"));N(i,e),await(0,Be.build)({entryPoints:Object.values(require(e.functionsManifest)),outdir:e.functionsOutputDir,platform:"node",target:["node12"],minify:!0,allowOverwrite:!0,external:Object.keys(b.dependencies||{}),bundle:!0,define:{"process.env.PRESTA_SERVERLESS_RUNTIME":"true"}}),a=u()}})(),(async()=>{if(re.default.existsSync(e.assets)){let u=(0,C.timer)();re.default.copySync(e.assets,e.staticOutputDir),l=u()}})()]);if(m.find(u=>u.status==="rejected"))throw d({label:"build",message:"build partially failed"}),m.forEach(u=>{u.status==="rejected"&&v({label:"error",error:u.reason})}),new Error("presta build failed");n&&g({label:"static",message:`rendered ${p} file(s)`,duration:n}),a&&g({label:"lambda",message:`compiled ${i.length} function(s)`,duration:a}),l&&g({label:"assets",message:"copied",duration:l}),t.emitPostBuild({output:e.output,staticOutput:e.staticOutputDir,functionsOutput:e.functionsOutputDir,functionsManifest:(0,C.requireSafe)(e.functionsManifest)}),(n||a)&&g({label:"build",message:"complete",duration:o()})}}var Ie=c(require("http")),oe=c(require("sirv")),Te=c(require("mime-types")),je=c(require("regexparam")),se=c(require("statuses")),Le=c(require("ws")),P=c(require("@presta/utils"));function St(e,t){let o=new Error(t);return o.statusCode=e,o}function Ct(e){let t=((e==null?void 0:e.headers)||{})["content-type"];return Te.default.extension(t)||"html"}function Ot(e,t){let s=Object.keys(t).map(r=>({matcher:(0,je.default)(r),route:r})).filter(({matcher:r})=>r.pattern.test(e.split("?")[0])).map(({route:r})=>t[r])[0];return s?require(s):void 0}async function Rt(e,t){let o=e.headers.Accept||e.headers.accept,s=o&&o.includes("json");try{if(!t||!t.handler)throw St(404,"");return I(await t.handler(e,{awsRequestId:"presta dev"}))}catch(r){let i=r,{statusCode:n=500}=i;return n>499&&v({label:"error",message:i.message||se.default.message[n],error:i}),I({statusCode:n,html:s?void 0:(0,P.createDefaultHtmlResponse)({statusCode:n}),json:s?{detail:se.default.message[n]}:void 0})}}function kt({port:e,config:t}){return async function(s,r){var b;let i=(0,P.timer)(),n=await(0,P.requestToEvent)(s),p=(0,P.requireFresh)(t.functionsManifest),a=Ot(n.path,p),l=await Rt(n,a),m=l.statusCode>299&&l.statusCode<399;Ct(l)==="html"&&(l.body=(l.body||"").split("</body>")[0]+A({port:e})),(0,P.sendServerlessResponse)(r,l),X[l.statusCode<299?"info":"error"]({label:"serve",message:`${l.statusCode} ${m&&((b=l==null?void 0:l.headers)==null?void 0:b.Location)||n.path}`,duration:i()})}}function Ft({port:e,config:t}){let o=t.staticOutputDir,s=t.assets;return async function(i,n){let p=(0,P.timer)(),a=i.url;d({label:"debug",message:`handling ${a}`});function l(m,u){g({label:"serve",message:`${m.statusCode} ${u}`,duration:p()})}(0,oe.default)(s,{dev:!0,setHeaders:l})(i,n,()=>{(0,oe.default)(o,{dev:!0,setHeaders:l})(i,n,async()=>{kt({port:e,config:t})(i,n)})})}}function ie(e,t){let o=e.port,s=Ie.default.createServer(Ft({port:o,config:e})).listen(o),r=new Le.WebSocketServer({server:s}),i=[];return s.on("connection",n=>{i.push(n),n.on("close",()=>i.splice(i.indexOf(n),1))}),t.onBrowserRefresh(()=>{d({label:"debug",message:"refresh event received"}),r.clients.forEach(n=>n.send("refresh"))}),{async close(){return new Promise(n=>{s.close(()=>n(1)),i.forEach(p=>p.destroy())})}}}async function Ne(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=G(),r=J(s),i=M(y.PRODUCTION,k(h({},e),{port:o}),t);await z(i.plugins,i,r),Me.default.emptyDirSync(i.output),g({label:"build"}),await He(i,r)}async function qe(e){let t=e["no-serve"],o,s,r=!1;async function i(){let p,a,l,m=L(e.config);(!s||m.port&&s!==m.port)&&(s=await j(e.port||m.port||4e3),process.env.PRESTA_SERVE_URL=`http://localhost:${s}`);let u=G(),b=J(u),x=M(y.DEVELOPMENT,k(h({},e),{port:s}),m),R=await z(x.plugins,x,b);return d({label:"debug",message:`config created ${JSON.stringify(x)}`}),t||(a=ie(x,b),l=ne.default.watch(x.assets,{ignoreInitial:!0}).on("all",()=>{b.emitBrowserRefresh()})),g({label:r?"restart":"start",message:t?"":`http://localhost:${x.port}`}),p=await ke(x,b),{config:x,async close(){u.clear(),await R.cleanup(),await l.close(),await p.close(),a&&await a.close()}}}let n=ne.default.watch($e.default.resolve(e.config||S),{ignoreInitial:!0}).on("all",async()=>{if(!r){r=!0;try{await o.close()}catch(p){console.error(p)}console.clear(),o=await i(),r=!1}});return o=await i(),{async close(){await n.close(),await o.close()}}}async function _e(e){let t=L(e.config,!0),o=await j(e.port||t.port||4e3),s=G(),r=J(s),i=M(y.PRODUCTION,k(h({},e),{port:o}),t);await z(i.plugins,i,r),ie(i,r),g({label:"serve",message:`http://localhost:${i.port}`})}function K(e={}){require("dotenv").config({path:Ae.default.join(process.cwd(),".env")}),require("module-alias").addAliases({"@":process.cwd(),"presta:internal":__dirname}),require("esbuild-register/dist/node").register(e)}var T=(0,Ve.default)("presta");T.version(me.version).option("--config, -c",`Path to a config file. (default ${S})`).option("--output, -o","Specify output directory for built files. (default ./build)").option("--assets, -a","Specify static asset directory. (default ./public)").option("--debug, -d","Enable debug mode (prints more logs)").example("dev index.jsx -o dist").example("dev 'pages/*.tsx' -o static").example("'pages/*.tsx'").example("-c site.json").example("serve -p 8080");T.command("build","Build project to output directory.",{default:!0}).example("").example("files/**/*.js").example(`-c ${S}`).action(e=>{process.env.PRESTA_ENV=y.PRODUCTION,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),K(),Ne(e)});T.command("dev","Start Presta dev server and watch files",{alias:"watch"}).option("--port, -p","Port to run the local server. (default 4000)").option("--no-serve, -n","Do not run local dev server. (default false)").describe("Watch project and build to output directory.").example("dev").example("dev ./files/**/*.js").example("dev ./files/**/*.js -o ./out").example(`dev -c ${S}`).action(e=>{process.env.PRESTA_ENV=y.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),K(),qe(e)});T.command("serve").option("--port, -p","Port to run the local server. (default 4000)").describe("Serve built files, lambdas, and static assets.").example("serve").example("serve -o ./out -p 8080").example(`serve -c ${S}`).action(async e=>{process.env.PRESTA_ENV=y.DEVELOPMENT,process.env.PRESTA_DEBUG=e.debug?"debug":"",console.clear(),K(),_e(e)});T.parse(process.argv);0&&(module.exports={registerRuntime});
31//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbGliL2Jpbi50cyIsICIuLi9saWIvY2xpLnRzIiwgIi4uL2xpYi9sb2cudHMiLCAiLi4vbGliL2NvbnN0YW50cy50cyIsICIuLi9saWIvY29uZmlnLnRzIiwgIi4uL2xpYi93YXRjaC50cyIsICIuLi9saWIvb3V0cHV0TGFtYmRhcy50cyIsICIuLi9saWIvZ2V0RmlsZXMudHMiLCAiLi4vbGliL2J1aWxkU3RhdGljRmlsZXMudHMiLCAiLi4vbGliL25vcm1hbGl6ZVJlc3BvbnNlLnRzIiwgIi4uL2xpYi91dGlscy50cyIsICIuLi9saWIvcGx1Z2lucy50cyIsICIuLi9saWIvY3JlYXRlRW1pdHRlci50cyIsICIuLi9saWIvYnVpbGQudHMiLCAiLi4vbGliL3NlcnZlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgc2FkZSBmcm9tICdzYWRlJ1xuXG5pbXBvcnQgcGtnIGZyb20gJy4uL3BhY2thZ2UuanNvbidcblxuaW1wb3J0IHsgYnVpbGRDb21tYW5kLCBkZXZDb21tYW5kLCBzZXJ2ZUNvbW1hbmQgfSBmcm9tICcuL2NsaSdcbmltcG9ydCB7IGRlZmF1bHRDb25maWdGaWxlcGF0aCB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclJ1bnRpbWUob3B0aW9ucyA9IHt9KSB7XG4gIHJlcXVpcmUoJ2RvdGVudicpLmNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLmVudicpIH0pXG5cbiAgcmVxdWlyZSgnbW9kdWxlLWFsaWFzJykuYWRkQWxpYXNlcyh7XG4gICAgJ0AnOiBwcm9jZXNzLmN3ZCgpLFxuICAgICdwcmVzdGE6aW50ZXJuYWwnOiBfX2Rpcm5hbWUsIC8vIFRPRE8gd2hlcmV2ZXIgdGhpcyBpcyBydW5uaW5nIGZyb21cbiAgfSlcblxuICByZXF1aXJlKCdlc2J1aWxkLXJlZ2lzdGVyL2Rpc3Qvbm9kZScpLnJlZ2lzdGVyKG9wdGlvbnMpXG59XG5cbmNvbnN0IHByb2dyYW0gPSBzYWRlKCdwcmVzdGEnKVxuXG5wcm9ncmFtXG4gIC52ZXJzaW9uKHBrZy52ZXJzaW9uKVxuICAvLyBkbyBub3QgcHJvdmlkZSBkZWZhdWx0IGNvbmZpZyBoZXJlXG4gIC5vcHRpb24oJy0tY29uZmlnLCAtYycsIGBQYXRoIHRvIGEgY29uZmlnIGZpbGUuICAoZGVmYXVsdCAke2RlZmF1bHRDb25maWdGaWxlcGF0aH0pYClcbiAgLm9wdGlvbignLS1vdXRwdXQsIC1vJywgYFNwZWNpZnkgb3V0cHV0IGRpcmVjdG9yeSBmb3IgYnVpbHQgZmlsZXMuICAoZGVmYXVsdCAuL2J1aWxkKWApXG4gIC5vcHRpb24oJy0tYXNzZXRzLCAtYScsIGBTcGVjaWZ5IHN0YXRpYyBhc3NldCBkaXJlY3RvcnkuICAoZGVmYXVsdCAuL3B1YmxpYylgKVxuICAub3B0aW9uKCctLWRlYnVnLCAtZCcsIGBFbmFibGUgZGVidWcgbW9kZSAocHJpbnRzIG1vcmUgbG9ncylgKVxuICAuZXhhbXBsZShgZGV2IGluZGV4LmpzeCAtbyBkaXN0YClcbiAgLmV4YW1wbGUoYGRldiAncGFnZXMvKi50c3gnIC1vIHN0YXRpY2ApXG4gIC5leGFtcGxlKGAncGFnZXMvKi50c3gnYClcbiAgLmV4YW1wbGUoYC1jIHNpdGUuanNvbmApXG4gIC5leGFtcGxlKGBzZXJ2ZSAtcCA4MDgwYClcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnYnVpbGQnLCAnQnVpbGQgcHJvamVjdCB0byBvdXRwdXQgZGlyZWN0b3J5LicsIHsgZGVmYXVsdDogdHJ1ZSB9KVxuICAuZXhhbXBsZShgYClcbiAgLmV4YW1wbGUoYGZpbGVzLyoqLyouanNgKVxuICAuZXhhbXBsZShgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbigob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuUFJPRFVDVElPTlxuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVRyA9IG9wdGlvbnMuZGVidWcgPyAnZGVidWcnIDogJydcbiAgICBjb25zb2xlLmNsZWFyKClcbiAgICByZWdpc3RlclJ1bnRpbWUoKVxuICAgIGJ1aWxkQ29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdkZXYnLCAnU3RhcnQgUHJlc3RhIGRldiBzZXJ2ZXIgYW5kIHdhdGNoIGZpbGVzJywgeyBhbGlhczogJ3dhdGNoJyB9KVxuICAub3B0aW9uKCctLXBvcnQsIC1wJywgYFBvcnQgdG8gcnVuIHRoZSBsb2NhbCBzZXJ2ZXIuICAoZGVmYXVsdCA0MDAwKWApXG4gIC5vcHRpb24oJy0tbm8tc2VydmUsIC1uJywgYERvIG5vdCBydW4gbG9jYWwgZGV2IHNlcnZlci4gIChkZWZhdWx0IGZhbHNlKWApXG4gIC5kZXNjcmliZSgnV2F0Y2ggcHJvamVjdCBhbmQgYnVpbGQgdG8gb3V0cHV0IGRpcmVjdG9yeS4nKVxuICAuZXhhbXBsZShgZGV2YClcbiAgLmV4YW1wbGUoYGRldiAuL2ZpbGVzLyoqLyouanNgKVxuICAuZXhhbXBsZShgZGV2IC4vZmlsZXMvKiovKi5qcyAtbyAuL291dGApXG4gIC5leGFtcGxlKGBkZXYgLWMgJHtkZWZhdWx0Q29uZmlnRmlsZXBhdGh9YClcbiAgLmFjdGlvbigob3B0aW9ucykgPT4ge1xuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPSBFbnYuREVWRUxPUE1FTlRcbiAgICBwcm9jZXNzLmVudi5QUkVTVEFfREVCVUcgPSBvcHRpb25zLmRlYnVnID8gJ2RlYnVnJyA6ICcnXG4gICAgY29uc29sZS5jbGVhcigpXG4gICAgcmVnaXN0ZXJSdW50aW1lKClcbiAgICBkZXZDb21tYW5kKG9wdGlvbnMpXG4gIH0pXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3NlcnZlJylcbiAgLm9wdGlvbignLS1wb3J0LCAtcCcsIGBQb3J0IHRvIHJ1biB0aGUgbG9jYWwgc2VydmVyLiAgKGRlZmF1bHQgNDAwMClgKVxuICAuZGVzY3JpYmUoJ1NlcnZlIGJ1aWx0IGZpbGVzLCBsYW1iZGFzLCBhbmQgc3RhdGljIGFzc2V0cy4nKVxuICAuZXhhbXBsZShgc2VydmVgKVxuICAuZXhhbXBsZShgc2VydmUgLW8gLi9vdXQgLXAgODA4MGApXG4gIC5leGFtcGxlKGBzZXJ2ZSAtYyAke2RlZmF1bHRDb25maWdGaWxlcGF0aH1gKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgcHJvY2Vzcy5lbnYuUFJFU1RBX0VOViA9IEVudi5ERVZFTE9QTUVOVFxuICAgIHByb2Nlc3MuZW52LlBSRVNUQV9ERUJVRyA9IG9wdGlvbnMuZGVidWcgPyAnZGVidWcnIDogJydcbiAgICBjb25zb2xlLmNsZWFyKClcbiAgICByZWdpc3RlclJ1bnRpbWUoKVxuICAgIHNlcnZlQ29tbWFuZChvcHRpb25zKVxuICB9KVxuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJ1xuXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi9sb2cnXG5pbXBvcnQgeyBPcHRpb25zLCBjcmVhdGUsIGdldENvbmZpZ0ZpbGUsIGRlZmF1bHRDb25maWdGaWxlcGF0aCwgZ2V0QXZhaWxhYmxlUG9ydCB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICcuL3dhdGNoJ1xuaW1wb3J0IHsgaW5pdFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbnMnXG5pbXBvcnQgeyBjcmVhdGVFbWl0dGVyLCBjcmVhdGVIb29rcyB9IGZyb20gJy4vY3JlYXRlRW1pdHRlcidcbmltcG9ydCB7IGJ1aWxkIH0gZnJvbSAnLi9idWlsZCdcbmltcG9ydCB7IHNlcnZlIH0gZnJvbSAnLi9zZXJ2ZSdcbmltcG9ydCB7IEVudiB9IGZyb20gJy4vY29uc3RhbnRzJ1xuXG5leHBvcnQgdHlwZSBQcmVzdGFDTElPcHRpb25zID0ge1xuICBjb25maWc/OiBzdHJpbmdcbiAgb3V0cHV0Pzogc3RyaW5nXG4gIGRlYnVnPzogYm9vbGVhblxufSAmIFBhcnRpYWw8T3B0aW9ucz5cblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJQnVpbGRPcHRpb25zID0gUHJlc3RhQ0xJT3B0aW9ucyAmIHtcbiAgXzogc3RyaW5nW11cbn1cblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJU2VydmVPcHRpb25zID0gUHJlc3RhQ0xJQnVpbGRPcHRpb25zICYge1xuICBwb3J0Pzogc3RyaW5nXG4gICduby1zZXJ2ZSc6IGJvb2xlYW5cbn1cblxuZXhwb3J0IHR5cGUgUHJlc3RhQ0xJRGV2T3B0aW9ucyA9IFByZXN0YUNMSVNlcnZlT3B0aW9uc1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSUJ1aWxkT3B0aW9ucykge1xuICBjb25zdCBjb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZywgdHJ1ZSlcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IGNvbmZpZ0ZpbGUucG9ydCB8fCA0MDAwKVxuXG4gIGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKClcbiAgY29uc3QgaG9va3MgPSBjcmVhdGVIb29rcyhlbWl0dGVyKVxuICBjb25zdCBjb25maWcgPSBjcmVhdGUoRW52LlBST0RVQ1RJT04sIHsgLi4ub3B0aW9ucywgcG9ydCB9LCBjb25maWdGaWxlKVxuICBhd2FpdCBpbml0UGx1Z2lucyhjb25maWcucGx1Z2lucywgY29uZmlnLCBob29rcylcblxuICBmcy5lbXB0eURpclN5bmMoY29uZmlnLm91dHB1dClcblxuICBsb2dnZXIuaW5mbyh7XG4gICAgbGFiZWw6ICdidWlsZCcsXG4gIH0pXG5cbiAgYXdhaXQgYnVpbGQoY29uZmlnLCBob29rcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldkNvbW1hbmQob3B0aW9uczogUHJlc3RhQ0xJRGV2T3B0aW9ucykge1xuICBjb25zdCBub1NlcnZlID0gb3B0aW9uc1snbm8tc2VydmUnXVxuICBsZXQgZGV2U2VydmVyOiBhbnlcbiAgbGV0IHBvcnQ6IG51bWJlclxuICBsZXQgcmVzdGFydGluZyA9IGZhbHNlXG5cbiAgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoKSB7XG4gICAgbGV0IHdhdGNoVGFzazogYW55XG4gICAgbGV0IGh0dHBTZXJ2ZXI6IFJldHVyblR5cGU8dHlwZW9mIHNlcnZlPlxuICAgIGxldCBzdGF0aWNBc3NldFdhdGNoZXI6IFJldHVyblR5cGU8dHlwZW9mIGNob2tpZGFyLndhdGNoPlxuXG4gICAgY29uc3QgdXNlckNvbmZpZ0ZpbGUgPSBnZXRDb25maWdGaWxlKG9wdGlvbnMuY29uZmlnKVxuXG4gICAgaWYgKCFwb3J0IHx8ICh1c2VyQ29uZmlnRmlsZS5wb3J0ICYmIHBvcnQgIT09IHVzZXJDb25maWdGaWxlLnBvcnQpKSB7XG4gICAgICBwb3J0ID0gYXdhaXQgZ2V0QXZhaWxhYmxlUG9ydChvcHRpb25zLnBvcnQgfHwgdXNlckNvbmZpZ0ZpbGUucG9ydCB8fCA0MDAwKVxuICAgICAgcHJvY2Vzcy5lbnYuUFJFU1RBX1NFUlZFX1VSTCA9IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gXG4gICAgfVxuXG4gICAgY29uc3QgZW1pdHRlciA9IGNyZWF0ZUVtaXR0ZXIoKVxuICAgIGNvbnN0IGhvb2tzID0gY3JlYXRlSG9va3MoZW1pdHRlcilcbiAgICBjb25zdCBjb25maWcgPSBjcmVhdGUoRW52LkRFVkVMT1BNRU5ULCB7IC4uLm9wdGlvbnMsIHBvcnQgfSwgdXNlckNvbmZpZ0ZpbGUpXG4gICAgY29uc3QgcGx1Z2lucyA9IGF3YWl0IGluaXRQbHVnaW5zKGNvbmZpZy5wbHVnaW5zLCBjb25maWcsIGhvb2tzKVxuXG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYGNvbmZpZyBjcmVhdGVkICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnKX1gLFxuICAgIH0pXG5cbiAgICBpZiAoIW5vU2VydmUpIHtcbiAgICAgIGh0dHBTZXJ2ZXIgPSBzZXJ2ZShjb25maWcsIGhvb2tzKVxuXG4gICAgICBzdGF0aWNBc3NldFdhdGNoZXIgPSBjaG9raWRhci53YXRjaChjb25maWcuYXNzZXRzLCB7IGlnbm9yZUluaXRpYWw6IHRydWUgfSkub24oJ2FsbCcsICgpID0+IHtcbiAgICAgICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZWw6IHJlc3RhcnRpbmcgPyAncmVzdGFydCcgOiAnc3RhcnQnLFxuICAgICAgbWVzc2FnZTogIW5vU2VydmUgPyBgaHR0cDovL2xvY2FsaG9zdDoke2NvbmZpZy5wb3J0fWAgOiAnJyxcbiAgICB9KVxuXG4gICAgd2F0Y2hUYXNrID0gYXdhaXQgd2F0Y2goY29uZmlnLCBob29rcylcblxuICAgIHJldHVybiB7XG4gICAgICBjb25maWcsXG4gICAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgICAgZW1pdHRlci5jbGVhcigpXG4gICAgICAgIGF3YWl0IHBsdWdpbnMuY2xlYW51cCgpXG4gICAgICAgIGF3YWl0IHN0YXRpY0Fzc2V0V2F0Y2hlci5jbG9zZSgpXG4gICAgICAgIGF3YWl0IHdhdGNoVGFzay5jbG9zZSgpXG5cbiAgICAgICAgaWYgKGh0dHBTZXJ2ZXIpIHtcbiAgICAgICAgICBhd2FpdCBodHRwU2VydmVyLmNsb3NlKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb25maWdXYXRjaGVyID0gY2hva2lkYXJcbiAgICAud2F0Y2gocGF0aC5yZXNvbHZlKG9wdGlvbnMuY29uZmlnIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aCksIHsgaWdub3JlSW5pdGlhbDogdHJ1ZSB9KVxuICAgIC5vbignYWxsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHJlc3RhcnRpbmcpIHJldHVyblxuXG4gICAgICByZXN0YXJ0aW5nID0gdHJ1ZVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBkZXZTZXJ2ZXIuY2xvc2UoKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICB9XG5cbiAgICAgIGNvbnNvbGUuY2xlYXIoKVxuXG4gICAgICBkZXZTZXJ2ZXIgPSBhd2FpdCBzdGFydERldlNlcnZlcigpXG5cbiAgICAgIHJlc3RhcnRpbmcgPSBmYWxzZVxuICAgIH0pXG5cbiAgZGV2U2VydmVyID0gYXdhaXQgc3RhcnREZXZTZXJ2ZXIoKVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgY2xvc2UoKSB7XG4gICAgICBhd2FpdCBjb25maWdXYXRjaGVyLmNsb3NlKClcbiAgICAgIGF3YWl0IGRldlNlcnZlci5jbG9zZSgpXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VydmVDb21tYW5kKG9wdGlvbnM6IFByZXN0YUNMSVNlcnZlT3B0aW9ucykge1xuICBjb25zdCBjb25maWdGaWxlID0gZ2V0Q29uZmlnRmlsZShvcHRpb25zLmNvbmZpZywgdHJ1ZSlcbiAgY29uc3QgcG9ydCA9IGF3YWl0IGdldEF2YWlsYWJsZVBvcnQob3B0aW9ucy5wb3J0IHx8IGNvbmZpZ0ZpbGUucG9ydCB8fCA0MDAwKVxuXG4gIGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKClcbiAgY29uc3QgaG9va3MgPSBjcmVhdGVIb29rcyhlbWl0dGVyKVxuICBjb25zdCBjb25maWcgPSBjcmVhdGUoRW52LlBST0RVQ1RJT04sIHsgLi4ub3B0aW9ucywgcG9ydCB9LCBjb25maWdGaWxlKVxuICBhd2FpdCBpbml0UGx1Z2lucyhjb25maWcucGx1Z2lucywgY29uZmlnLCBob29rcylcblxuICBzZXJ2ZShjb25maWcsIGhvb2tzKVxuXG4gIGxvZ2dlci5pbmZvKHtcbiAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICBtZXNzYWdlOiBgaHR0cDovL2xvY2FsaG9zdDoke2NvbmZpZy5wb3J0fWAsXG4gIH0pXG59XG4iLCAiaW1wb3J0IGMsIHsgS2xldXIgfSBmcm9tICdrbGV1cidcblxuaW1wb3J0IHsgRW52IH0gZnJvbSAnLi9jb25zdGFudHMnXG5cbmV4cG9ydCBlbnVtIExldmVscyB7XG4gIERlYnVnID0gJ2RlYnVnJyxcbiAgSW5mbyA9ICdpbmZvJyxcbiAgV2FybiA9ICd3YXJuJyxcbiAgRXJyID0gJ2Vycm9yJyxcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZSA9IHtcbiAgbGV2ZWw/OiBMZXZlbHNcbiAgbGFiZWw6IHN0cmluZyB8IG51bWJlclxuICBtZXNzYWdlPzogc3RyaW5nXG4gIGR1cmF0aW9uPzogc3RyaW5nIHwgbnVtYmVyXG4gIGVycm9yPzogRXJyb3Jcbn1cblxubGV0IGxvZ3M6IGFueVtdID0gW11cblxuY29uc3QgY29sb3JzID0ge1xuICBbTGV2ZWxzLkRlYnVnXTogJ21hZ2VudGEnLFxuICBbTGV2ZWxzLkluZm9dOiAnYmx1ZScsXG4gIFtMZXZlbHMuV2Fybl06ICd5ZWxsb3cnLFxuICBbTGV2ZWxzLkVycl06ICdyZWQnLFxufVxuXG5leHBvcnQgeyBjIGFzIGNvbG9ycyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dzKCkge1xuICBpZiAoIXByb2Nlc3MuZW52LlRFU1RJTkcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIG1ldGhvZCB3YXMgY2FsbGVkIG91dHNpZGUgdGVzdCBtb2RlJylcbiAgfVxuXG4gIHJldHVybiBsb2dzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dnZXIobWVzc2FnZTogTWVzc2FnZSkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIGxvZ3MucHVzaChtZXNzYWdlKVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGRlYnVnID0gcHJvY2Vzcy5lbnYuUFJFU1RBX0RFQlVHXG4gICAgY29uc3QgY29udGV4dCA9IHByb2Nlc3MuZW52LlBSRVNUQV9FTlYgPT09IEVudi5QUk9EVUNUSU9OID8gJ3Byb2QnIDogJ2RldidcblxuICAgIGlmICghZGVidWcgJiYgbWVzc2FnZS5sZXZlbCA9PT0gTGV2ZWxzLkRlYnVnKSByZXR1cm5cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgW1xuICAgICAgICBjLmdyYXkoY29udGV4dCksXG4gICAgICAgIGNbY29sb3JzW21lc3NhZ2UubGV2ZWwgfHwgJ2luZm8nXSBhcyBrZXlvZiBLbGV1cl0obWVzc2FnZS5sYWJlbCksXG4gICAgICAgIG1lc3NhZ2UubWVzc2FnZSxcbiAgICAgICAgbWVzc2FnZS5kdXJhdGlvbiA/IGMuZ3JheSgnKycgKyBtZXNzYWdlLmR1cmF0aW9uKSA6ICcnLFxuICAgICAgICBtZXNzYWdlLmVycm9yID8gYFxcblxcbiR7bWVzc2FnZS5lcnJvci5zdGFjayB8fCBtZXNzYWdlLmVycm9yfVxcblxcbmAgOiAnJyxcbiAgICAgIF1cbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuam9pbignICcpXG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1ZyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gIGxvZ2dlcih7IGxldmVsOiBMZXZlbHMuRGVidWcsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZm8obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLkluZm8sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm4obWVzc2FnZTogTWVzc2FnZSkge1xuICBsb2dnZXIoeyBsZXZlbDogTGV2ZWxzLldhcm4sIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgbG9nZ2VyKHsgbGV2ZWw6IExldmVscy5FcnIsIC4uLm1lc3NhZ2UgfSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhdyguLi5hcmdzOiBhbnlbXSkge1xuICBpZiAocHJvY2Vzcy5lbnYuVEVTVElORykge1xuICAgIGxvZ3MucHVzaChhcmdzKVxuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld2xpbmUoKSB7XG4gIGlmIChwcm9jZXNzLmVudi5URVNUSU5HKSByZXR1cm5cbiAgY29uc29sZS5sb2coJycpXG59XG4iLCAiZXhwb3J0IGNvbnN0IEVudiA9IHtcbiAgUFJPRFVDVElPTjogJ3Byb2R1Y3Rpb24nLFxuICBERVZFTE9QTUVOVDogJ2RldmVsb3BtZW50Jyxcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGdldFBvcnQgZnJvbSAnZ2V0LXBvcnQnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IFByZXN0YUNMSURldk9wdGlvbnMsIFByZXN0YUNMSUJ1aWxkT3B0aW9ucyB9IGZyb20gJy4vY2xpJ1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zJ1xuXG5leHBvcnQgdHlwZSBPcHRpb25zID0ge1xuICBmaWxlczogc3RyaW5nW11cbiAgb3V0cHV0OiBzdHJpbmdcbiAgYXNzZXRzOiBzdHJpbmdcbiAgcGx1Z2luczogUGx1Z2luW11cbiAgcG9ydDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IE9wdGlvbnMgJiB7XG4gIGVudjogc3RyaW5nXG4gIHN0YXRpY091dHB1dERpcjogc3RyaW5nXG4gIGZ1bmN0aW9uc091dHB1dERpcjogc3RyaW5nXG4gIGZ1bmN0aW9uc01hbmlmZXN0OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWdGaWxlcGF0aCA9ICdwcmVzdGEuY29uZmlnLmpzJ1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUG9ydChwcmVmZXJyZWQ6IHN0cmluZykge1xuICByZXR1cm4gZ2V0UG9ydCh7IHBvcnQ6IHBhcnNlSW50KHByZWZlcnJlZCwgMTApIH0pXG59XG5cbi8qKlxuICogRmV0Y2ggYSBjb25maWcgZmlsZS4gSWYgb25lIHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIGxldCB0aGVtIGtub3cgaWZcbiAqIGFueXRoaW5nIGdvZXMgd3JvbmcuIE91dHNpZGUgd2F0Y2ggbW9kZSwgdGhpcyBzaG91bGQgZXhpdCgxKSBpZiB0aGUgdXNlclxuICogcHJvdmlkZWQgYSBjb25maWcgYW5kIHRoZXJlIHdhcyBhbiBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnRmlsZShmaWxlcGF0aD86IHN0cmluZywgc2hvdWxkRXhpdDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gIGNvbnN0IGZwID0gcGF0aC5yZXNvbHZlKGZpbGVwYXRoIHx8IGRlZmF1bHRDb25maWdGaWxlcGF0aClcblxuICB0cnkge1xuICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW2ZwXVxuICAgIHJldHVybiByZXF1aXJlKGZwKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXhpc3RzID0gZnMuZXhpc3RzU3luYyhmcClcblxuICAgIC8vIGNvbmZpZyBmaWxlIGV4aXN0cywgc2hvdWxkIGxvZyBlcnJvciwgb3RoZXJ3aXNlIGlnbm9yZSBtaXNzaW5nIGZpbGVcbiAgICBpZiAoZXhpc3RzKSB7XG4gICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgZXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICB9KVxuXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gd2F0Y2ggbW9kZSwgZXhpdCBidWlsZFxuICAgICAgaWYgKHNob3VsZEV4aXQpIHByb2Nlc3MuZXhpdCgxKVxuICAgIH1cblxuICAgIHJldHVybiB7fVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoXG4gIGVudjogc3RyaW5nLFxuICBjbGk6IFByZXN0YUNMSUJ1aWxkT3B0aW9ucyB8IFByZXN0YUNMSURldk9wdGlvbnMsXG4gIGZpbGU6IFBhcnRpYWw8T3B0aW9ucz4sXG4gIGN3ZCA9IHByb2Nlc3MuY3dkKClcbik6IENvbmZpZyB7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBlbnYsXG4gICAgb3V0cHV0OiAnYnVpbGQnLFxuICAgIGFzc2V0czogJ3B1YmxpYycsXG4gICAgcGx1Z2luczogW10sXG4gICAgcG9ydDogNDAwMCxcbiAgICBmaWxlczogW10sIC8vIFRPRE8gd2hlcmUgZG8gd2UgdmFsaWRhdGVcbiAgICAuLi5maWxlLFxuICB9XG5cbiAgLy8gb3ZlcnJpZGUgd2l0aCBDTElcbiAgaWYgKGNsaS5fLmxlbmd0aCkgY29uZmlnLmZpbGVzID0gY2xpLl9cbiAgaWYgKGNsaS5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBjbGkub3V0cHV0XG4gIGlmIChjbGkuYXNzZXRzKSBjb25maWcuYXNzZXRzID0gY2xpLmFzc2V0c1xuICBpZiAoY2xpLnBvcnQpIGNvbmZpZy5wb3J0ID0gY2xpLnBvcnRcblxuICAvLyByZXNvbHZlIGFic29sdXRlIHBhdGhzXG4gIGlmIChjb25maWcuZmlsZXMpIGNvbmZpZy5maWxlcyA9IChbXSBhcyBzdHJpbmdbXSkuY29uY2F0KGNvbmZpZy5maWxlcykubWFwKChwKSA9PiBwYXRoLnJlc29sdmUoY3dkLCBwKSlcbiAgaWYgKGNvbmZpZy5vdXRwdXQpIGNvbmZpZy5vdXRwdXQgPSBwYXRoLnJlc29sdmUoY3dkLCBjb25maWcub3V0cHV0KVxuICBpZiAoY29uZmlnLmFzc2V0cykgY29uZmlnLmFzc2V0cyA9IHBhdGgucmVzb2x2ZShjd2QsIGNvbmZpZy5hc3NldHMpXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWcsXG4gICAgc3RhdGljT3V0cHV0RGlyOiBwYXRoLmpvaW4oY29uZmlnLm91dHB1dCwgJ3N0YXRpYycpLFxuICAgIGZ1bmN0aW9uc091dHB1dERpcjogcGF0aC5qb2luKGNvbmZpZy5vdXRwdXQsICdmdW5jdGlvbnMnKSxcbiAgICBmdW5jdGlvbnNNYW5pZmVzdDogcGF0aC5qb2luKGNvbmZpZy5vdXRwdXQsICdyb3V0ZXMuanNvbicpLFxuICB9XG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3dhdGNoLWRlcGVuZGVuY3ktZ3JhcGgnXG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInXG5pbXBvcnQgbWF0Y2ggZnJvbSAncGljb21hdGNoJ1xuaW1wb3J0IG1lcmdlIGZyb20gJ2RlZXAtZXh0ZW5kJ1xuaW1wb3J0IHsgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcywgcmVtb3ZlQnVpbHRTdGF0aWNGaWxlLCBTdGF0aWNGaWxlc01hcCB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5cbi8qXG4gKiBXcmFwcyBvdXRwdXRMYW1iZGFzIGZvciBsb2dnaW5nXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUxhbWJkYXMoaW5wdXRzOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAvLyBhbHdheXMgd3JpdGUgdGhpcywgZXZlbiBpZiBpbnB1dHMgPSBbXVxuICBvdXRwdXRMYW1iZGFzKGlucHV0cywgY29uZmlnKVxuXG4gIC8vIGlmIHVzZXIgYWN0dWFsbHkgaGFzIHJvdXRlcyBjb25maWd1cmVkLCBnaXZlIGZlZWRiYWNrXG4gIGlmIChpbnB1dHMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLmluZm8oe1xuICAgICAgbGFiZWw6ICdidWlsdCcsXG4gICAgICBtZXNzYWdlOiBgbGFtYmRhc2AsXG4gICAgICBkdXJhdGlvbjogdGltZSgpLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTmV3VmFsaWRGaWxlKGZpbGU6IHN0cmluZywgZ2xvYnM6IHN0cmluZ1tdLCBleGlzdGluZzogc3RyaW5nW10pIHtcbiAgcmV0dXJuIG1hdGNoKGdsb2JzKShmaWxlKSAmJiAhZXhpc3RpbmcuaW5jbHVkZXMoZmlsZSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhdGNoKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgbGV0IHN0YXRpY0ZpbGVzTWFwOiBTdGF0aWNGaWxlc01hcCA9IHt9XG4gIGNvbnN0IGZpbGVzID0gZ2V0RmlsZXMoY29uZmlnLmZpbGVzKVxuXG4gIGlmICghZmlsZXMubGVuZ3RoKSB7XG4gICAgbG9nZ2VyLndhcm4oe1xuICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICBtZXNzYWdlOiAnbm8gZmlsZXMgY29uZmlndXJlZCcsXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmlsZShmaWxlOiBzdHJpbmcsIGV4aXN0aW5nOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgICBkZWxldGUgcmVxdWlyZS5jYWNoZVtmaWxlXVxuXG4gICAgLy8gcmVuZGVyIGp1c3QgZmlsZSB0aGF0IGNoYW5nZWRcbiAgICBpZiAoaXNTdGF0aWMoZmlsZSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGJ1aWxkU3RhdGljRmlsZXMoW2ZpbGVdLCBjb25maWcsIHN0YXRpY0ZpbGVzTWFwKVxuICAgICAgc3RhdGljRmlsZXNNYXAgPSBtZXJnZSh7fSwgc3RhdGljRmlsZXNNYXAsIHJlc3VsdC5zdGF0aWNGaWxlc01hcClcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgZHluYW1pYyBlbnRyeSB3aXRoIEFMTCBkeW5hbWljIGZpbGVzXG4gICAgdXBkYXRlTGFtYmRhcyhleGlzdGluZy5maWx0ZXIoaXNEeW5hbWljKSwgY29uZmlnKVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYnVpbGRGaWxlcyhmaWxlczogc3RyaW5nW10sIGV4aXN0aW5nOiBzdHJpbmdbXSwgY29uZmlnOiBDb25maWcpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGF3YWl0IGJ1aWxkRmlsZShmaWxlLCBleGlzdGluZywgY29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnRhbnQ6IGlmIHdlIGV2ZXIgcmVtb3ZlIGluaXRpYWwgcmVuZGVyaW5nLCB3ZSB3aWxsIG5lZWQgdG9cbiAgICogcmUtaW50cm9kdWNlIFwiZmlsZSBwcmltaW5nXCIgd2hlcmUgd2UgcmVxdWlyZSBhbGwgZmlsZXMgYW5kIHN1cmZhY2UgZXJyb3JzXG4gICAqIG9uIHN0YXJ0dXAuXG4gICAqL1xuICBhd2FpdCBidWlsZEZpbGVzKGZpbGVzLCBmaWxlcywgY29uZmlnKVxuICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuXG4gIC8qXG4gICAqIEZpbGV3YXRjaGVyIHdhdGNoZXMgb25seSBwcmVzdGEgZmlsZXMuIEl0IGhhbmRsZXMgY2hhbmdlIGFuZCByZW1vdmVcbiAgICogZXZlbnRzLCBhcyB3ZWxsIGFzIHN1cmZhY2VzIGRlcGVuZGVuY3kgdHJlZSB0cmF2ZXJzYWwgZXJyb3JzXG4gICAqL1xuICBjb25zdCBmaWxlV2F0Y2hlciA9IGNyZWF0ZSh7IGFsaWFzOiB7ICdAJzogcHJvY2Vzcy5jd2QoKSB9IH0pXG5cbiAgZmlsZVdhdGNoZXIub25DaGFuZ2UoYXN5bmMgKGNoYW5nZWQpID0+IHtcbiAgICBhd2FpdCBidWlsZEZpbGVzKGNoYW5nZWQsIGZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICBmaWxlV2F0Y2hlci5vblJlbW92ZShhc3luYyAoW2lkXSkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1Zyh7IGxhYmVsOiAnd2F0Y2gnLCBtZXNzYWdlOiBgcmVtb3ZlZCAke2lkfWAgfSlcblxuICAgIC8vIHJlbW92ZSBmcm9tIGxvY2FsIGhhc2hcbiAgICBmaWxlcy5zcGxpY2UoZmlsZXMuaW5kZXhPZihpZCksIDEpXG5cbiAgICAvLyB1cGRhdGUgdGhpcyByZWdhcmRsZXNzLCBub3Qgc3VyZSBpZiBbaWRdIHdhcyBkeW5hbWljIG9yIHN0YXRpY1xuICAgIHVwZGF0ZUxhbWJkYXMoZmlsZXMuZmlsdGVyKGlzRHluYW1pYyksIGNvbmZpZylcbiAgICA7KHN0YXRpY0ZpbGVzTWFwW2lkXSB8fCBbXSkuZm9yRWFjaCgoZmlsZSkgPT4gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKHBhdGguam9pbihjb25maWcuc3RhdGljT3V0cHV0RGlyLCBmaWxlKSkpXG5cbiAgICBob29rcy5lbWl0QnJvd3NlclJlZnJlc2goKVxuICB9KVxuXG4gIGZpbGVXYXRjaGVyLm9uRXJyb3IoKGUpID0+IHtcbiAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgbGFiZWw6ICdlcnJvcicsXG4gICAgICBlcnJvcjogdHlwZW9mIGUgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGUpIDogZSxcbiAgICB9KVxuICB9KVxuXG4gIGF3YWl0IGZpbGVXYXRjaGVyLmFkZChmaWxlcylcblxuICAvKlxuICAgKiBnbG9iYWxXYXRjaGVyIHdhdGNoZXMgdGhlIHJhdyBmaWxlIGdsb2JzIHBhc3NlZCB0byB0aGUgQ0xJIG9yIGFzIGBmaWxlc2BcbiAgICogaW4gdGhlIGNvbmZpZy4gSWYgY2hlY2tzIG9uIGFkZC9jaGFuZ2UgdG8gc2VlIGlmIGEgZmlsZSBzaG91bGQgYmUgdXBncmFkZWRcbiAgICogdG8gYSBhIFByZXN0YSBzb3VyY2UgZmlsZSwgYW5kIGFkZGVkIHRvIHRoZSBmaWxlV2F0Y2hlci5cbiAgICovXG4gIGNvbnN0IGdsb2JhbFdhdGNoZXIgPSBjaG9raWRhci53YXRjaChwcm9jZXNzLmN3ZCgpLCB7XG4gICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICBpZ25vcmVkOiBbY29uZmlnLm91dHB1dCwgY29uZmlnLmFzc2V0c10sXG4gIH0pXG5cbiAgZ2xvYmFsV2F0Y2hlci5vbignYWRkJywgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZSkgfHwgZnMubHN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVyblxuICAgIGlmICghaXNOZXdWYWxpZEZpbGUoZmlsZSwgY29uZmlnLmZpbGVzLCBmaWxlcykpIHJldHVyblxuXG4gICAgbG9nZ2VyLmRlYnVnKHsgbGFiZWw6ICd3YXRjaCcsIG1lc3NhZ2U6IGBhZGQgJHtmaWxlfWAgfSlcblxuICAgIGZpbGVzLnB1c2goZmlsZSlcbiAgICBhd2FpdCBmaWxlV2F0Y2hlci5hZGQoZmlsZSlcblxuICAgIGF3YWl0IGJ1aWxkRmlsZShmaWxlLCBmaWxlcywgY29uZmlnKVxuXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICAvKipcbiAgICogTGlzdGVucyBmb3IgZXZlbnRzIGZyb20gcGx1Z2lucyByZXF1ZXN0aW5nIGEgZmlsZSB0byBiZSBidWlsdFxuICAgKi9cbiAgaG9va3Mub25CdWlsZEZpbGUoYXN5bmMgKHsgZmlsZSB9KSA9PiB7XG4gICAgYXdhaXQgYnVpbGRGaWxlKGZpbGUsIGZpbGVzLCBjb25maWcpXG4gICAgaG9va3MuZW1pdEJyb3dzZXJSZWZyZXNoKClcbiAgfSlcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsb3NlKCkge1xuICAgICAgYXdhaXQgZmlsZVdhdGNoZXIuY2xvc2UoKVxuICAgICAgYXdhaXQgZ2xvYmFsV2F0Y2hlci5jbG9zZSgpXG4gICAgfSxcbiAgfVxufVxuIiwgImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcnNvcnQgZnJvbSAncm91dGUtc29ydCdcbmltcG9ydCB7IGhhc2hDb250ZW50IH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcblxuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnkoZmlsZW5hbWU6IHN0cmluZykge1xuICByZXR1cm4gZmlsZW5hbWVcbiAgICAucmVwbGFjZShwcm9jZXNzLmN3ZCgpLCAnJykgLy8gL3BhZ2VzL0ZpbGUucGFnZS5qc1xuICAgIC5zcGxpdCgnLicpIC8vIGV4dGVuc2lvbiwgWy9wYWdlcy9GaWxlLCBwYWdlLCBqc11cbiAgICAucmV2ZXJzZSgpXG4gICAgLnNsaWNlKDEpXG4gICAgLnJldmVyc2UoKVxuICAgIC5qb2luKCctJykgLy8gL3BhZ2VzL0ZpbGUucGFnZVxuICAgIC5zcGxpdCgnLycpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCctJykgLy8gcGFnZXMtRmlsZS1wYWdlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRMYW1iZGFzKGlucHV0czogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IGxhbWJkYXMgPSBpbnB1dHNcbiAgICAubWFwKChpbnB1dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyByb3V0ZSB9ID0gcmVxdWlyZShpbnB1dClcbiAgICAgICAgY29uc3QgbmFtZSA9IHNsdWdpZnkoaW5wdXQpXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHBhdGguam9pbihcbiAgICAgICAgICBjb25maWcuZnVuY3Rpb25zT3V0cHV0RGlyLFxuICAgICAgICAgIGNvbmZpZy5lbnYgPT09IEVudi5QUk9EVUNUSU9OXG4gICAgICAgICAgICA/IG5hbWUgKyAnLScgKyBoYXNoQ29udGVudChmcy5yZWFkRmlsZVN5bmMoaW5wdXQsICd1dGY4JykpICsgJy5qcydcbiAgICAgICAgICAgIDogbmFtZSArICcuanMnXG4gICAgICAgIClcblxuICAgICAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0aW5nICR7bmFtZX0gbGFtYmRhYCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBpbXBvcnRhbnQgZm9yIHdhdGNoIHRhc2tcbiAgICAgICAgZGVsZXRlIHJlcXVpcmUuY2FjaGVbaW5wdXRdXG4gICAgICAgIGRlbGV0ZSByZXF1aXJlLmNhY2hlW291dHB1dF1cblxuICAgICAgICBmcy5vdXRwdXRGaWxlU3luYyhcbiAgICAgICAgICBvdXRwdXQsXG4gICAgICAgICAgYGltcG9ydCB7IHdyYXBIYW5kbGVyIH0gZnJvbSAncHJlc3RhL2Rpc3Qvd3JhcEhhbmRsZXInO1xuICAgICAgaW1wb3J0ICogYXMgZmlsZSBmcm9tICcke2lucHV0fSc7XG4gICAgICBleHBvcnQgY29uc3Qgcm91dGUgPSBmaWxlLnJvdXRlXG4gICAgICBleHBvcnQgY29uc3QgaGFuZGxlciA9IHdyYXBIYW5kbGVyKGZpbGUpYFxuICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIFtyb3V0ZSwgb3V0cHV0XVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIuZXJyb3Ioe1xuICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKSBhcyBbc3RyaW5nLCBzdHJpbmddW11cblxuICBjb25zdCBzb3J0ZWQgPSByc29ydChsYW1iZGFzLm1hcCgobCkgPT4gbFswXSkpXG4gIGNvbnN0IG1hbmlmZXN0OiB7IFtyb3V0ZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuXG4gIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsYW1iZGFzLmZpbmQoKGwpID0+IGxbMF0gPT09IHJvdXRlKVxuXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBtYW5pZmVzdFtyb3V0ZV0gPSBtYXRjaFsxXVxuICAgIH1cbiAgfVxuXG4gIGZzLm91dHB1dEZpbGVTeW5jKGNvbmZpZy5mdW5jdGlvbnNNYW5pZmVzdCwgSlNPTi5zdHJpbmdpZnkobWFuaWZlc3QpKVxuXG4gIHJldHVybiBsYW1iZGFzXG59XG4iLCAiaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBnbG9iU3luYyBmcm9tICd0aW55LWdsb2Ivc3luYydcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc3JvdXRlXFxzK1xcPS8udGVzdChmcy5yZWFkRmlsZVN5bmMoZmlsZSwgJ3V0Zi04JykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YXRpYyhmaWxlOiBzdHJpbmcpIHtcbiAgcmV0dXJuIC9leHBvcnRcXHMuK1xcc2dldFN0YXRpY1BhdGhzLy50ZXN0KGZzLnJlYWRGaWxlU3luYyhmaWxlLCAndXRmLTgnKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzKGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIChbXSBhcyBzdHJpbmdbXSlcbiAgICAuY29uY2F0KGZpbGVzKVxuICAgIC5tYXAoKGZpbGUpID0+IGdsb2JTeW5jKGZpbGUpKVxuICAgIC5mbGF0KClcbiAgICAubWFwKChmaWxlKSA9PiBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZmlsZSkpIC8vIG1ha2UgYWJzb2x1dGVcbn1cbiIsICJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcbmltcG9ydCB7IHRpbWVyLCBwYXJzZVBhdGhQYXJhbWV0ZXJzIH0gZnJvbSAnQHByZXN0YS91dGlscydcblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJy4vbG9nJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuaW1wb3J0IHsgY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCB9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBFbnYgfSBmcm9tICcuL2NvbnN0YW50cydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuXG5leHBvcnQgdHlwZSBTdGF0aWNGaWxlc01hcCA9IHsgW2ZpbGVuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRobmFtZVRvRmlsZShwYXRobmFtZTogc3RyaW5nLCBleHQgPSAnaHRtbCcpIHtcbiAgcmV0dXJuICEhcGF0aC5leHRuYW1lKHBhdGhuYW1lKVxuICAgID8gcGF0aG5hbWUgLy8gaWYgcGF0aCBoYXMgZXh0ZW5zaW9uLCB1c2UgaXRcbiAgICA6IGV4dCA9PT0gJ2h0bWwnXG4gICAgPyBgJHtwYXRobmFtZX0vaW5kZXguaHRtbGAgLy8gaWYgSFRNTCBpcyBpbmZlcnJlZCwgY3JlYXRlIGluZGV4XG4gICAgOiBgJHtwYXRobmFtZX0uJHtleHR9YCAvLyBhbnl0aGluZyBidXQgSFRNTCB3aWxsIG5lZWQgYW4gZXh0ZW5zaW9uLCBvdGhlcndpc2UgYnJvd3NlcnMgd2lsbCByZW5kZXIgYXMgdGV4dFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlKGZpbGU6IHN0cmluZykge1xuICBsb2dnZXIuZGVidWcoe1xuICAgIGxhYmVsOiAnZGVidWcnLFxuICAgIG1lc3NhZ2U6IGByZW1vdmluZyBvbGQgc3RhdGljIGZpbGUgJHtmaWxlfWAsXG4gIH0pXG5cbiAgcmV0dXJuIGZzLnJlbW92ZShmaWxlKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVtb3ZlQnVpbHRTdGF0aWNGaWxlcyhmaWxlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGZpbGVzLm1hcChyZW1vdmVCdWlsdFN0YXRpY0ZpbGUpKVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTdGF0aWNGaWxlKGZpbGU6IHN0cmluZywgb3V0cHV0OiBzdHJpbmcsIHsgZm9vdGVyIH06IHsgZm9vdGVyOiBzdHJpbmcgfSkge1xuICBjb25zdCBsYW1iZGEgPSByZXF1aXJlKGZpbGUpXG4gIGNvbnN0IHBhdGhzID0gYXdhaXQgbGFtYmRhLmdldFN0YXRpY1BhdGhzKClcblxuICBjb25zdCBidWlsdEZpbGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgaWYgKCFwYXRocyB8fCAhcGF0aHMubGVuZ3RoKSByZXR1cm4gYnVpbHRGaWxlc1xuXG4gIGZvciAoY29uc3QgdXJsIG9mIHBhdGhzKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcblxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcGF0aDogdXJsLFxuICAgICAgcGF0aFBhcmFtZXRlcnM6IGxhbWJkYS5yb3V0ZSA/IHBhcnNlUGF0aFBhcmFtZXRlcnModXJsLCBsYW1iZGEucm91dGUpIDoge30sXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBub3JtYWxpemVSZXNwb25zZShhd2FpdCBsYW1iZGEuaGFuZGxlcihldmVudCwge30pKVxuICAgIGNvbnN0IHR5cGUgPSAocmVzcG9uc2U/LmhlYWRlcnMgfHwge30pWydjb250ZW50LXR5cGUnXVxuICAgIGNvbnN0IGV4dCA9IG1pbWUuZXh0ZW5zaW9uKHR5cGUgYXMgc3RyaW5nKSB8fCAnaHRtbCdcbiAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGhuYW1lVG9GaWxlKHVybCwgZXh0KVxuICAgIGNvbnN0IGh0bWwgPSByZXNwb25zZS5ib2R5ICsgKGV4dCA9PT0gJ2h0bWwnID8gZm9vdGVyIDogJycpXG4gICAgY29uc3Qgb3V0ZmlsZSA9IHBhdGguam9pbihvdXRwdXQsIGZpbGVuYW1lKVxuXG4gICAgZnMub3V0cHV0RmlsZVN5bmMob3V0ZmlsZSwgaHRtbCwgJ3V0Zi04JylcblxuICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgIGxhYmVsOiAnYnVpbHQnLFxuICAgICAgbWVzc2FnZTogdXJsLFxuICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICB9KVxuXG4gICAgYnVpbHRGaWxlcy5wdXNoKG91dGZpbGUpXG4gIH1cblxuICByZXR1cm4gYnVpbHRGaWxlc1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRTdGF0aWNGaWxlcyhmaWxlczogc3RyaW5nW10sIGNvbmZpZzogQ29uZmlnLCBzdGF0aWNGaWxlc01hcDogU3RhdGljRmlsZXNNYXAgPSB7fSkge1xuICBjb25zdCBpc0RldiA9IGNvbmZpZy5lbnYgPT09IEVudi5ERVZFTE9QTUVOVFxuICBjb25zdCBvdXRwdXQgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGZvb3RlciA9IGlzRGV2ID8gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQ6IGNvbmZpZy5wb3J0IH0pIDogJydcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmaWxlLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSwgJycpXG4gICAgICBjb25zdCBwcmV2QnVpbHRGaWxlcyA9IHN0YXRpY0ZpbGVzTWFwW2ZpbGVdIHx8IFtdXG4gICAgICBjb25zdCBidWlsdEZpbGVzID0gYXdhaXQgYnVpbGRTdGF0aWNGaWxlKGZpbGUsIG91dHB1dCwgeyBmb290ZXIgfSlcblxuICAgICAgaWYgKCFidWlsdEZpbGVzIHx8ICFidWlsdEZpbGVzLmxlbmd0aCkge1xuICAgICAgICBsb2dnZXIud2Fybih7XG4gICAgICAgICAgbGFiZWw6ICdwYXRocycsXG4gICAgICAgICAgbWVzc2FnZTogYCR7ZmlsZW5hbWV9IC0gbm8gcGF0aHMgdG8gcmVuZGVyYCxcbiAgICAgICAgfSlcblxuICAgICAgICByZW1vdmVCdWlsdFN0YXRpY0ZpbGVzKHByZXZCdWlsdEZpbGVzKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGRpZmYgYW5kIHJlbW92ZSBmaWxlc1xuICAgICAgZm9yIChjb25zdCBwcmV2IG9mIHByZXZCdWlsdEZpbGVzKSB7XG4gICAgICAgIGlmICghYnVpbHRGaWxlcy5pbmNsdWRlcyhwcmV2KSkge1xuICAgICAgICAgIHJlbW92ZUJ1aWx0U3RhdGljRmlsZShwcmV2KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0YXRpY0ZpbGVzTWFwW2ZpbGVdID0gYnVpbHRGaWxlc1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcih7IGxhYmVsOiAnZXJyb3InLCBlcnJvcjogZSBhcyBFcnJvciB9KVxuXG4gICAgICAvLyBleGl0IGxvb3Agb24gYW55IGVycm9yXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3RhdGljRmlsZXNNYXAsXG4gIH1cbn1cbiIsICIvKipcbiAqIFRISVMgSVMgUFJPRCBDT0RFLCBCRSBDQVJFRlVMIFdIQVQgWU9VIEFERCBUTyBUSElTIEZJTEVcbiAqL1xuXG5pbXBvcnQgeyBSZXNwb25zZSBhcyBMYW1iZGFSZXNwb25zZSB9IGZyb20gJ2xhbWJkYS10eXBlcydcbmltcG9ydCB7IFJlc3BvbnNlLCBIZWFkZXJzIH0gZnJvbSAnLi9sYW1iZGEnXG5cbmZ1bmN0aW9uIHN0cmluZ2lmeShvYmo6IG9iamVjdCB8IHN0cmluZykge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShvYmopIDogb2JqXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhlYWRlcnMoaGVhZGVyczogSGVhZGVycykge1xuICBjb25zdCBub3JtYWxpemVkOiBIZWFkZXJzID0ge31cblxuICBmb3IgKGNvbnN0IGhlYWRlciBvZiBPYmplY3Qua2V5cyhoZWFkZXJzKSkge1xuICAgIGNvbnN0IGtleSA9IGhlYWRlci50b0xvd2VyQ2FzZSgpXG4gICAgY29uc3QgdmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICBub3JtYWxpemVkW2tleV0gPSB2YWx1ZSB8fCAnJ1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlc3BvbnNlKHJlc3BvbnNlOiBQYXJ0aWFsPFJlc3BvbnNlPiB8IHN0cmluZyk6IExhbWJkYVJlc3BvbnNlIHtcbiAgY29uc3Qge1xuICAgIGlzQmFzZTY0RW5jb2RlZCA9IGZhbHNlLFxuICAgIHN0YXR1c0NvZGUgPSAyMDAsXG4gICAgaGVhZGVycyA9IHt9LFxuICAgIG11bHRpVmFsdWVIZWFkZXJzID0ge30sXG4gICAgYm9keSA9ICcnLFxuICAgIGh0bWwgPSB1bmRlZmluZWQsXG4gICAganNvbiA9IHVuZGVmaW5lZCxcbiAgICB4bWwgPSB1bmRlZmluZWQsXG4gIH0gPSB0eXBlb2YgcmVzcG9uc2UgPT09ICdzdHJpbmcnXG4gICAgPyB7XG4gICAgICAgIGJvZHk6IHJlc3BvbnNlLFxuICAgICAgfVxuICAgIDogcmVzcG9uc2VcblxuICBsZXQgY29udGVudFR5cGUgPSAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04J1xuXG4gIGlmICghIWpzb24pIHtcbiAgICBjb250ZW50VHlwZSA9ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICB9IGVsc2UgaWYgKCEheG1sKSB7XG4gICAgY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24veG1sOyBjaGFyc2V0PXV0Zi04J1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZEluY29taW5nSGVhZGVycyA9IG5vcm1hbGl6ZUhlYWRlcnMoaGVhZGVycyBhcyBIZWFkZXJzKVxuICBjb25zdCBub3JtYWxpemVkSGVhZGVyczogTGFtYmRhUmVzcG9uc2VbJ2hlYWRlcnMnXSA9IHtcbiAgICAnY29udGVudC10eXBlJzogY29udGVudFR5cGUsXG4gICAgLi4ubm9ybWFsaXplZEluY29taW5nSGVhZGVycyxcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaXNCYXNlNjRFbmNvZGVkLFxuICAgIHN0YXR1c0NvZGUsXG4gICAgaGVhZGVyczogbm9ybWFsaXplZEhlYWRlcnMsXG4gICAgbXVsdGlWYWx1ZUhlYWRlcnMsXG4gICAgYm9keTogc3RyaW5naWZ5KGJvZHkgfHwgaHRtbCB8fCBqc29uIHx8IHhtbCB8fCAnJyksXG4gIH1cbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlTGl2ZVJlbG9hZFNjcmlwdCh7IHBvcnQgfTogeyBwb3J0OiBudW1iZXIgfSkge1xuICByZXR1cm4gYFxuICAgIDxzY3JpcHQ+XG4gICAgICAoZnVuY3Rpb24gKGdsb2JhbCkge1xuICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgnd3M6Ly9sb2NhbGhvc3Q6JHtwb3J0fScpO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1twcmVzdGFdIGNvbm5lY3RlZCBvbiBwb3J0ICR7cG9ydH0nKVxuICAgICAgICB9KTtcblxuICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxcYCdbcHJlc3RhXSByZWNlaXZlZCBcXCRcXHtldmVudC5kYXRhXFx9XFxgKVxuICAgICAgICAgIGlmIChldmVudC5kYXRhID09PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIGdsb2JhbC5sb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3ByZXN0YV0gZGlzY29ubmVjdGVkJylcbiAgICAgICAgfSk7XG4gICAgICB9KSh0aGlzKTtcbiAgICA8L3NjcmlwdD5cbiAgYFxufVxuIiwgImltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi9jb25maWcnXG5cbmV4cG9ydCB0eXBlIFBsdWdpbkludGVyZmFjZSA9IHtcbiAgY2xlYW51cD8oKTogdm9pZFxufVxuZXhwb3J0IHR5cGUgUGx1Z2luID0gKGNvbmZpZzogQ29uZmlnLCBob29rczogSG9va3MpID0+IFByb21pc2U8UGx1Z2luSW50ZXJmYWNlIHwgdm9pZD4gfCBQbHVnaW5JbnRlcmZhY2UgfCB2b2lkXG5leHBvcnQgdHlwZSBQbHVnaW5Jbml0ID0gKC4uLnByb3BzOiBhbnkpID0+IFBsdWdpblxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luKGluaXQ6IFBsdWdpbkluaXQpIHtcbiAgcmV0dXJuIGluaXRcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQbHVnaW5zKHBsdWdpbnM6IFBsdWdpbltdLCBpbnN0YW5jZTogQ29uZmlnLCBob29rczogSG9va3MpIHtcbiAgY29uc3QgaW5zdGFudGlhdGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgcGx1Z2luc1xuICAgICAgLm1hcCgocCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBwKGluc3RhbmNlLCBob29rcylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgICAgICBsYWJlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBlIGFzIEVycm9yLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBsdWdpbkludGVyZmFjZVtdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGNsZWFudXAoKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW5zdGFudGlhdGVkLm1hcCgocCkgPT4gcCAmJiBwLmNsZWFudXAgJiYgcC5jbGVhbnVwKCkpKVxuICAgIH0sXG4gIH1cbn1cbiIsICJleHBvcnQgZW51bSBFdmVudHMge1xuICBQb3N0QnVpbGQgPSAncG9zdC1idWlsZCcsXG4gIEJ1aWxkRmlsZSA9ICdidWlsZC1maWxlJyxcbiAgQnJvd3NlclJlZnJlc2ggPSAnYnJvd3Nlci1yZWZyZXNoJyxcbn1cblxuZXhwb3J0IHR5cGUgQ2FsbGFibGUgPSAoLi4uYXJnczogYW55W10pID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va1Bvc3RCdWlsZFBheWxvYWQgPSB7XG4gIG91dHB1dDogc3RyaW5nXG4gIHN0YXRpY091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc091dHB1dDogc3RyaW5nXG4gIGZ1bmN0aW9uc01hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCB0eXBlIEhvb2tCdWlsZEZpbGVQYXlsb2FkID0ge1xuICBmaWxlOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgRGVzdHJveUhvb2tDYWxsYmFjayA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgSG9va3MgPSB7XG4gIGVtaXRQb3N0QnVpbGQocHJvcHM6IEhvb2tQb3N0QnVpbGRQYXlsb2FkKTogdm9pZFxuICBvblBvc3RCdWlsZChjYjogKHByb3BzOiBIb29rUG9zdEJ1aWxkUGF5bG9hZCkgPT4gdm9pZCk6IERlc3Ryb3lIb29rQ2FsbGJhY2tcbiAgZW1pdEJ1aWxkRmlsZShwcm9wczogSG9va0J1aWxkRmlsZVBheWxvYWQpOiB2b2lkXG4gIG9uQnVpbGRGaWxlKGNiOiAocHJvcHM6IEhvb2tCdWlsZEZpbGVQYXlsb2FkKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xuICBlbWl0QnJvd3NlclJlZnJlc2goKTogdm9pZFxuICBvbkJyb3dzZXJSZWZyZXNoKGNiOiAoKSA9PiB2b2lkKTogRGVzdHJveUhvb2tDYWxsYmFja1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1pdHRlcigpIHtcbiAgbGV0IGV2ZW50czogeyBbZXZlbnQ6IHN0cmluZ106IENhbGxhYmxlW10gfSA9IHt9XG5cbiAgZnVuY3Rpb24gZW1pdChldjogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGV2ZW50c1tldl0gPyBldmVudHNbZXZdLm1hcCgoZm46IENhbGxhYmxlKSA9PiBmbiguLi5hcmdzKSkgOiBbXVxuICB9XG5cbiAgZnVuY3Rpb24gb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGV2ZW50c1tldl0gPSBldmVudHNbZXZdID8gZXZlbnRzW2V2XS5jb25jYXQoZm4pIDogW2ZuXVxuICAgIHJldHVybiAoKSA9PiBldmVudHNbZXZdLnNwbGljZShldmVudHNbZXZdLmluZGV4T2YoZm4pLCAxKVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgZXZlbnRzID0ge31cbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3RlbmVycyhldjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGV2ZW50c1tldl0gfHwgW11cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZW1pdCxcbiAgICBvbixcbiAgICBjbGVhcixcbiAgICBsaXN0ZW5lcnMsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvb2tzKGVtaXR0ZXI6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUVtaXR0ZXI+KTogSG9va3Mge1xuICByZXR1cm4ge1xuICAgIGVtaXRQb3N0QnVpbGQocHJvcHMpIHtcbiAgICAgIGVtaXR0ZXIuZW1pdCgncG9zdEJ1aWxkJywgcHJvcHMpXG4gICAgfSxcbiAgICBvblBvc3RCdWlsZChjYikge1xuICAgICAgcmV0dXJuIGVtaXR0ZXIub24oJ3Bvc3RCdWlsZCcsIGNiKVxuICAgIH0sXG4gICAgZW1pdEJ1aWxkRmlsZShwcm9wcykge1xuICAgICAgZW1pdHRlci5lbWl0KCdidWlsZEZpbGUnLCBwcm9wcylcbiAgICB9LFxuICAgIG9uQnVpbGRGaWxlKGNiKSB7XG4gICAgICByZXR1cm4gZW1pdHRlci5vbignYnVpbGRGaWxlJywgY2IpXG4gICAgfSxcbiAgICBlbWl0QnJvd3NlclJlZnJlc2goKSB7XG4gICAgICBlbWl0dGVyLmVtaXQoJ2Jyb3dzZXJSZWZyZXNoJylcbiAgICB9LFxuICAgIG9uQnJvd3NlclJlZnJlc2goY2IpIHtcbiAgICAgIHJldHVybiBlbWl0dGVyLm9uKCdicm93c2VyUmVmcmVzaCcsIGNiKVxuICAgIH0sXG4gIH1cbn1cbiIsICJpbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xuaW1wb3J0IHsgYnVpbGQgYXMgZXNidWlsZCB9IGZyb20gJ2VzYnVpbGQnXG5pbXBvcnQgeyByZXF1aXJlU2FmZSwgdGltZXIgfSBmcm9tICdAcHJlc3RhL3V0aWxzJ1xuXG5pbXBvcnQgeyBvdXRwdXRMYW1iZGFzIH0gZnJvbSAnLi9vdXRwdXRMYW1iZGFzJ1xuaW1wb3J0IHsgZ2V0RmlsZXMsIGlzU3RhdGljLCBpc0R5bmFtaWMgfSBmcm9tICcuL2dldEZpbGVzJ1xuaW1wb3J0IHsgYnVpbGRTdGF0aWNGaWxlcyB9IGZyb20gJy4vYnVpbGRTdGF0aWNGaWxlcydcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgSG9va3MgfSBmcm9tICcuL2NyZWF0ZUVtaXR0ZXInXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZChjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IHRvdGFsVGltZSA9IHRpbWVyKClcbiAgY29uc3QgZmlsZXMgPSBnZXRGaWxlcyhjb25maWcuZmlsZXMpXG4gIGNvbnN0IHN0YXRpY0lkcyA9IGZpbGVzLmZpbHRlcihpc1N0YXRpYylcbiAgY29uc3QgZHluYW1pY0lkcyA9IGZpbGVzLmZpbHRlcihpc0R5bmFtaWMpXG5cbiAgbG9nZ2VyLmRlYnVnKHtcbiAgICBsYWJlbDogJ2J1aWxkJyxcbiAgICBtZXNzYWdlOiAnc3RhcnRpbmcgYnVpbGQnLFxuICB9KVxuXG4gIGlmICghc3RhdGljSWRzLmxlbmd0aCAmJiAhZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICBsb2dnZXIud2Fybih7XG4gICAgICBsYWJlbDogJ2ZpbGVzJyxcbiAgICAgIG1lc3NhZ2U6ICdubyBmaWxlcyB3ZXJlIGZvdW5kLCBub3RoaW5nIHRvIGJ1aWxkJyxcbiAgICB9KVxuICB9IGVsc2Uge1xuICAgIGxldCBzdGF0aWNUaW1lID0gJydcbiAgICBsZXQgc3RhdGljRmlsZUFtb3VudCA9IDBcbiAgICBsZXQgZHluYW1pY1RpbWUgPSAnJ1xuICAgIGxldCBjb3B5VGltZSA9ICcnXG5cbiAgICBjb25zdCB0YXNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGljSWRzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBjb25zdCB7IHN0YXRpY0ZpbGVzTWFwIH0gPSBhd2FpdCBidWlsZFN0YXRpY0ZpbGVzKHN0YXRpY0lkcywgY29uZmlnKVxuXG4gICAgICAgICAgc3RhdGljVGltZSA9IHRpbWUoKVxuICAgICAgICAgIHN0YXRpY0ZpbGVBbW91bnQgPSBPYmplY3Qua2V5cyhzdGF0aWNGaWxlc01hcCkucmVkdWNlKChjb3VudCwga2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKGNvdW50ICs9IHN0YXRpY0ZpbGVzTWFwW2tleV0ubGVuZ3RoKVxuICAgICAgICAgIH0sIDApXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZHluYW1pY0lkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgICAgICAgIGNvbnN0IHBrZyA9IHJlcXVpcmVTYWZlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAncGFja2FnZS5qc29uJykpXG5cbiAgICAgICAgICBvdXRwdXRMYW1iZGFzKGR5bmFtaWNJZHMsIGNvbmZpZylcblxuICAgICAgICAgIGF3YWl0IGVzYnVpbGQoe1xuICAgICAgICAgICAgZW50cnlQb2ludHM6IE9iamVjdC52YWx1ZXMocmVxdWlyZShjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QpKSxcbiAgICAgICAgICAgIG91dGRpcjogY29uZmlnLmZ1bmN0aW9uc091dHB1dERpcixcbiAgICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbm9kZTEyJ10sXG4gICAgICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgICAgICBhbGxvd092ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIGV4dGVybmFsOiBPYmplY3Qua2V5cyhwa2cuZGVwZW5kZW5jaWVzIHx8IHt9KSxcbiAgICAgICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmluZToge1xuICAgICAgICAgICAgICAncHJvY2Vzcy5lbnYuUFJFU1RBX1NFUlZFUkxFU1NfUlVOVElNRSc6ICd0cnVlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGR5bmFtaWNUaW1lID0gdGltZSgpXG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb25maWcuYXNzZXRzKSkge1xuICAgICAgICAgIGNvbnN0IHRpbWUgPSB0aW1lcigpXG5cbiAgICAgICAgICBmcy5jb3B5U3luYyhjb25maWcuYXNzZXRzLCBjb25maWcuc3RhdGljT3V0cHV0RGlyKVxuXG4gICAgICAgICAgY29weVRpbWUgPSB0aW1lKClcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICBdKVxuXG4gICAgLy8gc2luY2Ugd2UncmUgYnVpbGRpbmcgKG5vdCB3YXRjaCkgaWYgYW55IHRhc2sgZmFpbHMsIGV4aXQgd2l0aCBlcnJvclxuICAgIGlmICh0YXNrcy5maW5kKCh0YXNrKSA9PiB0YXNrLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykpIHtcbiAgICAgIGxvZ2dlci5kZWJ1Zyh7XG4gICAgICAgIGxhYmVsOiAnYnVpbGQnLFxuICAgICAgICBtZXNzYWdlOiAnYnVpbGQgcGFydGlhbGx5IGZhaWxlZCcsXG4gICAgICB9KVxuXG4gICAgICAvLyBsb2cgb3V0IGVycm9yc1xuICAgICAgdGFza3MuZm9yRWFjaCgodGFzaykgPT4ge1xuICAgICAgICBpZiAodGFzay5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgICAvLyBUT0RPIGNhbiBzd2FsbG93IGVycm9ycyBpbiB0ZXN0aW5nXG4gICAgICAgICAgbG9nZ2VyLmVycm9yKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IHRhc2sucmVhc29uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIHRocm93IG5ldyBFcnJvcigncHJlc3RhIGJ1aWxkIGZhaWxlZCcpXG4gICAgfVxuXG4gICAgaWYgKHN0YXRpY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdzdGF0aWMnLFxuICAgICAgICBtZXNzYWdlOiBgcmVuZGVyZWQgJHtzdGF0aWNGaWxlQW1vdW50fSBmaWxlKHMpYCxcbiAgICAgICAgZHVyYXRpb246IHN0YXRpY1RpbWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChkeW5hbWljVGltZSkge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ2xhbWJkYScsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21waWxlZCAke2R5bmFtaWNJZHMubGVuZ3RofSBmdW5jdGlvbihzKWAsXG4gICAgICAgIGR1cmF0aW9uOiBkeW5hbWljVGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKGNvcHlUaW1lKSB7XG4gICAgICBsb2dnZXIuaW5mbyh7XG4gICAgICAgIGxhYmVsOiAnYXNzZXRzJyxcbiAgICAgICAgbWVzc2FnZTogYGNvcGllZGAsXG4gICAgICAgIGR1cmF0aW9uOiBjb3B5VGltZSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaG9va3MuZW1pdFBvc3RCdWlsZCh7XG4gICAgICBvdXRwdXQ6IGNvbmZpZy5vdXRwdXQsXG4gICAgICBzdGF0aWNPdXRwdXQ6IGNvbmZpZy5zdGF0aWNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNPdXRwdXQ6IGNvbmZpZy5mdW5jdGlvbnNPdXRwdXREaXIsXG4gICAgICBmdW5jdGlvbnNNYW5pZmVzdDogcmVxdWlyZVNhZmUoY29uZmlnLmZ1bmN0aW9uc01hbmlmZXN0KSxcbiAgICB9KVxuXG4gICAgaWYgKHN0YXRpY1RpbWUgfHwgZHluYW1pY1RpbWUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKHtcbiAgICAgICAgbGFiZWw6ICdidWlsZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBjb21wbGV0ZWAsXG4gICAgICAgIGR1cmF0aW9uOiB0b3RhbFRpbWUoKSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0J1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCdcbmltcG9ydCBzaXJ2IGZyb20gJ3NpcnYnXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xuaW1wb3J0IHRvUmVnRXhwIGZyb20gJ3JlZ2V4cGFyYW0nXG5pbXBvcnQgc3RhdHVzIGZyb20gJ3N0YXR1c2VzJ1xuaW1wb3J0IHsgV2ViU29ja2V0U2VydmVyIH0gZnJvbSAnd3MnXG5pbXBvcnQgeyB0aW1lciwgcmVxdWVzdFRvRXZlbnQsIHJlcXVpcmVGcmVzaCwgc2VuZFNlcnZlcmxlc3NSZXNwb25zZSwgY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSB9IGZyb20gJ0BwcmVzdGEvdXRpbHMnXG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuL2xvZydcbmltcG9ydCB7IGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgSGFuZGxlciwgRXZlbnQsIFJlc3BvbnNlLCBDb250ZXh0IH0gZnJvbSAnLi9sYW1iZGEnXG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuL2NvbmZpZydcbmltcG9ydCB7IEhvb2tzIH0gZnJvbSAnLi9jcmVhdGVFbWl0dGVyJ1xuaW1wb3J0IHsgbm9ybWFsaXplUmVzcG9uc2UgfSBmcm9tICcuL25vcm1hbGl6ZVJlc3BvbnNlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzQ29kZT86IG51bWJlclxuICBtZXNzYWdlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh0dHBFcnJvcihzdGF0dXNDb2RlOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZyk6IEh0dHBFcnJvciB7XG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpXG4gIC8vIEB0cy1pZ25vcmVcbiAgZXJyb3Iuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGVcbiAgcmV0dXJuIGVycm9yXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW1lVHlwZShyZXNwb25zZTogUmVzcG9uc2UpIHtcbiAgY29uc3QgdHlwZSA9IChyZXNwb25zZT8uaGVhZGVycyB8fCB7fSlbJ2NvbnRlbnQtdHlwZSddXG4gIHJldHVybiBtaW1lLmV4dGVuc2lvbih0eXBlIGFzIHN0cmluZykgfHwgJ2h0bWwnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTGFtYmRhRnJvTWFuaWZlc3QodXJsOiBzdHJpbmcsIG1hbmlmZXN0OiB7IFtyb3V0ZTogc3RyaW5nXTogc3RyaW5nIH0pOiB7IGhhbmRsZXI6IEhhbmRsZXIgfSB7XG4gIGNvbnN0IHJvdXRlcyA9IE9iamVjdC5rZXlzKG1hbmlmZXN0KVxuICBjb25zdCBsYW1iZGFGaWxlcGF0aCA9IHJvdXRlc1xuICAgIC5tYXAoKHJvdXRlKSA9PiAoe1xuICAgICAgbWF0Y2hlcjogdG9SZWdFeHAocm91dGUpLFxuICAgICAgcm91dGUsXG4gICAgfSkpXG4gICAgLmZpbHRlcigoeyBtYXRjaGVyIH0pID0+IHtcbiAgICAgIHJldHVybiBtYXRjaGVyLnBhdHRlcm4udGVzdCh1cmwuc3BsaXQoJz8nKVswXSlcbiAgICB9KVxuICAgIC5tYXAoKHsgcm91dGUgfSkgPT4gbWFuaWZlc3Rbcm91dGVdKVswXVxuXG4gIHJldHVybiBsYW1iZGFGaWxlcGF0aCA/IHJlcXVpcmUobGFtYmRhRmlsZXBhdGgpIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzSGFuZGxlcihldmVudDogRXZlbnQsIGxhbWJkYTogeyBoYW5kbGVyOiBIYW5kbGVyIH0pIHtcbiAgY29uc3QgYWNjZXB0ID0gZXZlbnQuaGVhZGVycy5BY2NlcHQgfHwgZXZlbnQuaGVhZGVycy5hY2NlcHRcbiAgY29uc3QgYWNjZXB0c0pzb24gPSBhY2NlcHQgJiYgYWNjZXB0LmluY2x1ZGVzKCdqc29uJylcblxuICAvKlxuICAgKiBObyBhc3NldCBmaWxlLCBubyBzdGF0aWMgZmlsZSwgdHJ5IGR5bmFtaWNcbiAgICovXG4gIHRyeSB7XG4gICAgaWYgKCFsYW1iZGEgfHwgIWxhbWJkYS5oYW5kbGVyKSB7XG4gICAgICB0aHJvdyBjcmVhdGVIdHRwRXJyb3IoNDA0LCAnJylcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplUmVzcG9uc2UoYXdhaXQgbGFtYmRhLmhhbmRsZXIoZXZlbnQsIHsgYXdzUmVxdWVzdElkOiAncHJlc3RhIGRldicgfSBhcyBDb250ZXh0KSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGVycm9yID0gZSBhcyBIdHRwRXJyb3JcbiAgICBjb25zdCB7IHN0YXR1c0NvZGUgPSA1MDAgfSA9IGVycm9yXG5cbiAgICBpZiAoc3RhdHVzQ29kZSA+IDQ5OSlcbiAgICAgIGxvZ2dlci5lcnJvcih7XG4gICAgICAgIGxhYmVsOiAnZXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IHN0YXR1cy5tZXNzYWdlW3N0YXR1c0NvZGVdLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gbm9ybWFsaXplUmVzcG9uc2Uoe1xuICAgICAgc3RhdHVzQ29kZTogc3RhdHVzQ29kZSxcbiAgICAgIGh0bWw6IGFjY2VwdHNKc29uID8gdW5kZWZpbmVkIDogY3JlYXRlRGVmYXVsdEh0bWxSZXNwb25zZSh7IHN0YXR1c0NvZGUgfSksXG4gICAgICBqc29uOiBhY2NlcHRzSnNvbiA/IHsgZGV0YWlsOiBzdGF0dXMubWVzc2FnZVtzdGF0dXNDb2RlXSB9IDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH06IHsgcG9ydDogbnVtYmVyOyBjb25maWc6IENvbmZpZyB9KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SGFuZGxlcihyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpIHtcbiAgICBjb25zdCB0aW1lID0gdGltZXIoKVxuICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVxdWVzdFRvRXZlbnQocmVxKSAvLyBzdG9jayBBV1MgRXZlbnQgc2hhcGVcbiAgICBjb25zdCBtYW5pZmVzdCA9IHJlcXVpcmVGcmVzaChjb25maWcuZnVuY3Rpb25zTWFuaWZlc3QpXG4gICAgY29uc3QgbGFtYmRhID0gbG9hZExhbWJkYUZyb01hbmlmZXN0KGV2ZW50LnBhdGgsIG1hbmlmZXN0KVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvY2Vzc0hhbmRsZXIoZXZlbnQsIGxhbWJkYSlcbiAgICBjb25zdCByZWRpciA9IHJlc3BvbnNlLnN0YXR1c0NvZGUgPiAyOTkgJiYgcmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDM5OVxuICAgIGNvbnN0IG1pbWUgPSBnZXRNaW1lVHlwZShyZXNwb25zZSlcblxuICAgIGlmIChtaW1lID09PSAnaHRtbCcpIHtcbiAgICAgIHJlc3BvbnNlLmJvZHkgPSAocmVzcG9uc2UuYm9keSB8fCAnJykuc3BsaXQoJzwvYm9keT4nKVswXSArIGNyZWF0ZUxpdmVSZWxvYWRTY3JpcHQoeyBwb3J0IH0pXG4gICAgfVxuXG4gICAgc2VuZFNlcnZlcmxlc3NSZXNwb25zZShyZXMsIHJlc3BvbnNlKVxuXG4gICAgbG9nZ2VyW3Jlc3BvbnNlLnN0YXR1c0NvZGUgPCAyOTkgPyAnaW5mbycgOiAnZXJyb3InXSh7XG4gICAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICAgIG1lc3NhZ2U6IGAke3Jlc3BvbnNlLnN0YXR1c0NvZGV9ICR7cmVkaXIgPyByZXNwb25zZT8uaGVhZGVycz8uTG9jYXRpb24gfHwgZXZlbnQucGF0aCA6IGV2ZW50LnBhdGh9YCxcbiAgICAgIGR1cmF0aW9uOiB0aW1lKCksXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVySGFuZGxlcih7IHBvcnQsIGNvbmZpZyB9OiB7IHBvcnQ6IG51bWJlcjsgY29uZmlnOiBDb25maWcgfSkge1xuICBjb25zdCBzdGF0aWNEaXIgPSBjb25maWcuc3RhdGljT3V0cHV0RGlyXG4gIGNvbnN0IGFzc2V0RGlyID0gY29uZmlnLmFzc2V0c1xuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzZXJ2ZUhhbmRsZXIocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlKSB7XG4gICAgY29uc3QgdGltZSA9IHRpbWVyKClcbiAgICBjb25zdCB1cmwgPSByZXEudXJsIGFzIHN0cmluZ1xuXG4gICAgbG9nZ2VyLmRlYnVnKHtcbiAgICAgIGxhYmVsOiAnZGVidWcnLFxuICAgICAgbWVzc2FnZTogYGhhbmRsaW5nICR7dXJsfWAsXG4gICAgfSlcblxuICAgIC8vIGhvb2sgaW50byBzaXJ2IGZvciBsb2dnaW5nIG9ubHlcbiAgICAvKiBjOCBpZ25vcmUgc3RhcnQgKi9cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXJzKHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSwgcGF0aG5hbWU6IHN0cmluZykge1xuICAgICAgbG9nZ2VyLmluZm8oe1xuICAgICAgICBsYWJlbDogJ3NlcnZlJyxcbiAgICAgICAgbWVzc2FnZTogYCR7cmVzLnN0YXR1c0NvZGV9ICR7cGF0aG5hbWV9YCxcbiAgICAgICAgZHVyYXRpb246IHRpbWUoKSxcbiAgICAgIH0pXG4gICAgfVxuICAgIC8qIGM4IGlnbm9yZSBlbmQgKi9cblxuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDIgKi9cbiAgICBzaXJ2KGFzc2V0RGlyLCB7IGRldjogdHJ1ZSwgc2V0SGVhZGVycyB9KShyZXEsIHJlcywgKCkgPT4ge1xuICAgICAgc2lydihzdGF0aWNEaXIsIHsgZGV2OiB0cnVlLCBzZXRIZWFkZXJzIH0pKHJlcSwgcmVzLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNyZWF0ZVJlcXVlc3RIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH0pKHJlcSwgcmVzKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZShjb25maWc6IENvbmZpZywgaG9va3M6IEhvb2tzKSB7XG4gIGNvbnN0IHBvcnQgPSBjb25maWcucG9ydFxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihjcmVhdGVTZXJ2ZXJIYW5kbGVyKHsgcG9ydCwgY29uZmlnIH0pKS5saXN0ZW4ocG9ydClcbiAgY29uc3Qgd2Vic29ja2V0ID0gbmV3IFdlYlNvY2tldFNlcnZlcih7IHNlcnZlciB9KVxuICBjb25zdCBzb2NrZXRzOiBTb2NrZXRbXSA9IFtdXG5cbiAgc2VydmVyLm9uKCdjb25uZWN0aW9uJywgKHNvY2tldCkgPT4ge1xuICAgIHNvY2tldHMucHVzaChzb2NrZXQpXG4gICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHNvY2tldHMuc3BsaWNlKHNvY2tldHMuaW5kZXhPZihzb2NrZXQpLCAxKSlcbiAgfSlcblxuICBob29rcy5vbkJyb3dzZXJSZWZyZXNoKCgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoe1xuICAgICAgbGFiZWw6ICdkZWJ1ZycsXG4gICAgICBtZXNzYWdlOiBgcmVmcmVzaCBldmVudCByZWNlaXZlZGAsXG4gICAgfSlcblxuICAgIHdlYnNvY2tldC5jbGllbnRzLmZvckVhY2goKHdzKSA9PiB3cy5zZW5kKCdyZWZyZXNoJykpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBjbG9zZSgpIHtcbiAgICAgIC8vIHNvIGp1c3QgYWx3YXlzIHJlc29sdmUgT0tcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoeSkgPT4ge1xuICAgICAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4geSgxKSlcbiAgICAgICAgLy8gc29ja2V0cyBpbmNsdWRlcyB3cyBzb2NrZXRzXG4gICAgICAgIHNvY2tldHMuZm9yRWFjaCgod3MpID0+IHdzLmRlc3Ryb3koKSlcbiAgICAgIH0pXG4gICAgfSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjttOEJBQUEsb0NBRUEsT0FBaUIsbUJBQ2pCLEdBQWlCLGcvQ0NIakIsT0FBZSx1QkFDZixHQUFpQixtQkFDakIsR0FBcUIsdUJDRnJCLDZKQUF5QixvQkNBbEIsR0FBTSxHQUFNLENBQ2pCLFdBQVksYUFDWixZQUFhLGVERVIsR0FBSyxHQUFMLFVBQUssRUFBTCxDQUNMLFFBQVEsUUFDUixPQUFPLE9BQ1AsT0FBTyxPQUNQLE1BQU0sVUFKSSxXQWVaLEdBQUksR0FBYyxHQUVaLEdBQVMsRUFDWixFQUFPLE9BQVEsV0FDZixFQUFPLE1BQU8sUUFDZCxFQUFPLE1BQU8sVUFDZCxFQUFPLEtBQU0sT0FLVCxhQUFtQixDQUN4QixHQUFJLENBQUMsUUFBUSxJQUFJLFFBQ2YsS0FBTSxJQUFJLE9BQU0sZ0RBR2xCLE1BQU8sR0FHRixXQUFnQixFQUFrQixDQUN2QyxHQUFJLFFBQVEsSUFBSSxRQUNkLEVBQUssS0FBSyxPQUNMLENBQ0wsR0FBTSxHQUFRLFFB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