@axway/axway-cli-pm
Version:
Package manager for Axway products
237 lines (193 loc) • 24.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _snooplogg = _interopRequireDefault(require("snooplogg"));
var _utils = require("../utils.js");
var _amplifyCliUtils = require("@axway/amplify-cli-utils");
var _pm = require("../pm.js");
var _ora = _interopRequireDefault(require("ora"));
var _promiseLimit = _interopRequireDefault(require("promise-limit"));
var _semver = _interopRequireDefault(require("semver"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var _default = {
aliases: ['up'],
args: [{
name: 'package',
desc: 'The package name to update',
redact: false
}],
desc: 'Download updates for installed packages',
options: {
'--json': {
callback: ({
ctx,
value
}) => ctx.jsonMode = value,
desc: 'Outputs updated packages as JSON'
},
'-y, --yes': {
aliases: ['--no-prompt'],
desc: 'Automatic yes to prompts and run non-interactively'
}
},
skipExtensionUpdateCheck: true,
async action({
argv,
cli,
console,
exitCode,
terminal
}) {
const {
alert,
bold,
highlight
} = _snooplogg.default.styles;
const results = {
alreadyActive: [],
selected: [],
installed: [],
failures: []
};
let packages = []; // get installed packages
if (argv.package) {
const pkg = await (0, _pm.find)(argv.package);
if (!pkg) {
throw new Error(`Package "${argv.package}" is not installed`);
}
packages.push(pkg);
} else {
packages = await (0, _pm.list)();
}
if (!packages.length) {
if (argv.json) {
console.log(JSON.stringify(results, null, 2));
} else {
console.log('There are no packages to update.');
}
return;
} // step 1: check for updates
const plimit = (0, _promiseLimit.default)(10);
const spinner = (0, _ora.default)({
stream: terminal.stderr
}).start('Checking packages for updates');
await Promise.all(packages.map(pkg => {
return plimit(async () => {
pkg.current = Object.keys(pkg.versions).sort(_semver.default.rcompare)[0];
pkg.latest = (await (0, _pm.view)(pkg.name)).version;
});
}));
spinner.stop();
const updateTable = (0, _amplifyCliUtils.createTable)();
for (let i = 0; i < packages.length; i++) {
const pkg = packages[i];
if (_semver.default.gt(pkg.latest, pkg.version)) {
updateTable.push([` ${bold(pkg.name)}`, pkg.version, '→', (0, _amplifyCliUtils.hlVer)(pkg.latest, pkg.version)]);
} else {
results.alreadyActive.push(`${pkg.name}@${pkg.version}`);
packages.splice(i--, 1);
}
}
if (!packages.length) {
console.log('All packages are up-to-date');
return;
} // step 2: confirm updates
console.log(`The following packages have updates available:\n\n${updateTable.toString()}\n`);
if (terminal.stdout.isTTY && !argv.yes && !argv.json) {
await new Promise(resolve => {
terminal.once('keypress', str => {
terminal.stderr.cursorTo(0);
terminal.stderr.clearLine();
if (str === 'y' || str === 'Y') {
return resolve();
}
process.exit(0);
});
terminal.stderr.write('Do you want to update? (y/N) ');
});
} // step 3: create the tasks
const tasks = packages.map(pkg => {
const versionData = pkg.versions[pkg.latest];
if (versionData) {
// select it
return {
title: `${highlight(`${pkg.name}@${pkg.latest}`)} is installed, setting it as active`,
async task(ctx, task) {
results.selected.push(`${pkg.name}@${pkg.latest}`);
const config = await (0, _amplifyCliUtils.loadConfig)();
await config.set(`extensions.${pkg.name}`, versionData.path);
await config.save();
task.title = `${highlight(`${pkg.name}@${pkg.latest}`)} set as active version`;
}
};
}
return {
title: `Downloading and installing ${highlight(`${pkg.name}@${pkg.latest}`)}`,
async task(ctx, task) {
try {
await new Promise((resolve, reject) => {
(0, _pm.install)(`${pkg.name}@${pkg.latest}`).on('download', ({
name,
version
}) => {
task.title = `Downloading ${highlight(`${name}@${version}`)}`;
}).on('install', ({
name,
version
}) => {
task.title = `Installing ${highlight(`${name}@${version}`)}`;
}).on('register', ({
name,
version
}) => {
task.title = `Registering ${highlight(`${name}@${version}`)}`;
}).on('end', info => {
task.title = `${highlight(`${info.name}@${info.version}`)} installed and set as active version`;
results.installed.push(info);
resolve();
}).on('error', reject);
});
} catch (err) {
results.failures.push({
error: err.toString(),
package: pkg
});
task.title = alert(err.toString());
err.message = undefined; // prevent the error from rendering twice
exitCode(1);
throw err;
}
}
};
}); // step 4: run the tasks
try {
await (0, _utils.runListr)({
console,
json: argv.json,
tasks
});
} catch (err) {// errors are stored in the results
}
const cfg = await (0, _amplifyCliUtils.loadConfig)();
await cfg.delete('update.notified');
await cfg.save();
if (argv.json) {
console.log(JSON.stringify(results, null, 2));
} else {
// step 5: show packages that can be purged
const purgable = await (0, _pm.listPurgable)(argv.package);
if (Object.keys(purgable).length) {
const purgeTable = (0, _amplifyCliUtils.createTable)();
for (const [name, versions] of Object.entries(purgable)) {
purgeTable.push([` ${bold(name)}`, versions.map(v => v.version).sort(_semver.default.rcompare).join(', ')]);
}
console.log(`\nThe following package versions can be purged:\n\n${purgeTable.toString()}\n\nTo purge these unused packages, run: ${highlight('axway pm purge')}`);
}
}
await cli.emitAction('axway:pm:update', results);
}
};
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZHMvdXBkYXRlLmpzIiwibmFtZXMiOlsiYWxpYXNlcyIsImFyZ3MiLCJuYW1lIiwiZGVzYyIsInJlZGFjdCIsIm9wdGlvbnMiLCJjYWxsYmFjayIsImN0eCIsInZhbHVlIiwianNvbk1vZGUiLCJza2lwRXh0ZW5zaW9uVXBkYXRlQ2hlY2siLCJhY3Rpb24iLCJhcmd2IiwiY2xpIiwiY29uc29sZSIsImV4aXRDb2RlIiwidGVybWluYWwiLCJhbGVydCIsImJvbGQiLCJoaWdobGlnaHQiLCJzbm9vcGxvZ2ciLCJzdHlsZXMiLCJyZXN1bHRzIiwiYWxyZWFkeUFjdGl2ZSIsInNlbGVjdGVkIiwiaW5zdGFsbGVkIiwiZmFpbHVyZXMiLCJwYWNrYWdlcyIsInBhY2thZ2UiLCJwa2ciLCJFcnJvciIsInB1c2giLCJsZW5ndGgiLCJqc29uIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsInBsaW1pdCIsInNwaW5uZXIiLCJzdHJlYW0iLCJzdGRlcnIiLCJzdGFydCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJjdXJyZW50IiwiT2JqZWN0Iiwia2V5cyIsInZlcnNpb25zIiwic29ydCIsInNlbXZlciIsInJjb21wYXJlIiwibGF0ZXN0IiwidmVyc2lvbiIsInN0b3AiLCJ1cGRhdGVUYWJsZSIsImkiLCJndCIsInNwbGljZSIsInRvU3RyaW5nIiwic3Rkb3V0IiwiaXNUVFkiLCJ5ZXMiLCJyZXNvbHZlIiwib25jZSIsInN0ciIsImN1cnNvclRvIiwiY2xlYXJMaW5lIiwicHJvY2VzcyIsImV4aXQiLCJ3cml0ZSIsInRhc2tzIiwidmVyc2lvbkRhdGEiLCJ0aXRsZSIsInRhc2siLCJjb25maWciLCJzZXQiLCJwYXRoIiwic2F2ZSIsInJlamVjdCIsIm9uIiwiaW5mbyIsImVyciIsImVycm9yIiwibWVzc2FnZSIsInVuZGVmaW5lZCIsImNmZyIsImRlbGV0ZSIsInB1cmdhYmxlIiwicHVyZ2VUYWJsZSIsImVudHJpZXMiLCJ2Iiwiam9pbiIsImVtaXRBY3Rpb24iXSwic291cmNlcyI6WyJjb21tYW5kcy91cGRhdGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNub29wbG9nZyBmcm9tICdzbm9vcGxvZ2cnO1xuaW1wb3J0IHsgcnVuTGlzdHIgfSBmcm9tICcuLi91dGlscy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUYWJsZSwgaGxWZXIsIGxvYWRDb25maWcgfSBmcm9tICdAYXh3YXkvYW1wbGlmeS1jbGktdXRpbHMnO1xuaW1wb3J0IHsgZmluZCwgaW5zdGFsbCwgbGlzdCwgbGlzdFB1cmdhYmxlLCB2aWV3IH0gZnJvbSAnLi4vcG0uanMnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHByb21pc2VMaW1pdCBmcm9tICdwcm9taXNlLWxpbWl0JztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuZXhwb3J0IGRlZmF1bHQge1xuXHRhbGlhc2VzOiBbICd1cCcgXSxcblx0YXJnczogW1xuXHRcdHtcblx0XHRcdG5hbWU6ICdwYWNrYWdlJyxcblx0XHRcdGRlc2M6ICdUaGUgcGFja2FnZSBuYW1lIHRvIHVwZGF0ZScsXG5cdFx0XHRyZWRhY3Q6IGZhbHNlXG5cdFx0fVxuXHRdLFxuXHRkZXNjOiAnRG93bmxvYWQgdXBkYXRlcyBmb3IgaW5zdGFsbGVkIHBhY2thZ2VzJyxcblx0b3B0aW9uczoge1xuXHRcdCctLWpzb24nOiB7XG5cdFx0XHRjYWxsYmFjazogKHsgY3R4LCB2YWx1ZSB9KSA9PiBjdHguanNvbk1vZGUgPSB2YWx1ZSxcblx0XHRcdGRlc2M6ICdPdXRwdXRzIHVwZGF0ZWQgcGFja2FnZXMgYXMgSlNPTidcblx0XHR9LFxuXHRcdCcteSwgLS15ZXMnOiB7XG5cdFx0XHRhbGlhc2VzOiBbICctLW5vLXByb21wdCcgXSxcblx0XHRcdGRlc2M6ICdBdXRvbWF0aWMgeWVzIHRvIHByb21wdHMgYW5kIHJ1biBub24taW50ZXJhY3RpdmVseSdcblx0XHR9XG5cdH0sXG5cdHNraXBFeHRlbnNpb25VcGRhdGVDaGVjazogdHJ1ZSxcblx0YXN5bmMgYWN0aW9uKHsgYXJndiwgY2xpLCBjb25zb2xlLCBleGl0Q29kZSwgdGVybWluYWwgfSkge1xuXHRcdGNvbnN0IHsgYWxlcnQsIGJvbGQsIGhpZ2hsaWdodCB9ID0gc25vb3Bsb2dnLnN0eWxlcztcblx0XHRjb25zdCByZXN1bHRzID0ge1xuXHRcdFx0YWxyZWFkeUFjdGl2ZTogW10sXG5cdFx0XHRzZWxlY3RlZDogW10sXG5cdFx0XHRpbnN0YWxsZWQ6IFtdLFxuXHRcdFx0ZmFpbHVyZXM6IFtdXG5cdFx0fTtcblx0XHRsZXQgcGFja2FnZXMgPSBbXTtcblxuXHRcdC8vIGdldCBpbnN0YWxsZWQgcGFja2FnZXNcblx0XHRpZiAoYXJndi5wYWNrYWdlKSB7XG5cdFx0XHRjb25zdCBwa2cgPSBhd2FpdCBmaW5kKGFyZ3YucGFja2FnZSk7XG5cdFx0XHRpZiAoIXBrZykge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFBhY2thZ2UgXCIke2FyZ3YucGFja2FnZX1cIiBpcyBub3QgaW5zdGFsbGVkYCk7XG5cdFx0XHR9XG5cdFx0XHRwYWNrYWdlcy5wdXNoKHBrZyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBhY2thZ2VzID0gYXdhaXQgbGlzdCgpO1xuXHRcdH1cblxuXHRcdGlmICghcGFja2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRpZiAoYXJndi5qc29uKSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCdUaGVyZSBhcmUgbm8gcGFja2FnZXMgdG8gdXBkYXRlLicpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHN0ZXAgMTogY2hlY2sgZm9yIHVwZGF0ZXNcblx0XHRjb25zdCBwbGltaXQgPSBwcm9taXNlTGltaXQoMTApO1xuXHRcdGNvbnN0IHNwaW5uZXIgPSBvcmEoeyBzdHJlYW06IHRlcm1pbmFsLnN0ZGVyciB9KS5zdGFydCgnQ2hlY2tpbmcgcGFja2FnZXMgZm9yIHVwZGF0ZXMnKTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChwYWNrYWdlcy5tYXAocGtnID0+IHtcblx0XHRcdHJldHVybiBwbGltaXQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRwa2cuY3VycmVudCA9IE9iamVjdC5rZXlzKHBrZy52ZXJzaW9ucykuc29ydChzZW12ZXIucmNvbXBhcmUpWzBdO1xuXHRcdFx0XHRwa2cubGF0ZXN0ID0gKGF3YWl0IHZpZXcocGtnLm5hbWUpKS52ZXJzaW9uO1xuXHRcdFx0fSk7XG5cdFx0fSkpO1xuXHRcdHNwaW5uZXIuc3RvcCgpO1xuXG5cdFx0Y29uc3QgdXBkYXRlVGFibGUgPSBjcmVhdGVUYWJsZSgpO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcGFja2FnZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IHBrZyA9IHBhY2thZ2VzW2ldO1xuXHRcdFx0aWYgKHNlbXZlci5ndChwa2cubGF0ZXN0LCBwa2cudmVyc2lvbikpIHtcblx0XHRcdFx0dXBkYXRlVGFibGUucHVzaChbIGAgICR7Ym9sZChwa2cubmFtZSl9YCwgcGtnLnZlcnNpb24sICfihpInLCBobFZlcihwa2cubGF0ZXN0LCBwa2cudmVyc2lvbikgXSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHRzLmFscmVhZHlBY3RpdmUucHVzaChgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gKTtcblx0XHRcdFx0cGFja2FnZXMuc3BsaWNlKGktLSwgMSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghcGFja2FnZXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zb2xlLmxvZygnQWxsIHBhY2thZ2VzIGFyZSB1cC10by1kYXRlJyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gc3RlcCAyOiBjb25maXJtIHVwZGF0ZXNcblx0XHRjb25zb2xlLmxvZyhgVGhlIGZvbGxvd2luZyBwYWNrYWdlcyBoYXZlIHVwZGF0ZXMgYXZhaWxhYmxlOlxcblxcbiR7dXBkYXRlVGFibGUudG9TdHJpbmcoKX1cXG5gKTtcblxuXHRcdGlmICh0ZXJtaW5hbC5zdGRvdXQuaXNUVFkgJiYgIWFyZ3YueWVzICYmICFhcmd2Lmpzb24pIHtcblx0XHRcdGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0XHR0ZXJtaW5hbC5vbmNlKCdrZXlwcmVzcycsIHN0ciA9PiB7XG5cdFx0XHRcdFx0dGVybWluYWwuc3RkZXJyLmN1cnNvclRvKDApO1xuXHRcdFx0XHRcdHRlcm1pbmFsLnN0ZGVyci5jbGVhckxpbmUoKTtcblx0XHRcdFx0XHRpZiAoc3RyID09PSAneScgfHwgc3RyID09PSAnWScpIHtcblx0XHRcdFx0XHRcdHJldHVybiByZXNvbHZlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHByb2Nlc3MuZXhpdCgwKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRlcm1pbmFsLnN0ZGVyci53cml0ZSgnRG8geW91IHdhbnQgdG8gdXBkYXRlPyAoeS9OKSAnKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIHN0ZXAgMzogY3JlYXRlIHRoZSB0YXNrc1xuXHRcdGNvbnN0IHRhc2tzID0gcGFja2FnZXMubWFwKHBrZyA9PiB7XG5cdFx0XHRjb25zdCB2ZXJzaW9uRGF0YSA9IHBrZy52ZXJzaW9uc1twa2cubGF0ZXN0XTtcblx0XHRcdGlmICh2ZXJzaW9uRGF0YSkge1xuXHRcdFx0XHQvLyBzZWxlY3QgaXRcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHR0aXRsZTogYCR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9IGlzIGluc3RhbGxlZCwgc2V0dGluZyBpdCBhcyBhY3RpdmVgLFxuXHRcdFx0XHRcdGFzeW5jIHRhc2soY3R4LCB0YXNrKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLnNlbGVjdGVkLnB1c2goYCR7cGtnLm5hbWV9QCR7cGtnLmxhdGVzdH1gKTtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcoKTtcblx0XHRcdFx0XHRcdGF3YWl0IGNvbmZpZy5zZXQoYGV4dGVuc2lvbnMuJHtwa2cubmFtZX1gLCB2ZXJzaW9uRGF0YS5wYXRoKTtcblx0XHRcdFx0XHRcdGF3YWl0IGNvbmZpZy5zYXZlKCk7XG5cdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYCR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9IHNldCBhcyBhY3RpdmUgdmVyc2lvbmA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0aXRsZTogYERvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nICR7aGlnaGxpZ2h0KGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YCl9YCxcblx0XHRcdFx0YXN5bmMgdGFzayhjdHgsIHRhc2spIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRpbnN0YWxsKGAke3BrZy5uYW1lfUAke3BrZy5sYXRlc3R9YClcblx0XHRcdFx0XHRcdFx0XHQub24oJ2Rvd25sb2FkJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYERvd25sb2FkaW5nICR7aGlnaGxpZ2h0KGAke25hbWV9QCR7dmVyc2lvbn1gKX1gO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Lm9uKCdpbnN0YWxsJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYEluc3RhbGxpbmcgJHtoaWdobGlnaHQoYCR7bmFtZX1AJHt2ZXJzaW9ufWApfWA7XG5cdFx0XHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdFx0XHQub24oJ3JlZ2lzdGVyJywgKHsgbmFtZSwgdmVyc2lvbiB9KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYFJlZ2lzdGVyaW5nICR7aGlnaGxpZ2h0KGAke25hbWV9QCR7dmVyc2lvbn1gKX1gO1xuXHRcdFx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHRcdFx0Lm9uKCdlbmQnLCBpbmZvID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhc2sudGl0bGUgPSBgJHtoaWdobGlnaHQoYCR7aW5mby5uYW1lfUAke2luZm8udmVyc2lvbn1gKX0gaW5zdGFsbGVkIGFuZCBzZXQgYXMgYWN0aXZlIHZlcnNpb25gO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5pbnN0YWxsZWQucHVzaChpbmZvKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHRcdC5vbignZXJyb3InLCByZWplY3QpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLmZhaWx1cmVzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRlcnJvcjogZXJyLnRvU3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdHBhY2thZ2U6IHBrZ1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR0YXNrLnRpdGxlID0gYWxlcnQoZXJyLnRvU3RyaW5nKCkpO1xuXHRcdFx0XHRcdFx0ZXJyLm1lc3NhZ2UgPSB1bmRlZmluZWQ7IC8vIHByZXZlbnQgdGhlIGVycm9yIGZyb20gcmVuZGVyaW5nIHR3aWNlXG5cdFx0XHRcdFx0XHRleGl0Q29kZSgxKTtcblx0XHRcdFx0XHRcdHRocm93IGVycjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHQvLyBzdGVwIDQ6IHJ1biB0aGUgdGFza3Ncblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgcnVuTGlzdHIoeyBjb25zb2xlLCBqc29uOiBhcmd2Lmpzb24sIHRhc2tzIH0pO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Ly8gZXJyb3JzIGFyZSBzdG9yZWQgaW4gdGhlIHJlc3VsdHNcblx0XHR9XG5cblx0XHRjb25zdCBjZmcgPSBhd2FpdCBsb2FkQ29uZmlnKCk7XG5cdFx0YXdhaXQgY2ZnLmRlbGV0ZSgndXBkYXRlLm5vdGlmaWVkJyk7XG5cdFx0YXdhaXQgY2ZnLnNhdmUoKTtcblxuXHRcdGlmIChhcmd2Lmpzb24pIHtcblx0XHRcdGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdHMsIG51bGwsIDIpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gc3RlcCA1OiBzaG93IHBhY2thZ2VzIHRoYXQgY2FuIGJlIHB1cmdlZFxuXHRcdFx0Y29uc3QgcHVyZ2FibGUgPSBhd2FpdCBsaXN0UHVyZ2FibGUoYXJndi5wYWNrYWdlKTtcblx0XHRcdGlmIChPYmplY3Qua2V5cyhwdXJnYWJsZSkubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IHB1cmdlVGFibGUgPSBjcmVhdGVUYWJsZSgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IFsgbmFtZSwgdmVyc2lvbnMgXSBvZiBPYmplY3QuZW50cmllcyhwdXJnYWJsZSkpIHtcblx0XHRcdFx0XHRwdXJnZVRhYmxlLnB1c2goWyBgICAke2JvbGQobmFtZSl9YCwgdmVyc2lvbnMubWFwKHYgPT4gdi52ZXJzaW9uKS5zb3J0KHNlbXZlci5yY29tcGFyZSkuam9pbignLCAnKSBdKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb25zb2xlLmxvZyhgXFxuVGhlIGZvbGxvd2luZyBwYWNrYWdlIHZlcnNpb25zIGNhbiBiZSBwdXJnZWQ6XFxuXFxuJHtwdXJnZVRhYmxlLnRvU3RyaW5nKCl9XFxuXFxuVG8gcHVyZ2UgdGhlc2UgdW51c2VkIHBhY2thZ2VzLCBydW46ICR7aGlnaGxpZ2h0KCdheHdheSBwbSBwdXJnZScpfWApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGF3YWl0IGNsaS5lbWl0QWN0aW9uKCdheHdheTpwbTp1cGRhdGUnLCByZXN1bHRzKTtcblx0fVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7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