aws-cdk
Version:
AWS CDK CLI, the command line tool for CDK apps
210 lines • 31.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.handleFlags = handleFlags;
exports.displayFlags = displayFlags;
const path = require("path");
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
const chalk = require("chalk");
const fs = require("fs-extra");
const api_1 = require("../api");
async function handleFlags(flagData, ioHelper, options, toolkit) {
if (options.FLAGNAME && options.all) {
await ioHelper.defaults.error('Error: Cannot use both --all and a specific flag name. Please use either --all to show all flags or specify a single flag name.');
return;
}
if (options.set && options.all) {
await ioHelper.defaults.error('Error: --set is currently only compatible with a flag name. Please specify which flag you want to set.');
return;
}
if (options.set && !options.FLAGNAME) {
await ioHelper.defaults.error('Error: --set requires a flag name. Please specify which flag you want to set.');
return;
}
if (options.set && !options.value) {
await ioHelper.defaults.error('Error: --set requires a value. Please specify the value you want to set for the flag.');
return;
}
if (options.FLAGNAME && !options.set && !options.value) {
await displayFlags(flagData, ioHelper, String(options.FLAGNAME));
return;
}
if (options.all && !options.set) {
await displayFlags(flagData, ioHelper, undefined, true);
return;
}
if (options.set && options.FLAGNAME || options.value && options.FLAGNAME) {
await prototypeChanges(flagData, ioHelper, String(options.FLAGNAME), options.value, toolkit);
return;
}
if (!options.FLAGNAME && !options.all && !options.set) {
await displayFlags(flagData, ioHelper, undefined, false);
}
}
async function displayFlags(flagsData, ioHelper, flagName, all) {
if (flagName && flagName.length > 0) {
const flag = flagsData.find(f => f.name === flagName);
if (!flag) {
await ioHelper.defaults.error('Flag not found.');
return;
}
await ioHelper.defaults.info(`Description: ${flag.explanation}`);
await ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
await ioHelper.defaults.info(`User value: ${flag.userValue}`);
return;
}
const headers = ['Feature Flag Name', 'Recommended Value', 'User Value'];
const rows = [];
const getFlagPriority = (flag) => {
if (flag.userValue === undefined) {
return 3;
}
else if (String(flag.userValue) === String(flag.recommendedValue)) {
return 1;
}
else {
return 2;
}
};
let flagsToDisplay;
if (all) {
flagsToDisplay = flagsData;
}
else {
flagsToDisplay = flagsData.filter(flag => flag.userValue === undefined || String(flag.userValue) !== String(flag.recommendedValue));
}
const sortedFlags = [...flagsToDisplay].sort((a, b) => {
const priorityA = getFlagPriority(a);
const priorityB = getFlagPriority(b);
if (priorityA !== priorityB) {
return priorityA - priorityB;
}
if (a.module !== b.module) {
return a.module.localeCompare(b.module);
}
return a.name.localeCompare(b.name);
});
let currentModule = '';
sortedFlags.forEach((flag) => {
if (flag.module !== currentModule) {
rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
currentModule = flag.module;
}
rows.push([
flag.name,
String(flag.recommendedValue),
flag.userValue === undefined ? '<unset>' : String(flag.userValue),
]);
});
const formattedTable = formatTable(headers, rows);
await ioHelper.defaults.info(formattedTable);
}
async function prototypeChanges(flagData, ioHelper, flagName, value, toolkit) {
const flag = flagData.find(f => f.name === flagName);
if (!flag) {
await ioHelper.defaults.error('Flag not found.');
return;
}
if (typeof flag.recommendedValue !== 'boolean' && flag.recommendedValue !== 'true' && flag.recommendedValue !== 'false') {
await ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
return;
}
const baseContext = new toolkit_lib_1.CdkAppMultiContext(process.cwd());
const baseContextValues = await baseContext.read();
const memoryContext = new toolkit_lib_1.MemoryContext(baseContextValues);
const boolValue = value.toLowerCase() === 'true';
if (baseContextValues[flagName] == boolValue) {
await ioHelper.defaults.error('Flag is already set to the specified value. No changes needed.');
return;
}
const cdkJson = await JSON.parse(await fs.readFile(path.join(process.cwd(), 'cdk.json'), 'utf-8'));
const app = cdkJson.app;
const source = await toolkit.fromCdkApp(app, {
contextStore: baseContext,
outdir: path.join(process.cwd(), 'original'),
});
const cx = await toolkit.synth(source);
const assembly = cx.cloudAssembly;
const updateObj = {};
updateObj[flagName] = boolValue;
await memoryContext.update(updateObj);
const modifiedSource = await toolkit.fromCdkApp(app, {
contextStore: memoryContext,
outdir: path.join(process.cwd(), 'temp'),
});
const modifiedCx = await toolkit.synth(modifiedSource);
const allStacks = assembly.stacksRecursively;
for (const stack of allStacks) {
const templatePath = stack.templateFullPath;
await toolkit.diff(modifiedCx, {
method: toolkit_lib_1.DiffMethod.LocalFile(templatePath),
stacks: {
strategy: api_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE,
patterns: [stack.hierarchicalId],
},
});
}
const userAccepted = await promptUser(ioHelper, flagName, flag.userValue, value?.toLowerCase() === 'true');
if (userAccepted) {
await modifyValues(flagName, value, ioHelper);
await ioHelper.defaults.info('Flag value updated successfully.');
}
else {
await ioHelper.defaults.info('Operation cancelled');
}
const originalDir = path.join(process.cwd(), 'original');
const tempDir = path.join(process.cwd(), 'temp');
await fs.remove(originalDir);
await fs.remove(tempDir);
}
async function promptUser(ioHelper, flagName, currentValue, newValue) {
return ioHelper.requestResponse({
time: new Date(),
level: 'info',
code: 'CDK_TOOLKIT_I9300',
message: 'Do you want to accept these changes?',
data: {
flagName,
currentValue,
newValue,
responseDescription: 'Enter "y" to apply changes or "n" to cancel',
},
defaultResponse: false,
});
}
async function modifyValues(flagName, value, ioHelper) {
const cdkJsonPath = path.join(process.cwd(), 'cdk.json');
const cdkJsonContent = await fs.readFile(cdkJsonPath, 'utf-8');
const cdkJson = JSON.parse(cdkJsonContent);
const boolValue = value.toLowerCase() === 'true';
cdkJson.context[flagName] = boolValue;
await ioHelper.defaults.info(`Setting flag '${flagName}' to: ${boolValue}`);
await fs.writeFile(cdkJsonPath, JSON.stringify(cdkJson, null, 2), 'utf-8');
}
function formatTable(headers, rows) {
const columnWidths = [
Math.max(headers[0].length, ...rows.map(row => row[0].length)),
Math.max(headers[1].length, ...rows.map(row => row[1].length)),
Math.max(headers[2].length, ...rows.map(row => row[2].length)),
];
const createSeparator = () => {
return '+' + columnWidths.map(width => '-'.repeat(width + 2)).join('+') + '+';
};
const formatRow = (values) => {
return '|' + values.map((value, i) => ` ${value.padEnd(columnWidths[i])} `).join('|') + '|';
};
const separator = createSeparator();
let table = separator + '\n';
table += formatRow(headers) + '\n';
table += separator + '\n';
rows.forEach(row => {
if (row[1] === '' && row[2] === '') {
table += ` ${row[0].padEnd(columnWidths[0])} \n`;
}
else {
table += formatRow(row) + '\n';
}
});
table += separator;
return table;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhZy1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esa0NBdUNDO0FBRUQsb0NBZ0VDO0FBbEhELDZCQUE2QjtBQUU3QixzREFBcUY7QUFDckYsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixnQ0FBZ0Q7QUFJekMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQWtCLEVBQUUsT0FBcUIsRUFBRSxPQUFnQjtJQUNwSCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUlBQWlJLENBQUMsQ0FBQztRQUNqSyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx3R0FBd0csQ0FBQyxDQUFDO1FBQ3hJLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUMvRyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkgsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFD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QUUsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzlGLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsS0FBSyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsS0FBSyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxTQUFTLENBQUM7SUFDbkIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWcsIFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBDZGtBcHBNdWx0aUNvbnRleHQsIE1lbW9yeUNvbnRleHQsIERpZmZNZXRob2QgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZsYWdzT3B0aW9ucyB9IGZyb20gJy4uL2NsaS91c2VyLWlucHV0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZsYWdzKGZsYWdEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIG9wdGlvbnM6IEZsYWdzT3B0aW9ucywgdG9vbGtpdDogVG9vbGtpdCkge1xuICBpZiAob3B0aW9ucy5GTEFHTkFNRSAmJiBvcHRpb25zLmFsbCkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogQ2Fubm90IHVzZSBib3RoIC0tYWxsIGFuZCBhIHNwZWNpZmljIGZsYWcgbmFtZS4gUGxlYXNlIHVzZSBlaXRoZXIgLS1hbGwgdG8gc2hvdyBhbGwgZmxhZ3Mgb3Igc3BlY2lmeSBhIHNpbmdsZSBmbGFnIG5hbWUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiAtLXNldCBpcyBjdXJyZW50bHkgb25seSBjb21wYXRpYmxlIHdpdGggYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy5GTEFHTkFNRSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy52YWx1ZSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSB2YWx1ZS4gUGxlYXNlIHNwZWNpZnkgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHNldCBmb3IgdGhlIGZsYWcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuc2V0ICYmICFvcHRpb25zLnZhbHVlKSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGwgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy5GTEFHTkFNRSB8fCBvcHRpb25zLnZhbHVlICYmIG9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBwcm90b3R5cGVDaGFuZ2VzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpLCBvcHRpb25zLnZhbHVlLCB0b29sa2l0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuYWxsICYmICFvcHRpb25zLnNldCkge1xuICAgIGF3YWl0IGRpc3BsYXlGbGFncyhmbGFnRGF0YSwgaW9IZWxwZXIsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ3MoZmxhZ3NEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIGZsYWdOYW1lPzogc3RyaW5nLCBhbGw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChmbGFnTmFtZSAmJiBmbGFnTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhZyA9IGZsYWdzRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgaWYgKCFmbGFnKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRmxhZyBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBSZWNvbW1lbmRlZCB2YWx1ZTogJHtmbGFnLnJlY29tbWVuZGVkVmFsdWV9YCk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgVXNlciB2YWx1ZTogJHtmbGFnLnVzZXJWYWx1ZX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gWydGZWF0dXJlIEZsYWcgTmFtZScsICdSZWNvbW1lbmRlZCBWYWx1ZScsICdVc2VyIFZhbHVlJ107XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbXTtcblxuICBjb25zdCBnZXRGbGFnUHJpb3JpdHkgPSAoZmxhZzogRmVhdHVyZUZsYWcpOiBudW1iZXIgPT4ge1xuICAgIGlmIChmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgPT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICB9O1xuXG4gIGxldCBmbGFnc1RvRGlzcGxheTogRmVhdHVyZUZsYWdbXTtcbiAgaWYgKGFsbCkge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhO1xuICB9IGVsc2Uge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgIT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc1RvRGlzcGxheV0uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHByaW9yaXR5QSA9IGdldEZsYWdQcmlvcml0eShhKTtcbiAgICBjb25zdCBwcmlvcml0eUIgPSBnZXRGbGFnUHJpb3JpdHkoYik7XG5cbiAgICBpZiAocHJpb3JpdHlBICE9PSBwcmlvcml0eUIpIHtcbiAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XG4gICAgfVxuICAgIGlmIChhLm1vZHVsZSAhPT0gYi5tb2R1bGUpIHtcbiAgICAgIHJldHVybiBhLm1vZHVsZS5sb2NhbGVDb21wYXJlKGIubW9kdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuXG4gIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG4gIHNvcnRlZEZsYWdzLmZvckVhY2goKGZsYWcpID0+IHtcbiAgICBpZiAoZmxhZy5tb2R1bGUgIT09IGN1cnJlbnRNb2R1bGUpIHtcbiAgICAgIHJvd3MucHVzaChbY2hhbGsuYm9sZChgTW9kdWxlOiAke2ZsYWcubW9kdWxlfWApLCAnJywgJyddKTtcbiAgICAgIGN1cnJlbnRNb2R1bGUgPSBmbGFnLm1vZHVsZTtcbiAgICB9XG4gICAgcm93cy5wdXNoKFtcbiAgICAgIGZsYWcubmFtZSxcbiAgICAgIFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgXSk7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUoaGVhZGVycywgcm93cyk7XG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm90b3R5cGVDaGFuZ2VzKFxuICBmbGFnRGF0YTogRmVhdHVyZUZsYWdbXSxcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBmbGFnTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0b29sa2l0OiBUb29sa2l0LFxuKSB7XG4gIGNvbnN0IGZsYWcgPSBmbGFnRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gIGlmICghZmxhZykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ3RydWUnICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2ZhbHNlJykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYmFzZUNvbnRleHQgPSBuZXcgQ2RrQXBwTXVsdGlDb250ZXh0KHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBiYXNlQ29udGV4dFZhbHVlcyA9IGF3YWl0IGJhc2VDb250ZXh0LnJlYWQoKTtcbiAgY29uc3QgbWVtb3J5Q29udGV4dCA9IG5ldyBNZW1vcnlDb250ZXh0KGJhc2VDb250ZXh0VmFsdWVzKTtcblxuICBjb25zdCBib29sVmFsdWUgPSB2YWx1ZSEudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuXG4gIGlmIChiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV0gPT0gYm9vbFZhbHVlKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0ZsYWcgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gTm8gY2hhbmdlcyBuZWVkZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNka0pzb24gPSBhd2FpdCBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnY2RrLmpzb24nKSwgJ3V0Zi04JykpO1xuICBjb25zdCBhcHAgPSBjZGtKc29uLmFwcDtcblxuICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBiYXNlQ29udGV4dCxcbiAgICBvdXRkaXI6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnb3JpZ2luYWwnKSxcbiAgfSk7XG5cbiAgY29uc3QgY3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKHNvdXJjZSk7XG4gIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIHVwZGF0ZU9ialtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG4gIGF3YWl0IG1lbW9yeUNvbnRleHQudXBkYXRlKHVwZGF0ZU9iaik7XG5cbiAgY29uc3QgbW9kaWZpZWRTb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBtZW1vcnlDb250ZXh0LFxuICAgIG91dGRpcjogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0ZW1wJyksXG4gIH0pO1xuXG4gIGNvbnN0IG1vZGlmaWVkQ3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKG1vZGlmaWVkU291cmNlKTtcbiAgY29uc3QgYWxsU3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzUmVjdXJzaXZlbHk7XG5cbiAgZm9yIChjb25zdCBzdGFjayBvZiBhbGxTdGFja3MpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgIGF3YWl0IHRvb2xraXQuZGlmZihtb2RpZmllZEN4LCB7XG4gICAgICBtZXRob2Q6IERpZmZNZXRob2QuTG9jYWxGaWxlKHRlbXBsYXRlUGF0aCksXG4gICAgICBzdGFja3M6IHtcbiAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgcHJvbXB0VXNlcihcbiAgICBpb0hlbHBlcixcbiAgICBmbGFnTmFtZSxcbiAgICBmbGFnLnVzZXJWYWx1ZSxcbiAgICB2YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnLFxuICApO1xuXG4gIGlmICh1c2VyQWNjZXB0ZWQpIHtcbiAgICBhd2FpdCBtb2RpZnlWYWx1ZXMoZmxhZ05hbWUsIHZhbHVlISwgaW9IZWxwZXIpO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0ZsYWcgdmFsdWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnT3BlcmF0aW9uIGNhbmNlbGxlZCcpO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ29yaWdpbmFsJyk7XG4gIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcblxuICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICBhd2FpdCBmcy5yZW1vdmUodGVtcERpcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFVzZXIoXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgZmxhZ05hbWU6IHN0cmluZyxcbiAgY3VycmVudFZhbHVlOiB1bmtub3duLFxuICBuZXdWYWx1ZTogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKHtcbiAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgIGxldmVsOiAnaW5mbycsXG4gICAgY29kZTogJ0NES19UT09MS0lUX0k5MzAwJyxcbiAgICBtZXNzYWdlOiAnRG8geW91IHdhbnQgdG8gYWNjZXB0IHRoZXNlIGNoYW5nZXM/JyxcbiAgICBkYXRhOiB7XG4gICAgICBmbGFnTmFtZSxcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICB9LFxuICAgIGRlZmF1bHRSZXNwb25zZTogZmFsc2UsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb2RpZnlWYWx1ZXMoZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICBjb25zdCBjZGtKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNka0pzb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoY2RrSnNvbkNvbnRlbnQpO1xuXG4gIGNvbnN0IGJvb2xWYWx1ZSA9IHZhbHVlIS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG5cbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgU2V0dGluZyBmbGFnICcke2ZsYWdOYW1lfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY2RrSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KGNka0pzb24sIG51bGwsIDIpLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFibGUoaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IHN0cmluZ1tdW10pOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW5XaWR0aHMgPSBbXG4gICAgTWF0aC5tYXgoaGVhZGVyc1swXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMF0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1sxXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMV0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1syXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMl0ubGVuZ3RoKSksXG4gIF07XG5cbiAgY29uc3QgY3JlYXRlU2VwYXJhdG9yID0gKCkgPT4ge1xuICAgIHJldHVybiAnKycgKyBjb2x1bW5XaWR0aHMubWFwKHdpZHRoID0+ICctJy5yZXBlYXQod2lkdGggKyAyKSkuam9pbignKycpICsgJysnO1xuICB9O1xuXG4gIGNvbnN0IGZvcm1hdFJvdyA9ICh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgcmV0dXJuICd8JyArIHZhbHVlcy5tYXAoKHZhbHVlLCBpKSA9PiBgICR7dmFsdWUucGFkRW5kKGNvbHVtbldpZHRoc1tpXSl9IGApLmpvaW4oJ3wnKSArICd8JztcbiAgfTtcblxuICBjb25zdCBzZXBhcmF0b3IgPSBjcmVhdGVTZXBhcmF0b3IoKTtcbiAgbGV0IHRhYmxlID0gc2VwYXJhdG9yICsgJ1xcbic7XG4gIHRhYmxlICs9IGZvcm1hdFJvdyhoZWFkZXJzKSArICdcXG4nO1xuICB0YWJsZSArPSBzZXBhcmF0b3IgKyAnXFxuJztcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93WzFdID09PSAnJyAmJiByb3dbMl0gPT09ICcnKSB7XG4gICAgICB0YWJsZSArPSBgICR7cm93WzBdLnBhZEVuZChjb2x1bW5XaWR0aHNbMF0pfSBcXG5gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZSArPSBmb3JtYXRSb3cocm93KSArICdcXG4nO1xuICAgIH1cbiAgfSk7XG5cbiAgdGFibGUgKz0gc2VwYXJhdG9yO1xuICByZXR1cm4gdGFibGU7XG59XG4iXX0=
;