cdk8s-cli
Version:
This is the command line tool for Cloud Development Kit (CDK) for Kubernetes (cdk8s).
174 lines • 21.1 kB
JavaScript
;
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=