UNPKG

aws-cdk

Version:

AWS CDK CLI, the command line tool for CDK apps

128 lines 18.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EcsHotswapProperties = exports.HotswapPropertyOverrides = exports.HotswapMode = exports.ICON = void 0; exports.classifyChanges = classifyChanges; exports.nonHotswappableChange = nonHotswappableChange; exports.nonHotswappableResource = nonHotswappableResource; const api_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api"); const hotswap_1 = require("../../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/payloads/hotswap"); exports.ICON = '✨'; var HotswapMode; (function (HotswapMode) { /** * Will fall back to CloudFormation when a non-hotswappable change is detected */ HotswapMode["FALL_BACK"] = "fall-back"; /** * Will not fall back to CloudFormation when a non-hotswappable change is detected */ HotswapMode["HOTSWAP_ONLY"] = "hotswap-only"; /** * Will not attempt to hotswap anything and instead go straight to CloudFormation */ HotswapMode["FULL_DEPLOYMENT"] = "full-deployment"; })(HotswapMode || (exports.HotswapMode = HotswapMode = {})); /** * Represents configuration property overrides for hotswap deployments */ class HotswapPropertyOverrides { constructor(ecsHotswapProperties) { this.ecsHotswapProperties = ecsHotswapProperties; } } exports.HotswapPropertyOverrides = HotswapPropertyOverrides; /** * Represents configuration properties for ECS hotswap deployments */ class EcsHotswapProperties { constructor(minimumHealthyPercent, maximumHealthyPercent) { if (minimumHealthyPercent !== undefined && minimumHealthyPercent < 0) { throw new api_1.ToolkitError('hotswap-ecs-minimum-healthy-percent can\'t be a negative number'); } if (maximumHealthyPercent !== undefined && maximumHealthyPercent < 0) { throw new api_1.ToolkitError('hotswap-ecs-maximum-healthy-percent can\'t be a negative number'); } // In order to preserve the current behaviour, when minimumHealthyPercent is not defined, it will be set to the currently default value of 0 if (minimumHealthyPercent == undefined) { this.minimumHealthyPercent = 0; } else { this.minimumHealthyPercent = minimumHealthyPercent; } this.maximumHealthyPercent = maximumHealthyPercent; } /** * Check if any hotswap properties are defined * @returns true if all properties are undefined, false otherwise */ isEmpty() { return this.minimumHealthyPercent === 0 && this.maximumHealthyPercent === undefined; } } exports.EcsHotswapProperties = EcsHotswapProperties; class ClassifiedChanges { constructor(change, hotswappableProps, nonHotswappableProps) { this.change = change; this.hotswappableProps = hotswappableProps; this.nonHotswappableProps = nonHotswappableProps; } reportNonHotswappablePropertyChanges(ret) { const nonHotswappablePropNames = Object.keys(this.nonHotswappableProps); if (nonHotswappablePropNames.length > 0) { const tagOnlyChange = nonHotswappablePropNames.length === 1 && nonHotswappablePropNames[0] === 'Tags'; const reason = tagOnlyChange ? hotswap_1.NonHotswappableReason.TAGS : hotswap_1.NonHotswappableReason.PROPERTIES; const description = tagOnlyChange ? 'Tags are not hotswappable' : `resource properties '${nonHotswappablePropNames}' are not hotswappable on this resource type`; ret.push(nonHotswappableChange(this.change, reason, description, this.nonHotswappableProps)); } } get namesOfHotswappableProps() { return Object.keys(this.hotswappableProps); } } function classifyChanges(xs, hotswappablePropNames) { const hotswappableProps = {}; const nonHotswappableProps = {}; for (const [name, propDiff] of Object.entries(xs.propertyUpdates)) { if (hotswappablePropNames.includes(name)) { hotswappableProps[name] = propDiff; } else { nonHotswappableProps[name] = propDiff; } } return new ClassifiedChanges(xs, hotswappableProps, nonHotswappableProps); } function nonHotswappableChange(change, reason, description, nonHotswappableProps, hotswapOnlyVisible = true) { return { hotswappable: false, hotswapOnlyVisible, change: { reason, description, subject: { type: 'Resource', logicalId: change.logicalId, resourceType: change.newValue.Type, rejectedProperties: Object.keys(nonHotswappableProps ?? change.propertyUpdates), metadata: change.metadata, }, }, }; } function nonHotswappableResource(change) { return { hotswappable: false, change: { reason: hotswap_1.NonHotswappableReason.RESOURCE_UNSUPPORTED, description: 'This resource type is not supported for hotswap deployments', subject: { type: 'Resource', logicalId: change.logicalId, resourceType: change.newValue.Type, rejectedProperties: Object.keys(change.propertyUpdates), metadata: change.metadata, }, }, }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlKQSwwQ0FhQztBQUVELHNEQXNCQztBQUVELDBEQWVDO0FBdE1ELDBFQUFnRjtBQUVoRixrR0FBNkc7QUFHaEcsUUFBQSxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBNkN4QixJQUFZLFdBZVg7QUFmRCxXQUFZLFdBQVc7SUFDckI7O09BRUc7SUFDSCxzQ0FBdUIsQ0FBQTtJQUV2Qjs7T0FFRztJQUNILDRDQUE2QixDQUFBO0lBRTdCOztPQUVHO0lBQ0gsa0RBQW1DLENBQUE7QUFDckMsQ0FBQyxFQWZXLFdBQVcsMkJBQVgsV0FBVyxRQWV0QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSx3QkFBd0I7SUFJbkMsWUFBb0Isb0JBQTJDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztJQUNuRCxDQUFDO0NBQ0Y7QUFQRCw0REFPQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxvQkFBb0I7SUFNL0IsWUFBb0IscUJBQThCLEVBQUUscUJBQThCO1FBQ2hGLElBQUkscUJBQXFCLEtBQUssU0FBUyxJQUFJLHFCQUFxQixHQUFHLENBQUMsRUFBRyxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxrQkFBWSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELElBQUkscUJBQXFCLEtBQUssU0FBUyxJQUFJLHFCQUFxQixHQUFHLENBQUMsRUFBRyxDQUFDO1lBQ3RFLE1BQU0sSUFBSSxrQkFBWSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUNELDRJQUE0STtRQUM1SSxJQUFJLHFCQUFxQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDakMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFD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QUUsTUFBTSxDQUFDLFFBQVE7YUFDMUI7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsdUJBQXVCLENBQUMsTUFBc0I7SUFDNUQsT0FBTztRQUNMLFlBQVksRUFBRSxLQUFLO1FBQ25CLE1BQU0sRUFBRTtZQUNOLE1BQU0sRUFBRSwrQkFBcUIsQ0FBQyxvQkFBb0I7WUFDbEQsV0FBVyxFQUFFLDZEQUE2RDtZQUMxRSxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDbEMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUN2RCxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7YUFDMUI7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9wZXJ0eURpZmZlcmVuY2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaSc7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBwYWJsZUNoYW5nZSwgTm9uSG90c3dhcHBhYmxlQ2hhbmdlLCBSZXNvdXJjZUNoYW5nZSB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wYXlsb2Fkcy9ob3Rzd2FwJztcbmltcG9ydCB7IE5vbkhvdHN3YXBwYWJsZVJlYXNvbiB9IGZyb20gJy4uLy4uLy4uLy4uL0Bhd3MtY2RrL3RtcC10b29sa2l0LWhlbHBlcnMvc3JjL2FwaS9pby9wYXlsb2Fkcy9ob3Rzd2FwJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuXG5leHBvcnQgY29uc3QgSUNPTiA9ICfinKgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhvdHN3YXBPcGVyYXRpb24ge1xuICAvKipcbiAgICogTWFya3MgdGhlIG9wZXJhdGlvbiBhcyBob3Rzd2FwcGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBwYWJsZTogdHJ1ZTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgYmVpbmcgaG90c3dhcHBlZC5cbiAgICogVXNlZCB0byBzZXQgYSBjdXN0b20gVXNlci1BZ2VudCBmb3IgU0RLIGNhbGxzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlIHRoYXQgaXMgYXBwbGllZCBhcyBwYXJ0IG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNoYW5nZTogSG90c3dhcHBhYmxlQ2hhbmdlO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBob3Rzd2FwIG9wZXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbHk6IChzZGs6IFNESykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWplY3RlZENoYW5nZSB7XG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgY2hhbmdlIGFzIG5vdCBob3Rzd2FwcGFibGVcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBwYWJsZTogZmFsc2U7XG4gIC8qKlxuICAgKiBUaGUgY2hhbmdlIHRoYXQgZ290IHJlamVjdGVkXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2U6IE5vbkhvdHN3YXBwYWJsZUNoYW5nZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIHNob3cgdGhpcyBjaGFuZ2Ugd2hlbiBsaXN0aW5nIG5vbi1ob3Rzd2FwcGFibGUgY2hhbmdlcyBpbiBIT1RTV0FQX09OTFkgbW9kZS4gRG9lcyBub3QgYWZmZWN0XG4gICAqIGxpc3RpbmcgaW4gRkFMTF9CQUNLIG1vZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGhvdHN3YXBPbmx5VmlzaWJsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEhvdHN3YXBDaGFuZ2UgPSBIb3Rzd2FwT3BlcmF0aW9uIHwgUmVqZWN0ZWRDaGFuZ2U7XG5cbmV4cG9ydCBlbnVtIEhvdHN3YXBNb2RlIHtcbiAgLyoqXG4gICAqIFdpbGwgZmFsbCBiYWNrIHRvIENsb3VkRm9ybWF0aW9uIHdoZW4gYSBub24taG90c3dhcHBhYmxlIGNoYW5nZSBpcyBkZXRlY3RlZFxuICAgKi9cbiAgRkFMTF9CQUNLID0gJ2ZhbGwtYmFjaycsXG5cbiAgLyoqXG4gICAqIFdpbGwgbm90IGZhbGwgYmFjayB0byBDbG91ZEZvcm1hdGlvbiB3aGVuIGEgbm9uLWhvdHN3YXBwYWJsZSBjaGFuZ2UgaXMgZGV0ZWN0ZWRcbiAgICovXG4gIEhPVFNXQVBfT05MWSA9ICdob3Rzd2FwLW9ubHknLFxuXG4gIC8qKlxuICAgKiBXaWxsIG5vdCBhdHRlbXB0IHRvIGhvdHN3YXAgYW55dGhpbmcgYW5kIGluc3RlYWQgZ28gc3RyYWlnaHQgdG8gQ2xvdWRGb3JtYXRpb25cbiAgICovXG4gIEZVTExfREVQTE9ZTUVOVCA9ICdmdWxsLWRlcGxveW1lbnQnLFxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBvdmVycmlkZXMgZm9yIGhvdHN3YXAgZGVwbG95bWVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIEhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyB7XG4gIC8vIEVhY2ggc3VwcG9ydGVkIHJlc291cmNlIHR5cGUgd2lsbCBoYXZlIGl0cyBvd24gcHJvcGVydGllcy4gQ3VycmVudGx5IHRoaXMgaXMgRUNTXG4gIGVjc0hvdHN3YXBQcm9wZXJ0aWVzPzogRWNzSG90c3dhcFByb3BlcnRpZXM7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yIChlY3NIb3Rzd2FwUHJvcGVydGllcz86IEVjc0hvdHN3YXBQcm9wZXJ0aWVzKSB7XG4gICAgdGhpcy5lY3NIb3Rzd2FwUHJvcGVydGllcyA9IGVjc0hvdHN3YXBQcm9wZXJ0aWVzO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIEVDUyBob3Rzd2FwIGRlcGxveW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBFY3NIb3Rzd2FwUHJvcGVydGllcyB7XG4gIC8vIFRoZSBsb3dlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHlvdXIgc2VydmljZSdzIHRhc2tzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIFJVTk5JTkcgc3RhdGUgZHVyaW5nIGEgZGVwbG95bWVudCwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBkZXNpcmVkQ291bnRcbiAgcmVhZG9ubHkgbWluaW11bUhlYWx0aHlQZXJjZW50PzogbnVtYmVyO1xuICAvLyBUaGUgdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiB5b3VyIHNlcnZpY2UncyB0YXNrcyB0aGF0IGFyZSBhbGxvd2VkIGluIHRoZSBSVU5OSU5HIG9yIFBFTkRJTkcgc3RhdGUgZHVyaW5nIGEgZGVwbG95bWVudCwgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBkZXNpcmVkQ291bnRcbiAgcmVhZG9ubHkgbWF4aW11bUhlYWx0aHlQZXJjZW50PzogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvciAobWluaW11bUhlYWx0aHlQZXJjZW50PzogbnVtYmVyLCBtYXhpbXVtSGVhbHRoeVBlcmNlbnQ/OiBudW1iZXIpIHtcbiAgICBpZiAobWluaW11bUhlYWx0aHlQZXJjZW50ICE9PSB1bmRlZmluZWQgJiYgbWluaW11bUhlYWx0aHlQZXJjZW50IDwgMCApIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ2hvdHN3YXAtZWNzLW1pbmltdW0taGVhbHRoeS1wZXJjZW50IGNhblxcJ3QgYmUgYSBuZWdhdGl2ZSBudW1iZXInKTtcbiAgICB9XG4gICAgaWYgKG1heGltdW1IZWFsdGh5UGVyY2VudCAhPT0gdW5kZWZpbmVkICYmIG1heGltdW1IZWFsdGh5UGVyY2VudCA8IDAgKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdob3Rzd2FwLWVjcy1tYXhpbXVtLWhlYWx0aHktcGVyY2VudCBjYW5cXCd0IGJlIGEgbmVnYXRpdmUgbnVtYmVyJyk7XG4gICAgfVxuICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjdXJyZW50IGJlaGF2aW91ciwgd2hlbiBtaW5pbXVtSGVhbHRoeVBlcmNlbnQgaXMgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBjdXJyZW50bHkgZGVmYXVsdCB2YWx1ZSBvZiAwXG4gICAgaWYgKG1pbmltdW1IZWFsdGh5UGVyY2VudCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubWluaW11bUhlYWx0aHlQZXJjZW50ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5taW5pbXVtSGVhbHRoeVBlcmNlbnQgPSBtaW5pbXVtSGVhbHRoeVBlcmNlbnQ7XG4gICAgfVxuICAgIHRoaXMubWF4aW11bUhlYWx0aHlQZXJjZW50ID0gbWF4aW11bUhlYWx0aHlQZXJjZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBob3Rzd2FwIHByb3BlcnRpZXMgYXJlIGRlZmluZWRcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhbGwgcHJvcGVydGllcyBhcmUgdW5kZWZpbmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1pbmltdW1IZWFsdGh5UGVyY2VudCA9PT0gMCAmJiB0aGlzLm1heGltdW1IZWFsdGh5UGVyY2VudCA9PT0gdW5kZWZpbmVkO1xuICB9XG59XG5cbnR5cGUgUHJvcERpZmZzID0gUmVjb3JkPHN0cmluZywgUHJvcGVydHlEaWZmZXJlbmNlPGFueT4+O1xuXG5jbGFzcyBDbGFzc2lmaWVkQ2hhbmdlcyB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaG90c3dhcHBhYmxlUHJvcHM6IFByb3BEaWZmcyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgbm9uSG90c3dhcHBhYmxlUHJvcHM6IFByb3BEaWZmcyxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgcmVwb3J0Tm9uSG90c3dhcHBhYmxlUHJvcGVydHlDaGFuZ2VzKHJldDogSG90c3dhcENoYW5nZVtdKTogdm9pZCB7XG4gICAgY29uc3Qgbm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzID0gT2JqZWN0LmtleXModGhpcy5ub25Ib3Rzd2FwcGFibGVQcm9wcyk7XG4gICAgaWYgKG5vbkhvdHN3YXBwYWJsZVByb3BOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB0YWdPbmx5Q2hhbmdlID0gbm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzLmxlbmd0aCA9PT0gMSAmJiBub25Ib3Rzd2FwcGFibGVQcm9wTmFtZXNbMF0gPT09ICdUYWdzJztcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHRhZ09ubHlDaGFuZ2UgPyBOb25Ib3Rzd2FwcGFibGVSZWFzb24uVEFHUyA6IE5vbkhvdHN3YXBwYWJsZVJlYXNvbi5QUk9QRVJUSUVTO1xuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0YWdPbmx5Q2hhbmdlID8gJ1RhZ3MgYXJlIG5vdCBob3Rzd2FwcGFibGUnIDogYHJlc291cmNlIHByb3BlcnRpZXMgJyR7bm9uSG90c3dhcHBhYmxlUHJvcE5hbWVzfScgYXJlIG5vdCBob3Rzd2FwcGFibGUgb24gdGhpcyByZXNvdXJjZSB0eXBlYDtcblxuICAgICAgcmV0LnB1c2gobm9uSG90c3dhcHBhYmxlQ2hhbmdlKFxuICAgICAgICB0aGlzLmNoYW5nZSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgdGhpcy5ub25Ib3Rzd2FwcGFibGVQcm9wcyxcbiAgICAgICkpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZXNPZkhvdHN3YXBwYWJsZVByb3BzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5ob3Rzd2FwcGFibGVQcm9wcyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5Q2hhbmdlcyh4czogUmVzb3VyY2VDaGFuZ2UsIGhvdHN3YXBwYWJsZVByb3BOYW1lczogc3RyaW5nW10pOiBDbGFzc2lmaWVkQ2hhbmdlcyB7XG4gIGNvbnN0IGhvdHN3YXBwYWJsZVByb3BzOiBQcm9wRGlmZnMgPSB7fTtcbiAgY29uc3Qgbm9uSG90c3dhcHBhYmxlUHJvcHM6IFByb3BEaWZmcyA9IHt9O1xuXG4gIGZvciAoY29uc3QgW25hbWUsIHByb3BEaWZmXSBvZiBPYmplY3QuZW50cmllcyh4cy5wcm9wZXJ0eVVwZGF0ZXMpKSB7XG4gICAgaWYgKGhvdHN3YXBwYWJsZVByb3BOYW1lcy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgaG90c3dhcHBhYmxlUHJvcHNbbmFtZV0gPSBwcm9wRGlmZjtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9uSG90c3dhcHBhYmxlUHJvcHNbbmFtZV0gPSBwcm9wRGlmZjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3IENsYXNzaWZpZWRDaGFuZ2VzKHhzLCBob3Rzd2FwcGFibGVQcm9wcywgbm9uSG90c3dhcHBhYmxlUHJvcHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9uSG90c3dhcHBhYmxlQ2hhbmdlKFxuICBjaGFuZ2U6IFJlc291cmNlQ2hhbmdlLFxuICByZWFzb246IE5vbkhvdHN3YXBwYWJsZVJlYXNvbixcbiAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgbm9uSG90c3dhcHBhYmxlUHJvcHM/OiBQcm9wRGlmZnMsXG4gIGhvdHN3YXBPbmx5VmlzaWJsZTogYm9vbGVhbiA9IHRydWUsXG4pOiBSZWplY3RlZENoYW5nZSB7XG4gIHJldHVybiB7XG4gICAgaG90c3dhcHBhYmxlOiBmYWxzZSxcbiAgICBob3Rzd2FwT25seVZpc2libGUsXG4gICAgY2hhbmdlOiB7XG4gICAgICByZWFzb24sXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIHN1YmplY3Q6IHtcbiAgICAgICAgdHlwZTogJ1Jlc291cmNlJyxcbiAgICAgICAgbG9naWNhbElkOiBjaGFuZ2UubG9naWNhbElkLFxuICAgICAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgICAgICByZWplY3RlZFByb3BlcnRpZXM6IE9iamVjdC5rZXlzKG5vbkhvdHN3YXBwYWJsZVByb3BzID8/IGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpLFxuICAgICAgICBtZXRhZGF0YTogY2hhbmdlLm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9uSG90c3dhcHBhYmxlUmVzb3VyY2UoY2hhbmdlOiBSZXNvdXJjZUNoYW5nZSk6IFJlamVjdGVkQ2hhbmdlIHtcbiAgcmV0dXJuIHtcbiAgICBob3Rzd2FwcGFibGU6IGZhbHNlLFxuICAgIGNoYW5nZToge1xuICAgICAgcmVhc29uOiBOb25Ib3Rzd2FwcGFibGVSZWFzb24uUkVTT1VSQ0VfVU5TVVBQT1JURUQsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgcmVzb3VyY2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3Rzd2FwIGRlcGxveW1lbnRzJyxcbiAgICAgIHN1YmplY3Q6IHtcbiAgICAgICAgdHlwZTogJ1Jlc291cmNlJyxcbiAgICAgICAgbG9naWNhbElkOiBjaGFuZ2UubG9naWNhbElkLFxuICAgICAgICByZXNvdXJjZVR5cGU6IGNoYW5nZS5uZXdWYWx1ZS5UeXBlLFxuICAgICAgICByZWplY3RlZFByb3BlcnRpZXM6IE9iamVjdC5rZXlzKGNoYW5nZS5wcm9wZXJ0eVVwZGF0ZXMpLFxuICAgICAgICBtZXRhZGF0YTogY2hhbmdlLm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuIl19