@wheatstalk/aws-cdk-exec
Version:
An AWS CDK Cloud Assembly-aware command to help find and execute lambda functions and state machines
188 lines • 21.6 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;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.exportEnv = exports.cdkExec = void 0;
const cxapi = __importStar(require("aws-cdk-lib/cx-api"));
const chalk_1 = __importDefault(require("chalk"));
const yargs = __importStar(require("yargs"));
const aws_sdk_1 = require("../aws-sdk");
const executor_1 = require("../executor");
const find_matching_resources_1 = require("../find-matching-resources");
async function main() {
const args = yargs
.usage('$0 [path]', 'Execute the resource for a construct at a given path', builder => {
var _a;
return builder
.positional('path', {
type: 'string',
description: 'Path to executable construct resource',
})
.option('app', {
type: 'string',
default: (_a = process.env.CDK_EXEC_APP) !== null && _a !== void 0 ? _a : 'cdk.out',
description: 'Path to your `cdk.out` cloud assembly directory',
})
.option('all', {
type: 'boolean',
alias: 'a',
description: 'Execute all matching resources',
})
.option('export-env', {
type: 'boolean',
describe: 'Export a .env for all matching function environment variables',
})
.option('metadata', {
type: 'array',
alias: 'm',
description: 'Match resources with the given metadata key or key=value',
})
.option('tag', {
type: 'array',
alias: 't',
description: 'Match resources with the given tag key or key=value',
})
.option('output', {
type: 'boolean',
description: 'Show execution output',
default: true,
})
.option('input', {
type: 'string',
description: 'Execute with custom JSON input',
});
})
.argv;
// TODO: Need a better way to handle config-based profiles.
process.env.AWS_SDK_LOAD_CONFIG = '1';
if (args.exportEnv) {
return exportEnv({
constructPath: args.path,
app: args.app,
metadata: args.metadata ? new find_matching_resources_1.MetadataMatch(args.metadata) : undefined,
tags: args.tag ? new find_matching_resources_1.TagsMatch(args.tag) : undefined,
});
}
return cdkExec({
constructPath: args.path,
app: args.app,
all: args.all,
metadata: args.metadata ? new find_matching_resources_1.MetadataMatch(args.metadata) : undefined,
tags: args.tag ? new find_matching_resources_1.TagsMatch(args.tag) : undefined,
input: args.input,
showOutput: args.output,
});
}
async function cdkExec(options) {
try {
const assembly = new cxapi.CloudAssembly(options.app);
const executors = await executor_1.Executor.find({
assembly,
constructPath: options.constructPath,
metadata: options.metadata,
tags: options.tags,
sdk: new aws_sdk_1.AwsSdk(),
});
if (executors.length === 0) {
console.log('❌ No matching executable constructs found');
return 1;
}
if (!options.all && executors.length > 1) {
console.log('\n❌ Matched multiple resources: %s', executors.map(e => e.constructPath).join(', '));
return 1;
}
const executorResults = await Promise.all(executors.map(async (executor) => {
console.log('⚡ Executing %s (%s)', executor.constructPath, executor.physicalResourceId);
const result = await executor.execute(options.input);
return {
executor,
...result,
};
}));
let error = false;
for (const result of executorResults) {
console.log('\n\n✨ Final status of %s', result.executor.constructPath);
if (options.showOutput && result.output) {
console.log('\nOutput:\n%s', chalk_1.default.cyan(JSON.stringify(result.output, null, 2)));
}
if (result.error) {
error = true;
console.log('\n❌ Execution failed with an error message:\n\n%s', chalk_1.default.red(result.error));
}
else {
console.log('\n✅ Execution succeeded');
}
}
return error ? 1 : 0;
}
catch (e) {
if (e instanceof Error) {
if (e.stack && /new CloudAssembly/.test(e.stack)) {
console.log('\n❌ AWS CDK lib error: %s', e.message);
return 1;
}
}
throw e;
}
}
exports.cdkExec = cdkExec;
async function exportEnv(options) {
const assembly = new cxapi.CloudAssembly(options.app);
const executors = await executor_1.Executor.find({
assembly,
constructPath: options.constructPath,
metadata: options.metadata,
tags: options.tags,
sdk: new aws_sdk_1.AwsSdk(),
});
if (executors.length === 0) {
console.error('❌ No matching executable constructs found');
return 1;
}
if (executors.length > 1) {
console.error('\n❌ Matched multiple resources: %s', executors.map(e => e.constructPath).join(', '));
return 1;
}
for (const executor of executors) {
const env = await executor.env();
for (const [k, v] of Object.entries(env)) {
console.log(`${k}=${v}`);
}
}
return 0;
}
exports.exportEnv = exportEnv;
main()
.then(exitCode => {
process.exit(exitCode);
})
.catch(e => {
console.error(e);
process.exit(1);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWV4ZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2Nkay1leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLDBEQUE0QztBQUM1QyxrREFBMEI7QUFDMUIsNkNBQStCO0FBQy9CLHdDQUFvQztBQUNwQywwQ0FBdUM7QUFDdkMsd0VBQXNFO0FBRXRFLEtBQUssVUFBVSxJQUFJO0lBQ2pCLE1BQU0sSUFBSSxHQUFRLEtBQUs7U0FDcEIsS0FBSyxDQUFDLFdBQVcsRUFBRSxzREFBc0QsRUFBRSxPQUFPLENBQUMsRUFBRTs7UUFBQyxPQUFBLE9BQU87YUFDM0YsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNsQixJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSx1Q0FBdUM7U0FDckQsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFBLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxtQ0FBSSxTQUFTO1lBQzlDLFdBQVcsRUFBRSxpREFBaUQ7U0FDL0QsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLGdDQUFnQztTQUM5QyxDQUFDO2FBQ0QsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUNwQixJQUFJLEVBQUUsU0FBUztZQUNmLFFBQVEsRUFBRSwrREFBK0Q7U0FDMUUsQ0FBQzthQUNELE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDbEIsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwwREFBMEQ7U0FDeEUsQ0FBQzthQUNELE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDYixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FB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QUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzFCO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUE5QkQsOEJBOEJDO0FBRUQsSUFBSSxFQUFFO0tBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO0lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUM7S0FDRCxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdhd3MtY2RrLWxpYi9jeC1hcGknO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIHlhcmdzIGZyb20gJ3lhcmdzJztcbmltcG9ydCB7IEF3c1NkayB9IGZyb20gJy4uL2F3cy1zZGsnO1xuaW1wb3J0IHsgRXhlY3V0b3IgfSBmcm9tICcuLi9leGVjdXRvcic7XG5pbXBvcnQgeyBNZXRhZGF0YU1hdGNoLCBUYWdzTWF0Y2ggfSBmcm9tICcuLi9maW5kLW1hdGNoaW5nLXJlc291cmNlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgYXJnczogYW55ID0geWFyZ3NcbiAgICAudXNhZ2UoJyQwIFtwYXRoXScsICdFeGVjdXRlIHRoZSByZXNvdXJjZSBmb3IgYSBjb25zdHJ1Y3QgYXQgYSBnaXZlbiBwYXRoJywgYnVpbGRlciA9PiBidWlsZGVyXG4gICAgICAucG9zaXRpb25hbCgncGF0aCcsIHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUGF0aCB0byBleGVjdXRhYmxlIGNvbnN0cnVjdCByZXNvdXJjZScsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignYXBwJywge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVmYXVsdDogcHJvY2Vzcy5lbnYuQ0RLX0VYRUNfQVBQID8/ICdjZGsub3V0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHlvdXIgYGNkay5vdXRgIGNsb3VkIGFzc2VtYmx5IGRpcmVjdG9yeScsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignYWxsJywge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGFsaWFzOiAnYScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRXhlY3V0ZSBhbGwgbWF0Y2hpbmcgcmVzb3VyY2VzJyxcbiAgICAgIH0pXG4gICAgICAub3B0aW9uKCdleHBvcnQtZW52Jywge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaWJlOiAnRXhwb3J0IGEgLmVudiBmb3IgYWxsIG1hdGNoaW5nIGZ1bmN0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlcycsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignbWV0YWRhdGEnLCB7XG4gICAgICAgIHR5cGU6ICdhcnJheScsXG4gICAgICAgIGFsaWFzOiAnbScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTWF0Y2ggcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIG1ldGFkYXRhIGtleSBvciBrZXk9dmFsdWUnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ3RhZycsIHtcbiAgICAgICAgdHlwZTogJ2FycmF5JyxcbiAgICAgICAgYWxpYXM6ICd0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdNYXRjaCByZXNvdXJjZXMgd2l0aCB0aGUgZ2l2ZW4gdGFnIGtleSBvciBrZXk9dmFsdWUnLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb24oJ291dHB1dCcsIHtcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Nob3cgZXhlY3V0aW9uIG91dHB1dCcsXG4gICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICB9KVxuICAgICAgLm9wdGlvbignaW5wdXQnLCB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0V4ZWN1dGUgd2l0aCBjdXN0b20gSlNPTiBpbnB1dCcsXG4gICAgICB9KSlcbiAgICAuYXJndjtcblxuICAvLyBUT0RPOiBOZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgY29uZmlnLWJhc2VkIHByb2ZpbGVzLlxuICBwcm9jZXNzLmVudi5BV1NfU0RLX0xPQURfQ09ORklHID0gJzEnO1xuXG4gIGlmIChhcmdzLmV4cG9ydEVudikge1xuICAgIHJldHVybiBleHBvcnRFbnYoe1xuICAgICAgY29uc3RydWN0UGF0aDogYXJncy5wYXRoLFxuICAgICAgYXBwOiBhcmdzLmFwcCxcbiAgICAgIG1ldGFkYXRhOiBhcmdzLm1ldGFkYXRhID8gbmV3IE1ldGFkYXRhTWF0Y2goYXJncy5tZXRhZGF0YSkgOiB1bmRlZmluZWQsXG4gICAgICB0YWdzOiBhcmdzLnRhZyA/IG5ldyBUYWdzTWF0Y2goYXJncy50YWcpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNka0V4ZWMoe1xuICAgIGNvbnN0cnVjdFBhdGg6IGFyZ3MucGF0aCxcbiAgICBhcHA6IGFyZ3MuYXBwLFxuICAgIGFsbDogYXJncy5hbGwsXG4gICAgbWV0YWRhdGE6IGFyZ3MubWV0YWRhdGEgPyBuZXcgTWV0YWRhdGFNYXRjaChhcmdzLm1ldGFkYXRhKSA6IHVuZGVmaW5lZCxcbiAgICB0YWdzOiBhcmdzLnRhZyA/IG5ldyBUYWdzTWF0Y2goYXJncy50YWcpIDogdW5kZWZpbmVkLFxuICAgIGlucHV0OiBhcmdzLmlucHV0LFxuICAgIHNob3dPdXRwdXQ6IGFyZ3Mub3V0cHV0LFxuICB9KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZGtFeGVjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBcHAgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYWxsIG1hdGNoZXMgcmF0aGVyIHRoYW4gZXJyb3Jpbmcgb24gYW1iaWd1aXR5XG4gICAqL1xuICByZWFkb25seSBhbGw6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCBvZiB0aGUgY29uc3RydWN0IHRvIGV4ZWN1dGUuXG4gICAqL1xuICByZWFkb25seSBjb25zdHJ1Y3RQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXRjaCByZWNvcmRzIHdpdGggdGhlIGdpdmVuIG1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YT86IE1ldGFkYXRhTWF0Y2g7XG5cbiAgLyoqXG4gICAqIE1hdGNoIHJlY29yZHMgd2l0aCB0aGUgZ2l2ZW4gdGFnc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFncz86IFRhZ3NNYXRjaDtcblxuICAvKipcbiAgICogRXhlY3V0aW9uIGlucHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNob3cgb3V0cHV0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd091dHB1dDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNka0V4ZWMob3B0aW9uczogQ2RrRXhlY09wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gbmV3IGN4YXBpLkNsb3VkQXNzZW1ibHkob3B0aW9ucy5hcHApO1xuXG4gICAgY29uc3QgZXhlY3V0b3JzID0gYXdhaXQgRXhlY3V0b3IuZmluZCh7XG4gICAgICBhc3NlbWJseSxcbiAgICAgIGNvbnN0cnVjdFBhdGg6IG9wdGlvbnMuY29uc3RydWN0UGF0aCxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgICAgdGFnczogb3B0aW9ucy50YWdzLFxuICAgICAgc2RrOiBuZXcgQXdzU2RrKCksXG4gICAgfSk7XG5cbiAgICBpZiAoZXhlY3V0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coJ+KdjCAgTm8gbWF0Y2hpbmcgZXhlY3V0YWJsZSBjb25zdHJ1Y3RzIGZvdW5kJyk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuYWxsICYmIGV4ZWN1dG9ycy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zb2xlLmxvZygnXFxu4p2MICBNYXRjaGVkIG11bHRpcGxlIHJlc291cmNlczogJXMnLCBleGVjdXRvcnMubWFwKGUgPT4gZS5jb25zdHJ1Y3RQYXRoKS5qb2luKCcsICcpKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dG9yUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgZXhlY3V0b3JzLm1hcChhc3luYyAoZXhlY3V0b3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ+KaoSAgRXhlY3V0aW5nICVzICglcyknLCBleGVjdXRvci5jb25zdHJ1Y3RQYXRoLCBleGVjdXRvci5waHlzaWNhbFJlc291cmNlSWQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5leGVjdXRlKG9wdGlvbnMuaW5wdXQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGV4ZWN1dG9yLFxuICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsZXQgZXJyb3IgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBleGVjdXRvclJlc3VsdHMpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdcXG5cXG7inKggIEZpbmFsIHN0YXR1cyBvZiAlcycsIHJlc3VsdC5leGVjdXRvci5jb25zdHJ1Y3RQYXRoKTtcbiAgICAgIGlmIChvcHRpb25zLnNob3dPdXRwdXQgJiYgcmVzdWx0Lm91dHB1dCkge1xuICAgICAgICBjb25zb2xlLmxvZygnXFxuT3V0cHV0OlxcbiVzJywgY2hhbGsuY3lhbihKU09OLnN0cmluZ2lmeShyZXN1bHQub3V0cHV0LCBudWxsLCAyKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgIGVycm9yID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coJ1xcbuKdjCAgRXhlY3V0aW9uIGZhaWxlZCB3aXRoIGFuIGVycm9yIG1lc3NhZ2U6XFxuXFxuJXMnLCBjaGFsay5yZWQocmVzdWx0LmVycm9yKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnXFxu4pyFICBFeGVjdXRpb24gc3VjY2VlZGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yID8gMSA6IDA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZiAoZS5zdGFjayAmJiAvbmV3IENsb3VkQXNzZW1ibHkvLnRlc3QoZS5zdGFjaykpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1xcbuKdjCAgQVdTIENESyBsaWIgZXJyb3I6ICVzJywgZS5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEVudiB7XG4gIC8qKlxuICAgKiBBcHAgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggb2YgdGhlIGNvbnN0cnVjdCB0byBleGVjdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0UGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogTWF0Y2ggcmVjb3JkcyB3aXRoIHRoZSBnaXZlbiBtZXRhZGF0YVxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE/OiBNZXRhZGF0YU1hdGNoO1xuXG4gIC8qKlxuICAgKiBNYXRjaCByZWNvcmRzIHdpdGggdGhlIGdpdmVuIHRhZ3NcbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdzTWF0Y2g7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnRFbnYob3B0aW9uczogRXhwb3J0RW52KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgYXNzZW1ibHkgPSBuZXcgY3hhcGkuQ2xvdWRBc3NlbWJseShvcHRpb25zLmFwcCk7XG5cbiAgY29uc3QgZXhlY3V0b3JzID0gYXdhaXQgRXhlY3V0b3IuZmluZCh7XG4gICAgYXNzZW1ibHksXG4gICAgY29uc3RydWN0UGF0aDogb3B0aW9ucy5jb25zdHJ1Y3RQYXRoLFxuICAgIG1ldGFkYXRhOiBvcHRpb25zLm1ldGFkYXRhLFxuICAgIHRhZ3M6IG9wdGlvbnMudGFncyxcbiAgICBzZGs6IG5ldyBBd3NTZGsoKSxcbiAgfSk7XG5cbiAgaWYgKGV4ZWN1dG9ycy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKCfinYwgIE5vIG1hdGNoaW5nIGV4ZWN1dGFibGUgY29uc3RydWN0cyBmb3VuZCcpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgaWYgKGV4ZWN1dG9ycy5sZW5ndGggPiAxKSB7XG4gICAgY29uc29sZS5lcnJvcignXFxu4p2MICBNYXRjaGVkIG11bHRpcGxlIHJlc291cmNlczogJXMnLCBleGVjdXRvcnMubWFwKGUgPT4gZS5jb25zdHJ1Y3RQYXRoKS5qb2luKCcsICcpKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZXhlY3V0b3Igb2YgZXhlY3V0b3JzKSB7XG4gICAgY29uc3QgZW52ID0gYXdhaXQgZXhlY3V0b3IuZW52KCk7XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhlbnYpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtrfT0ke3Z9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbm1haW4oKVxuICAudGhlbihleGl0Q29kZSA9PiB7XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfSlcbiAgLmNhdGNoKGUgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcbiJdfQ==