build-ts 15.0.6 → 15.0.8

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.
Files changed (2) hide show
  1. package/dist/index.js +2 -2
  2. package/package.json +16 -15
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import b from"@rollup/plugin-json";import g from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap((e=>e.toString().split(","))),...e.autoInline?Object.keys(T(e,o)):[]]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},I={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function A(e,o,n,s,i,c){const a=[...e.external??[]].map((e=>e.toString()));if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(m.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),b(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map((e=>new RegExp(`^${e}(?:\\/.+)?`))),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),g({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:e.keepImport?.map((e=>e.toString()))??[]})],u="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=u?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:u?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some((e=>e.preserveModules))?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[m,f]=await N(i);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map((e=>r.join(o,e.toString())));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),b=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some((e=>e.endsWith(".tsx")))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${b} (${o})`));const[g]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(m),h="module"===m.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=b;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,b,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===b&&await H(i,m,e.moduleType);const v={input:"functions"===b?Object.fromEntries(y.map(((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e]))):y,plugins:A(e,b,m,g,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map((e=>r.relative(i,e)));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",(async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()}))}(e,b,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map((e=>e.file||e.dir||""))).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map((e=>s.write(e)))),e.silent||console.info(c.green(`Created ${w(j.map((e=>e.file||e.dir||""))).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===b||"functions"===b||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map((e=>e.toString()))];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IE9wdGlvbnMgfT4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpIHx8ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggfHwgW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCBjb21tb25qcyBmcm9tICdAcm9sbHVwL3BsdWdpbi1jb21tb25qcyc7XG5pbXBvcnQganNvbiBmcm9tICdAcm9sbHVwL3BsdWdpbi1qc29uJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1yZXBsYWNlJztcbmltcG9ydCB0ZXJzZXIgZnJvbSAnQHJvbGx1cC9wbHVnaW4tdGVyc2VyJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2Uoe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5qb2luKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuIl0sIm5hbWVzIjpbImVudlZhcnMiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUiLCJhcmd2IiwiY3dkIiwicmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJPYmplY3QiLCJrZXlzIiwiY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIiwiZW52VmFyc0RlZiIsImVudlZhck5hbWVzIiwiU2V0IiwiaW5saW5lIiwiZmxhdE1hcCIsImUiLCJ0b1N0cmluZyIsInNwbGl0IiwiYXV0b0lubGluZSIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoicy9CQU1BLElBQUlBLEVBS0csU0FBU0MsRUFDZEMsRUFDQUMsR0FRQSxPQU5LSCxJQUNIQSxFQUFVSSxFQUFpQ0YsRUFBTUMsR0FDN0NELEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssbUJBQW9CQyxPQUFPQyxLQUFLVCxLQUcxQ0EsQ0FDVCxDQUtPLFNBQVNVLEVBQ2RSLEVBQ0FDLEdBRUEsTUFBTVEsRUFBcUMsQ0FBQSxFQUNyQ0MsRUFBYyxJQUFJQyxJQUFJLEtBQ3RCWCxFQUFLWSxRQUFVLElBQUlDLFNBQVNDLEdBQU1BLEVBQUVDLFdBQVdDLE1BQU0sVUFDckRoQixFQUFLaUIsV0FBYVgsT0FBT0MsS0FBS1IsRUFBa0NDLEVBQU1DLElBQVEsS0FFcEYsSUFBSyxNQUFNaUIsS0FBUVIsT0FDU1MsSUFBdEJDLFFBQVFDLElBQUlILEtBRWhCVCxFQUFXLGVBQWVTLEtBQVVJLEtBQUtDLFVBQVVILFFBQVFDLElBQUlILEtBS2pFLE9BSElsQixFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLG1CQUFvQkMsT0FBT0MsS0FBS0UsSUFFeENBLENBQ1QsQ0MzQ08sTUFBTWUsRUFBc0IsQ0FBQyxNQUFPLFlBQWEsT0NJakRDLGVBQWVDLEVBQWdCQyxHQUNwQyxNQUFNQyxFQUFrQkMsRUFBS0MsS0FBS0gsRUFBUyxnQkFDM0MsSUFDRSxNQUFNSSxRQUF3QkMsRUFBR0MsU0FBU0MsU0FBU04sRUFBaUIsUUFDcEUsTUFBTyxDQUFDTixLQUFLYSxNQUFNSixHQUFpQ0gsRUFDdEQsQ0FBRSxNQUNBLENBRUYs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
1
+ import{readAndApplyEnvironmentVariables as e,yargsOptionsBuilderForEnv as o,removeNpmAndYarnEnvironmentVariables as n}from"@willbooster/shared-lib-node";import s from"yargs";import{hideBin as i}from"yargs/helpers";import t from"node:fs";import r from"node:path";import c from"chalk";import a from"date-time";import p from"pretty-ms";import{rollup as l,watch as d}from"rollup";import{onExit as u}from"signal-exit";import m from"node:url";import{babel as f}from"@rollup/plugin-babel";import y from"@rollup/plugin-commonjs";import b from"@rollup/plugin-json";import g from"@rollup/plugin-node-resolve";import h from"@rollup/plugin-replace";import j from"@rollup/plugin-terser";import v from"rollup-plugin-analyzer";import{keepImport as w}from"rollup-plugin-keep-import";import{nodeExternals as x}from"rollup-plugin-node-externals";import k from"rollup-plugin-preserve-directives";import{string as S}from"rollup-plugin-string";import $ from"node:process";import E from"typescript";import*as D from"node:child_process";let O;function T(o,n){return O||(O=e(o,n),o.verbose&&console.info("Loaded env vars:",Object.keys(O))),O}function F(e,o){const n={},s=new Set([...(e.inline??[]).flatMap(e=>e.toString().split(",")),...e.autoInline?Object.keys(T(e,o)):[]]);for(const e of s)void 0!==process.env[e]&&(n[`process.env.${e}`]=JSON.stringify(process.env[e]));return e.verbose&&console.info("Inline env vars:",Object.keys(n)),n}const _=["app","functions","lib"];async function N(e){const o=r.join(e,"package.json");try{const e=await t.promises.readFile(o,"utf8");return[JSON.parse(e),o]}catch{}return[void 0,o]}const B={...o,silent:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"s"}},R={...B,input:{description:'Paths of source code files to be built. The first file is main. If no option is given, "src/index.{ts,tsx}" from package directory is targeted.',type:"array",alias:"i"},"core-js":{description:"Whether or not core-js is employed.",type:"boolean",default:!1},"core-js-proposals":{description:"Whether or not core-js with proposals support is employed.",type:"boolean",default:!1},minify:{description:"Whether or not minification is enabled.",type:"boolean",default:!0},sourcemap:{description:"Whether or not sourcemap is enabled.",type:"boolean",default:!0},external:{description:"Additional external dependencies.",type:"array"},inline:{description:"Environment variables to be inlined.",type:"array"},"auto-inline":{description:"Inline environment variables defined at env files.",type:"boolean",default:!1},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"},keepImport:{description:"Identifiers to be kept as import statements.",type:"array"},bundleBuiltins:{description:"Module names same with builtins (e.g., undici) to be bundled.",type:"array"}},C={...R,moduleType:{description:"esm, cjs, or either (default).",type:"string",alias:"m"}},L={...C,onlyPackageJson:{description:"Whether to generate only package.json.",type:"boolean"}},I={...R,moduleType:{description:"esm, cjs, either, or both (default).",type:"string",alias:"m"},jsExtension:{description:"Whether to use .js in cjs and/or esm: either (default), both, or none.",type:"string",alias:"j"}};function A(e,o,n,s,i,c){const a=[...e.external??[]].map(e=>e.toString());if(n.dependencies?.["@prisma/client"]&&a.push("prisma-client"),a.push(...Object.keys(n.dependencies??{}),...Object.keys(n.peerDependencies??{}),...Object.keys(n.optionalDependencies??{})),t.existsSync(r.join("..","..","package.json"))){const e=t.readdirSync(r.join(".."),{withFileTypes:!0});for(const o of e){if(!o.isDirectory())continue;const e=r.join("..",o.name,"package.json");if(!t.existsSync(e))continue;const s=JSON.parse(t.readFileSync(e,"utf8"));n.dependencies?.[s.name??""]&&a.push(...Object.keys(s.dependencies??{}),...Object.keys(s.peerDependencies??{}),...Object.keys(s.optionalDependencies??{}))}}const p=[".cjs",".mjs",".js",".jsx",".json",".cts",".mts",".ts",".tsx"],l=r.join(m.fileURLToPath(r.dirname(r.dirname(import.meta.url))),"babel.config.mjs"),d=[h({delimiters:["",""],preventAssignment:!0,values:F(e,i)}),b(),x({deps:!0,devDeps:!1,peerDeps:!0,optDeps:!0,include:a.map(e=>new RegExp(`^${e}(?:\\/.+)?`)),exclude:s&&new RegExp(`^@?${s}(?:\\/.+)?`)}),g({extensions:p,preferBuiltins:o=>!e.bundleBuiltins?.includes(o)}),y(),w({moduleNames:e.keepImport?.map(e=>e.toString())??[]})],u="app-node"===o||"functions"===o||!a.includes("@babel/runtime");return process.env.BUILDTS_USE_BABLE_RUNTIME=u?"":"1",d.push(f({configFile:l,extensions:p,babelHelpers:u?"bundled":"runtime",exclude:/^(.+\/)?node_modules\/.+$/}),...c.some(e=>e.preserveModules)?[k()]:[],S({include:["**/*.csv","**/*.txt"]})),e.minify&&d.push(j({compress:{directives:!1}})),d.push(v({summaryOnly:!0})),d}async function P(e,o){const n=E.findConfigFile(o,E.sys.fileExists);if(!n)throw new Error(`Failed to find tsconfig.json in ${o}.`);e.verbose&&console.info("Found tsconfig.json:",n);const s=[];let i=r.join("dist",r.basename(o),"src");if(t.existsSync(i)){const e=r.dirname(o),n=await t.promises.readdir(e,{withFileTypes:!0});o=r.resolve(o);for(const i of n){if(!i.isDirectory())continue;const n=r.resolve(e,i.name);if(n===o)continue;const c=E.findConfigFile(n,E.sys.fileExists),a=r.join("dist",i.name,"src");c&&t.existsSync(a)&&s.push([n,c,a])}}else i="dist";s.push([o,n,i]);let c=!0;for(const[n,i,t]of s)c&&=U(e,n,i,r.join(o,t));return c}function U(e,o,n,s){e.verbose&&console.info("runTypeScriptCompiler()",o,n,s);const{config:i}=E.readConfigFile(n,E.sys.readFile);i.compilerOptions={...i.compilerOptions,declaration:!0,emitDeclarationOnly:!0,noEmit:!1,noEmitOnError:!0,outDir:s},i.include=["src/**/*"];const{errors:t,fileNames:r,options:c}=E.parseJsonConfigFileContent(i,E.sys,o),a=E.createProgram({options:c,rootNames:r,configFileParsingDiagnostics:t}),{diagnostics:p,emitSkipped:l}=a.emit(),d=[...E.getPreEmitDiagnostics(a),...p,...t];if(d.length>0){const e={getCanonicalFileName:e=>e,getCurrentDirectory:E.sys.getCurrentDirectory,getNewLine:()=>E.sys.newLine},o=E.formatDiagnostics(d,e);console.warn(o)}return!l}const W={command:"app [package]",describe:"Build an app",builder:C,handler:async e=>G(e,"app")},J={command:"functions [package]",describe:"Build a GCP/Firebase functions app",builder:L,async handler(e){if(!e.onlyPackageJson)return G(e,"functions");{const o=r.resolve(e.package?.toString()??"."),[n,s]=await N(o);n||(console.error(`Failed to parse package.json (${s}).`),process.exit(1)),await H(o,n,e.moduleType)}}},M={command:"lib [package]",describe:"Build a Node.js / React library",builder:I,handler:async e=>G(e,"lib")};async function G(e,o){process.env.NODE_ENV||="production";const n=!e.silent&&e.verbose,s=process.cwd(),i=r.resolve(e.package?.toString()??"."),[m,f]=await N(i);m||(console.error(`Failed to parse package.json (${f}).`),process.exit(1)),T(e,i);const y=function(e,o,n){if(e.input&&e.input.length>0)return e.input.map(e=>r.join(o,e.toString()));const s=r.join(n,"src");for(const e of["ts","tsx","cts","mts"]){const o=r.join(s,`index.${e}`);if(t.existsSync(o))return[o]}console.error("Failed to detect input file."),process.exit(1)}(e,s,i),b=function(e,o){switch(e){case"app":return"app-node";case"functions":return"functions";case"lib":return o.some(e=>e.endsWith(".tsx"))?"lib-react":"lib";default:console.error("target option must be one of: "+_.join(", ")),process.exit(1)}}(o,y);n&&(console.info("argv:",e),console.info("packageJsonPath:",f),console.info("Target (Category):",`${b} (${o})`));const[g]=function(e){const o=e.name?.toString()||"",n=/@([^/]+)\/(.+)/.exec(o),[,s,i]=n||[];return[s,i]}(m),h="module"===m.type;e["core-js"]?process.env.BUILD_TS_COREJS="1":e["core-js-proposals"]&&(process.env.BUILD_TS_COREJS_WITH_PROPOSALS="1"),n&&(process.env.BUILD_TS_VERBOSE="1"),process.env.BUILD_TS_TARGET_CATEGORY=o,process.env.BUILD_TS_TARGET_DETAIL=b;const j=function(e,o,n,s){const i=r.join(n,"dist");if("app-node"===o||"functions"===o)return[{dir:i,format:V(s,e.moduleType)?"module":"commonjs",sourcemap:e.sourcemap&&"inline"}];const t=[],c=e.moduleType||"both",a=e.jsExtension||"either";("cjs"===c||"both"===c||"either"===c&&!s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&!s?"[name].js":"[name].cjs",format:"commonjs",preserveModules:!0,sourcemap:e.sourcemap});("esm"===c||"both"===c||"either"===c&&s)&&t.push({dir:i,entryFileNames:"both"===a||"either"===a&&s?"[name].js":"[name].mjs",format:"module",preserveModules:!0,sourcemap:e.sourcemap});return t}(e,b,i,h);n&&console.info("OutputOptions:",j),0===j.length&&(console.error("Failed to detect output files."),process.exit(1)),process.chdir(i),await t.promises.rm(r.join(i,"dist"),{recursive:!0,force:!0}),"functions"===b&&await H(i,m,e.moduleType);const v={input:"functions"===b?Object.fromEntries(y.map((e,o)=>[0===o?"index":r.basename(e,r.extname(e)),e])):y,plugins:A(e,b,m,g,i,j),watch:e.watch?{clearScreen:!1}:void 0},w=e=>(Array.isArray(e)?e:[e]).map(e=>r.relative(i,e));if(e.watch)!function(e,o,n,s,i,t){const r=d({...s,output:i}),l=async e=>{process.removeListener("uncaughtException",l),process.stdin.removeListener("end",l),r&&await r.close(),e&&process.exit(e)};u(l),process.on("uncaughtException",l),process.stdin.isTTY||(process.stdin.on("end",l),process.stdin.resume());r.on("event",async s=>{switch(s.code){case"ERROR":!function(e,o=!1){const n=e.name||e.cause?.name,s=n?`${n}: `:"",i=`${e.plugin?`(plugin ${e.plugin}) `:""}${s}${e.message}`,t=[c.bold(c.red(`[!] ${c.bold(i.toString())}`))];e.url&&t.push(c.cyan(e.url)),e.loc?t.push(`${e.loc.file||e.id} (${e.loc.line}:${e.loc.column})`):e.id&&t.push(e.id),e.frame&&t.push(c.dim(e.frame)),e.stack&&t.push(c.dim(e.stack?.replace(`${s}${e.message}\n`,""))),t.push("",""),console.error(t.join("\n")),o||$.exit(1)}(s.error,!0);break;case"BUNDLE_START":{if(e.silent)break;const o=s.input,i=[];"string"==typeof o?i.push(o):i.push(...Array.isArray(o)?o:Object.values(o)),console.info(c.cyan(`Bundles ${c.bold(t(i).join(", "))} → ${c.bold(t(s.output).join(", "))}\non ${n} ...`));break}case"BUNDLE_END":if(e.silent)break;console.info(c.green(`Created ${c.bold(t(s.output).join(", "))} in ${c.bold(p(s.duration))}`)),"app-node"!==o&&"functions"!==o&&await P(e,n);break;case"END":if(e.silent)break;console.info(`\n[${a()}] waiting for changes...`)}"result"in s&&s.result&&s.result.close()})}(e,b,i,v,j,w);else{let o;e.silent||console.info(c.cyan(`Bundles ${c.bold(w(y).join(", "))} → ${c.bold(w(j.map(e=>e.file||e.dir||"")).join(", "))}\non ${i} ...`));let n=!1;try{const n=Date.now(),s=await l(v);o=s,await Promise.all(j.map(e=>s.write(e))),e.silent||console.info(c.green(`Created ${w(j.map(e=>e.file||e.dir||"")).join(", ")} in ${c.bold(p(Date.now()-n))}`))}catch(e){n=!0,console.error("Failed to build due to:",e)}await(o?.close()),n&&process.exit(1),"app-node"===b||"functions"===b||await P(e,i)||process.exit(1)}}async function H(e,o,n){o.name+="-dist";const s="module"===o.type,i=V(s,n);o.main=s===i?"index.js":i?"index.mjs":"index.cjs",delete o.scripts,delete o.devDependencies,await t.promises.mkdir(r.join(e,"dist"),{recursive:!0}),await t.promises.writeFile(r.join(e,"dist","package.json"),JSON.stringify(o))}function V(e,o){return"esm"===o||(!o||"either"===o)&&e}const Y={command:"run <file>",describe:"Run script",builder:{...B,module:{description:"A module type: cjs or esm",type:"string",alias:"m"},watch:{description:"Whether watch mode is enabled or not",type:"boolean",alias:"w"}},handler(e){T(e,process.cwd());const o=e.file?.toString()||"",n=process.versions.bun,s=n?"bun":"node",i=n?["--bun"]:["--no-warnings","--import","tsx"];e.watch&&i.push("--watch"),i.push(o);const[,...t]=e._,r=[...i,...t.map(e=>e.toString())];e.verbose&&console.info(`Running '${s} ${r.join(" ")}'`);const c=D.spawnSync(s,r,{stdio:"inherit",env:{...process.env}});process.exit(c.status??1)}};n(process.env),await s(i(process.argv)).scriptName("build-ts").options(B).command(W).command(J).command(M).command(Y).demandCommand().strict().help().argv;
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbnYudHMiLCIuLi9zcmMvdHlwZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvc2hhcmVkT3B0aW9uc0J1aWxkZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvYnVpbGRlci50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9wbHVnaW4udHMiLCIuLi9zcmMvY29tbWFuZHMvYnVpbGQvdHlwZVNjcmlwdC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyIsIi4uL3NyYy9jb21tYW5kcy9idWlsZC9yb2xsdXBMb2dnZXIudHMiLCIuLi9zcmMvY29tbWFuZHMvcnVuLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRBbmRBcHBseUVudmlyb25tZW50VmFyaWFibGVzIH0gZnJvbSAnQHdpbGxib29zdGVyL3NoYXJlZC1saWItbm9kZSc7XG5cbmltcG9ydCB0eXBlIHsgYnVpbGRlciB9IGZyb20gJy4vY29tbWFuZHMvYnVpbGQvYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcblxubGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBsb2FkcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBgLmVudmAgZmlsZXMuXG4gKiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2Ygc2hhcmVkT3B0aW9uc0J1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghZW52VmFycykge1xuICAgIGVudlZhcnMgPSByZWFkQW5kQXBwbHlFbnZpcm9ubWVudFZhcmlhYmxlcyhhcmd2LCBjd2QpO1xuICAgIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnTG9hZGVkIGVudiB2YXJzOicsIE9iamVjdC5rZXlzKGVudlZhcnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGVudlZhcnM7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZGVmaW5pdGlvbiBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGJ1aWxkLlxuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZpcm9ubWVudFZhcmlhYmxlc0RlZmluaXRpb24oXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8dHlwZW9mIGJ1aWxkZXI+LFxuICBjd2Q6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IGVudlZhcnNEZWY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgY29uc3QgZW52VmFyTmFtZXMgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXJndi5pbmxpbmUgPz8gW10pLmZsYXRNYXAoKGUpID0+IGUudG9TdHJpbmcoKS5zcGxpdCgnLCcpKSxcbiAgICAuLi4oYXJndi5hdXRvSW5saW5lID8gT2JqZWN0LmtleXMobG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlKGFyZ3YsIGN3ZCkpIDogW10pLFxuICBdKTtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52W25hbWVdID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgZW52VmFyc0RlZltgcHJvY2Vzcy5lbnYuJHtuYW1lfWBdID0gSlNPTi5zdHJpbmdpZnkocHJvY2Vzcy5lbnZbbmFtZV0pO1xuICB9XG4gIGlmIChhcmd2LnZlcmJvc2UpIHtcbiAgICBjb25zb2xlLmluZm8oJ0lubGluZSBlbnYgdmFyczonLCBPYmplY3Qua2V5cyhlbnZWYXJzRGVmKSk7XG4gIH1cbiAgcmV0dXJuIGVudlZhcnNEZWY7XG59XG4iLCJpbXBvcnQgdHlwZSB7IEFyZ3VtZW50c0NhbWVsQ2FzZSwgSW5mZXJyZWRPcHRpb25UeXBlcywgT3B0aW9ucyB9IGZyb20gJ3lhcmdzJztcblxuZXhwb3J0IGNvbnN0IGFsbFRhcmdldENhdGVnb3JpZXMgPSBbJ2FwcCcsICdmdW5jdGlvbnMnLCAnbGliJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFRhcmdldENhdGVnb3J5ID0gKHR5cGVvZiBhbGxUYXJnZXRDYXRlZ29yaWVzKVtudW1iZXJdO1xuXG5leHBvcnQgY29uc3QgYWxsVGFyZ2V0RGV0YWlscyA9IFsnYXBwLW5vZGUnLCAnZnVuY3Rpb25zJywgJ2xpYicsICdsaWItcmVhY3QnXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgVGFyZ2V0RGV0YWlsID0gKHR5cGVvZiBhbGxUYXJnZXREZXRhaWxzKVtudW1iZXJdO1xuXG5leHBvcnQgdHlwZSBBcmd1bWVudHNUeXBlPFQgZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IE9wdGlvbnMgfT4gPSBBcmd1bWVudHNDYW1lbENhc2U8SW5mZXJyZWRPcHRpb25UeXBlczxUPj47XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFBhY2thZ2VKc29uKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8W1BhY2thZ2VKc29uIHwgdW5kZWZpbmVkLCBzdHJpbmddPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCAncGFja2FnZS5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25UZXh0ID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpO1xuICAgIHJldHVybiBbSlNPTi5wYXJzZShwYWNrYWdlSnNvblRleHQpIGFzIFBhY2thZ2VKc29uLCBwYWNrYWdlSnNvblBhdGhdO1xuICB9IGNhdGNoIHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cbiAgcmV0dXJuIFt1bmRlZmluZWQsIHBhY2thZ2VKc29uUGF0aF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWlsZFRzUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHVybC5maWxlVVJMVG9QYXRoKHBhdGguZGlybmFtZShwYXRoLmRpcm5hbWUoaW1wb3J0Lm1ldGEudXJsKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQW5kTmFtZShwYWNrYWdlSnNvbjogUGFja2FnZUpzb24pOiBbc3RyaW5nIHwgdW5kZWZpbmVkLCBzdHJpbmcgfCB1bmRlZmluZWRdIHtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlSnNvbi5uYW1lPy50b1N0cmluZygpIHx8ICcnO1xuICBjb25zdCBtYXRjaCA9IC9AKFteL10rKVxcLyguKykvLmV4ZWMocGFja2FnZU5hbWUpO1xuICBjb25zdCBbLCBuYW1lc3BhY2UsIG5hbWVdID0gbWF0Y2ggfHwgW107XG4gIHJldHVybiBbbmFtZXNwYWNlLCBuYW1lXTtcbn1cbiIsImltcG9ydCB7IHlhcmdzT3B0aW9uc0J1aWxkZXJGb3JFbnYgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcblxuZXhwb3J0IGNvbnN0IHNoYXJlZE9wdGlvbnNCdWlsZGVyID0ge1xuICAuLi55YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52LFxuICBzaWxlbnQ6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgd2F0Y2ggbW9kZSBpcyBlbmFibGVkIG9yIG5vdCcsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGFsaWFzOiAncycsXG4gIH0sXG59IGFzIGNvbnN0O1xuIiwiaW1wb3J0IHsgc2hhcmVkT3B0aW9uc0J1aWxkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbmV4cG9ydCBjb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgaW5wdXQ6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQYXRocyBvZiBzb3VyY2UgY29kZSBmaWxlcyB0byBiZSBidWlsdC4gVGhlIGZpcnN0IGZpbGUgaXMgbWFpbi4gSWYgbm8gb3B0aW9uIGlzIGdpdmVuLCBcInNyYy9pbmRleC57dHMsdHN4fVwiIGZyb20gcGFja2FnZSBkaXJlY3RvcnkgaXMgdGFyZ2V0ZWQuJyxcbiAgICB0eXBlOiAnYXJyYXknLFxuICAgIGFsaWFzOiAnaScsXG4gIH0sXG4gICdjb3JlLWpzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyBpcyBlbXBsb3llZC4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgJ2NvcmUtanMtcHJvcG9zYWxzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3QgY29yZS1qcyB3aXRoIHByb3Bvc2FscyBzdXBwb3J0IGlzIGVtcGxveWVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBtaW5pZnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1doZXRoZXIgb3Igbm90IG1pbmlmaWNhdGlvbiBpcyBlbmFibGVkLicsXG4gICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHNvdXJjZW1hcDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciBvciBub3Qgc291cmNlbWFwIGlzIGVuYWJsZWQuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgZXh0ZXJuYWw6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgaW5saW5lOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gYmUgaW5saW5lZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG4gICdhdXRvLWlubGluZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ0lubGluZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBhdCBlbnYgZmlsZXMuJyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIHdhdGNoOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdhdGNoIG1vZGUgaXMgZW5hYmxlZCBvciBub3QnLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICBhbGlhczogJ3cnLFxuICB9LFxuICBrZWVwSW1wb3J0OiB7XG4gICAgZGVzY3JpcHRpb246ICdJZGVudGlmaWVycyB0byBiZSBrZXB0IGFzIGltcG9ydCBzdGF0ZW1lbnRzLicsXG4gICAgdHlwZTogJ2FycmF5JyxcbiAgfSxcbiAgYnVuZGxlQnVpbHRpbnM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ01vZHVsZSBuYW1lcyBzYW1lIHdpdGggYnVpbHRpbnMgKGUuZy4sIHVuZGljaSkgdG8gYmUgYnVuZGxlZC4nLFxuICAgIHR5cGU6ICdhcnJheScsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgYXBwQnVpbGRlciA9IHtcbiAgLi4uYnVpbGRlcixcbiAgbW9kdWxlVHlwZToge1xuICAgIGRlc2NyaXB0aW9uOiAnZXNtLCBjanMsIG9yIGVpdGhlciAoZGVmYXVsdCkuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IGZ1bmN0aW9uc0J1aWxkZXIgPSB7XG4gIC4uLmFwcEJ1aWxkZXIsXG4gIG9ubHlQYWNrYWdlSnNvbjoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0byBnZW5lcmF0ZSBvbmx5IHBhY2thZ2UuanNvbi4nLFxuICAgIHR5cGU6ICdib29sZWFuJyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsaWJCdWlsZGVyID0ge1xuICAuLi5idWlsZGVyLFxuICBtb2R1bGVUeXBlOiB7XG4gICAgZGVzY3JpcHRpb246ICdlc20sIGNqcywgZWl0aGVyLCBvciBib3RoIChkZWZhdWx0KS4nLFxuICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgIGFsaWFzOiAnbScsXG4gIH0sXG4gIC8vIC5qcyBmaWxlcyBpbiBhIHBhY2thZ2Ugd2l0aCBgXCJ0eXBlXCI6IFwibW9kdWxlXCJgIGFyZSB0cmVhdGVkIGFzIGVzbS5cbiAgLy8gSG93ZXZlciwgd2Ugd2FudCB0byB0cmVhdCB0aGVtIGFzIGNqcyBpbiB0aGUgY2FzZSB3aGVyZSBhIGNqcyBwcm9qZWN0IGltcG9ydHMgYW4gZXNtIHBhY2thZ2UuXG4gIC8vIFRvIGRlYWwgd2l0aCB0aGUgY2FzZSwgd2UgdXNlIC5janMgYW5kIC5tanMgZXh0ZW5zaW9ucyBpbnN0ZWFkIG9mIC5qcyBleHRlbnNpb24uXG4gIGpzRXh0ZW5zaW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRvIHVzZSAuanMgaW4gY2pzIGFuZC9vciBlc206IGVpdGhlciAoZGVmYXVsdCksIGJvdGgsIG9yIG5vbmUuJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ2onLFxuICB9LFxufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQW55QnVpbGRlclR5cGUgPSB0eXBlb2YgYXBwQnVpbGRlciB8IHR5cGVvZiBmdW5jdGlvbnNCdWlsZGVyIHwgdHlwZW9mIGxpYkJ1aWxkZXI7XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBiYWJlbCB9IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWJhYmVsJztcbmltcG9ydCBjb21tb25qcyBmcm9tICdAcm9sbHVwL3BsdWdpbi1jb21tb25qcyc7XG5pbXBvcnQganNvbiBmcm9tICdAcm9sbHVwL3BsdWdpbi1qc29uJztcbmltcG9ydCByZXNvbHZlIGZyb20gJ0Byb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZSc7XG5pbXBvcnQgcmVwbGFjZSBmcm9tICdAcm9sbHVwL3BsdWdpbi1yZXBsYWNlJztcbmltcG9ydCB0ZXJzZXIgZnJvbSAnQHJvbGx1cC9wbHVnaW4tdGVyc2VyJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUGx1Z2luIH0gZnJvbSAncm9sbHVwJztcbmltcG9ydCBhbmFseXplIGZyb20gJ3JvbGx1cC1wbHVnaW4tYW5hbHl6ZXInO1xuaW1wb3J0IHsga2VlcEltcG9ydCB9IGZyb20gJ3JvbGx1cC1wbHVnaW4ta2VlcC1pbXBvcnQnO1xuaW1wb3J0IHsgbm9kZUV4dGVybmFscyB9IGZyb20gJ3JvbGx1cC1wbHVnaW4tbm9kZS1leHRlcm5hbHMnO1xuaW1wb3J0IHByZXNlcnZlRGlyZWN0aXZlcyBmcm9tICdyb2xsdXAtcGx1Z2luLXByZXNlcnZlLWRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgc3RyaW5nIH0gZnJvbSAncm9sbHVwLXBsdWdpbi1zdHJpbmcnO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudmlyb25tZW50VmFyaWFibGVzRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Vudi5qcyc7XG5pbXBvcnQgdHlwZSB7IEFyZ3VtZW50c1R5cGUsIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGdldEJ1aWxkVHNSb290UGF0aCB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuaW1wb3J0IHR5cGUgeyBidWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwUGx1Z2lucyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sXG4gIHRhcmdldERldGFpbDogVGFyZ2V0RGV0YWlsLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG5hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdXG4pOiBQbHVnaW5bXSB7XG4gIGNvbnN0IGV4dGVybmFsRGVwcyA9IFsuLi4oYXJndi5leHRlcm5hbCA/PyBbXSldLm1hcCgoaXRlbSkgPT4gaXRlbS50b1N0cmluZygpKTtcbiAgaWYgKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcz8uWydAcHJpc21hL2NsaWVudCddKSB7XG4gICAgZXh0ZXJuYWxEZXBzLnB1c2goJ3ByaXNtYS1jbGllbnQnKTtcbiAgfVxuICAvLyBTaW5jZSBgZGVwczogdHJ1ZWAgZG9lcyBub3Qgd29yayBmb3IgYGltcG9ydCBjaHVuayBmcm9tICdsb2Rhc2guY2h1bmsvaW5kZXguanMnO2BcbiAgZXh0ZXJuYWxEZXBzLnB1c2goXG4gICAgLi4uT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAuLi5PYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5vcHRpb25hbERlcGVuZGVuY2llcyA/PyB7fSlcbiAgKTtcbiAgLy8gQWRkIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmcm9tIHNpYmxpbmcgcGFja2FnZXNcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKCcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICBjb25zdCBwYWNrYWdlRGlycyA9IGZzLnJlYWRkaXJTeW5jKHBhdGguam9pbignLi4nKSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGZvciAoY29uc3QgcGFja2FnZURpciBvZiBwYWNrYWdlRGlycykge1xuICAgICAgaWYgKCFwYWNrYWdlRGlyLmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oJy4uJywgcGFja2FnZURpci5uYW1lLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IG90aGVyUGFja2FnZUpzb246IFBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgIGlmIChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXM/LltvdGhlclBhY2thZ2VKc29uLm5hbWUgPz8gJyddKSB7XG4gICAgICAgIGV4dGVybmFsRGVwcy5wdXNoKFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24uZGVwZW5kZW5jaWVzID8/IHt9KSxcbiAgICAgICAgICAuLi5PYmplY3Qua2V5cyhvdGhlclBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgPz8ge30pLFxuICAgICAgICAgIC4uLk9iamVjdC5rZXlzKG90aGVyUGFja2FnZUpzb24ub3B0aW9uYWxEZXBlbmRlbmNpZXMgPz8ge30pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsnLmNqcycsICcubWpzJywgJy5qcycsICcuanN4JywgJy5qc29uJywgJy5jdHMnLCAnLm10cycsICcudHMnLCAnLnRzeCddO1xuICBjb25zdCBiYWJlbENvbmZpZ1BhdGggPSBwYXRoLmpvaW4oZ2V0QnVpbGRUc1Jvb3RQYXRoKCksICdiYWJlbC5jb25maWcubWpzJyk7XG4gIGNvbnN0IHBsdWdpbnM6IFBsdWdpbltdID0gW1xuICAgIHJlcGxhY2Uoe1xuICAgICAgLy8gSWdub3JlIHdvcmQgYm91bmRhcmllcyBhbmQgcmVwbGFjZSBldmVyeSBpbnN0YW5jZSBvZiB0aGUgc3RyaW5nLlxuICAgICAgLy8gY2YuIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2xsdXAvcGx1Z2lucy90cmVlL21hc3Rlci9wYWNrYWdlcy9yZXBsYWNlI3dvcmQtYm91bmRhcmllc1xuICAgICAgZGVsaW1pdGVyczogWycnLCAnJ10sXG4gICAgICBwcmV2ZW50QXNzaWdubWVudDogdHJ1ZSxcbiAgICAgIHZhbHVlczogY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKSxcbiAgICB9KSxcbiAgICBqc29uKCksXG4gICAgbm9kZUV4dGVybmFscyh7XG4gICAgICBkZXBzOiB0cnVlLFxuICAgICAgZGV2RGVwczogZmFsc2UsXG4gICAgICBwZWVyRGVwczogdHJ1ZSxcbiAgICAgIG9wdERlcHM6IHRydWUsXG4gICAgICBpbmNsdWRlOiBleHRlcm5hbERlcHMubWFwKChuYW1lKSA9PiBuZXcgUmVnRXhwKGBeJHtuYW1lfSg/OlxcXFwvLispP2ApKSxcbiAgICAgIGV4Y2x1ZGU6IG5hbWVzcGFjZSAmJiBuZXcgUmVnRXhwKGBeQD8ke25hbWVzcGFjZX0oPzpcXFxcLy4rKT9gKSxcbiAgICB9KSxcbiAgICByZXNvbHZlKHtcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICBwcmVmZXJCdWlsdGluczogKGlkOiBzdHJpbmcpID0+ICFhcmd2LmJ1bmRsZUJ1aWx0aW5zPy5pbmNsdWRlcyhpZCksXG4gICAgfSksXG4gICAgY29tbW9uanMoKSxcbiAgICBrZWVwSW1wb3J0KHsgbW9kdWxlTmFtZXM6IGFyZ3Yua2VlcEltcG9ydD8ubWFwKChpdGVtKSA9PiBpdGVtLnRvU3RyaW5nKCkpID8/IFtdIH0pLFxuICBdO1xuICBjb25zdCBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPVxuICAgIHRhcmdldERldGFpbCA9PT0gJ2FwcC1ub2RlJyB8fCB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnIHx8ICFleHRlcm5hbERlcHMuaW5jbHVkZXMoJ0BiYWJlbC9ydW50aW1lJyk7XG4gIHByb2Nlc3MuZW52LkJVSUxEVFNfVVNFX0JBQkxFX1JVTlRJTUUgPSBpc0JhYmVsSGVscGVyc0J1bmRsZWQgPyAnJyA6ICcxJztcbiAgcGx1Z2lucy5wdXNoKFxuICAgIGJhYmVsKHtcbiAgICAgIGNvbmZpZ0ZpbGU6IGJhYmVsQ29uZmlnUGF0aCxcbiAgICAgIGV4dGVuc2lvbnMsXG4gICAgICAvLyBXZSBuZWVkIGBydW50aW1lIHNpbmNlIGBidW5kbGVkYCBtYXkgYnJlYWsgZGlyZWN0b3J5IHN0cnVjdHVyZSBieSBjcmVhdGluZyBfdmlydHVhbCBkaXJlY3RvcnkuXG4gICAgICBiYWJlbEhlbHBlcnM6IGlzQmFiZWxIZWxwZXJzQnVuZGxlZCA/ICdidW5kbGVkJyA6ICdydW50aW1lJyxcbiAgICAgIGV4Y2x1ZGU6IC9eKC4rXFwvKT9ub2RlX21vZHVsZXNcXC8uKyQvLFxuICAgIH0pLFxuICAgIC4uLihvdXRwdXRPcHRpb25zTGlzdC5zb21lKChvcHRzKSA9PiBvcHRzLnByZXNlcnZlTW9kdWxlcykgPyBbcHJlc2VydmVEaXJlY3RpdmVzKCldIDogW10pLFxuICAgIHN0cmluZyh7IGluY2x1ZGU6IFsnKiovKi5jc3YnLCAnKiovKi50eHQnXSB9KVxuICApO1xuICBpZiAoYXJndi5taW5pZnkpIHtcbiAgICBwbHVnaW5zLnB1c2godGVyc2VyKHsgY29tcHJlc3M6IHsgZGlyZWN0aXZlczogZmFsc2UgfSB9KSk7XG4gIH1cbiAgcGx1Z2lucy5wdXNoKGFuYWx5emUoeyBzdW1tYXJ5T25seTogdHJ1ZSB9KSk7XG4gIHJldHVybiBwbHVnaW5zO1xufVxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyICovXG5cbi8vIFdlIGNhbm5vdCB1c2UgbmFtZWQgaW1wb3J0cyBmcm9tICd0eXBlc2NyaXB0JyBiZWNhdXNlIG9mIGJ1aWxkIGVycm9ycy5cbmltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHR5cGUgeyBBcmd1bWVudHNUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMuanMnO1xuXG5pbXBvcnQgdHlwZSB7IEFueUJ1aWxkZXJUeXBlIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIGNvcmVQcm9qZWN0RGlyUGF0aDogc3RyaW5nXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY29yZUNvbmZpZ0ZpbGUgPSB0cy5maW5kQ29uZmlnRmlsZShjb3JlUHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgaWYgKCFjb3JlQ29uZmlnRmlsZSkgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCB0c2NvbmZpZy5qc29uIGluICR7Y29yZVByb2plY3REaXJQYXRofS5gKTtcbiAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnRm91bmQgdHNjb25maWcuanNvbjonLCBjb3JlQ29uZmlnRmlsZSk7XG4gIH1cblxuICBjb25zdCBwcm9qZWN0czogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcbiAgbGV0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIHBhdGguYmFzZW5hbWUoY29yZVByb2plY3REaXJQYXRoKSwgJ3NyYycpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhvdXREaXIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyUGF0aCA9IHBhdGguZGlybmFtZShjb3JlUHJvamVjdERpclBhdGgpO1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHBhcmVudERpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBjb3JlUHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUoY29yZVByb2plY3REaXJQYXRoKTtcbiAgICBmb3IgKGNvbnN0IGRpcmVudCBvZiBkaXJlbnRzKSB7XG4gICAgICBpZiAoIWRpcmVudC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcHJvamVjdERpclBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50RGlyUGF0aCwgZGlyZW50Lm5hbWUpO1xuICAgICAgaWYgKHByb2plY3REaXJQYXRoID09PSBjb3JlUHJvamVjdERpclBhdGgpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBjb25maWdGaWxlID0gdHMuZmluZENvbmZpZ0ZpbGUocHJvamVjdERpclBhdGgsIHRzLnN5cy5maWxlRXhpc3RzKTtcbiAgICAgIGNvbnN0IG91dERpciA9IHBhdGguam9pbignZGlzdCcsIGRpcmVudC5uYW1lLCAnc3JjJyk7XG4gICAgICBpZiAoY29uZmlnRmlsZSAmJiBmcy5leGlzdHNTeW5jKG91dERpcikpIHtcbiAgICAgICAgcHJvamVjdHMucHVzaChbcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIG91dERpcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXREaXIgPSAnZGlzdCc7XG4gIH1cbiAgcHJvamVjdHMucHVzaChbY29yZVByb2plY3REaXJQYXRoLCBjb3JlQ29uZmlnRmlsZSwgb3V0RGlyXSk7XG5cbiAgbGV0IGFsbFN1Y2NlZWRlZCA9IHRydWU7XG4gIGZvciAoY29uc3QgW3Byb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXJdIG9mIHByb2plY3RzKSB7XG4gICAgYWxsU3VjY2VlZGVkICYmPSBydW5UeXBlU2NyaXB0Q29tcGlsZXIoYXJndiwgcHJvamVjdERpclBhdGgsIGNvbmZpZ0ZpbGUsIHBhdGguam9pbihjb3JlUHJvamVjdERpclBhdGgsIG91dERpcikpO1xuICB9XG4gIHJldHVybiBhbGxTdWNjZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIHJ1blR5cGVTY3JpcHRDb21waWxlcihcbiAgYXJndjogQXJndW1lbnRzVHlwZTxBbnlCdWlsZGVyVHlwZT4sXG4gIHByb2plY3REaXJQYXRoOiBzdHJpbmcsXG4gIGNvbmZpZ0ZpbGU6IHN0cmluZyxcbiAgb3V0RGlyOiBzdHJpbmdcbik6IGJvb2xlYW4ge1xuICBpZiAoYXJndi52ZXJib3NlKSB7XG4gICAgY29uc29sZS5pbmZvKCdydW5UeXBlU2NyaXB0Q29tcGlsZXIoKScsIHByb2plY3REaXJQYXRoLCBjb25maWdGaWxlLCBvdXREaXIpO1xuICB9XG5cbiAgY29uc3QgeyBjb25maWcgfSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ0ZpbGUsIHRzLnN5cy5yZWFkRmlsZSk7XG4gIGNvbmZpZy5jb21waWxlck9wdGlvbnMgPSB7XG4gICAgLi4uY29uZmlnLmNvbXBpbGVyT3B0aW9ucyxcbiAgICBkZWNsYXJhdGlvbjogdHJ1ZSxcbiAgICBlbWl0RGVjbGFyYXRpb25Pbmx5OiB0cnVlLFxuICAgIG5vRW1pdDogZmFsc2UsXG4gICAgbm9FbWl0T25FcnJvcjogdHJ1ZSxcbiAgICBvdXREaXIsXG4gIH07XG4gIGNvbmZpZy5pbmNsdWRlID0gWydzcmMvKiovKiddO1xuICBjb25zdCB7IGVycm9ycywgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWcsIHRzLnN5cywgcHJvamVjdERpclBhdGgpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHsgb3B0aW9ucywgcm9vdE5hbWVzOiBmaWxlTmFtZXMsIGNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3M6IGVycm9ycyB9KTtcbiAgY29uc3QgeyBkaWFnbm9zdGljcywgZW1pdFNraXBwZWQgfSA9IHByb2dyYW0uZW1pdCgpO1xuXG4gIGNvbnN0IGFsbERpYWdub3N0aWNzID0gWy4uLnRzLmdldFByZUVtaXREaWFnbm9zdGljcyhwcm9ncmFtKSwgLi4uZGlhZ25vc3RpY3MsIC4uLmVycm9yc107XG4gIGlmIChhbGxEaWFnbm9zdGljcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZm9ybWF0SG9zdDogdHMuRm9ybWF0RGlhZ25vc3RpY3NIb3N0ID0ge1xuICAgICAgZ2V0Q2Fub25pY2FsRmlsZU5hbWU6IChwYXRoKSA9PiBwYXRoLFxuICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogdHMuc3lzLmdldEN1cnJlbnREaXJlY3RvcnksXG4gICAgICBnZXROZXdMaW5lOiAoKSA9PiB0cy5zeXMubmV3TGluZSxcbiAgICB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhhbGxEaWFnbm9zdGljcywgZm9ybWF0SG9zdCk7XG4gICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICB9XG4gIHJldHVybiAhZW1pdFNraXBwZWQ7XG59XG4iLCJpbXBvcnQgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGRhdGVUaW1lIGZyb20gJ2RhdGUtdGltZSc7XG5pbXBvcnQgbXMgZnJvbSAncHJldHR5LW1zJztcbmltcG9ydCB0eXBlIHsgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQsIFJvbGx1cE9wdGlvbnMgfSBmcm9tICdyb2xsdXAnO1xuaW1wb3J0IHsgcm9sbHVwLCB3YXRjaCB9IGZyb20gJ3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgeyBvbkV4aXQgfSBmcm9tICdzaWduYWwtZXhpdCc7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vLi4vZW52LmpzJztcbmltcG9ydCB0eXBlIHsgQXJndW1lbnRzVHlwZSwgVGFyZ2V0Q2F0ZWdvcnksIFRhcmdldERldGFpbCB9IGZyb20gJy4uLy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGFsbFRhcmdldENhdGVnb3JpZXMgfSBmcm9tICcuLi8uLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VBbmROYW1lLCByZWFkUGFja2FnZUpzb24gfSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCB0eXBlIHsgQW55QnVpbGRlclR5cGUsIGJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgYXBwQnVpbGRlciwgZnVuY3Rpb25zQnVpbGRlciwgbGliQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBzZXR1cFBsdWdpbnMgfSBmcm9tICcuL3BsdWdpbi5qcyc7XG5pbXBvcnQgeyBoYW5kbGVFcnJvciB9IGZyb20gJy4vcm9sbHVwTG9nZ2VyLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyB9IGZyb20gJy4vdHlwZVNjcmlwdC5qcyc7XG5cbmV4cG9ydCBjb25zdCBhcHA6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgYXBwQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnYXBwIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYW4gYXBwJyxcbiAgYnVpbGRlcjogYXBwQnVpbGRlcixcbiAgYXN5bmMgaGFuZGxlcihhcmd2KSB7XG4gICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdhcHAnKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBmdW5jdGlvbnM6IENvbW1hbmRNb2R1bGU8dW5rbm93biwgQXJndW1lbnRzVHlwZTx0eXBlb2YgZnVuY3Rpb25zQnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAnZnVuY3Rpb25zIFtwYWNrYWdlXScsXG4gIGRlc2NyaWJlOiAnQnVpbGQgYSBHQ1AvRmlyZWJhc2UgZnVuY3Rpb25zIGFwcCcsXG4gIGJ1aWxkZXI6IGZ1bmN0aW9uc0J1aWxkZXIsXG4gIGFzeW5jIGhhbmRsZXIoYXJndikge1xuICAgIGlmIChhcmd2Lm9ubHlQYWNrYWdlSnNvbikge1xuICAgICAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gICAgICBjb25zdCBbcGFja2FnZUpzb24sIHBhY2thZ2VKc29uUGF0aF0gPSBhd2FpdCByZWFkUGFja2FnZUpzb24ocGFja2FnZURpclBhdGgpO1xuICAgICAgaWYgKCFwYWNrYWdlSnNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1aWxkKGFyZ3YsICdmdW5jdGlvbnMnKTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgbGliOiBDb21tYW5kTW9kdWxlPHVua25vd24sIEFyZ3VtZW50c1R5cGU8dHlwZW9mIGxpYkJ1aWxkZXI+PiA9IHtcbiAgY29tbWFuZDogJ2xpYiBbcGFja2FnZV0nLFxuICBkZXNjcmliZTogJ0J1aWxkIGEgTm9kZS5qcyAvIFJlYWN0IGxpYnJhcnknLFxuICBidWlsZGVyOiBsaWJCdWlsZGVyLFxuICBhc3luYyBoYW5kbGVyKGFyZ3YpIHtcbiAgICByZXR1cm4gYnVpbGQoYXJndiwgJ2xpYicpO1xuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkKGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LCB0YXJnZXRDYXRlZ29yeTogVGFyZ2V0Q2F0ZWdvcnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgfHw9ICdwcm9kdWN0aW9uJztcblxuICAvLyBgc2lsZW50YCBpcyBzdHJvbmdlciB0aGFuIGB2ZXJib3NlYC5cbiAgY29uc3QgdmVyYm9zZSA9ICFhcmd2LnNpbGVudCAmJiBhcmd2LnZlcmJvc2U7XG4gIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgY29uc3QgcGFja2FnZURpclBhdGggPSBwYXRoLnJlc29sdmUoYXJndi5wYWNrYWdlPy50b1N0cmluZygpID8/ICcuJyk7XG4gIGNvbnN0IFtwYWNrYWdlSnNvbiwgcGFja2FnZUpzb25QYXRoXSA9IGF3YWl0IHJlYWRQYWNrYWdlSnNvbihwYWNrYWdlRGlyUGF0aCk7XG4gIGlmICghcGFja2FnZUpzb24pIHtcbiAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gcGFyc2UgcGFja2FnZS5qc29uICgke3BhY2thZ2VKc29uUGF0aH0pLmApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwYWNrYWdlRGlyUGF0aCk7XG5cbiAgY29uc3QgaW5wdXRzID0gdmVyaWZ5SW5wdXQoYXJndiwgY3dkLCBwYWNrYWdlRGlyUGF0aCk7XG4gIGNvbnN0IHRhcmdldERldGFpbCA9IGRldGVjdFRhcmdldERldGFpbCh0YXJnZXRDYXRlZ29yeSwgaW5wdXRzKTtcblxuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnYXJndjonLCBhcmd2KTtcbiAgICBjb25zb2xlLmluZm8oJ3BhY2thZ2VKc29uUGF0aDonLCBwYWNrYWdlSnNvblBhdGgpO1xuICAgIGNvbnNvbGUuaW5mbygnVGFyZ2V0IChDYXRlZ29yeSk6JywgYCR7dGFyZ2V0RGV0YWlsfSAoJHt0YXJnZXRDYXRlZ29yeX0pYCk7XG4gIH1cblxuICBjb25zdCBbbmFtZXNwYWNlXSA9IGdldE5hbWVzcGFjZUFuZE5hbWUocGFja2FnZUpzb24pO1xuICBjb25zdCBpc0VzbVBhY2thZ2UgPSBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcblxuICBpZiAoYXJndlsnY29yZS1qcyddKSB7XG4gICAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfQ09SRUpTID0gJzEnO1xuICB9IGVsc2UgaWYgKGFyZ3ZbJ2NvcmUtanMtcHJvcG9zYWxzJ10pIHtcbiAgICBwcm9jZXNzLmVudi5CVUlMRF9UU19DT1JFSlNfV0lUSF9QUk9QT1NBTFMgPSAnMSc7XG4gIH1cblxuICBpZiAodmVyYm9zZSkge1xuICAgIHByb2Nlc3MuZW52LkJVSUxEX1RTX1ZFUkJPU0UgPSAnMSc7XG4gIH1cbiAgcHJvY2Vzcy5lbnYuQlVJTERfVFNfVEFSR0VUX0NBVEVHT1JZID0gdGFyZ2V0Q2F0ZWdvcnk7XG4gIHByb2Nlc3MuZW52LkJVSUxEX1RTX1RBUkdFVF9ERVRBSUwgPSB0YXJnZXREZXRhaWw7XG5cbiAgY29uc3Qgb3V0cHV0T3B0aW9uc0xpc3QgPSBnZXRPdXRwdXRPcHRpb25zTGlzdChhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VEaXJQYXRoLCBpc0VzbVBhY2thZ2UpO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGNvbnNvbGUuaW5mbygnT3V0cHV0T3B0aW9uczonLCBvdXRwdXRPcHRpb25zTGlzdCk7XG4gIH1cbiAgaWYgKG91dHB1dE9wdGlvbnNMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3Qgb3V0cHV0IGZpbGVzLicpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIHByb2Nlc3MuY2hkaXIocGFja2FnZURpclBhdGgpO1xuICBhd2FpdCBmcy5wcm9taXNlcy5ybShwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgaWYgKHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICBhd2FpdCBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKHBhY2thZ2VEaXJQYXRoLCBwYWNrYWdlSnNvbiwgYXJndi5tb2R1bGVUeXBlKTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMgPSB7XG4gICAgaW5wdXQ6XG4gICAgICB0YXJnZXREZXRhaWwgPT09ICdmdW5jdGlvbnMnXG4gICAgICAgID8gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgaW5wdXRzLm1hcCgoaW5wdXQsIGluZGV4KSA9PiBbaW5kZXggPT09IDAgPyAnaW5kZXgnIDogcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSksIGlucHV0XSlcbiAgICAgICAgICApXG4gICAgICAgIDogaW5wdXRzLFxuICAgIHBsdWdpbnM6IHNldHVwUGx1Z2lucyhhcmd2LCB0YXJnZXREZXRhaWwsIHBhY2thZ2VKc29uLCBuYW1lc3BhY2UsIHBhY2thZ2VEaXJQYXRoLCBvdXRwdXRPcHRpb25zTGlzdCksXG4gICAgd2F0Y2g6IGFyZ3Yud2F0Y2ggPyB7IGNsZWFyU2NyZWVuOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGNvbnN0IHBhdGhUb1JlbGF0aXZlUGF0aCA9IChwYXRoczogc3RyaW5nIHwgUmVhZG9ubHk8c3RyaW5nW10+KTogc3RyaW5nW10gPT5cbiAgICAoQXJyYXkuaXNBcnJheShwYXRocykgPyBwYXRocyA6IFtwYXRoc10pLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShwYWNrYWdlRGlyUGF0aCwgcCkpO1xuICBpZiAoYXJndi53YXRjaCkge1xuICAgIHdhdGNoUm9sbHVwKGFyZ3YsIHRhcmdldERldGFpbCwgcGFja2FnZURpclBhdGgsIG9wdGlvbnMsIG91dHB1dE9wdGlvbnNMaXN0LCBwYXRoVG9SZWxhdGl2ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIGlmICghYXJndi5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0cykuam9pbignLCAnKSl9IOKGkiAke2NoYWxrLmJvbGQoXG4gICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgob3V0cHV0T3B0aW9uc0xpc3QubWFwKChvcHRzKSA9PiBvcHRzLmZpbGUgfHwgb3B0cy5kaXIgfHwgJycpKS5qb2luKCcsICcpXG4gICAgICAgICAgKX1cXG5vbiAke3BhY2thZ2VEaXJQYXRofSAuLi5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGJ1bmRsZTogUm9sbHVwQnVpbGQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJ1aWxkRmFpbGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBfYnVuZGxlID0gYXdhaXQgcm9sbHVwKG9wdGlvbnMpO1xuICAgICAgYnVuZGxlID0gX2J1bmRsZTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gX2J1bmRsZS53cml0ZShvcHRzKSkpO1xuXG4gICAgICBpZiAoIWFyZ3Yuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBDcmVhdGVkICR7cGF0aFRvUmVsYXRpdmVQYXRoKG91dHB1dE9wdGlvbnNMaXN0Lm1hcCgob3B0cykgPT4gb3B0cy5maWxlIHx8IG9wdHMuZGlyIHx8ICcnKSkuam9pbihcbiAgICAgICAgICAgICAgJywgJ1xuICAgICAgICAgICAgKX0gaW4gJHtjaGFsay5ib2xkKG1zKERhdGUubm93KCkgLSBzdGFydFRpbWUpKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBidWlsZEZhaWxlZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgZHVlIHRvOicsIGVycm9yKTtcbiAgICB9XG4gICAgYXdhaXQgYnVuZGxlPy5jbG9zZSgpO1xuICAgIGlmIChidWlsZEZhaWxlZCkgcHJvY2Vzcy5leGl0KDEpO1xuXG4gICAgaWYgKFxuICAgICAgdGFyZ2V0RGV0YWlsICE9PSAnYXBwLW5vZGUnICYmXG4gICAgICB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnICYmXG4gICAgICAhKGF3YWl0IGdlbmVyYXRlRGVjbGFyYXRpb25GaWxlcyhhcmd2LCBwYWNrYWdlRGlyUGF0aCkpXG4gICAgKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHdhdGNoUm9sbHVwKFxuICBhcmd2OiBBcmd1bWVudHNUeXBlPEFueUJ1aWxkZXJUeXBlPixcbiAgdGFyZ2V0RGV0YWlsOiBzdHJpbmcsXG4gIHBhY2thZ2VEaXJQYXRoOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJvbGx1cE9wdGlvbnMsXG4gIG91dHB1dE9wdGlvbnNMaXN0OiBPdXRwdXRPcHRpb25zW10sXG4gIHBhdGhUb1JlbGF0aXZlUGF0aDogKHBhdGhzOiBzdHJpbmcgfCBSZWFkb25seTxzdHJpbmdbXT4pID0+IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3Qgd2F0Y2hlciA9IHdhdGNoKHsgLi4ub3B0aW9ucywgb3V0cHV0OiBvdXRwdXRPcHRpb25zTGlzdCB9KTtcblxuICBjb25zdCBjbG9zZSA9IGFzeW5jIChjb2RlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5jYXVnaHRFeGNlcHRpb24nLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xvc2UpO1xuICAgIGlmICh3YXRjaGVyKSBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgaWYgKGNvZGUpIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfTtcbiAgb25FeGl0KGNsb3NlIGFzIHVua25vd24gYXMgSGFuZGxlcik7XG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgY2xvc2UpO1xuICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICBwcm9jZXNzLnN0ZGluLm9uKCdlbmQnLCBjbG9zZSk7XG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgfVxuXG4gIHdhdGNoZXIub24oJ2V2ZW50JywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICBjYXNlICdFUlJPUic6IHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXZlbnQuZXJyb3IsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0JVTkRMRV9TVEFSVCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zdCBldmVudElucHV0ID0gZXZlbnQuaW5wdXQ7XG4gICAgICAgIGNvbnN0IGlucHV0RmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmICh0eXBlb2YgZXZlbnRJbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBpbnB1dEZpbGVzLnB1c2goZXZlbnRJbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5wdXRGaWxlcy5wdXNoKFxuICAgICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZlbnRJbnB1dCkgPyBldmVudElucHV0IDogT2JqZWN0LnZhbHVlcyhldmVudElucHV0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgICBgQnVuZGxlcyAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGlucHV0RmlsZXMpLmpvaW4oJywgJykpfSDihpIgJHtjaGFsay5ib2xkKFxuICAgICAgICAgICAgICBwYXRoVG9SZWxhdGl2ZVBhdGgoZXZlbnQub3V0cHV0KS5qb2luKCcsICcpXG4gICAgICAgICAgICApfVxcbm9uICR7cGFja2FnZURpclBhdGh9IC4uLmBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnQlVORExFX0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQ3JlYXRlZCAke2NoYWxrLmJvbGQocGF0aFRvUmVsYXRpdmVQYXRoKGV2ZW50Lm91dHB1dCkuam9pbignLCAnKSl9IGluICR7Y2hhbGsuYm9sZChtcyhldmVudC5kdXJhdGlvbikpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRhcmdldERldGFpbCAhPT0gJ2FwcC1ub2RlJyAmJiB0YXJnZXREZXRhaWwgIT09ICdmdW5jdGlvbnMnKSB7XG4gICAgICAgICAgYXdhaXQgZ2VuZXJhdGVEZWNsYXJhdGlvbkZpbGVzKGFyZ3YsIHBhY2thZ2VEaXJQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VORCc6IHtcbiAgICAgICAgaWYgKGFyZ3Yuc2lsZW50KSBicmVhaztcblxuICAgICAgICBjb25zb2xlLmluZm8oYFxcblske2RhdGVUaW1lKCl9XSB3YWl0aW5nIGZvciBjaGFuZ2VzLi4uYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgncmVzdWx0JyBpbiBldmVudCAmJiBldmVudC5yZXN1bHQpIHtcbiAgICAgIHZvaWQgZXZlbnQucmVzdWx0LmNsb3NlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5SW5wdXQoYXJndjogQXJndW1lbnRzVHlwZTx0eXBlb2YgYnVpbGRlcj4sIGN3ZDogc3RyaW5nLCBwYWNrYWdlRGlyUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAoYXJndi5pbnB1dCAmJiBhcmd2LmlucHV0Lmxlbmd0aCA+IDApIHJldHVybiBhcmd2LmlucHV0Lm1hcCgocCkgPT4gcGF0aC5qb2luKGN3ZCwgcC50b1N0cmluZygpKSk7XG5cbiAgY29uc3Qgc3JjRGlyUGF0aCA9IHBhdGguam9pbihwYWNrYWdlRGlyUGF0aCwgJ3NyYycpO1xuICBmb3IgKGNvbnN0IGV4dCBvZiBbJ3RzJywgJ3RzeCcsICdjdHMnLCAnbXRzJ10pIHtcbiAgICBjb25zdCBpbnB1dCA9IHBhdGguam9pbihzcmNEaXJQYXRoLCBgaW5kZXguJHtleHR9YCk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoaW5wdXQpKSByZXR1cm4gW2lucHV0XTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZXRlY3QgaW5wdXQgZmlsZS4nKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RUYXJnZXREZXRhaWwodGFyZ2V0Q2F0ZWdvcnk6IHN0cmluZywgaW5wdXRzOiBzdHJpbmdbXSk6IFRhcmdldERldGFpbCB7XG4gIHN3aXRjaCAodGFyZ2V0Q2F0ZWdvcnkpIHtcbiAgICBjYXNlICdhcHAnOiB7XG4gICAgICByZXR1cm4gJ2FwcC1ub2RlJztcbiAgICB9XG4gICAgY2FzZSAnZnVuY3Rpb25zJzoge1xuICAgICAgcmV0dXJuICdmdW5jdGlvbnMnO1xuICAgIH1cbiAgICBjYXNlICdsaWInOiB7XG4gICAgICBpZiAoaW5wdXRzLnNvbWUoKGlucHV0KSA9PiBpbnB1dC5lbmRzV2l0aCgnLnRzeCcpKSkge1xuICAgICAgICByZXR1cm4gJ2xpYi1yZWFjdCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ2xpYic7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ3RhcmdldCBvcHRpb24gbXVzdCBiZSBvbmUgb2Y6ICcgKyBhbGxUYXJnZXRDYXRlZ29yaWVzLmpvaW4oJywgJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zKFxuICBwYWNrYWdlRGlyUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSnNvbjogUGFja2FnZUpzb24sXG4gIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHBhY2thZ2VKc29uLm5hbWUgKz0gJy1kaXN0JztcbiAgY29uc3QgZXNtUGFja2FnZSA9IHBhY2thZ2VKc29uLnR5cGUgPT09ICdtb2R1bGUnO1xuICBjb25zdCBlc21PdXRwdXQgPSBpc0VzbU91dHB1dChlc21QYWNrYWdlLCBtb2R1bGVUeXBlKTtcbiAgcGFja2FnZUpzb24ubWFpbiA9IGVzbVBhY2thZ2UgPT09IGVzbU91dHB1dCA/ICdpbmRleC5qcycgOiBlc21PdXRwdXQgPyAnaW5kZXgubWpzJyA6ICdpbmRleC5janMnO1xuXG4gIC8vIFByZXZlbnQgRmlyZWJhc2UgRnVuY3Rpb25zIGZyb20gcnVubmluZyBgYnVpbGRgIHNjcmlwdCBzaW5jZSB3ZSBhcmUgYnVpbGRpbmcgY29kZSBiZWZvcmUgZGVwbG95aW5nLlxuICBkZWxldGUgcGFja2FnZUpzb24uc2NyaXB0cztcbiAgLy8gZGV2RGVwZW5kZW5jaWVzIGFyZSBub3QgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGJ1aWxkaW5nIGNvZGUgYmVmb3JlIGRlcGxveWluZy5cbiAgZGVsZXRlIHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcztcblxuICBhd2FpdCBmcy5wcm9taXNlcy5ta2RpcihwYXRoLmpvaW4ocGFja2FnZURpclBhdGgsICdkaXN0JyksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcsICdwYWNrYWdlLmpzb24nKSwgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24pKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0T3B0aW9uc0xpc3QoXG4gIGFyZ3Y6IEFyZ3VtZW50c1R5cGU8QW55QnVpbGRlclR5cGU+LFxuICB0YXJnZXREZXRhaWw6IFRhcmdldERldGFpbCxcbiAgcGFja2FnZURpclBhdGg6IHN0cmluZyxcbiAgaXNFc21QYWNrYWdlOiBib29sZWFuXG4pOiBPdXRwdXRPcHRpb25zW10ge1xuICBjb25zdCBvdXREaXJQYXRoID0gcGF0aC5qb2luKHBhY2thZ2VEaXJQYXRoLCAnZGlzdCcpO1xuICBpZiAodGFyZ2V0RGV0YWlsID09PSAnYXBwLW5vZGUnIHx8IHRhcmdldERldGFpbCA9PT0gJ2Z1bmN0aW9ucycpIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICAgIGZvcm1hdDogaXNFc21PdXRwdXQoaXNFc21QYWNrYWdlLCBhcmd2Lm1vZHVsZVR5cGUpID8gJ21vZHVsZScgOiAnY29tbW9uanMnLFxuICAgICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwICYmICdpbmxpbmUnLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLy8gVGhlIGZvbGxvd2luZyBpbXBvcnQgc3RhdGVtZW50IGluIGFuIGVzbSBtb2R1bGUgY2F1c2VzIHRoZSBmb2xsb3dpbmcgZXJyb3I6XG4gIC8vIFN0YXRlbWVudDpcbiAgLy8gICBpbXBvcnQgeyB1c2VQcmV2aW91cyB9IGZyb20gJ3JlYWN0LXVzZSc7XG4gIC8vIEVycm9yOlxuICAvLyAgIE5hbWVkIGV4cG9ydCAndXNlUHJldmlvdXMnIG5vdCBmb3VuZC4gVGhlIHJlcXVlc3RlZCBtb2R1bGUgJ3JlYWN0LXVzZScgaXMgYSBDb21tb25KUyBtb2R1bGUsXG4gIC8vICAgd2hpY2ggbWF5IG5vdCBzdXBwb3J0IGFsbCBtb2R1bGUuZXhwb3J0cyBhcyBuYW1lZCBleHBvcnRzLlxuICAvLyBXZSBuZWVkIGNqcyBtb2R1bGVzIGZvciB3ZWIgYXBwcyB0byBhdm9pZCB0aGUgZXJyb3IuXG4gIC8vIEFsc28sIHNwbGl0dGluZyBhIGxpYnJhcnkgaXMgdXNlZnVsIGluIGJvdGggbW9kdWxlcywgc28gcHJlc2VydmVNb2R1bGVzIHNob3VsZCBiZSB0cnVlLlxuICBjb25zdCBvdXRwdXRPcHRpb25zTGlzdDogT3V0cHV0T3B0aW9uc1tdID0gW107XG4gIGNvbnN0IG1vZHVsZVR5cGUgPSBhcmd2Lm1vZHVsZVR5cGUgfHwgJ2JvdGgnO1xuICBjb25zdCBqc0V4dCA9IGFyZ3YuanNFeHRlbnNpb24gfHwgJ2VpdGhlcic7XG4gIGlmIChtb2R1bGVUeXBlID09PSAnY2pzJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpKSB7XG4gICAgb3V0cHV0T3B0aW9uc0xpc3QucHVzaCh7XG4gICAgICBkaXI6IG91dERpclBhdGgsXG4gICAgICBlbnRyeUZpbGVOYW1lczoganNFeHQgPT09ICdib3RoJyB8fCAoanNFeHQgPT09ICdlaXRoZXInICYmICFpc0VzbVBhY2thZ2UpID8gJ1tuYW1lXS5qcycgOiAnW25hbWVdLmNqcycsXG4gICAgICBmb3JtYXQ6ICdjb21tb25qcycsXG4gICAgICBwcmVzZXJ2ZU1vZHVsZXM6IHRydWUsXG4gICAgICBzb3VyY2VtYXA6IGFyZ3Yuc291cmNlbWFwLFxuICAgIH0pO1xuICB9XG4gIGlmIChtb2R1bGVUeXBlID09PSAnZXNtJyB8fCBtb2R1bGVUeXBlID09PSAnYm90aCcgfHwgKG1vZHVsZVR5cGUgPT09ICdlaXRoZXInICYmIGlzRXNtUGFja2FnZSkpIHtcbiAgICBvdXRwdXRPcHRpb25zTGlzdC5wdXNoKHtcbiAgICAgIGRpcjogb3V0RGlyUGF0aCxcbiAgICAgIGVudHJ5RmlsZU5hbWVzOiBqc0V4dCA9PT0gJ2JvdGgnIHx8IChqc0V4dCA9PT0gJ2VpdGhlcicgJiYgaXNFc21QYWNrYWdlKSA/ICdbbmFtZV0uanMnIDogJ1tuYW1lXS5tanMnLFxuICAgICAgZm9ybWF0OiAnbW9kdWxlJyxcbiAgICAgIHByZXNlcnZlTW9kdWxlczogdHJ1ZSxcbiAgICAgIHNvdXJjZW1hcDogYXJndi5zb3VyY2VtYXAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dHB1dE9wdGlvbnNMaXN0O1xufVxuXG5mdW5jdGlvbiBpc0VzbU91dHB1dChpc0VzbVBhY2thZ2U6IGJvb2xlYW4sIG1vZHVsZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbW9kdWxlVHlwZSA9PT0gJ2VzbScgfHwgKCghbW9kdWxlVHlwZSB8fCBtb2R1bGVUeXBlID09PSAnZWl0aGVyJykgJiYgaXNFc21QYWNrYWdlKTtcbn1cbiIsImltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFJvbGx1cEVycm9yIH0gZnJvbSAncm9sbHVwJztcblxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUVycm9yKGVycm9yOiBSb2xsdXBFcnJvciwgcmVjb3ZlciA9IGZhbHNlKTogdm9pZCB7XG4gIGNvbnN0IG5hbWUgPSBlcnJvci5uYW1lIHx8IChlcnJvci5jYXVzZSBhcyBFcnJvcik/Lm5hbWU7XG4gIGNvbnN0IG5hbWVTZWN0aW9uID0gbmFtZSA/IGAke25hbWV9OiBgIDogJyc7XG4gIGNvbnN0IHBsdWdpblNlY3Rpb24gPSBlcnJvci5wbHVnaW4gPyBgKHBsdWdpbiAke2Vycm9yLnBsdWdpbn0pIGAgOiAnJztcbiAgY29uc3QgbWVzc2FnZSA9IGAke3BsdWdpblNlY3Rpb259JHtuYW1lU2VjdGlvbn0ke2Vycm9yLm1lc3NhZ2V9YDtcblxuICBjb25zdCBvdXRwdXRMaW5lcyA9IFtjaGFsay5ib2xkKGNoYWxrLnJlZChgWyFdICR7Y2hhbGsuYm9sZChtZXNzYWdlLnRvU3RyaW5nKCkpfWApKV07XG5cbiAgaWYgKGVycm9yLnVybCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuY3lhbihlcnJvci51cmwpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5sb2MpIHtcbiAgICBvdXRwdXRMaW5lcy5wdXNoKGAke2Vycm9yLmxvYy5maWxlIHx8IGVycm9yLmlkfSAoJHtlcnJvci5sb2MubGluZX06JHtlcnJvci5sb2MuY29sdW1ufSlgKTtcbiAgfSBlbHNlIGlmIChlcnJvci5pZCkge1xuICAgIG91dHB1dExpbmVzLnB1c2goZXJyb3IuaWQpO1xuICB9XG5cbiAgaWYgKGVycm9yLmZyYW1lKSB7XG4gICAgb3V0cHV0TGluZXMucHVzaChjaGFsay5kaW0oZXJyb3IuZnJhbWUpKTtcbiAgfVxuXG4gIGlmIChlcnJvci5zdGFjaykge1xuICAgIG91dHB1dExpbmVzLnB1c2goY2hhbGsuZGltKGVycm9yLnN0YWNrPy5yZXBsYWNlKGAke25hbWVTZWN0aW9ufSR7ZXJyb3IubWVzc2FnZX1cXG5gLCAnJykpKTtcbiAgfVxuXG4gIG91dHB1dExpbmVzLnB1c2goJycsICcnKTtcbiAgY29uc29sZS5lcnJvcihvdXRwdXRMaW5lcy5qb2luKCdcXG4nKSk7XG5cbiAgaWYgKCFyZWNvdmVyKSBwcm9jZXNzLmV4aXQoMSk7XG59XG4iLCJpbXBvcnQgKiBhcyBjaGlsZF9wcm9jZXNzIGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbWFuZE1vZHVsZSwgSW5mZXJyZWRPcHRpb25UeXBlcyB9IGZyb20gJ3lhcmdzJztcblxuaW1wb3J0IHsgbG9hZEVudmlyb25tZW50VmFyaWFibGVzV2l0aENhY2hlIH0gZnJvbSAnLi4vZW52LmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi4vc2hhcmVkT3B0aW9uc0J1aWxkZXIuanMnO1xuXG5jb25zdCBidWlsZGVyID0ge1xuICAuLi5zaGFyZWRPcHRpb25zQnVpbGRlcixcbiAgbW9kdWxlOiB7XG4gICAgZGVzY3JpcHRpb246ICdBIG1vZHVsZSB0eXBlOiBjanMgb3IgZXNtJyxcbiAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICBhbGlhczogJ20nLFxuICB9LFxuICB3YXRjaDoge1xuICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB3YXRjaCBtb2RlIGlzIGVuYWJsZWQgb3Igbm90JyxcbiAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgYWxpYXM6ICd3JyxcbiAgfSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBydW46IENvbW1hbmRNb2R1bGU8dW5rbm93biwgSW5mZXJyZWRPcHRpb25UeXBlczx0eXBlb2YgYnVpbGRlcj4+ID0ge1xuICBjb21tYW5kOiAncnVuIDxmaWxlPicsXG4gIGRlc2NyaWJlOiAnUnVuIHNjcmlwdCcsXG4gIGJ1aWxkZXIsXG4gIGhhbmRsZXIoYXJndikge1xuICAgIGxvYWRFbnZpcm9ubWVudFZhcmlhYmxlc1dpdGhDYWNoZShhcmd2LCBwcm9jZXNzLmN3ZCgpKTtcblxuICAgIGNvbnN0IGZpbGUgPSBhcmd2LmZpbGU/LnRvU3RyaW5nKCkgfHwgJyc7XG5cbiAgICAvLyBjZi4gaHR0cHM6Ly9idW4uc2gvZ3VpZGVzL3V0aWwvZGV0ZWN0LWJ1blxuICAgIGNvbnN0IGlzUnVubmluZ09uQnVuID0gcHJvY2Vzcy52ZXJzaW9ucy5idW47XG4gICAgY29uc3QgcnVudGltZSA9IGlzUnVubmluZ09uQnVuID8gJ2J1bicgOiAnbm9kZSc7XG4gICAgY29uc3QgYXJncyA9IGlzUnVubmluZ09uQnVuID8gWyctLWJ1biddIDogWyctLW5vLXdhcm5pbmdzJywgJy0taW1wb3J0JywgJ3RzeCddO1xuICAgIGlmIChhcmd2LndhdGNoKSB7XG4gICAgICBhcmdzLnB1c2goJy0td2F0Y2gnKTtcbiAgICB9XG4gICAgYXJncy5wdXNoKGZpbGUpO1xuICAgIGNvbnN0IFssIC4uLmFkZGl0aW9uYWxBcmd1bWVudHNdID0gYXJndi5fO1xuICAgIGNvbnN0IHJ1bnRpbWVBcmdzID0gWy4uLmFyZ3MsIC4uLmFkZGl0aW9uYWxBcmd1bWVudHMubWFwKChhcmcpID0+IGFyZy50b1N0cmluZygpKV07XG4gICAgaWYgKGFyZ3YudmVyYm9zZSkge1xuICAgICAgY29uc29sZS5pbmZvKGBSdW5uaW5nICcke3J1bnRpbWV9ICR7cnVudGltZUFyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgcmV0ID0gY2hpbGRfcHJvY2Vzcy5zcGF3blN5bmMocnVudGltZSwgcnVudGltZUFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYgfSxcbiAgICB9KTtcbiAgICBwcm9jZXNzLmV4aXQocmV0LnN0YXR1cyA/PyAxKTtcbiAgfSxcbn07XG4iLCJpbXBvcnQgeyByZW1vdmVOcG1BbmRZYXJuRW52aXJvbm1lbnRWYXJpYWJsZXMgfSBmcm9tICdAd2lsbGJvb3N0ZXIvc2hhcmVkLWxpYi1ub2RlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmltcG9ydCB7IGFwcCwgZnVuY3Rpb25zLCBsaWIgfSBmcm9tICcuL2NvbW1hbmRzL2J1aWxkL2J1aWxkLmpzJztcbmltcG9ydCB7IHJ1biB9IGZyb20gJy4vY29tbWFuZHMvcnVuLmpzJztcbmltcG9ydCB7IHNoYXJlZE9wdGlvbnNCdWlsZGVyIH0gZnJvbSAnLi9zaGFyZWRPcHRpb25zQnVpbGRlci5qcyc7XG5cbnJlbW92ZU5wbUFuZFlhcm5FbnZpcm9ubWVudFZhcmlhYmxlcyhwcm9jZXNzLmVudik7XG5cbmF3YWl0IHlhcmdzKGhpZGVCaW4ocHJvY2Vzcy5hcmd2KSlcbiAgLnNjcmlwdE5hbWUoJ2J1aWxkLXRzJylcbiAgLm9wdGlvbnMoc2hhcmVkT3B0aW9uc0J1aWxkZXIpXG4gIC5jb21tYW5kKGFwcClcbiAgLmNvbW1hbmQoZnVuY3Rpb25zKVxuICAuY29tbWFuZChsaWIpXG4gIC5jb21tYW5kKHJ1bilcbiAgLmRlbWFuZENvbW1hbmQoKVxuICAuc3RyaWN0KClcbiAgLmhlbHAoKS5hcmd2O1xuIl0sIm5hbWVzIjpbImVudlZhcnMiLCJsb2FkRW52aXJvbm1lbnRWYXJpYWJsZXNXaXRoQ2FjaGUiLCJhcmd2IiwiY3dkIiwicmVhZEFuZEFwcGx5RW52aXJvbm1lbnRWYXJpYWJsZXMiLCJ2ZXJib3NlIiwiY29uc29sZSIsImluZm8iLCJPYmplY3QiLCJrZXlzIiwiY3JlYXRlRW52aXJvbm1lbnRWYXJpYWJsZXNEZWZpbml0aW9uIiwiZW52VmFyc0RlZiIsImVudlZhck5hbWVzIiwiU2V0IiwiaW5saW5lIiwiZmxhdE1hcCIsImUiLCJ0b1N0cmluZyIsInNwbGl0IiwiYXV0b0lubGluZSIsIm5hbWUiLCJ1bmRlZmluZWQiLCJwcm9jZXNzIiwiZW52IiwiSlNPTiIsInN0cmluZ2lmeSIsImFsbFRhcmdldENhdGVnb3JpZXMiLCJhc3luYyIsInJlYWRQYWNrYWdlSnNvbiIsImRpclBhdGgiLCJwYWNrYWdlSnNvblBhdGgiLCJwYXRoIiwiam9pbiIsInBhY2thZ2VKc29uVGV4dCIsImZzIiwicHJvbWlzZXMiLCJyZWFkRmlsZSIsInBhcnNlIiwic2hhcmVkT3B0aW9uc0J1aWxkZXIiLCJ5YXJnc09wdGlvbnNCdWlsZGVyRm9yRW52Iiwic2lsZW50IiwiZGVzY3JpcHRpb24iLCJ0eXBlIiwiYWxpYXMiLCJidWlsZGVyIiwiaW5wdXQiLCJkZWZhdWx0IiwibWluaWZ5Iiwic291cmNlbWFwIiwiZXh0ZXJuYWwiLCJ3YXRjaCIsImtlZXBJbXBvcnQiLCJidW5kbGVCdWlsdGlucyIsImFwcEJ1aWxkZXIiLCJtb2R1bGVUeXBlIiwiZnVuY3Rpb25zQnVpbGRlciIsIm9ubHlQYWNrYWdlSnNvbiIsImxpYkJ1aWxkZXIiLCJqc0V4dGVuc2lvbiIsInNldHVwUGx1Z2lucyIsInRhcmdldERldGFpbCIsInBhY2thZ2VKc29uIiwibmFtZXNwYWNlIiwicGFja2FnZURpclBhdGgiLCJvdXRwdXRPcHRpb25zTGlzdCIsImV4dGVybmFsRGVwcyIsIm1hcCIsIml0ZW0iLCJkZXBlbmRlbmNpZXMiLCJwdXNoIiwicGVlckRlcGVuZGVuY2llcyIsIm9wdGlvbmFsRGVwZW5kZW5jaWVzIiwiZXhpc3RzU3luYyIsInBhY2thZ2VEaXJzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwicGFja2FnZURpciIsImlzRGlyZWN0b3J5Iiwib3RoZXJQYWNrYWdlSnNvbiIsInJlYWRGaWxlU3luYyIsImV4dGVuc2lvbnMiLCJiYWJlbENvbmZpZ1BhdGgiLCJ1cmwiLCJmaWxlVVJMVG9QYXRoIiwiZGlybmFtZSIsInBsdWdpbnMiLCJyZXBsYWNlIiwiZGVsaW1pdGVycyIsInByZXZlbnRBc3NpZ25tZW50IiwidmFsdWVzIiwianNvbiIsIm5vZGVFeHRlcm5hbHMiLCJkZXBzIiwiZGV2RGVwcyIsInBlZXJEZXBzIiwib3B0RGVwcyIsImluY2x1ZGUiLCJSZWdFeHAiLCJleGNsdWRlIiwicmVzb2x2ZSIsInByZWZlckJ1aWx0aW5zIiwiaWQiLCJpbmNsdWRlcyIsImNvbW1vbmpzIiwibW9kdWxlTmFtZXMiLCJpc0JhYmVsSGVscGVyc0J1bmRsZWQiLCJCVUlMRFRTX1VTRV9CQUJMRV9SVU5USU1FIiwiYmFiZWwiLCJjb25maWdGaWxlIiwiYmFiZWxIZWxwZXJzIiwic29tZSIsIm9wdHMiLCJwcmVzZXJ2ZU1vZHVsZXMiLCJwcmVzZXJ2ZURpcmVjdGl2ZXMiLCJzdHJpbmciLCJ0ZXJzZXIiLCJjb21wcmVzcyIsImRpcmVjdGl2ZXMiLCJhbmFseXplIiwic3VtbWFyeU9ubHkiLCJnZW5lcmF0ZURlY2xhcmF0aW9uRmlsZXMiLCJjb3JlUHJvamVjdERpclBhdGgiLCJjb3JlQ29uZmlnRmlsZSIsInRzIiwiZmluZENvbmZpZ0ZpbGUiLCJzeXMiLCJmaWxlRXhpc3RzIiwiRXJyb3IiLCJwcm9qZWN0cyIsIm91dERpciIsImJhc2VuYW1lIiwicGFyZW50RGlyUGF0aCIsImRpcmVudHMiLCJyZWFkZGlyIiwiZGlyZW50IiwicHJvamVjdERpclBhdGgiLCJhbGxTdWNjZWVkZWQiLCJydW5UeXBlU2NyaXB0Q29tcGlsZXIiLCJjb25maWciLCJyZWFkQ29uZmlnRmlsZSIsImNvbXBpbGVyT3B0aW9ucyIsImRlY2xhcmF0aW9uIiwiZW1pdERlY2xhcmF0aW9uT25seSIsIm5vRW1pdCIsIm5vRW1pdE9uRXJyb3IiLCJlcnJvcnMiLCJmaWxlTmFtZXMiLCJvcHRpb25zIiwicGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQiLCJwcm9ncmFtIiwiY3JlYXRlUHJvZ3JhbSIsInJvb3ROYW1lcyIsImNvbmZpZ0ZpbGVQYXJzaW5nRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsImVtaXRTa2lwcGVkIiwiZW1pdCIsImFsbERpYWdub3N0aWNzIiwiZ2V0UHJlRW1pdERpYWdub3N0aWNzIiwibGVuZ3RoIiwiZm9ybWF0SG9zdCIsImdldENhbm9uaWNhbEZpbGVOYW1lIiwiZ2V0Q3VycmVudERpcmVjdG9yeSIsImdldE5ld0xpbmUiLCJuZXdMaW5lIiwibWVzc2FnZSIsImZvcm1hdERpYWdub3N0aWNzIiwid2FybiIsImFwcCIsImNvbW1hbmQiLCJkZXNjcmliZSIsImhhbmRsZXIiLCJidWlsZCIsImZ1bmN0aW9ucyIsInBhY2thZ2UiLCJlcnJvciIsImV4aXQiLCJnZW5lcmF0ZVBhY2thZ2VKc29uRm9yRnVuY3Rpb25zIiwibGliIiwidGFyZ2V0Q2F0ZWdvcnkiLCJOT0RFX0VOViIsImlucHV0cyIsInAiLCJzcmNEaXJQYXRoIiwiZXh0IiwidmVyaWZ5SW5wdXQiLCJlbmRzV2l0aCIsImRldGVjdFRhcmdldERldGFpbCIsInBhY2thZ2VOYW1lIiwibWF0Y2giLCJleGVjIiwiZ2V0TmFtZXNwYWNlQW5kTmFtZSIsImlzRXNtUGFja2FnZSIsIkJVSUxEX1RTX0NPUkVKUyIsIkJVSUxEX1RTX0NPUkVKU19XSVRIX1BST1BPU0FMUyIsIkJVSUxEX1RTX1ZFUkJPU0UiLCJCVUlMRF9UU19UQVJHRVRfQ0FURUdPUlkiLCJCVUlMRF9UU19UQVJHRVRfREVUQUlMIiwib3V0RGlyUGF0aCIsImRpciIsImZvcm1hdCIsImlzRXNtT3V0cHV0IiwianNFeHQiLCJlbnRyeUZpbGVOYW1lcyIsImdldE91dHB1dE9wdGlvbnNMaXN0IiwiY2hkaXIiLCJybSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwiZnJvbUVudHJpZXMiLCJpbmRleCIsImV4dG5hbWUiLCJjbGVhclNjcmVlbiIsInBhdGhUb1JlbGF0aXZlUGF0aCIsInBhdGhzIiwiQXJyYXkiLCJpc0FycmF5IiwicmVsYXRpdmUiLCJ3YXRjaGVyIiwib3V0cHV0IiwiY2xvc2UiLCJyZW1vdmVMaXN0ZW5lciIsInN0ZGluIiwiY29kZSIsIm9uRXhpdCIsIm9uIiwiaXNUVFkiLCJyZXN1bWUiLCJldmVudCIsInJlY292ZXIiLCJjYXVzZSIsIm5hbWVTZWN0aW9uIiwicGx1Z2luIiwib3V0cHV0TGluZXMiLCJjaGFsayIsImJvbGQiLCJyZWQiLCJjeWFuIiwibG9jIiwiZmlsZSIsImxpbmUiLCJjb2x1bW4iLCJmcmFtZSIsImRpbSIsInN0YWNrIiwiaGFuZGxlRXJyb3IiLCJldmVudElucHV0IiwiaW5wdXRGaWxlcyIsImdyZWVuIiwibXMiLCJkdXJhdGlvbiIsImRhdGVUaW1lIiwicmVzdWx0Iiwid2F0Y2hSb2xsdXAiLCJidW5kbGUiLCJidWlsZEZhaWxlZCIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJfYnVuZGxlIiwicm9sbHVwIiwiUHJvbWlzZSIsImFsbCIsIndyaXRlIiwiZXNtUGFja2FnZSIsImVzbU91dHB1dCIsIm1haW4iLCJzY3JpcHRzIiwiZGV2RGVwZW5kZW5jaWVzIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJydW4iLCJtb2R1bGUiLCJpc1J1bm5pbmdPbkJ1biIsInZlcnNpb25zIiwiYnVuIiwicnVudGltZSIsImFyZ3MiLCJhZGRpdGlvbmFsQXJndW1lbnRzIiwiXyIsInJ1bnRpbWVBcmdzIiwiYXJnIiwicmV0IiwiY2hpbGRfcHJvY2VzcyIsInNwYXduU3luYyIsInN0ZGlvIiwic3RhdHVzIiwicmVtb3ZlTnBtQW5kWWFybkVudmlyb25tZW50VmFyaWFibGVzIiwieWFyZ3MiLCJoaWRlQmluIiwic2NyaXB0TmFtZSIsImRlbWFuZENvbW1hbmQiLCJzdHJpY3QiLCJoZWxwIl0sIm1hcHBpbmdzIjoicy9CQU1BLElBQUlBLEVBS0csU0FBU0MsRUFDZEMsRUFDQUMsR0FRQSxPQU5LSCxJQUNIQSxFQUFVSSxFQUFpQ0YsRUFBTUMsR0FDN0NELEVBQUtHLFNBQ1BDLFFBQVFDLEtBQUssbUJBQW9CQyxPQUFPQyxLQUFLVCxLQUcxQ0EsQ0FDVCxDQUtPLFNBQVNVLEVBQ2RSLEVBQ0FDLEdBRUEsTUFBTVEsRUFBcUMsQ0FBQSxFQUNyQ0MsRUFBYyxJQUFJQyxJQUFJLEtBQ3RCWCxFQUFLWSxRQUFVLElBQUlDLFFBQVNDLEdBQU1BLEVBQUVDLFdBQVdDLE1BQU0sU0FDckRoQixFQUFLaUIsV0FBYVgsT0FBT0MsS0FBS1IsRUFBa0NDLEVBQU1DLElBQVEsS0FFcEYsSUFBSyxNQUFNaUIsS0FBUVIsT0FDU1MsSUFBdEJDLFFBQVFDLElBQUlILEtBRWhCVCxFQUFXLGVBQWVTLEtBQVVJLEtBQUtDLFVBQVVILFFBQVFDLElBQUlILEtBS2pFLE9BSElsQixFQUFLRyxTQUNQQyxRQUFRQyxLQUFLLG1CQUFvQkMsT0FBT0MsS0FBS0UsSUFFeENBLENBQ1QsQ0MzQ08sTUFBTWUsRUFBc0IsQ0FBQyxNQUFPLFlBQWEsT0NJakRDLGVBQWVDLEVBQWdCQyxHQUNwQyxNQUFNQyxFQUFrQkMsRUFBS0MsS0FBS0gsRUFBUyxnQkFDM0MsSUFDRSxNQUFNSSxRQUF3QkMsRUFBR0MsU0FBU0MsU0FBU04sRUFBaUIsUUFDcEUsTUFBTyxDQUFDTixLQUFLYSxNQUFNSixHQUFpQ0gsRUFDdEQsQ0FBRSxNQUNBLENBRUYs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "build-ts",
3
- "version": "15.0.6",
3
+ "version": "15.0.8",
4
4
  "repository": "github:WillBooster/build-ts",
5
5
  "license": "UNLICENSED",
6
6
  "author": "WillBooster Inc.",
@@ -22,7 +22,7 @@
22
22
  "prepack": "pinst --disable",
23
23
  "postpack": "pinst --enable",
24
24
  "prepare": "husky || true",
25
- "prettify": "prettier --cache --color --write \"**/{.*/,}*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}\" \"!**/test-fixtures/**\"",
25
+ "prettify": "prettier --cache --color --write \"**/{.*/,}*.{cjs,css,cts,htm,html,js,json,json5,jsonc,jsx,md,mjs,mts,scss,ts,tsx,vue,yaml,yml}\" \"!**/test{-,/}fixtures/**\"",
26
26
  "start": "tsx src/index.ts",
27
27
  "start-prod": "yarn build && yarn build-ts",
28
28
  "test": "vitest",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "prettier": "@willbooster/prettier-config",
32
32
  "dependencies": {
33
- "@babel/core": "7.27.4",
33
+ "@babel/core": "7.27.7",
34
34
  "@babel/plugin-proposal-decorators": "7.27.1",
35
35
  "@babel/plugin-proposal-explicit-resource-management": "7.27.4",
36
36
  "@babel/plugin-syntax-import-attributes": "7.27.1",
@@ -45,15 +45,15 @@
45
45
  "@rollup/plugin-replace": "6.0.2",
46
46
  "@rollup/plugin-terser": "0.4.4",
47
47
  "@rollup/pluginutils": "5.2.0",
48
- "@willbooster/shared-lib-node": "6.2.3",
49
- "babel-plugin-polyfill-corejs3": "0.12.0",
48
+ "@willbooster/shared-lib-node": "6.2.5",
49
+ "babel-plugin-polyfill-corejs3": "0.13.0",
50
50
  "babel-plugin-transform-remove-console": "6.9.4",
51
51
  "chalk": "5.4.1",
52
52
  "core-js": "3.43.0",
53
53
  "core-js-pure": "3.43.0",
54
54
  "date-time": "4.0.0",
55
55
  "pretty-ms": "9.2.0",
56
- "rollup": "4.44.0",
56
+ "rollup": "4.44.1",
57
57
  "rollup-plugin-analyzer": "4.0.0",
58
58
  "rollup-plugin-keep-import": "1.0.3",
59
59
  "rollup-plugin-node-externals": "8.0.1",
@@ -70,19 +70,19 @@
70
70
  "@types/babel__plugin-transform-runtime": "7.9.5",
71
71
  "@types/babel__preset-env": "7.10.0",
72
72
  "@types/eslint": "8.56.10",
73
- "@types/node": "22.15.32",
73
+ "@types/node": "22.15.33",
74
74
  "@types/signal-exit": "3.0.4",
75
75
  "@types/yargs": "17.0.33",
76
76
  "@willbooster/babel-configs": "2.1.0",
77
- "@willbooster/eslint-config-ts": "11.2.0",
78
- "@willbooster/prettier-config": "10.0.0",
79
- "@willbooster/wb": "8.1.13",
77
+ "@willbooster/eslint-config-ts": "11.3.3",
78
+ "@willbooster/prettier-config": "10.1.3",
79
+ "@willbooster/wb": "8.1.16",
80
80
  "conventional-changelog-conventionalcommits": "9.0.0",
81
81
  "eslint": "9.29.0",
82
82
  "eslint-config-flat-gitignore": "2.1.0",
83
83
  "eslint-config-prettier": "10.1.5",
84
- "eslint-import-resolver-typescript": "4.4.3",
85
- "eslint-plugin-import-x": "4.15.2",
84
+ "eslint-import-resolver-typescript": "4.4.4",
85
+ "eslint-plugin-import-x": "4.16.1",
86
86
  "eslint-plugin-sort-class-members": "1.21.0",
87
87
  "eslint-plugin-sort-destructure-keys": "2.0.0",
88
88
  "eslint-plugin-unicorn": "59.0.1",
@@ -92,11 +92,12 @@
92
92
  "lint-staged": "16.1.2",
93
93
  "micromatch": "4.0.8",
94
94
  "pinst": "3.0.0",
95
- "prettier": "3.5.3",
95
+ "prettier": "3.6.2",
96
+ "prettier-plugin-java": "2.6.8",
96
97
  "semantic-release": "24.2.5",
97
- "sort-package-json": "3.2.1",
98
+ "sort-package-json": "3.3.1",
98
99
  "type-fest": "4.41.0",
99
- "typescript-eslint": "8.34.1",
100
+ "typescript-eslint": "8.35.0",
100
101
  "vitest": "3.2.4"
101
102
  },
102
103
  "packageManager": "yarn@4.9.2",