cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
112 lines • 20.1 kB
JavaScript
"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