UNPKG

cdk8s-cli

Version:

This is the command line tool for Cloud Development Kit (CDK) for Kubernetes (cdk8s).

174 lines • 21.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImportHelm = void 0; const child_process_1 = require("child_process"); const fs = __importStar(require("fs")); const os = __importStar(require("os")); const path = __importStar(require("path")); const cdk8s_1 = require("cdk8s"); const json2jsii_1 = require("json2jsii"); const semver = __importStar(require("semver")); const base_1 = require("./base"); const codegen_1 = require("./codegen"); const MAX_HELM_BUFFER = 10 * 1024 * 1024; const CHART_SCHEMA = 'values.schema.json'; const CHART_YAML = 'Chart.yaml'; class ImportHelm extends base_1.ImportBase { static async fromSpec(importSpec) { const { source } = importSpec; return new ImportHelm(source); } constructor(source) { super(); this.chartDependencies = []; const [chartUrl, chartName, chartVersion] = extractHelmChartDetails(source); this.chartName = chartName; this.chartUrl = chartUrl; this.chartVersion = chartVersion; const tmpDir = pullHelmRepo(chartUrl, chartName, chartVersion); const chartYamlFilePath = path.join(tmpDir, this.chartName, CHART_YAML); const contents = cdk8s_1.Yaml.load(chartYamlFilePath); if (contents.length === 1 && contents[0].dependencies) { for (const dependency of contents[0].dependencies) { this.chartDependencies.push(dependency.name); } } const potentialSchemaPath = path.join(tmpDir, this.chartName, CHART_SCHEMA); this.chartSchemaPath = fs.existsSync(potentialSchemaPath) ? potentialSchemaPath : undefined; this.schema = this.chartSchemaPath ? JSON.parse(fs.readFileSync(this.chartSchemaPath, 'utf-8')) : undefined; cleanup(tmpDir); } get moduleNames() { return [this.chartName]; } async generateTypeScript(code) { var _a; (0, codegen_1.emitHelmHeader)(code); const types = new json2jsii_1.TypeGenerator({ definitions: (_a = this.schema) === null || _a === void 0 ? void 0 : _a.definitions, toJson: false, sanitizeEnums: true, }); (0, codegen_1.generateHelmConstruct)(types, { schema: this.schema, chartName: this.chartName, chartUrl: this.chartUrl, chartVersion: this.chartVersion, chartDependencies: this.chartDependencies, fqn: this.chartName, }); code.line(types.render()); } } exports.ImportHelm = ImportHelm; /** * Gets information about the helm chart from the helm url * @param url * @returns chartUrl, chartName and chartVersion */ function extractHelmChartDetails(url) { let chartUrl; let chartName; let chartVersion; if (url.startsWith('helm:oci://')) { // URL: helm:oci://registry-1.docker.io/bitnamicharts/wordpress@17.1.17 const helmRegex = /^helm:(oci:\/\/[A-Za-z0-9_.-:\-]+)\@([0-9]+)\.([0-9]+)\.([A-Za-z0-9-+]+)$/; const helmDetails = helmRegex.exec(url); if (!helmDetails) { throw Error(`Invalid helm URL: ${url}. Must match the format: 'helm:<oci-registry-url>@<chart-version>'.`); } chartUrl = helmDetails[1]; const lastIndexOfSlash = chartUrl.lastIndexOf('/'); chartName = chartUrl.substring(lastIndexOfSlash + 1); const major = helmDetails[2]; const minor = helmDetails[3]; const patch = helmDetails[4]; chartVersion = `${major}.${minor}.${patch}`; } else { // URL: helm:https://lacework.github.io/helm-charts/lacework-agent@6.9.0 const helmRegex = /^helm:([A-Za-z0-9_.-:\-]+)\/([A-Za-z0-9_.-:\-]+)\@([0-9]+)\.([0-9]+)\.([A-Za-z0-9-+]+)$/; const helmDetails = helmRegex.exec(url); if (!helmDetails) { throw Error(`Invalid helm URL: ${url}. Must match the format: 'helm:<repo-url>/<chart-name>@<chart-version>'.`); } chartUrl = helmDetails[1]; chartName = helmDetails[2]; const major = helmDetails[3]; const minor = helmDetails[4]; const patch = helmDetails[5]; chartVersion = `${major}.${minor}.${patch}`; } if (!semver.valid(chartVersion)) { throw new Error(`Invalid chart version (${chartVersion}) in URL: ${url}. Must follow SemVer-2 (see https://semver.org/).`); } return [chartUrl, chartName, chartVersion]; } /** * Pulls the helm chart in a temporary directory * @param chartUrl Chart url * @param chartName Chart name * @param chartVersion Chart version * @returns Temporary directory path */ function pullHelmRepo(chartUrl, chartName, chartVersion) { const workdir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk8s-helm-')); const args = new Array(); args.push('pull'); if (!chartUrl.startsWith('oci://')) { args.push(chartName); args.push('--repo', chartUrl); } else { args.push(chartUrl); } args.push('--version', chartVersion); args.push('--untar'); args.push('--untardir', workdir); const command = 'helm'; const helm = (0, child_process_1.spawnSync)(command, args, { maxBuffer: MAX_HELM_BUFFER, }); if (helm.error) { const err = helm.error.message; if (err.includes('ENOENT')) { throw new Error(`Unable to execute '${command}' to pull the Helm chart. Is helm installed on your system?`); } throw new Error(`Failed pulling helm chart from URL (${chartUrl}): ${err}`); } if (helm.status !== 0) { throw new Error(helm.stderr.toString()); } return workdir; } /** * Cleanup temp directory created * @param tmpDir Temporary directory path */ function cleanup(tmpDir) { fs.rmSync(tmpDir, { recursive: true }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVsbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbXBvcnQvaGVsbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGlEQUEwQztBQUMxQyx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixpQ0FBNkI7QUFHN0IseUNBQTBDO0FBQzFDLCtDQUFpQztBQUNqQyxpQ0FBb0M7QUFDcEMsdUNBQWtFO0FBR2xFLE1BQU0sZUFBZSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBQzFDLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQztBQUVoQyxNQUFhLFVBQVcsU0FBUSxpQkFBVTtJQUNqQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFzQjtRQUNqRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQVNELFlBQW9CLE1BQWM7UUFDaEMsS0FBSyxFQUFFLENBQUM7UUFKTyxzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFNaEQsTUFBTSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFL0QsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJ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O0tBQzdFO0lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztLQUN6QztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLE9BQU8sQ0FBQyxNQUFjO0lBQzdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFlhbWwgfSBmcm9tICdjZGs4cyc7XG5pbXBvcnQgeyBDb2RlTWFrZXIgfSBmcm9tICdjb2RlbWFrZXInO1xuaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNCB9IGZyb20gJ2pzb24tc2NoZW1hJztcbmltcG9ydCB7IFR5cGVHZW5lcmF0b3IgfSBmcm9tICdqc29uMmpzaWknO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBJbXBvcnRCYXNlIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IGVtaXRIZWxtSGVhZGVyLCBnZW5lcmF0ZUhlbG1Db25zdHJ1Y3QgfSBmcm9tICcuL2NvZGVnZW4nO1xuaW1wb3J0IHsgSW1wb3J0U3BlYyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmNvbnN0IE1BWF9IRUxNX0JVRkZFUiA9IDEwICogMTAyNCAqIDEwMjQ7XG5jb25zdCBDSEFSVF9TQ0hFTUEgPSAndmFsdWVzLnNjaGVtYS5qc29uJztcbmNvbnN0IENIQVJUX1lBTUwgPSAnQ2hhcnQueWFtbCc7XG5cbmV4cG9ydCBjbGFzcyBJbXBvcnRIZWxtIGV4dGVuZHMgSW1wb3J0QmFzZSB7XG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZnJvbVNwZWMoaW1wb3J0U3BlYzogSW1wb3J0U3BlYyk6IFByb21pc2U8SW1wb3J0SGVsbT4ge1xuICAgIGNvbnN0IHsgc291cmNlIH0gPSBpbXBvcnRTcGVjO1xuICAgIHJldHVybiBuZXcgSW1wb3J0SGVsbShzb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFydFVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0VmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0U2NoZW1hUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYXJ0RGVwZW5kZW5jaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjaGVtYTogSlNPTlNjaGVtYTQgfCB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihzb3VyY2U6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBjb25zdCBbY2hhcnRVcmwsIGNoYXJ0TmFtZSwgY2hhcnRWZXJzaW9uXSA9IGV4dHJhY3RIZWxtQ2hhcnREZXRhaWxzKHNvdXJjZSk7XG5cbiAgICB0aGlzLmNoYXJ0TmFtZSA9IGNoYXJ0TmFtZTtcbiAgICB0aGlzLmNoYXJ0VXJsID0gY2hhcnRVcmw7XG4gICAgdGhpcy5jaGFydFZlcnNpb24gPSBjaGFydFZlcnNpb247XG4gICAgY29uc3QgdG1wRGlyID0gcHVsbEhlbG1SZXBvKGNoYXJ0VXJsLCBjaGFydE5hbWUsIGNoYXJ0VmVyc2lvbik7XG5cbiAgICBjb25zdCBjaGFydFlhbWxGaWxlUGF0aCA9IHBhdGguam9pbih0bXBEaXIsIHRoaXMuY2hhcnROYW1lLCBDSEFSVF9ZQU1MKTtcbiAgICBjb25zdCBjb250ZW50cyA9IFlhbWwubG9hZChjaGFydFlhbWxGaWxlUGF0aCk7XG5cbiAgICBpZiAoY29udGVudHMubGVuZ3RoID09PSAxICYmIGNvbnRlbnRzWzBdLmRlcGVuZGVuY2llcykge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGNvbnRlbnRzWzBdLmRlcGVuZGVuY2llcykge1xuICAgICAgICB0aGlzLmNoYXJ0RGVwZW5kZW5jaWVzLnB1c2goZGVwZW5kZW5jeS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwb3RlbnRpYWxTY2hlbWFQYXRoID0gcGF0aC5qb2luKHRtcERpciwgdGhpcy5jaGFydE5hbWUsIENIQVJUX1NDSEVNQSk7XG4gICAgdGhpcy5jaGFydFNjaGVtYVBhdGggPSBmcy5leGlzdHNTeW5jKHBvdGVudGlhbFNjaGVtYVBhdGgpID8gcG90ZW50aWFsU2NoZW1hUGF0aCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNjaGVtYSA9IHRoaXMuY2hhcnRTY2hlbWFQYXRoID8gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5jaGFydFNjaGVtYVBhdGgsICd1dGYtOCcpKSA6IHVuZGVmaW5lZDtcblxuICAgIGNsZWFudXAodG1wRGlyKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbW9kdWxlTmFtZXMoKSB7XG4gICAgcmV0dXJuIFt0aGlzLmNoYXJ0TmFtZV07XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2VuZXJhdGVUeXBlU2NyaXB0KGNvZGU6IENvZGVNYWtlcikge1xuICAgIGVtaXRIZWxtSGVhZGVyKGNvZGUpO1xuXG4gICAgY29uc3QgdHlwZXMgPSBuZXcgVHlwZUdlbmVyYXRvcih7XG4gICAgICBkZWZpbml0aW9uczogdGhpcy5zY2hlbWE/LmRlZmluaXRpb25zLFxuICAgICAgdG9Kc29uOiBmYWxzZSxcbiAgICAgIHNhbml0aXplRW51bXM6IHRydWUsXG4gICAgfSk7XG5cbiAgICBnZW5lcmF0ZUhlbG1Db25zdHJ1Y3QodHlwZXMsIHtcbiAgICAgIHNjaGVtYTogdGhpcy5zY2hlbWEsXG4gICAgICBjaGFydE5hbWU6IHRoaXMuY2hhcnROYW1lLFxuICAgICAgY2hhcnRVcmw6IHRoaXMuY2hhcnRVcmwsXG4gICAgICBjaGFydFZlcnNpb246IHRoaXMuY2hhcnRWZXJzaW9uLFxuICAgICAgY2hhcnREZXBlbmRlbmNpZXM6IHRoaXMuY2hhcnREZXBlbmRlbmNpZXMsXG4gICAgICBmcW46IHRoaXMuY2hhcnROYW1lLFxuICAgIH0pO1xuXG4gICAgY29kZS5saW5lKHR5cGVzLnJlbmRlcigpKTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhlbG0gY2hhcnQgZnJvbSB0aGUgaGVsbSB1cmxcbiAqIEBwYXJhbSB1cmxcbiAqIEByZXR1cm5zIGNoYXJ0VXJsLCBjaGFydE5hbWUgYW5kIGNoYXJ0VmVyc2lvblxuICovXG5mdW5jdGlvbiBleHRyYWN0SGVsbUNoYXJ0RGV0YWlscyh1cmw6IHN0cmluZykge1xuXG4gIGxldCBjaGFydFVybDtcbiAgbGV0IGNoYXJ0TmFtZTtcbiAgbGV0IGNoYXJ0VmVyc2lvbjtcblxuICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2hlbG06b2NpOi8vJykpIHtcbiAgICAvLyBVUkw6IGhlbG06b2NpOi8vcmVnaXN0cnktMS5kb2NrZXIuaW8vYml0bmFtaWNoYXJ0cy93b3JkcHJlc3NAMTcuMS4xN1xuICAgIGNvbnN0IGhlbG1SZWdleCA9IC9eaGVsbToob2NpOlxcL1xcL1tBLVphLXowLTlfLi06XFwtXSspXFxAKFswLTldKylcXC4oWzAtOV0rKVxcLihbQS1aYS16MC05LStdKykkLztcbiAgICBjb25zdCBoZWxtRGV0YWlscyA9IGhlbG1SZWdleC5leGVjKHVybCk7XG5cbiAgICBpZiAoIWhlbG1EZXRhaWxzKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBoZWxtIFVSTDogJHt1cmx9LiBNdXN0IG1hdGNoIHRoZSBmb3JtYXQ6ICdoZWxtOjxvY2ktcmVnaXN0cnktdXJsPkA8Y2hhcnQtdmVyc2lvbj4nLmApO1xuICAgIH1cblxuICAgIGNoYXJ0VXJsID0gaGVsbURldGFpbHNbMV07XG4gICAgY29uc3QgbGFzdEluZGV4T2ZTbGFzaCA9IGNoYXJ0VXJsLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgY2hhcnROYW1lID0gY2hhcnRVcmwuc3Vic3RyaW5nKGxhc3RJbmRleE9mU2xhc2ggKyAxKTtcblxuICAgIGNvbnN0IG1ham9yID0gaGVsbURldGFpbHNbMl07XG4gICAgY29uc3QgbWlub3IgPSBoZWxtRGV0YWlsc1szXTtcbiAgICBjb25zdCBwYXRjaCA9IGhlbG1EZXRhaWxzWzRdO1xuICAgIGNoYXJ0VmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWA7XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBVUkw6IGhlbG06aHR0cHM6Ly9sYWNld29yay5naXRodWIuaW8vaGVsbS1jaGFydHMvbGFjZXdvcmstYWdlbnRANi45LjBcbiAgICBjb25zdCBoZWxtUmVnZXggPSAvXmhlbG06KFtBLVphLXowLTlfLi06XFwtXSspXFwvKFtBLVphLXowLTlfLi06XFwtXSspXFxAKFswLTldKylcXC4oWzAtOV0rKVxcLihbQS1aYS16MC05LStdKykkLztcbiAgICBjb25zdCBoZWxtRGV0YWlscyA9IGhlbG1SZWdleC5leGVjKHVybCk7XG5cbiAgICBpZiAoIWhlbG1EZXRhaWxzKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBoZWxtIFVSTDogJHt1cmx9LiBNdXN0IG1hdGNoIHRoZSBmb3JtYXQ6ICdoZWxtOjxyZXBvLXVybD4vPGNoYXJ0LW5hbWU+QDxjaGFydC12ZXJzaW9uPicuYCk7XG4gICAgfVxuXG4gICAgY2hhcnRVcmwgPSBoZWxtRGV0YWlsc1sxXTtcbiAgICBjaGFydE5hbWUgPSBoZWxtRGV0YWlsc1syXTtcblxuICAgIGNvbnN0IG1ham9yID0gaGVsbURldGFpbHNbM107XG4gICAgY29uc3QgbWlub3IgPSBoZWxtRGV0YWlsc1s0XTtcbiAgICBjb25zdCBwYXRjaCA9IGhlbG1EZXRhaWxzWzVdO1xuICAgIGNoYXJ0VmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofWA7XG4gIH1cblxuICBpZiAoIXNlbXZlci52YWxpZChjaGFydFZlcnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYXJ0IHZlcnNpb24gKCR7Y2hhcnRWZXJzaW9ufSkgaW4gVVJMOiAke3VybH0uIE11c3QgZm9sbG93IFNlbVZlci0yIChzZWUgaHR0cHM6Ly9zZW12ZXIub3JnLykuYCk7XG4gIH1cblxuICByZXR1cm4gW2NoYXJ0VXJsLCBjaGFydE5hbWUsIGNoYXJ0VmVyc2lvbl07XG59XG5cbi8qKlxuICogUHVsbHMgdGhlIGhlbG0gY2hhcnQgaW4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5XG4gKiBAcGFyYW0gY2hhcnRVcmwgQ2hhcnQgdXJsXG4gKiBAcGFyYW0gY2hhcnROYW1lIENoYXJ0IG5hbWVcbiAqIEBwYXJhbSBjaGFydFZlcnNpb24gQ2hhcnQgdmVyc2lvblxuICogQHJldHVybnMgVGVtcG9yYXJ5IGRpcmVjdG9yeSBwYXRoXG4gKi9cbmZ1bmN0aW9uIHB1bGxIZWxtUmVwbyhjaGFydFVybDogc3RyaW5nLCBjaGFydE5hbWU6IHN0cmluZywgY2hhcnRWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3b3JrZGlyID0gZnMubWtkdGVtcFN5bmMocGF0aC5qb2luKG9zLnRtcGRpcigpLCAnY2RrOHMtaGVsbS0nKSk7XG5cbiAgY29uc3QgYXJncyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gIGFyZ3MucHVzaCgncHVsbCcpO1xuXG4gIGlmICghY2hhcnRVcmwuc3RhcnRzV2l0aCgnb2NpOi8vJykpIHtcbiAgICBhcmdzLnB1c2goY2hhcnROYW1lKTtcbiAgICBhcmdzLnB1c2goJy0tcmVwbycsIGNoYXJ0VXJsKTtcbiAgfSBlbHNlIHtcbiAgICBhcmdzLnB1c2goY2hhcnRVcmwpO1xuICB9XG5cbiAgYXJncy5wdXNoKCctLXZlcnNpb24nLCBjaGFydFZlcnNpb24pO1xuICBhcmdzLnB1c2goJy0tdW50YXInKTtcbiAgYXJncy5wdXNoKCctLXVudGFyZGlyJywgd29ya2Rpcik7XG5cbiAgY29uc3QgY29tbWFuZCA9ICdoZWxtJztcblxuICBjb25zdCBoZWxtID0gc3Bhd25TeW5jKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICBtYXhCdWZmZXI6IE1BWF9IRUxNX0JVRkZFUixcbiAgfSk7XG5cbiAgaWYgKGhlbG0uZXJyb3IpIHtcbiAgICBjb25zdCBlcnIgPSBoZWxtLmVycm9yLm1lc3NhZ2U7XG4gICAgaWYgKGVyci5pbmNsdWRlcygnRU5PRU5UJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4ZWN1dGUgJyR7Y29tbWFuZH0nIHRvIHB1bGwgdGhlIEhlbG0gY2hhcnQuIElzIGhlbG0gaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtP2ApO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHB1bGxpbmcgaGVsbSBjaGFydCBmcm9tIFVSTCAoJHtjaGFydFVybH0pOiAke2Vycn1gKTtcbiAgfVxuXG4gIGlmIChoZWxtLnN0YXR1cyAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihoZWxtLnN0ZGVyci50b1N0cmluZygpKTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZGlyO1xufVxuXG4vKipcbiAqIENsZWFudXAgdGVtcCBkaXJlY3RvcnkgY3JlYXRlZFxuICogQHBhcmFtIHRtcERpciBUZW1wb3JhcnkgZGlyZWN0b3J5IHBhdGhcbiAqL1xuZnVuY3Rpb24gY2xlYW51cCh0bXBEaXI6IHN0cmluZykge1xuICBmcy5ybVN5bmModG1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn0iXX0=