cdk-pretty-diff
Version:
Formatting tool for CDK Diff output. Inspired by Terraform prettyplan (https://github.com/chrislewisdev/prettyplan)
166 lines • 23.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformDiff = void 0;
const cfnDiff = require("@aws-cdk/cloudformation-diff");
const through2 = require("through2");
const util_1 = require("./util");
const types_1 = require("./types");
const cdk_reverse_engineered_1 = require("./cdk-reverse-engineered");
// unable to emulate the --no-colors option, (tried passing no-colors option to cdk Configuration class to no avail)
// this is workaround to remove the colors tty elements
const fixRemoveColors = (input) => JSON.parse(JSON.stringify(input).replace(/\\u001b\[[^m]+m/g, ''));
const buildRaw = async (diff) => {
const strm = through2();
cfnDiff.formatDifferences(strm, diff.rawDiff, diff.logicalToPathMap);
strm.end();
return fixRemoveColors(await (0, util_1.streamToString)(strm));
};
const buildChangeAction = (oldValue, newValue) => {
if (oldValue !== undefined && newValue !== undefined) {
return "UPDATE";
}
else if (oldValue !== undefined) {
return "REMOVAL";
}
else {
return "ADDITION";
}
};
const transformIamChanges = async (diff) => {
if (!diff.rawDiff.iamChanges.hasChanges) {
return [];
}
const result = [];
if (diff.rawDiff.iamChanges.statements.hasChanges) {
const statementsSummarized = diff.rawDiff.iamChanges.summarizeStatements();
result.push({
label: "IAM Statement Changes",
cdkDiffRaw: fixRemoveColors(cfnDiff.formatTable((0, cdk_reverse_engineered_1.deepSubstituteBracedLogicalIds)(diff.logicalToPathMap)(statementsSummarized), undefined)),
});
}
if (diff.rawDiff.iamChanges.managedPolicies.hasChanges) {
const managedPoliciesSummarized = diff.rawDiff.iamChanges.summarizeManagedPolicies();
result.push({
label: "IAM Policy Changes",
cdkDiffRaw: fixRemoveColors(cfnDiff.formatTable((0, cdk_reverse_engineered_1.deepSubstituteBracedLogicalIds)(diff.logicalToPathMap)(managedPoliciesSummarized), undefined)),
});
}
return result;
};
const transformSecurityGroupChanges = async (diff) => {
if (!diff.rawDiff.securityGroupChanges.hasChanges) {
return [];
}
const summarized = diff.rawDiff.securityGroupChanges.summarize();
return [
{
label: "Security Group Changes",
cdkDiffRaw: fixRemoveColors(cfnDiff.formatTable((0, cdk_reverse_engineered_1.deepSubstituteBracedLogicalIds)(diff.logicalToPathMap)(summarized), undefined)),
},
];
};
const processIndividualDiff = (result, cdkDiffCategory) => (id, rdiff) => {
var _a, _b, _c, _d;
if (rdiff.isDifferent) {
const resourceType = (0, types_1.guardResourceDiff)(rdiff)
? (rdiff.isRemoval ? (_a = rdiff.oldValue) === null || _a === void 0 ? void 0 : _a.Type : (_b = rdiff.newValue) === null || _b === void 0 ? void 0 : _b.Type) ||
cdkDiffCategory
: (((_c = rdiff.oldValue) === null || _c === void 0 ? void 0 : _c.Type) || ((_d = rdiff.newValue) === null || _d === void 0 ? void 0 : _d.Type) || cdkDiffCategory);
const changes = [];
if ((0, types_1.guardResourceDiff)(rdiff) && rdiff.isUpdate) {
rdiff.forEachDifference((_, label, values) => {
changes.push({
label,
action: buildChangeAction(values.oldValue, values.newValue),
from: values.oldValue,
to: values.newValue,
});
});
}
result.push({
label: cdkDiffCategory,
cdkDiffRaw: JSON.stringify({ id, diff: rdiff }, null, 2),
nicerDiff: {
resourceType,
changes,
cdkDiffCategory,
resourceAction: rdiff.isAddition
? "ADDITION"
: rdiff.isRemoval
? "REMOVAL"
: "UPDATE",
resourceLabel: id,
},
});
}
};
const transformDiffForResourceTypes = async (diff) => {
const result = [];
for (const d of Object.entries(diff.rawDiff).filter(([k]) => !["iamChanges", "securityGroupChanges"].includes(k))) {
const validatedDiff = (0, types_1.diffValidator)(d);
if ('diffCollection' in validatedDiff) {
const { diffCollectionKey, diffCollection } = validatedDiff;
if (diffCollection.differenceCount > 0) {
diffCollection.forEachDifference(processIndividualDiff(result, diffCollectionKey));
}
}
else if ('diffKey' in validatedDiff) {
const { diffKey, diff } = validatedDiff;
if (diff.isDifferent) {
result.push({
label: diffKey,
cdkDiffRaw: JSON.stringify({ id: diffKey, diff }, null, 2),
});
}
}
}
return result;
};
const transformDescriptionChanges = (diff) => {
var _a, _b, _c, _d, _e, _f, _g;
if ((_a = diff.rawDiff.description) === null || _a === void 0 ? void 0 : _a.isDifferent) {
return {
label: 'Description',
cdkDiffRaw: JSON.stringify({ description: diff.rawDiff.description }, null, 2),
nicerDiff: {
resourceType: 'Description',
changes: [{
label: 'Description',
action: buildChangeAction((_b = diff.rawDiff.description) === null || _b === void 0 ? void 0 : _b.oldValue, (_c = diff.rawDiff.description) === null || _c === void 0 ? void 0 : _c.newValue),
from: (_d = diff.rawDiff.description) === null || _d === void 0 ? void 0 : _d.oldValue,
to: (_e = diff.rawDiff.description) === null || _e === void 0 ? void 0 : _e.newValue
}],
cdkDiffCategory: 'description',
resourceAction: ((_f = diff.rawDiff.description) === null || _f === void 0 ? void 0 : _f.isAddition)
? "ADDITION"
: ((_g = diff.rawDiff.description) === null || _g === void 0 ? void 0 : _g.isRemoval)
? "REMOVAL"
: "UPDATE",
resourceLabel: 'Description',
},
};
}
return null;
};
const transformDiff = async (diff) => {
if (diff.rawDiff.isEmpty) {
return {
stackName: diff.stackName,
raw: "There were no differences",
diff: [],
};
}
const descriptionDiff = transformDescriptionChanges(diff);
return {
stackName: diff.stackName,
raw: await buildRaw(diff),
diff: [
...(await transformIamChanges(diff)),
...(await transformSecurityGroupChanges(diff)),
...(await transformDiffForResourceTypes(diff)),
...(descriptionDiff ? [descriptionDiff] : []),
],
};
};
exports.transformDiff = transformDiff;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx3REFBd0Q7QUFDeEQscUNBQXFDO0FBRXJDLGlDQUF3QztBQUN4QyxtQ0FRaUI7QUFDakIscUVBQTBFO0FBRTFFLG9IQUFvSDtBQUNwSCx1REFBdUQ7QUFDdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtBQUVwSCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsSUFBa0IsRUFBbUIsRUFBRTtJQUM3RCxNQUFNLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQztJQUN4QixPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDckUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1gsT0FBTyxlQUFlLENBQUMsTUFBTSxJQUFBLHFCQUFjLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUFHLENBQUMsUUFBYSxFQUFFLFFBQWEsRUFBRSxFQUFFO0lBQ3pELElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ3BELE9BQU8sUUFBUSxDQUFDO0tBQ2pCO1NBQU0sSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ2pDLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQztLQUNuQjtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxFQUMvQixJQUFrQixFQUNJLEVB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LElBQUksQ0FBQyxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxNQUFNLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM5QztLQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUF0QlcsUUFBQSxhQUFhLGlCQXNCeEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZm5EaWZmIGZyb20gXCJAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmXCI7XG5pbXBvcnQgKiBhcyB0aHJvdWdoMiBmcm9tIFwidGhyb3VnaDJcIjtcblxuaW1wb3J0IHsgc3RyZWFtVG9TdHJpbmcgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQge1xuICBDZGtEaWZmQ2F0ZWdvcnksXG4gIGRpZmZWYWxpZGF0b3IsXG4gIGd1YXJkUmVzb3VyY2VEaWZmLFxuICBOaWNlckRpZmYsXG4gIE5pY2VyRGlmZkNoYW5nZSxcbiAgTmljZXJTdGFja0RpZmYsXG4gIFN0YWNrUmF3RGlmZixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyB9IGZyb20gXCIuL2Nkay1yZXZlcnNlLWVuZ2luZWVyZWRcIjtcblxuLy8gdW5hYmxlIHRvIGVtdWxhdGUgdGhlIC0tbm8tY29sb3JzIG9wdGlvbiwgKHRyaWVkIHBhc3Npbmcgbm8tY29sb3JzIG9wdGlvbiB0byBjZGsgQ29uZmlndXJhdGlvbiBjbGFzcyB0byBubyBhdmFpbClcbi8vIHRoaXMgaXMgd29ya2Fyb3VuZCB0byByZW1vdmUgdGhlIGNvbG9ycyB0dHkgZWxlbWVudHNcbmNvbnN0IGZpeFJlbW92ZUNvbG9ycyA9IChpbnB1dDogc3RyaW5nKTogc3RyaW5nID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQpLnJlcGxhY2UoL1xcXFx1MDAxYlxcW1tebV0rbS9nLCAnJykpXG5cbmNvbnN0IGJ1aWxkUmF3ID0gYXN5bmMgKGRpZmY6IFN0YWNrUmF3RGlmZik6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHN0cm0gPSB0aHJvdWdoMigpO1xuICBjZm5EaWZmLmZvcm1hdERpZmZlcmVuY2VzKHN0cm0sIGRpZmYucmF3RGlmZiwgZGlmZi5sb2dpY2FsVG9QYXRoTWFwKTtcbiAgc3RybS5lbmQoKTtcbiAgcmV0dXJuIGZpeFJlbW92ZUNvbG9ycyhhd2FpdCBzdHJlYW1Ub1N0cmluZyhzdHJtKSk7XG59O1xuXG5jb25zdCBidWlsZENoYW5nZUFjdGlvbiA9IChvbGRWYWx1ZTogYW55LCBuZXdWYWx1ZTogYW55KSA9PiB7XG4gIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gXCJVUERBVEVcIjtcbiAgfSBlbHNlIGlmIChvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFwiUkVNT1ZBTFwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIkFERElUSU9OXCI7XG4gIH1cbn07XG5cbmNvbnN0IHRyYW5zZm9ybUlhbUNoYW5nZXMgPSBhc3luYyAoXG4gIGRpZmY6IFN0YWNrUmF3RGlmZlxuKTogUHJvbWlzZTxOaWNlckRpZmZbXT4gPT4ge1xuICBpZiAoIWRpZmYucmF3RGlmZi5pYW1DaGFuZ2VzLmhhc0NoYW5nZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IE5pY2VyRGlmZltdID0gW107XG4gIGlmIChkaWZmLnJhd0RpZmYuaWFtQ2hhbmdlcy5zdGF0ZW1lbnRzLmhhc0NoYW5nZXMpIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzU3VtbWFyaXplZCA9IGRpZmYucmF3RGlmZi5pYW1DaGFuZ2VzLnN1bW1hcml6ZVN0YXRlbWVudHMoKTtcbiAgICByZXN1bHQucHVzaCh7XG4gICAgICBsYWJlbDogXCJJQU0gU3RhdGVtZW50IENoYW5nZXNcIixcbiAgICAgIGNka0RpZmZSYXc6IGZpeFJlbW92ZUNvbG9ycyhcbiAgICAgICAgY2ZuRGlmZi5mb3JtYXRUYWJsZShcbiAgICAgICAgICBkZWVwU3Vic3RpdHV0ZUJyYWNlZExvZ2ljYWxJZHMoZGlmZi5sb2dpY2FsVG9QYXRoTWFwKShcbiAgICAgICAgICAgIHN0YXRlbWVudHNTdW1tYXJpemVkXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChkaWZmLnJhd0RpZmYuaWFtQ2hhbmdlcy5tYW5hZ2VkUG9saWNpZXMuaGFzQ2hhbmdlcykge1xuICAgIGNvbnN0IG1hbmFnZWRQb2xpY2llc1N1bW1hcml6ZWQgPVxuICAgICAgZGlmZi5yYXdEaWZmLmlhbUNoYW5nZXMuc3VtbWFyaXplTWFuYWdlZFBvbGljaWVzKCk7XG4gICAgcmVzdWx0LnB1c2goe1xuICAgICAgbGFiZWw6IFwiSUFNIFBvbGljeSBDaGFuZ2VzXCIsXG4gICAgICBjZGtEaWZmUmF3OiBmaXhSZW1vdmVDb2xvcnMoXG4gICAgICAgIGNmbkRpZmYuZm9ybWF0VGFibGUoXG4gICAgICAgICAgZGVlcFN1YnN0aXR1dGVCcmFjZWRMb2dpY2FsSWRzKGRpZmYubG9naWNhbFRvUGF0aE1hcCkoXG4gICAgICAgICAgICBtYW5hZ2VkUG9saWNpZXNTdW1tYXJpemVkXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1TZWN1cml0eUdyb3VwQ2hhbmdlcyA9IGFzeW5jIChcbiAgZGlmZjogU3RhY2tSYXdEaWZmXG4pOiBQcm9taXNlPE5pY2VyRGlmZltdPiA9PiB7XG4gIGlmICghZGlmZi5yYXdEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLmhhc0NoYW5nZXMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBzdW1tYXJpemVkID0gZGlmZi5yYXdEaWZmLnNlY3VyaXR5R3JvdXBDaGFuZ2VzLnN1bW1hcml6ZSgpO1xuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiU2VjdXJpdHkgR3JvdXAgQ2hhbmdlc1wiLFxuICAgICAgY2RrRGlmZlJhdzogZml4UmVtb3ZlQ29sb3JzKFxuICAgICAgICBjZm5EaWZmLmZvcm1hdFRhYmxlKFxuICAgICAgICAgIGRlZXBTdWJzdGl0dXRlQnJhY2VkTG9naWNhbElkcyhkaWZmLmxvZ2ljYWxUb1BhdGhNYXApKHN1bW1hcml6ZWQpLFxuICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApXG4gICAgICApLFxuICAgIH0sXG4gIF07XG59O1xuXG5jb25zdCBwcm9jZXNzSW5kaXZpZHVhbERpZmYgPVxuICAocmVzdWx0OiBOaWNlckRpZmZbXSwgY2RrRGlmZkNhdGVnb3J5OiBDZGtEaWZmQ2F0ZWdvcnkpID0+XG4gICAgKGlkOiBzdHJpbmcsIHJkaWZmOiBjZm5EaWZmLkRpZmZlcmVuY2U8YW55PikgPT4ge1xuICAgICAgaWYgKHJkaWZmLmlzRGlmZmVyZW50KSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZTogc3RyaW5nID0gZ3VhcmRSZXNvdXJjZURpZmYocmRpZmYpXG4gICAgICAgICAgPyAocmRpZmYuaXNSZW1vdmFsID8gcmRpZmYub2xkVmFsdWU/LlR5cGUgOiByZGlmZi5uZXdWYWx1ZT8uVHlwZSkgfHxcbiAgICAgICAgICBjZGtEaWZmQ2F0ZWdvcnlcbiAgICAgICAgICA6IChyZGlmZi5vbGRWYWx1ZT8uVHlwZSB8fCByZGlmZi5uZXdWYWx1ZT8uVHlwZSB8fCBjZGtEaWZmQ2F0ZWdvcnkpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBOaWNlckRpZmZDaGFuZ2VbXSA9IFtdO1xuICAgICAgICBpZiAoZ3VhcmRSZXNvdXJjZURpZmYocmRpZmYpICYmIHJkaWZmLmlzVXBkYXRlKSB7XG4gICAgICAgICAgcmRpZmYuZm9yRWFjaERpZmZlcmVuY2UoKF8sIGxhYmVsLCB2YWx1ZXMpID0+IHtcbiAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICBhY3Rpb246IGJ1aWxkQ2hhbmdlQWN0aW9uKHZhbHVlcy5vbGRWYWx1ZSwgdmFsdWVzLm5ld1ZhbHVlKSxcbiAgICAgICAgICAgICAgZnJvbTogdmFsdWVzLm9sZFZhbHVlLFxuICAgICAgICAgICAgICB0bzogdmFsdWVzLm5ld1ZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IGNka0RpZmZDYXRlZ29yeSxcbiAgICAgICAgICBjZGtEaWZmUmF3OiBKU09OLnN0cmluZ2lmeSh7IGlkLCBkaWZmOiByZGlmZiB9LCBudWxsLCAyKSxcbiAgICAgICAgICBuaWNlckRpZmY6IHtcbiAgICAgICAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgICBjZGtEaWZmQ2F0ZWdvcnksXG4gICAgICAgICAgICByZXNvdXJjZUFjdGlvbjogcmRpZmYuaXNBZGRpdGlvblxuICAgICAgICAgICAgICA/IFwiQURESVRJT05cIlxuICAgICAgICAgICAgICA6IHJkaWZmLmlzUmVtb3ZhbFxuICAgICAgICAgICAgICAgID8gXCJSRU1PVkFMXCJcbiAgICAgICAgICAgICAgICA6IFwiVVBEQVRFXCIsXG4gICAgICAgICAgICByZXNvdXJjZUxhYmVsOiBpZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG5jb25zdCB0cmFuc2Zvcm1EaWZmRm9yUmVzb3VyY2VUeXBlcyA9IGFzeW5jIChkaWZmOiBTdGFja1Jhd0RpZmYpOiBQcm9taXNlPE5pY2VyRGlmZltdPiA9PiB7XG4gIGNvbnN0IHJlc3VsdDogTmljZXJEaWZmW10gPSBbXTtcbiAgZm9yIChjb25zdCBkIG9mIE9iamVjdC5lbnRyaWVzKGRpZmYucmF3RGlmZikuZmlsdGVyKChba10pID0+ICFbXCJpYW1DaGFuZ2VzXCIsIFwic2VjdXJpdHlHcm91cENoYW5nZXNcIl0uaW5jbHVkZXMoaykpKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkRGlmZiA9IGRpZmZWYWxpZGF0b3IoZCk7XG4gICAgaWYgKCdkaWZmQ29sbGVjdGlvbicgaW4gdmFsaWRhdGVkRGlmZikge1xuICAgICAgY29uc3QgeyBkaWZmQ29sbGVjdGlvbktleSwgZGlmZkNvbGxlY3Rpb24gfSA9IHZhbGlkYXRlZERpZmY7XG4gICAgICBpZiAoZGlmZkNvbGxlY3Rpb24uZGlmZmVyZW5jZUNvdW50ID4gMCkge1xuICAgICAgICBkaWZmQ29sbGVjdGlvbi5mb3JFYWNoRGlmZmVyZW5jZShcbiAgICAgICAgICBwcm9jZXNzSW5kaXZpZHVhbERpZmYocmVzdWx0LCBkaWZmQ29sbGVjdGlvbktleSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCdkaWZmS2V5JyBpbiB2YWxpZGF0ZWREaWZmKSB7XG4gICAgICBjb25zdCB7IGRpZmZLZXksIGRpZmYgfSA9IHZhbGlkYXRlZERpZmY7XG4gICAgICBpZiAoZGlmZi5pc0RpZmZlcmVudCkge1xuICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgbGFiZWw6IGRpZmZLZXksXG4gICAgICAgICAgY2RrRGlmZlJhdzogSlNPTi5zdHJpbmdpZnkoeyBpZDogZGlmZktleSwgZGlmZiB9LCBudWxsLCAyKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybURlc2NyaXB0aW9uQ2hhbmdlcyA9IChkaWZmOiBTdGFja1Jhd0RpZmYpOiBOaWNlckRpZmYgfCBudWxsID0+IHtcbiAgaWYgKGRpZmYucmF3RGlmZi5kZXNjcmlwdGlvbj8uaXNEaWZmZXJlbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBjZGtEaWZmUmF3OiBKU09OLnN0cmluZ2lmeSh7IGRlc2NyaXB0aW9uOiBkaWZmLnJhd0RpZmYuZGVzY3JpcHRpb24gfSwgbnVsbCwgMiksXG4gICAgICBuaWNlckRpZmY6IHtcbiAgICAgICAgcmVzb3VyY2VUeXBlOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICBjaGFuZ2VzOiBbe1xuICAgICAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICAgIGFjdGlvbjogYnVpbGRDaGFuZ2VBY3Rpb24oZGlmZi5yYXdEaWZmLmRlc2NyaXB0aW9uPy5vbGRWYWx1ZSwgZGlmZi5yYXdEaWZmLmRlc2NyaXB0aW9uPy5uZXdWYWx1ZSksXG4gICAgICAgICAgZnJvbTogZGlmZi5yYXdEaWZmLmRlc2NyaXB0aW9uPy5vbGRWYWx1ZSxcbiAgICAgICAgICB0bzogZGlmZi5yYXdEaWZmLmRlc2NyaXB0aW9uPy5uZXdWYWx1ZVxuICAgICAgICB9XSxcbiAgICAgICAgY2RrRGlmZkNhdGVnb3J5OiAnZGVzY3JpcHRpb24nLFxuICAgICAgICByZXNvdXJjZUFjdGlvbjogZGlmZi5yYXdEaWZmLmRlc2NyaXB0aW9uPy5pc0FkZGl0aW9uXG4gICAgICAgICAgPyBcIkFERElUSU9OXCJcbiAgICAgICAgICA6IGRpZmYucmF3RGlmZi5kZXNjcmlwdGlvbj8uaXNSZW1vdmFsXG4gICAgICAgICAgICA/IFwiUkVNT1ZBTFwiXG4gICAgICAgICAgICA6IFwiVVBEQVRFXCIsXG4gICAgICAgIHJlc291cmNlTGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtRGlmZiA9IGFzeW5jIChcbiAgZGlmZjogU3RhY2tSYXdEaWZmXG4pOiBQcm9taXNlPE5pY2VyU3RhY2tEaWZmPiA9PiB7XG4gIGlmIChkaWZmLnJhd0RpZmYuaXNFbXB0eSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFja05hbWU6IGRpZmYuc3RhY2tOYW1lLFxuICAgICAgcmF3OiBcIlRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXNcIixcbiAgICAgIGRpZmY6IFtdLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBkZXNjcmlwdGlvbkRpZmYgPSB0cmFuc2Zvcm1EZXNjcmlwdGlvbkNoYW5nZXMoZGlmZik7XG4gIHJldHVybiB7XG4gICAgc3RhY2tOYW1lOiBkaWZmLnN0YWNrTmFtZSxcbiAgICByYXc6IGF3YWl0IGJ1aWxkUmF3KGRpZmYpLFxuICAgIGRpZmY6IFtcbiAgICAgIC4uLihhd2FpdCB0cmFuc2Zvcm1JYW1DaGFuZ2VzKGRpZmYpKSxcbiAgICAgIC4uLihhd2FpdCB0cmFuc2Zvcm1TZWN1cml0eUdyb3VwQ2hhbmdlcyhkaWZmKSksXG4gICAgICAuLi4oYXdhaXQgdHJhbnNmb3JtRGlmZkZvclJlc291cmNlVHlwZXMoZGlmZikpLFxuICAgICAgLi4uKGRlc2NyaXB0aW9uRGlmZiA/IFtkZXNjcmlwdGlvbkRpZmZdIDogW10pLFxuICAgIF0sXG4gIH07XG59O1xuXG4iXX0=