projen
Version:
CDK for software projects
132 lines • 16.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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Projects = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = __importStar(require("path"));
const vm = __importStar(require("vm"));
const inventory_1 = require("./inventory");
const render_options_1 = require("./javascript/render-options");
const option_hints_1 = require("./option-hints");
/**
* Programmatic API for projen.
*/
class Projects {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Projects", version: "0.103.12" };
/**
* Creates a new project with defaults.
*
* This function creates the project type in-process (with in VM) and calls
* `.synth()` on it (if `options.synth` is not `false`).
*
* At the moment, it also generates a `.projenrc.js` file with the same code
* that was just executed. In the future, this will also be done by the project
* type, so we can easily support multiple languages of projenrc.
*
* An environment variable (PROJEN_CREATE_PROJECT=true) is set within the VM
* so that custom project types can detect whether the current synthesis is the
* result of a new project creation (and take additional steps accordingly)
*/
static createProject(options) {
createProject(options);
}
constructor() { }
}
exports.Projects = Projects;
function resolveModulePath(moduleName) {
// Default project resolution location
if (moduleName === "projen") {
return "./index";
}
// External projects need to load the module from the modules directory
try {
return path.dirname(require.resolve(path.join(moduleName, "package.json"), {
paths: [process.cwd()],
}));
}
catch (err) {
throw new Error(`External project module '${moduleName}' could not be resolved.`);
}
}
function createProject(opts) {
const projectType = (0, inventory_1.resolveProjectType)(opts.projectFqn);
const mod = resolveModulePath(projectType.moduleName);
// "dir" is exposed as a top-level option to require users to specify a value for it
opts.projectOptions.outdir = opts.dir;
// Generated a random name space for imports used by options
// This is so we can keep the top-level namespace as clean as possible
const optionsImports = "_options" + Math.random().toString(36).slice(2);
// pass the FQN of the project type to the project initializer so it can
// generate the projenrc file.
const { renderedOptions, imports } = (0, render_options_1.renderJavaScriptOptions)({
bootstrap: true,
comments: opts.optionHints ?? option_hints_1.InitProjectOptionHints.FEATURED,
type: projectType,
args: opts.projectOptions,
omitFromBootstrap: ["outdir"],
prefixImports: optionsImports,
synth: opts.synth ?? true,
post: opts.post ?? true,
});
const initProjectCode = new Array();
// generate a random variable name because jest tests appear to share
// VM contexts, causing
//
// > SyntaxError: Identifier 'project' has already been declared
//
// errors if this isn't unique
const varName = "project" + Math.random().toString(36).slice(2);
initProjectCode.push(`const ${varName} = new ${projectType.typename}(${renderedOptions});`);
// always synth; Project.synth() itself detects `--no-synth` and only runs
// the project-creation hooks (e.g. Projenrc writing its bootstrap file).
initProjectCode.push(`${varName}.synth();`);
// eslint-disable-next-line @typescript-eslint/no-require-imports
const mainModule = require(mod);
const ctx = vm.createContext({
...mainModule,
[optionsImports]: {
...imports.modules.reduce((optionsContext, currentModule) => ({
...optionsContext,
// eslint-disable-next-line @typescript-eslint/no-require-imports
[currentModule]: require(resolveModulePath(currentModule)),
}), {}),
},
});
const postSynth = opts.post ?? true;
process.env.PROJEN_DISABLE_POST = (!postSynth).toString();
process.env.PROJEN_CREATE_PROJECT = "true";
vm.runInContext(initProjectCode.join("\n"), ctx);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3Qix1Q0FBeUI7QUFDekIsMkNBQWlEO0FBQ2pELGdFQUFzRTtBQUN0RSxpREFBd0Q7QUFpRHhEOztHQUVHO0FBQ0gsTUFBYSxRQUFROztJQUNuQjs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUE2QjtRQUN2RCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUF1QixDQUFDOztBQW5CMUIsNEJBb0JDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxVQUFrQjtJQUMzQyxzQ0FBc0M7SUFDdEMsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLEVBQUU7WUFDckQsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3ZCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksS0FBSyxDQUNiLDRCQUE0QixVQUFVLDBCQUEwQixDQUNqRSxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUEwQjtJQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFBLDhCQUFrQixFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4RCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFdEQsb0ZBQW9GO0lBQ3BGLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFFdEMsNERBQTREO0lBQzVELHNFQUFzRTtJQUN0RSxNQUFNLGNBQWMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsd0VBQXdFO0lBQ3hFLDhCQUE4QjtJQUM5QixNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUEsd0NBQXVCLEVBQUM7UUFDM0QsU0FBUyxFQUFFLElBQUk7UUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxxQ0FBc0IsQ0FBQyxRQUFRO1FBQzdELElBQUksRUFBRSxXQUFXO1FBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYztRQUN6QixpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUM3QixhQUFhLEVBQUUsY0FBYztRQUM3QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJO1FBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUk7S0FDeEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxlQUFlLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztJQUU1QyxxRUFBcUU7SUFDckUsdUJBQXVCO0lBQ3ZCLEVBQUU7SUFDRixnRUFBZ0U7SUFDaEUsRUFBRTtJQUNGLDhCQUE4QjtJQUM5QixNQUFNLE9BQU8sR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsZUFBZSxDQUFDLElBQUksQ0FDbEIsU0FBUyxPQUFPLFVBQVUsV0FBVyxDQUFDLFFBQVEsSUFBSSxlQUFlLElBQUksQ0FDdEUsQ0FBQztJQUVGLDBFQUEwRTtJQUMxRSx5RUFBeUU7SUFDekUsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sV0FBVyxDQUFDLENBQUM7SUFFNUMsaUVBQWlFO0lBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQzNCLEdBQUcsVUFBVTtRQUNiLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDaEIsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDdkIsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQyxHQUFHLGNBQWM7Z0JBQ2pCLGlFQUFpRTtnQkFDakUsQ0FBQyxhQUFhLENBQUMsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDM0QsQ0FBQyxFQUNGLEVBQUUsQ0FDSDtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLENBQUM7SUFDM0MsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyB2bSBmcm9tIFwidm1cIjtcbmltcG9ydCB7IHJlc29sdmVQcm9qZWN0VHlwZSB9IGZyb20gXCIuL2ludmVudG9yeVwiO1xuaW1wb3J0IHsgcmVuZGVySmF2YVNjcmlwdE9wdGlvbnMgfSBmcm9tIFwiLi9qYXZhc2NyaXB0L3JlbmRlci1vcHRpb25zXCI7XG5pbXBvcnQgeyBJbml0UHJvamVjdE9wdGlvbkhpbnRzIH0gZnJvbSBcIi4vb3B0aW9uLWhpbnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdE9wdGlvbnMge1xuICAvKipcbiAgICogRGlyZWN0b3J5IHRoYXQgdGhlIHByb2plY3Qgd2lsbCBiZSBnZW5lcmF0ZWQgaW4uXG4gICAqL1xuICByZWFkb25seSBkaXI6IHN0cmluZztcblxuICAvKipcbiAgICogRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByb2plY3QgdHlwZSAodXN1YWxseSBmb3JtYXR0ZWRcbiAgICogYXMgYHByb2plbi5tb2R1bGUuUHJvamVjdFR5cGVgKS5cbiAgICogQGV4YW1wbGUgYHByb2plbi50eXBlc2NyaXB0LlR5cGVzY3JpcHRQcm9qZWN0YFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEZxbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQcm9qZWN0IG9wdGlvbnMuIE9ubHkgSlNPTi1saWtlIHZhbHVlcyBjYW4gYmUgcGFzc2VkIGluIChzdHJpbmdzLFxuICAgKiBib29sZWFucywgbnVtYmVycywgZW51bXMsIGFycmF5cywgYW5kIG9iamVjdHMgdGhhdCBhcmUgbm90XG4gICAqIGRlcml2ZWQgZnJvbSBjbGFzc2VzKS5cbiAgICpcbiAgICogQ29uc3VsdCB0aGUgQVBJIHJlZmVyZW5jZSBvZiB0aGUgcHJvamVjdCB0eXBlIHlvdSBhcmUgZ2VuZXJhdGluZyBmb3JcbiAgICogaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBmaWVsZHMgYW5kIHR5cGVzIGFyZSBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0T3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAvKipcbiAgICogU2hvdWxkIHdlIHJlbmRlciBjb21tZW50ZWQtb3V0IGRlZmF1bHQgb3B0aW9ucyBpbiB0aGUgcHJvamVucmMgZmlsZT9cbiAgICogRG9lcyBub3QgYXBwbHkgdG8gcHJvamVucmMuanNvbiBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgSW5pdFByb2plY3RPcHRpb25IaW50cy5GRUFUVVJFRFxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uSGludHM/OiBJbml0UHJvamVjdE9wdGlvbkhpbnRzO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgd2UgY2FsbCBgcHJvamVjdC5zeW50aCgpYCBvciBpbnN0YW50aWF0ZSB0aGUgcHJvamVjdCAoY291bGQgc3RpbGxcbiAgICogaGF2ZSBzaWRlLWVmZmVjdHMpIGFuZCByZW5kZXIgdGhlIC5wcm9qZW5yYyBmaWxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBzeW50aD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBleGVjdXRlIHBvc3Qgc3ludGhlc2lzIGhvb2tzPyAodXN1YWxseSBwYWNrYWdlIG1hbmFnZXIgaW5zdGFsbCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHBvc3Q/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFByb2dyYW1tYXRpYyBBUEkgZm9yIHByb2plbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFByb2plY3RzIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdCB3aXRoIGRlZmF1bHRzLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHByb2plY3QgdHlwZSBpbi1wcm9jZXNzICh3aXRoIGluIFZNKSBhbmQgY2FsbHNcbiAgICogYC5zeW50aCgpYCBvbiBpdCAoaWYgYG9wdGlvbnMuc3ludGhgIGlzIG5vdCBgZmFsc2VgKS5cbiAgICpcbiAgICogQXQgdGhlIG1vbWVudCwgaXQgYWxzbyBnZW5lcmF0ZXMgYSBgLnByb2plbnJjLmpzYCBmaWxlIHdpdGggdGhlIHNhbWUgY29kZVxuICAgKiB0aGF0IHdhcyBqdXN0IGV4ZWN1dGVkLiBJbiB0aGUgZnV0dXJlLCB0aGlzIHdpbGwgYWxzbyBiZSBkb25lIGJ5IHRoZSBwcm9qZWN0XG4gICAqIHR5cGUsIHNvIHdlIGNhbiBlYXNpbHkgc3VwcG9ydCBtdWx0aXBsZSBsYW5ndWFnZXMgb2YgcHJvamVucmMuXG4gICAqXG4gICAqIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIChQUk9KRU5fQ1JFQVRFX1BST0pFQ1Q9dHJ1ZSkgaXMgc2V0IHdpdGhpbiB0aGUgVk1cbiAgICogc28gdGhhdCBjdXN0b20gcHJvamVjdCB0eXBlcyBjYW4gZGV0ZWN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgc3ludGhlc2lzIGlzIHRoZVxuICAgKiByZXN1bHQgb2YgYSBuZXcgcHJvamVjdCBjcmVhdGlvbiAoYW5kIHRha2UgYWRkaXRpb25hbCBzdGVwcyBhY2NvcmRpbmdseSlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJvamVjdChvcHRpb25zOiBDcmVhdGVQcm9qZWN0T3B0aW9ucykge1xuICAgIGNyZWF0ZVByb2plY3Qob3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1vZHVsZVBhdGgobW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gIC8vIERlZmF1bHQgcHJvamVjdCByZXNvbHV0aW9uIGxvY2F0aW9uXG4gIGlmIChtb2R1bGVOYW1lID09PSBcInByb2plblwiKSB7XG4gICAgcmV0dXJuIFwiLi9pbmRleFwiO1xuICB9XG5cbiAgLy8gRXh0ZXJuYWwgcHJvamVjdHMgbmVlZCB0byBsb2FkIHRoZSBtb2R1bGUgZnJvbSB0aGUgbW9kdWxlcyBkaXJlY3RvcnlcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKFxuICAgICAgcmVxdWlyZS5yZXNvbHZlKHBhdGguam9pbihtb2R1bGVOYW1lLCBcInBhY2thZ2UuanNvblwiKSwge1xuICAgICAgICBwYXRoczogW3Byb2Nlc3MuY3dkKCldLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV4dGVybmFsIHByb2plY3QgbW9kdWxlICcke21vZHVsZU5hbWV9JyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuYCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb2plY3Qob3B0czogQ3JlYXRlUHJvamVjdE9wdGlvbnMpIHtcbiAgY29uc3QgcHJvamVjdFR5cGUgPSByZXNvbHZlUHJvamVjdFR5cGUob3B0cy5wcm9qZWN0RnFuKTtcbiAgY29uc3QgbW9kID0gcmVzb2x2ZU1vZHVsZVBhdGgocHJvamVjdFR5cGUubW9kdWxlTmFtZSk7XG5cbiAgLy8gXCJkaXJcIiBpcyBleHBvc2VkIGFzIGEgdG9wLWxldmVsIG9wdGlvbiB0byByZXF1aXJlIHVzZXJzIHRvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgaXRcbiAgb3B0cy5wcm9qZWN0T3B0aW9ucy5vdXRkaXIgPSBvcHRzLmRpcjtcblxuICAvLyBHZW5lcmF0ZWQgYSByYW5kb20gbmFtZSBzcGFjZSBmb3IgaW1wb3J0cyB1c2VkIGJ5IG9wdGlvbnNcbiAgLy8gVGhpcyBpcyBzbyB3ZSBjYW4ga2VlcCB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBhcyBjbGVhbiBhcyBwb3NzaWJsZVxuICBjb25zdCBvcHRpb25zSW1wb3J0cyA9IFwiX29wdGlvbnNcIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO1xuXG4gIC8vIHBhc3MgdGhlIEZRTiBvZiB0aGUgcHJvamVjdCB0eXBlIHRvIHRoZSBwcm9qZWN0IGluaXRpYWxpemVyIHNvIGl0IGNhblxuICAvLyBnZW5lcmF0ZSB0aGUgcHJvamVucmMgZmlsZS5cbiAgY29uc3QgeyByZW5kZXJlZE9wdGlvbnMsIGltcG9ydHMgfSA9IHJlbmRlckphdmFTY3JpcHRPcHRpb25zKHtcbiAgICBib290c3RyYXA6IHRydWUsXG4gICAgY29tbWVudHM6IG9wdHMub3B0aW9uSGludHMgPz8gSW5pdFByb2plY3RPcHRpb25IaW50cy5GRUFUVVJFRCxcbiAgICB0eXBlOiBwcm9qZWN0VHlwZSxcbiAgICBhcmdzOiBvcHRzLnByb2plY3RPcHRpb25zLFxuICAgIG9taXRGcm9tQm9vdHN0cmFwOiBbXCJvdXRkaXJcIl0sXG4gICAgcHJlZml4SW1wb3J0czogb3B0aW9uc0ltcG9ydHMsXG4gICAgc3ludGg6IG9wdHMuc3ludGggPz8gdHJ1ZSxcbiAgICBwb3N0OiBvcHRzLnBvc3QgPz8gdHJ1ZSxcbiAgfSk7XG5cbiAgY29uc3QgaW5pdFByb2plY3RDb2RlID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAvLyBnZW5lcmF0ZSBhIHJhbmRvbSB2YXJpYWJsZSBuYW1lIGJlY2F1c2UgamVzdCB0ZXN0cyBhcHBlYXIgdG8gc2hhcmVcbiAgLy8gVk0gY29udGV4dHMsIGNhdXNpbmdcbiAgLy9cbiAgLy8gPiBTeW50YXhFcnJvcjogSWRlbnRpZmllciAncHJvamVjdCcgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZFxuICAvL1xuICAvLyBlcnJvcnMgaWYgdGhpcyBpc24ndCB1bmlxdWVcbiAgY29uc3QgdmFyTmFtZSA9IFwicHJvamVjdFwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG4gIGluaXRQcm9qZWN0Q29kZS5wdXNoKFxuICAgIGBjb25zdCAke3Zhck5hbWV9ID0gbmV3ICR7cHJvamVjdFR5cGUudHlwZW5hbWV9KCR7cmVuZGVyZWRPcHRpb25zfSk7YCxcbiAgKTtcblxuICAvLyBhbHdheXMgc3ludGg7IFByb2plY3Quc3ludGgoKSBpdHNlbGYgZGV0ZWN0cyBgLS1uby1zeW50aGAgYW5kIG9ubHkgcnVuc1xuICAvLyB0aGUgcHJvamVjdC1jcmVhdGlvbiBob29rcyAoZS5nLiBQcm9qZW5yYyB3cml0aW5nIGl0cyBib290c3RyYXAgZmlsZSkuXG4gIGluaXRQcm9qZWN0Q29kZS5wdXNoKGAke3Zhck5hbWV9LnN5bnRoKCk7YCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgY29uc3QgbWFpbk1vZHVsZSA9IHJlcXVpcmUobW9kKTtcbiAgY29uc3QgY3R4ID0gdm0uY3JlYXRlQ29udGV4dCh7XG4gICAgLi4ubWFpbk1vZHVsZSxcbiAgICBbb3B0aW9uc0ltcG9ydHNdOiB7XG4gICAgICAuLi5pbXBvcnRzLm1vZHVsZXMucmVkdWNlKFxuICAgICAgICAob3B0aW9uc0NvbnRleHQsIGN1cnJlbnRNb2R1bGUpID0+ICh7XG4gICAgICAgICAgLi4ub3B0aW9uc0NvbnRleHQsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgICAgICBbY3VycmVudE1vZHVsZV06IHJlcXVpcmUocmVzb2x2ZU1vZHVsZVBhdGgoY3VycmVudE1vZHVsZSkpLFxuICAgICAgICB9KSxcbiAgICAgICAge30sXG4gICAgICApLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IHBvc3RTeW50aCA9IG9wdHMucG9zdCA/PyB0cnVlO1xuICBwcm9jZXNzLmVudi5QUk9KRU5fRElTQUJMRV9QT1NUID0gKCFwb3N0U3ludGgpLnRvU3RyaW5nKCk7XG4gIHByb2Nlc3MuZW52LlBST0pFTl9DUkVBVEVfUFJPSkVDVCA9IFwidHJ1ZVwiO1xuICB2bS5ydW5JbkNvbnRleHQoaW5pdFByb2plY3RDb2RlLmpvaW4oXCJcXG5cIiksIGN0eCk7XG59XG4iXX0=