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

156 lines 28.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.SqsQueueMonitoring = 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 common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class SqsQueueMonitoring extends common_1.Monitoring { constructor(scope, props, invokedFromSuper) { super(scope, props); const namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.queue, fallbackConstructName: this.resolveQueueName(props.queue), }); this.title = namingStrategy.resolveHumanReadableName(); this.queueUrl = scope .createAwsConsoleUrlFactory() .getSqsQueueUrl(props.queue.queueUrl); const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName()); this.queueAlarmFactory = new common_1.QueueAlarmFactory(alarmFactory); this.countAnnotations = []; this.ageAnnotations = []; this.timeToDrainAnnotations = []; const metricFactory = new SqsQueueMetricFactory_1.SqsQueueMetricFactory(scope.createMetricFactory(), props); this.visibleMessagesMetric = metricFactory.metricApproximateVisibleMessageCount(); this.incomingMessagesMetric = metricFactory.metricIncomingMessageCount(); this.deletedMessagesMetric = metricFactory.metricDeletedMessageCount(); this.oldestMessageAgeMetric = metricFactory.metricApproximateAgeOfOldestMessageInSeconds(); this.messageSizeMetric = metricFactory.metricAverageMessageSizeInBytes(); this.productionRateMetric = metricFactory.metricProductionRate(); this.consumptionRateMetric = metricFactory.metricConsumptionRate(); this.timeToDrainMetric = metricFactory.metricTimeToDrain(); for (const disambiguator in props.addQueueMinSizeAlarm) { const alarmProps = props.addQueueMinSizeAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMinQueueMessageCountAlarm(this.visibleMessagesMetric, alarmProps, disambiguator); this.countAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addQueueMaxSizeAlarm) { const alarmProps = props.addQueueMaxSizeAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMaxQueueMessageCountAlarm(this.visibleMessagesMetric, alarmProps, disambiguator); this.countAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addQueueMaxMessageAgeAlarm) { const alarmProps = props.addQueueMaxMessageAgeAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMaxQueueMessageAgeAlarm(this.oldestMessageAgeMetric, alarmProps, disambiguator); this.ageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addQueueMaxTimeToDrainMessagesAlarm) { const alarmProps = props.addQueueMaxTimeToDrainMessagesAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMaxQueueTimeToDrainMessagesAlarm(this.timeToDrainMetric, alarmProps, disambiguator); this.timeToDrainAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addQueueMinIncomingMessagesAlarm) { const alarmProps = props.addQueueMinIncomingMessagesAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMinQueueIncomingMessagesCountAlarm(this.incomingMessagesMetric, alarmProps, disambiguator); this.countAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addQueueMaxIncomingMessagesAlarm) { const alarmProps = props.addQueueMaxIncomingMessagesAlarm[disambiguator]; const createdAlarm = this.queueAlarmFactory.addMaxQueueIncomingMessagesCountAlarm(this.incomingMessagesMetric, alarmProps, disambiguator); this.countAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } if (!(invokedFromSuper ?? false)) { // invoke only when not called from super class, so it is not called twice // TODO: find a more elegant solution for this props.useCreatedAlarms?.consume(this.createdAlarms()); } } summaryWidgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createProducerAndConsumerRateWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), this.createTimeToDrainWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight)), new aws_cloudwatch_1.Row(this.createMessageCountWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight), this.createMessageAgeWidget(common_1.HalfWidth, common_1.DefaultSummaryWidgetHeight)), ]; } widgets() { return [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createMessageCountWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createMessageAgeWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight), this.createMessageSizeWidget(common_1.ThirdWidth, common_1.DefaultGraphWidgetHeight)), new aws_cloudwatch_1.Row(this.createProducerAndConsumerRateWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createTimeToDrainWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight)), ]; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "SQS Queue", title: this.title, goToLinkUrl: this.queueUrl, }); } createMessageCountWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Message Count", left: [this.visibleMessagesMetric, this.incomingMessagesMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.countAnnotations, }); } createMessageAgeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Oldest Message Age", left: [this.oldestMessageAgeMetric], leftYAxis: common_1.TimeAxisSecondsFromZero, leftAnnotations: this.ageAnnotations, }); } createMessageSizeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Message Size", left: [this.messageSizeMetric], leftYAxis: common_1.SizeAxisBytesFromZero, }); } createProducerAndConsumerRateWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Producer vs Consumer (rate)", left: [this.productionRateMetric, this.consumptionRateMetric], leftYAxis: common_1.RateAxisFromZero, }); } createTimeToDrainWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Time to drain", left: [this.timeToDrainMetric], leftYAxis: common_1.TimeAxisSecondsFromZero, }); } resolveQueueName(queue) { // try to take the name (if specified) instead of token return queue.node.defaultChild?.queueName; } } exports.SqsQueueMonitoring = SqsQueueMonitoring; _a = JSII_RTTI_SYMBOL_1; SqsQueueMonitoring[_a] = { fqn: "cdk-monitoring-constructs.SqsQueueMonitoring", version: "9.7.1" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FzUXVldWVNb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiU3FzUXVldWVNb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBS29DO0FBR3BDLG1FQUdpQztBQUNqQyx5Q0FvQnNCO0FBQ3RCLCtDQUd5QjtBQTRCekIsTUFBYSxrQkFBbUIsU0FBUSxtQkFBVTtJQWtCaEQsWUFDRSxLQUFzQixFQUN0QixLQUE4QixFQUM5QixnQkFBMEI7UUFFMUIsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixNQUFNLGNBQWMsR0FBRyxJQUFJLG9DQUF3QixDQUFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLGNBQWMsRUFBRSxLQUFLLENBQUMsS0FBSztZQUMzQixxQkFBcUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztTQUMxRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSzthQUNsQiwwQkFBMEIsRUFBRTthQUM1QixjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV4QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQzFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUMxQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksMEJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1FBRWpDLE1BQU0sYUFBYSxHQUFHLElBQUksNkNBQXFCLENBQzdDLEtBQUssQ0FBQyxt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SSxDQUFDLFlBQXlCLEVBQUUsU0FBUyxDQUFDO0lBQzFELENBQUM7O0FBcE9ILGdEQXFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEdyYXBoV2lkZ2V0LFxuICBIb3Jpem9udGFsQW5ub3RhdGlvbixcbiAgSVdpZGdldCxcbiAgUm93LFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IENmblF1ZXVlLCBJUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuXG5pbXBvcnQge1xuICBTcXNRdWV1ZU1ldHJpY0ZhY3RvcnksXG4gIFNxc1F1ZXVlTWV0cmljRmFjdG9yeVByb3BzLFxufSBmcm9tIFwiLi9TcXNRdWV1ZU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBIYWxmV2lkdGgsXG4gIE1heEluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZCxcbiAgTWF4TWVzc2FnZUFnZVRocmVzaG9sZCxcbiAgTWF4TWVzc2FnZUNvdW50VGhyZXNob2xkLFxuICBNYXhUaW1lVG9EcmFpblRocmVzaG9sZCxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbiAgTWluSW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkLFxuICBNaW5NZXNzYWdlQ291bnRUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVldWVBbGFybUZhY3RvcnksXG4gIFJhdGVBeGlzRnJvbVplcm8sXG4gIFNpemVBeGlzQnl0ZXNGcm9tWmVybyxcbiAgVGhpcmRXaWR0aCxcbiAgVGltZUF4aXNTZWNvbmRzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VTcXNRdWV1ZUFsYXJtcyB7XG4gIHJlYWRvbmx5IGFkZFF1ZXVlTWluU2l6ZUFsYXJtPzogUmVjb3JkPHN0cmluZywgTWluTWVzc2FnZUNvdW50VGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUXVldWVNYXhTaXplQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBNYXhNZXNzYWdlQ291bnRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRRdWV1ZU1heE1lc3NhZ2VBZ2VBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heE1lc3NhZ2VBZ2VUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRRdWV1ZU1heFRpbWVUb0RyYWluTWVzc2FnZXNBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgTWF4VGltZVRvRHJhaW5UaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkUXVldWVNaW5JbmNvbWluZ01lc3NhZ2VzQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIE1pbkluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZFxuICA+O1xuICByZWFkb25seSBhZGRRdWV1ZU1heEluY29taW5nTWVzc2FnZXNBbGFybT86IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgTWF4SW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3FzUXVldWVNb25pdG9yaW5nT3B0aW9uc1xuICBleHRlbmRzIEJhc2VTcXNRdWV1ZUFsYXJtcyxcbiAgICBCYXNlTW9uaXRvcmluZ1Byb3BzIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3FzUXVldWVNb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBTcXNRdWV1ZU1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBTcXNRdWV1ZU1vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBTcXNRdWV1ZU1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcXVldWVVcmw/OiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcXVldWVBbGFybUZhY3Rvcnk6IFF1ZXVlQWxhcm1GYWN0b3J5O1xuICByZWFkb25seSBjb3VudEFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBhZ2VBbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcbiAgcmVhZG9ubHkgdGltZVRvRHJhaW5Bbm5vdGF0aW9uczogSG9yaXpvbnRhbEFubm90YXRpb25bXTtcblxuICByZWFkb25seSB2aXNpYmxlTWVzc2FnZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGluY29taW5nTWVzc2FnZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGRlbGV0ZWRNZXNzYWdlc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgb2xkZXN0TWVzc2FnZUFnZU1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWVzc2FnZVNpemVNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHByb2R1Y3Rpb25SYXRlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBjb25zdW1wdGlvblJhdGVNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHRpbWVUb0RyYWluTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBNb25pdG9yaW5nU2NvcGUsXG4gICAgcHJvcHM6IFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzLFxuICAgIGludm9rZWRGcm9tU3VwZXI/OiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgcHJvcHMpO1xuXG4gICAgY29uc3QgbmFtaW5nU3RyYXRlZ3kgPSBuZXcgTW9uaXRvcmluZ05hbWluZ1N0cmF0ZWd5KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgbmFtZWRDb25zdHJ1Y3Q6IHByb3BzLnF1ZXVlLFxuICAgICAgZmFsbGJhY2tDb25zdHJ1Y3ROYW1lOiB0aGlzLnJlc29sdmVRdWV1ZU5hbWUocHJvcHMucXVldWUpLFxuICAgIH0pO1xuXG4gICAgdGhpcy50aXRsZSA9IG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVIdW1hblJlYWRhYmxlTmFtZSgpO1xuICAgIHRoaXMucXVldWVVcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRTcXNRdWV1ZVVybChwcm9wcy5xdWV1ZS5xdWV1ZVVybCk7XG5cbiAgICBjb25zdCBhbGFybUZhY3RvcnkgPSB0aGlzLmNyZWF0ZUFsYXJtRmFjdG9yeShcbiAgICAgIG5hbWluZ1N0cmF0ZWd5LnJlc29sdmVBbGFybUZyaWVuZGx5TmFtZSgpLFxuICAgICk7XG4gICAgdGhpcy5xdWV1ZUFsYXJtRmFjdG9yeSA9IG5ldyBRdWV1ZUFsYXJtRmFjdG9yeShhbGFybUZhY3RvcnkpO1xuICAgIHRoaXMuY291bnRBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMuYWdlQW5ub3RhdGlvbnMgPSBbXTtcbiAgICB0aGlzLnRpbWVUb0RyYWluQW5ub3RhdGlvbnMgPSBbXTtcblxuICAgIGNvbnN0IG1ldHJpY0ZhY3RvcnkgPSBuZXcgU3FzUXVldWVNZXRyaWNGYWN0b3J5KFxuICAgICAgc2NvcGUuY3JlYXRlTWV0cmljRmFjdG9yeSgpLFxuICAgICAgcHJvcHMsXG4gICAgKTtcbiAgICB0aGlzLnZpc2libGVNZXNzYWdlc01ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0FwcHJveGltYXRlVmlzaWJsZU1lc3NhZ2VDb3VudCgpO1xuICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdNZXNzYWdlQ291bnQoKTtcbiAgICB0aGlzLmRlbGV0ZWRNZXNzYWdlc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljRGVsZXRlZE1lc3NhZ2VDb3VudCgpO1xuICAgIHRoaXMub2xkZXN0TWVzc2FnZUFnZU1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0FwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlSW5TZWNvbmRzKCk7XG4gICAgdGhpcy5tZXNzYWdlU2l6ZU1ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljQXZlcmFnZU1lc3NhZ2VTaXplSW5CeXRlcygpO1xuICAgIHRoaXMucHJvZHVjdGlvblJhdGVNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1Byb2R1Y3Rpb25SYXRlKCk7XG4gICAgdGhpcy5jb25zdW1wdGlvblJhdGVNZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0NvbnN1bXB0aW9uUmF0ZSgpO1xuICAgIHRoaXMudGltZVRvRHJhaW5NZXRyaWMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY1RpbWVUb0RyYWluKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNaW5TaXplQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRRdWV1ZU1pblNpemVBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWluUXVldWVNZXNzYWdlQ291bnRBbGFybShcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZXNNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5jb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNYXhTaXplQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRRdWV1ZU1heFNpemVBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWF4UXVldWVNZXNzYWdlQ291bnRBbGFybShcbiAgICAgICAgdGhpcy52aXNpYmxlTWVzc2FnZXNNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5jb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNYXhNZXNzYWdlQWdlQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRRdWV1ZU1heE1lc3NhZ2VBZ2VBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWF4UXVldWVNZXNzYWdlQWdlQWxhcm0oXG4gICAgICAgIHRoaXMub2xkZXN0TWVzc2FnZUFnZU1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLmFnZUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUXVldWVNYXhUaW1lVG9EcmFpbk1lc3NhZ2VzQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRRdWV1ZU1heFRpbWVUb0RyYWluTWVzc2FnZXNBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMucXVldWVBbGFybUZhY3RvcnkuYWRkTWF4UXVldWVUaW1lVG9EcmFpbk1lc3NhZ2VzQWxhcm0oXG4gICAgICAgICAgdGhpcy50aW1lVG9EcmFpbk1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnRpbWVUb0RyYWluQW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRRdWV1ZU1pbkluY29taW5nTWVzc2FnZXNBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZFF1ZXVlTWluSW5jb21pbmdNZXNzYWdlc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID1cbiAgICAgICAgdGhpcy5xdWV1ZUFsYXJtRmFjdG9yeS5hZGRNaW5RdWV1ZUluY29taW5nTWVzc2FnZXNDb3VudEFsYXJtKFxuICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlc01ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLmNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRRdWV1ZU1heEluY29taW5nTWVzc2FnZXNBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZFF1ZXVlTWF4SW5jb21pbmdNZXNzYWdlc0FsYXJtW2Rpc2FtYmlndWF0b3JdO1xuICAgICAgY29uc3QgY3JlYXRlZEFsYXJtID1cbiAgICAgICAgdGhpcy5xdWV1ZUFsYXJtRmFjdG9yeS5hZGRNYXhRdWV1ZUluY29taW5nTWVzc2FnZXNDb3VudEFsYXJtKFxuICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlc01ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLmNvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGlmICghKGludm9rZWRGcm9tU3VwZXIgPz8gZmFsc2UpKSB7XG4gICAgICAvLyBpbnZva2Ugb25seSB3aGVuIG5vdCBjYWxsZWQgZnJvbSBzdXBlciBjbGFzcywgc28gaXQgaXMgbm90IGNhbGxlZCB0d2ljZVxuICAgICAgLy8gVE9ETzogZmluZCBhIG1vcmUgZWxlZ2FudCBzb2x1dGlvbiBmb3IgdGhpc1xuICAgICAgcHJvcHMudXNlQ3JlYXRlZEFsYXJtcz8uY29uc3VtZSh0aGlzLmNyZWF0ZWRBbGFybXMoKSk7XG4gICAgfVxuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVQcm9kdWNlckFuZENvbnN1bWVyUmF0ZVdpZGdldChcbiAgICAgICAgICBIYWxmV2lkdGgsXG4gICAgICAgICAgRGVmYXVsdFN1bW1hcnlXaWRnZXRIZWlnaHQsXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuY3JlYXRlVGltZVRvRHJhaW5XaWRnZXQoSGFsZldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlQ291bnRXaWRnZXQoSGFsZldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZUFnZVdpZGdldChIYWxmV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlQ291bnRXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVNZXNzYWdlQWdlV2lkZ2V0KFRoaXJkV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlTWVzc2FnZVNpemVXaWRnZXQoVGhpcmRXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgICBuZXcgUm93KFxuICAgICAgICB0aGlzLmNyZWF0ZVByb2R1Y2VyQW5kQ29uc3VtZXJSYXRlV2lkZ2V0KFxuICAgICAgICAgIEhhbGZXaWR0aCxcbiAgICAgICAgICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuY3JlYXRlVGltZVRvRHJhaW5XaWRnZXQoSGFsZldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgY3JlYXRlVGl0bGVXaWRnZXQoKSB7XG4gICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nSGVhZGVyV2lkZ2V0KHtcbiAgICAgIGZhbWlseTogXCJTUVMgUXVldWVcIixcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgZ29Ub0xpbmtVcmw6IHRoaXMucXVldWVVcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVNZXNzYWdlQ291bnRXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTWVzc2FnZSBDb3VudFwiLFxuICAgICAgbGVmdDogW3RoaXMudmlzaWJsZU1lc3NhZ2VzTWV0cmljLCB0aGlzLmluY29taW5nTWVzc2FnZXNNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5jb3VudEFubm90YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTWVzc2FnZUFnZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJPbGRlc3QgTWVzc2FnZSBBZ2VcIixcbiAgICAgIGxlZnQ6IFt0aGlzLm9sZGVzdE1lc3NhZ2VBZ2VNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBUaW1lQXhpc1NlY29uZHNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5hZ2VBbm5vdGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZU1lc3NhZ2VTaXplV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIk1lc3NhZ2UgU2l6ZVwiLFxuICAgICAgbGVmdDogW3RoaXMubWVzc2FnZVNpemVNZXRyaWNdLFxuICAgICAgbGVmdFlBeGlzOiBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVQcm9kdWNlckFuZENvbnN1bWVyUmF0ZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJQcm9kdWNlciB2cyBDb25zdW1lciAocmF0ZSlcIixcbiAgICAgIGxlZnQ6IFt0aGlzLnByb2R1Y3Rpb25SYXRlTWV0cmljLCB0aGlzLmNvbnN1bXB0aW9uUmF0ZU1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFJhdGVBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVUaW1lVG9EcmFpbldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJUaW1lIHRvIGRyYWluXCIsXG4gICAgICBsZWZ0OiBbdGhpcy50aW1lVG9EcmFpbk1ldHJpY10sXG4gICAgICBsZWZ0WUF4aXM6IFRpbWVBeGlzU2Vjb25kc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc29sdmVRdWV1ZU5hbWUocXVldWU6IElRdWV1ZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gdHJ5IHRvIHRha2UgdGhlIG5hbWUgKGlmIHNwZWNpZmllZCkgaW5zdGVhZCBvZiB0b2tlblxuICAgIHJldHVybiAocXVldWUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuUXVldWUpPy5xdWV1ZU5hbWU7XG4gIH1cbn1cbiJdfQ==