UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

112 lines 20.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SqsQueueMonitoringWithDlq = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const SqsQueueMetricFactory_1 = require("./SqsQueueMetricFactory"); const SqsQueueMonitoring_1 = require("./SqsQueueMonitoring"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class SqsQueueMonitoringWithDlq extends SqsQueueMonitoring_1.SqsQueueMonitoring { constructor(scope, props) { super(scope, props, true); const deadLetterMetricFactory = new SqsQueueMetricFactory_1.SqsQueueMetricFactory(scope.createMetricFactory(), { ...props, queue: props.deadLetterQueue, }); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.deadLetterQueue, fallbackConstructName: this.resolveQueueName(props.deadLetterQueue), }); this.deadLetterTitle = namingStrategy.resolveHumanReadableName(); this.deadLetterUrl = scope .createAwsConsoleUrlFactory() .getSqsQueueUrl(props.deadLetterQueue.queueUrl); this.addDeadLetterQueueToSummaryDashboard = props.addDeadLetterQueueToSummaryDashboard ?? false; const deadLetterAlarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName() + "-DLQ"); this.deadLetterCountAnnotations = []; this.deadLetterAgeAnnotations = []; this.deadLetterQueueAlarmFactory = new common_1.QueueAlarmFactory(deadLetterAlarmFactory); this.deadLetterQueueVisibleMessagesMetric = deadLetterMetricFactory.metricApproximateVisibleMessageCount(); this.deadLetterQueueIncomingMessagesMetric = deadLetterMetricFactory.metricIncomingMessageCount(); this.deadLetterQueueOldestMessageAgeMetric = deadLetterMetricFactory.metricApproximateAgeOfOldestMessageInSeconds(); for (const disambiguator in props.addDeadLetterQueueMaxSizeAlarm) { const alarmProps = props.addDeadLetterQueueMaxSizeAlarm[disambiguator]; const createdAlarm = this.deadLetterQueueAlarmFactory.addMaxQueueMessageCountAlarm(this.deadLetterQueueVisibleMessagesMetric, alarmProps, disambiguator); this.deadLetterCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addDeadLetterQueueMaxMessageAgeAlarm) { const alarmProps = props.addDeadLetterQueueMaxMessageAgeAlarm[disambiguator]; const createdAlarm = this.deadLetterQueueAlarmFactory.addMaxQueueMessageAgeAlarm(this.deadLetterQueueOldestMessageAgeMetric, alarmProps, disambiguator); this.deadLetterAgeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addDeadLetterQueueMaxIncomingMessagesAlarm) { const alarmProps = props.addDeadLetterQueueMaxIncomingMessagesAlarm[disambiguator]; const createdAlarm = this.deadLetterQueueAlarmFactory.addMaxQueueIncomingMessagesCountAlarm(this.deadLetterQueueIncomingMessagesMetric, alarmProps, disambiguator); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } summaryWidgets() { const addToSummary = this.addDeadLetterQueueToSummaryDashboard ?? true; if (!addToSummary) { // do not show the DLQ widgets at all return super.summaryWidgets(); } return [ ...super.summaryWidgets(), this.createDeadLetterMessageCountWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), this.createDeadLetterMessageAgeWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), ]; } widgets() { return [ ...super.widgets(), this.createDeadLetterTitleWidget(), this.createDeadLetterMessageCountWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createDeadLetterMessageAgeWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), ]; } createDeadLetterTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "SQS Dead-Letter Queue", title: this.deadLetterTitle, goToLinkUrl: this.deadLetterUrl, }); } createDeadLetterMessageCountWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "DLQ: Message Count", left: [ this.deadLetterQueueVisibleMessagesMetric, this.deadLetterQueueIncomingMessagesMetric, ], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.deadLetterCountAnnotations, }); } createDeadLetterMessageAgeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "DLQ: Oldest Message Age", left: [this.deadLetterQueueOldestMessageAgeMetric], leftYAxis: common_1.TimeAxisSecondsFromZero, leftAnnotations: this.deadLetterAgeAnnotations, }); } } exports.SqsQueueMonitoringWithDlq = SqsQueueMonitoringWithDlq; _a = JSII_RTTI_SYMBOL_1; SqsQueueMonitoringWithDlq[_a] = { fqn: "cdk-monitoring-constructs.SqsQueueMonitoringWithDlq", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzUXVldWVNb25pdG9yaW5nV2l0aERscS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlNxc1F1ZXVlTW9uaXRvcmluZ1dpdGhEbHEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrREFJb0M7QUFHcEMsbUVBQWdFO0FBQ2hFLDZEQUc4QjtBQUM5Qix5Q0FZc0I7QUFDdEIsK0NBR3lCO0FBd0N6QixNQUFhLHlCQUEwQixTQUFRLHVDQUFrQjtJQWEvRCxZQUFZLEtBQXNCLEVBQUUsS0FBcUM7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFMUIsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLDZDQUFxQixDQUN2RCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0I7WUFDRSxHQUFHLEtBQUs7WUFDUixLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWU7U0FDN0IsQ0FDRixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixjQUFjLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDckMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7U0FDcEUsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUs7YUFDdkIsMEJBQTBCLEVBQUU7YUFDNUIsY0FBYyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLG9DQUFvQztZQUN2QyxLQUFLLENBQUMsb0NBQW9DLElBQUksS0FBSyxDQUFDO1FBRXRELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNwRCxjQUFjLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLENBQ25ELENB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LEVBQ1QsaUNBQXdCLENBQ3pCO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFUywyQkFBMkI7UUFDbkMsT0FBTyxJQUFJLGtDQUFzQixDQUFDO1lBQ2hDLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQzNCLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYTtTQUNoQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0NBQWtDLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDeEUsT0FBTyxJQUFJLDRCQUFXLENBQUM7WUFDckIsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLLEVBQUUsb0JBQW9CO1lBQzNCLElBQUksRUFBRTtnQkFDSixJQUFJLENBQUMsb0NBQW9DO2dCQUN6QyxJQUFJLENBQUMscUNBQXFDO2FBQzNDO1lBQ0QsU0FBUyxFQUFFLDBCQUFpQjtZQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLDBCQUEwQjtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsZ0NBQWdDLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDdEUsT0FBTyxJQUFJLDRCQUFXLENBQUM7WUFDckIsS0FBSztZQUNMLE1BQU07WUFDTixLQUFLLEVBQUUseUJBQXlCO1lBQ2hDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQztZQUNsRCxTQUFTLEVBQUUsZ0NBQXVCO1lBQ2xDLGVBQWUsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBOUpILDhEQStKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEdyYXBoV2lkZ2V0LFxuICBIb3Jpem9udGFsQW5ub3RhdGlvbixcbiAgSVdpZGdldCxcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgeyBJUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuXG5pbXBvcnQgeyBTcXNRdWV1ZU1ldHJpY0ZhY3RvcnkgfSBmcm9tIFwiLi9TcXNRdWV1ZU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIFNxc1F1ZXVlTW9uaXRvcmluZyxcbiAgU3FzUXVldWVNb25pdG9yaW5nUHJvcHMsXG59IGZyb20gXCIuL1Nxc1F1ZXVlTW9uaXRvcmluZ1wiO1xuaW1wb3J0IHtcbiAgQ291bnRBeGlzRnJvbVplcm8sXG4gIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCxcbiAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gIEhhbGZXaWR0aCxcbiAgTWF4SW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkLFxuICBNYXhNZXNzYWdlQWdlVGhyZXNob2xkLFxuICBNYXhNZXNzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVldWVBbGFybUZhY3RvcnksXG4gIFRpbWVBeGlzU2Vjb25kc0Zyb21aZXJvLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0LFxuICBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3ksXG59IGZyb20gXCIuLi8uLi9kYXNoYm9hcmRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlRGxxQWxhcm1zIHtcbiAgcmVhZG9ubHkgYWRkRGVhZExldHRlclF1ZXVlTWF4U2l6ZUFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBNYXhNZXNzYWdlQ291bnRUaHJlc2hvbGRcbiAgPjtcblxuICByZWFkb25seSBhZGREZWFkTGV0dGVyUXVldWVNYXhNZXNzYWdlQWdlQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1heE1lc3NhZ2VBZ2VUaHJlc2hvbGRcbiAgPjtcblxuICAvKipcbiAgICogQWxhcm0gb24gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBhZGRlZCB0byBhIHF1ZXVlLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhpcyBjb3JyZXNwb25kcyB3aXRoIHRoZSBOdW1iZXJPZk1lc3NhZ2VzU2VudCBtZXRyaWMsIHdoaWNoIGRvZXMgbm90IGNhcHR1cmUgbWVzc2FnZXMgc2VudCB0byB0aGUgRExRXG4gICAqIGFzIGEgcmVzdWx0IG9mIGEgZmFpbGVkIHByb2Nlc3NpbmcgYXR0ZW1wdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTU2ltcGxlUXVldWVTZXJ2aWNlL2xhdGVzdC9TUVNEZXZlbG9wZXJHdWlkZS9zcXMtZGVhZC1sZXR0ZXItcXVldWVzLmh0bWwjc3FzLWRscS1udW1iZXItb2YtbWVzc2FnZXNcbiAgICovXG4gIHJlYWRvbmx5IGFkZERlYWRMZXR0ZXJRdWV1ZU1heEluY29taW5nTWVzc2FnZXNBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgTWF4SW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3FzUXVldWVNb25pdG9yaW5nV2l0aERscVByb3BzXG4gIGV4dGVuZHMgU3FzUXVldWVNb25pdG9yaW5nUHJvcHMsXG4gICAgQmFzZURscUFsYXJtcyB7XG4gIHJlYWRvbmx5IGRlYWRMZXR0ZXJRdWV1ZTogSVF1ZXVlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgRExRIG1vbml0b3Jpbmcgc2hvdWxkIGJlIGFkZGVkIHRvIHN1bW1hcnkgZGFzaGJvYXJkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFkZERlYWRMZXR0ZXJRdWV1ZVRvU3VtbWFyeURhc2hib2FyZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxIGV4dGVuZHMgU3FzUXVldWVNb25pdG9yaW5nIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlYWRMZXR0ZXJUaXRsZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVhZExldHRlclVybD86IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFkZERlYWRMZXR0ZXJRdWV1ZVRvU3VtbWFyeURhc2hib2FyZDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlQWxhcm1GYWN0b3J5OiBRdWV1ZUFsYXJtRmFjdG9yeTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlYWRMZXR0ZXJDb3VudEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVhZExldHRlckFnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBkZWFkTGV0dGVyUXVldWVWaXNpYmxlTWVzc2FnZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWFkTGV0dGVyUXVldWVJbmNvbWluZ01lc3NhZ2VzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlT2xkZXN0TWVzc2FnZUFnZU1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogTW9uaXRvcmluZ1Njb3BlLCBwcm9wczogU3FzUXVldWVNb25pdG9yaW5nV2l0aERscVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzLCB0cnVlKTtcblxuICAgIGNvbnN0IGRlYWRMZXR0ZXJNZXRyaWNGYWN0b3J5ID0gbmV3IFNxc1F1ZXVlTWV0cmljRmFjdG9yeShcbiAgICAgIHNjb3BlLmNyZWF0ZU1ldHJpY0ZhY3RvcnkoKSxcbiAgICAgIHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIHF1ZXVlOiBwcm9wcy5kZWFkTGV0dGVyUXVldWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBuYW1pbmdTdHJhdGVneSA9IG5ldyBNb25pdG9yaW5nTmFtaW5nU3RyYXRlZ3koe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBuYW1lZENvbnN0cnVjdDogcHJvcHMuZGVhZExldHRlclF1ZXVlLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiB0aGlzLnJlc29sdmVRdWV1ZU5hbWUocHJvcHMuZGVhZExldHRlclF1ZXVlKSxcbiAgICB9KTtcblxuICAgIHRoaXMuZGVhZExldHRlclRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5kZWFkTGV0dGVyVXJsID0gc2NvcGVcbiAgICAgIC5jcmVhdGVBd3NDb25zb2xlVXJsRmFjdG9yeSgpXG4gICAgICAuZ2V0U3FzUXVldWVVcmwocHJvcHMuZGVhZExldHRlclF1ZXVlLnF1ZXVlVXJsKTtcbiAgICB0aGlzLmFkZERlYWRMZXR0ZXJRdWV1ZVRvU3VtbWFyeURhc2hib2FyZCA9XG4gICAgICBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVUb1N1bW1hcnlEYXNoYm9hcmQgPz8gZmFsc2U7XG5cbiAgICBjb25zdCBkZWFkTGV0dGVyQWxhcm1GYWN0b3J5ID0gdGhpcy5jcmVhdGVBbGFybUZhY3RvcnkoXG4gICAgICBuYW1pbmdTdHJhdGVneS5yZXNvbHZlQWxhcm1GcmllbmRseU5hbWUoKSArIFwiLURMUVwiLFxuICAgICk7XG4gICAgdGhpcy5kZWFkTGV0dGVyQ291bnRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuZGVhZExldHRlckFnZUFubm90YXRpb25zID0gW107XG5cbiAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUFsYXJtRmFjdG9yeSA9IG5ldyBRdWV1ZUFsYXJtRmFjdG9yeShcbiAgICAgIGRlYWRMZXR0ZXJBbGFybUZhY3RvcnksXG4gICAgKTtcbiAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZVZpc2libGVNZXNzYWdlc01ldHJpYyA9XG4gICAgICBkZWFkTGV0dGVyTWV0cmljRmFjdG9yeS5tZXRyaWNBcHByb3hpbWF0ZVZpc2libGVNZXNzYWdlQ291bnQoKTtcbiAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUluY29taW5nTWVzc2FnZXNNZXRyaWMgPVxuICAgICAgZGVhZExldHRlck1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdNZXNzYWdlQ291bnQoKTtcbiAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZU9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWMgPVxuICAgICAgZGVhZExldHRlck1ldHJpY0ZhY3RvcnkubWV0cmljQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2VJblNlY29uZHMoKTtcblxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhTaXplQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhTaXplQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPVxuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUFsYXJtRmFjdG9yeS5hZGRNYXhRdWV1ZU1lc3NhZ2VDb3VudEFsYXJtKFxuICAgICAgICAgIHRoaXMuZGVhZExldHRlclF1ZXVlVmlzaWJsZU1lc3NhZ2VzTWV0cmljLFxuICAgICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgIHRoaXMuZGVhZExldHRlckNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhNZXNzYWdlQWdlQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhNZXNzYWdlQWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPVxuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUFsYXJtRmFjdG9yeS5hZGRNYXhRdWV1ZU1lc3NhZ2VBZ2VBbGFybShcbiAgICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZU9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWMsXG4gICAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgICBkaXNhbWJpZ3VhdG9yLFxuICAgICAgICApO1xuICAgICAgdGhpcy5kZWFkTGV0dGVyQWdlQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGREZWFkTGV0dGVyUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPVxuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUFsYXJtRmFjdG9yeS5hZGRNYXhRdWV1ZUluY29taW5nTWVzc2FnZXNDb3VudEFsYXJtKFxuICAgICAgICAgIHRoaXMuZGVhZExldHRlclF1ZXVlSW5jb21pbmdNZXNzYWdlc01ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuXG4gICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gIH1cblxuICBzdW1tYXJ5V2lkZ2V0cygpOiBJV2lkZ2V0W10ge1xuICAgIGNvbnN0IGFkZFRvU3VtbWFyeSA9IHRoaXMuYWRkRGVhZExldHRlclF1ZXVlVG9TdW1tYXJ5RGFzaGJvYXJkID8/IHRydWU7XG5cbiAgICBpZiAoIWFkZFRvU3VtbWFyeSkge1xuICAgICAgLy8gZG8gbm90IHNob3cgdGhlIERMUSB3aWRnZXRzIGF0IGFsbFxuICAgICAgcmV0dXJuIHN1cGVyLnN1bW1hcnlXaWRnZXRzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLnN1cGVyLnN1bW1hcnlXaWRnZXRzKCksXG4gICAgICB0aGlzLmNyZWF0ZURlYWRMZXR0ZXJNZXNzYWdlQ291bnRXaWRnZXQoXG4gICAgICAgIEhhbGZXaWR0aCxcbiAgICAgICAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gICAgICApLFxuICAgICAgdGhpcy5jcmVhdGVEZWFkTGV0dGVyTWVzc2FnZUFnZVdpZGdldChcbiAgICAgICAgSGFsZldpZHRoLFxuICAgICAgICBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uc3VwZXIud2lkZ2V0cygpLFxuICAgICAgdGhpcy5jcmVhdGVEZWFkTGV0dGVyVGl0bGVXaWRnZXQoKSxcbiAgICAgIHRoaXMuY3JlYXRlRGVhZExldHRlck1lc3NhZ2VDb3VudFdpZGdldChcbiAgICAgICAgSGFsZldpZHRoLFxuICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICApLFxuICAgICAgdGhpcy5jcmVhdGVEZWFkTGV0dGVyTWVzc2FnZUFnZVdpZGdldChcbiAgICAgICAgSGFsZldpZHRoLFxuICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlRGVhZExldHRlclRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiU1FTIERlYWQtTGV0dGVyIFF1ZXVlXCIsXG4gICAgICB0aXRsZTogdGhpcy5kZWFkTGV0dGVyVGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5kZWFkTGV0dGVyVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZURlYWRMZXR0ZXJNZXNzYWdlQ291bnRXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiRExROiBNZXNzYWdlIENvdW50XCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMuZGVhZExldHRlclF1ZXVlVmlzaWJsZU1lc3NhZ2VzTWV0cmljLFxuICAgICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZUluY29taW5nTWVzc2FnZXNNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5kZWFkTGV0dGVyQ291bnRBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVEZWFkTGV0dGVyTWVzc2FnZUFnZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJETFE6IE9sZGVzdCBNZXNzYWdlIEFnZVwiLFxuICAgICAgbGVmdDogW3RoaXMuZGVhZExldHRlclF1ZXVlT2xkZXN0TWVzc2FnZUFnZU1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFRpbWVBeGlzU2Vjb25kc0Zyb21aZXJvLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLmRlYWRMZXR0ZXJBZ2VBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuIl19