cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
211 lines • 35.6 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KinesisDataStreamMonitoring = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
const KinesisDataStreamMetricFactory_1 = require("./KinesisDataStreamMetricFactory");
const common_1 = require("../../common");
const dashboard_1 = require("../../dashboard");
class KinesisDataStreamMonitoring extends common_1.Monitoring {
constructor(scope, props) {
super(scope, props);
const namingStrategy = new dashboard_1.MonitoringNamingStrategy({
...props,
fallbackConstructName: props.streamName,
});
this.title = namingStrategy.resolveHumanReadableName();
this.streamUrl = scope
.createAwsConsoleUrlFactory()
.getKinesisDataStreamUrl(props.streamName);
const alarmFactory = this.createAlarmFactory(namingStrategy.resolveAlarmFriendlyName());
this.kinesisAlarmFactory = new common_1.KinesisAlarmFactory(alarmFactory);
this.provisionedCapacityAnnotations = [];
this.ageAnnotations = [];
this.recordCountAnnotations = [];
const metricFactory = new KinesisDataStreamMetricFactory_1.KinesisDataStreamMetricFactory(scope.createMetricFactory(), props);
this.metricGetRecordSumBytes = metricFactory.metricGetRecordsSumBytes();
this.metricGetRecordsIteratorAge =
metricFactory.metricGetRecordsIteratorAgeMaxMs();
this.metricGetRecordsLatencyAverage =
metricFactory.metricGetRecordsLatencyAverageMs();
this.metricGetRecordsSumCount = metricFactory.metricGetRecordsSumCount();
this.metricGetRecordsSuccessCount =
metricFactory.metricGetRecordsSuccessCount();
this.incomingDataSumBytesMetric =
metricFactory.metricIncomingDataSumBytes();
this.incomingDataSumCountMetric =
metricFactory.metricIncomingDataSumCount();
this.putRecordSumBytesMetric = metricFactory.metricPutRecordSumBytes();
this.putRecordLatencyAverageMetric =
metricFactory.metricPutRecordLatencyAverageMs();
this.putRecordSuccessCountMetric =
metricFactory.metricPutRecordSuccessCount();
this.putRecordsSumBytesMetric = metricFactory.metricPutRecordsSumBytes();
this.putRecordsLatencyAverageMetric =
metricFactory.metricPutRecordsLatencyAverageMs();
this.putRecordsSuccessCountMetric =
metricFactory.metricPutRecordsSuccessCount();
this.putRecordsTotalRecordsCountMetric =
metricFactory.metricPutRecordsTotalRecordsCount();
this.putRecordsSuccessfulRecordsCountMetric =
metricFactory.metricPutRecordsSuccessfulRecordsCount();
this.putRecordsThrottledRecordsCountMetric =
metricFactory.metricPutRecordsThrottledRecordsCount();
this.putRecordsFailedRecordsCountMetric =
metricFactory.metricPutRecordsFailedRecordsCount();
this.readProvisionedThroughputExceededMetric =
metricFactory.metricReadProvisionedThroughputExceeded();
this.writeProvisionedThroughputExceededMetric =
metricFactory.metricWriteProvisionedThroughputExceeded();
for (const disambiguator in props.addIteratorMaxAgeAlarm) {
const alarmProps = props.addIteratorMaxAgeAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addIteratorMaxAgeAlarm(this.metricGetRecordsIteratorAge, alarmProps, disambiguator);
this.ageAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addPutRecordsThrottledAlarm) {
const alarmProps = props.addPutRecordsThrottledAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addPutRecordsThrottledAlarm(this.putRecordsThrottledRecordsCountMetric, alarmProps, disambiguator);
this.recordCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addPutRecordsFailedAlarm) {
const alarmProps = props.addPutRecordsFailedAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addPutRecordsFailedAlarm(this.putRecordsFailedRecordsCountMetric, alarmProps, disambiguator);
this.recordCountAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addReadProvisionedThroughputExceededAlarm) {
const alarmProps = props.addReadProvisionedThroughputExceededAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addProvisionedReadThroughputExceededAlarm(this.readProvisionedThroughputExceededMetric, alarmProps, disambiguator);
this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
for (const disambiguator in props.addWriteProvisionedThroughputExceededAlarm) {
const alarmProps = props.addWriteProvisionedThroughputExceededAlarm[disambiguator];
const createdAlarm = this.kinesisAlarmFactory.addProvisionedWriteThroughputExceededAlarm(this.writeProvisionedThroughputExceededMetric, alarmProps, disambiguator);
this.provisionedCapacityAnnotations.push(createdAlarm.annotation);
this.addAlarm(createdAlarm);
}
props.useCreatedAlarms?.consume(this.createdAlarms());
}
summaryWidgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultSummaryWidgetHeight)),
];
}
widgets() {
return [
this.createTitleWidget(),
new aws_cloudwatch_1.Row(this.createIncomingDataWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createIteratorAgeWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createCapacityWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)),
this.createFirstAdditionalRow(),
this.createSecondAdditionalRow(),
];
}
createFirstAdditionalRow() {
return new aws_cloudwatch_1.Row(this.createRecordSizeWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight), this.createOperationWidget(common_1.HalfWidth, common_1.DefaultGraphWidgetHeight));
}
createSecondAdditionalRow() {
return new aws_cloudwatch_1.Row(this.createRecordNumberWidget(common_1.FullWidth, common_1.DefaultGraphWidgetHeight));
}
createTitleWidget() {
return new dashboard_1.MonitoringHeaderWidget({
family: "Kinesis Data Stream",
title: this.title,
goToLinkUrl: this.streamUrl,
});
}
createIncomingDataWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Incoming",
left: [this.incomingDataSumCountMetric],
leftYAxis: common_1.CountAxisFromZero,
});
}
createIteratorAgeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Iterator",
left: [this.metricGetRecordsIteratorAge],
leftAnnotations: this.ageAnnotations,
leftYAxis: common_1.TimeAxisMillisFromZero,
});
}
createLatencyWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Latency (Average)",
left: [
this.metricGetRecordsLatencyAverage,
this.putRecordLatencyAverageMetric,
this.putRecordsLatencyAverageMetric,
],
leftYAxis: common_1.TimeAxisMillisFromZero,
});
}
createCapacityWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Provisioned Capacity Exceeded",
left: [
this.readProvisionedThroughputExceededMetric,
this.writeProvisionedThroughputExceededMetric,
],
leftYAxis: common_1.CountAxisFromZero,
leftAnnotations: this.provisionedCapacityAnnotations,
});
}
createRecordSizeWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Bytes",
left: [
this.metricGetRecordSumBytes,
this.putRecordSumBytesMetric,
this.putRecordsSumBytesMetric,
],
leftYAxis: common_1.SizeAxisBytesFromZero,
});
}
createOperationWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Successful Operations",
left: [
this.metricGetRecordsSuccessCount,
this.putRecordSuccessCountMetric,
this.putRecordsSuccessCountMetric,
],
leftYAxis: common_1.CountAxisFromZero,
});
}
createRecordNumberWidget(width, height) {
return new aws_cloudwatch_1.GraphWidget({
width,
height,
title: "Records",
left: [
this.metricGetRecordsSumCount,
this.putRecordsTotalRecordsCountMetric,
this.putRecordsSuccessfulRecordsCountMetric,
this.putRecordsFailedRecordsCountMetric,
this.putRecordsThrottledRecordsCountMetric,
],
leftAnnotations: this.recordCountAnnotations,
leftYAxis: common_1.CountAxisFromZero,
});
}
}
exports.KinesisDataStreamMonitoring = KinesisDataStreamMonitoring;
_a = JSII_RTTI_SYMBOL_1;
KinesisDataStreamMonitoring[_a] = { fqn: "cdk-monitoring-constructs.KinesisDataStreamMonitoring", version: "10.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0RBS29DO0FBRXBDLHFGQUcwQztBQUMxQyx5Q0FpQnNCO0FBQ3RCLCtDQUd5QjtBQXlCekIsTUFBYSwyQkFBNEIsU0FBUSxtQkFBVTtJQTZCekQsWUFBWSxLQUFzQixFQUFFLEtBQXVDO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxvQ0FBd0IsQ0FBQztZQUNsRCxHQUFHLEtBQUs7WUFDUixxQkFBcUIsRUFBRSxLQUFLLENBQUMsVUFBVTtTQUN4QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSzthQUNuQiwwQkFBMEIsRUFBRTthQUM1Qix1QkFBdUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUMxQyxjQUFjLENBQUMsd0JBQXdCLEVBQUUsQ0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLDRCQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUVqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLCtEQUE4QixDQUN0RCxLQUFLLENBQUMsbUJBQW1CLEVBQUUsRUFDM0IsS0FBSyxDQUNOLENBQUM7UUFDRixJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFB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QUFrQztnQkFDdkMsSUFBSSxDQUFDLHFDQUFxQzthQUMzQztZQUNELGVBQWUsRUFBRSxJQUFJLENBQUMsc0JBQXNCO1lBQzVDLFNBQVMsRUFBRSwwQkFBaUI7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUE3Ukgsa0VBOFJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JhcGhXaWRnZXQsXG4gIEhvcml6b250YWxBbm5vdGF0aW9uLFxuICBJV2lkZ2V0LFxuICBSb3csXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuXG5pbXBvcnQge1xuICBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnksXG4gIEtpbmVzaXNEYXRhU3RyZWFtTWV0cmljRmFjdG9yeVByb3BzLFxufSBmcm9tIFwiLi9LaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnlcIjtcbmltcG9ydCB7XG4gIEJhc2VNb25pdG9yaW5nUHJvcHMsXG4gIENvdW50QXhpc0Zyb21aZXJvLFxuICBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQsXG4gIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0LFxuICBGdWxsV2lkdGgsXG4gIEhhbGZXaWR0aCxcbiAgS2luZXNpc0FsYXJtRmFjdG9yeSxcbiAgTWF4SXRlcmF0b3JBZ2VUaHJlc2hvbGQsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG4gIE1vbml0b3JpbmcsXG4gIE1vbml0b3JpbmdTY29wZSxcbiAgUXVhcnRlcldpZHRoLFxuICBSZWNvcmRzRmFpbGVkVGhyZXNob2xkLFxuICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkLFxuICBTaXplQXhpc0J5dGVzRnJvbVplcm8sXG4gIFRpbWVBeGlzTWlsbGlzRnJvbVplcm8sXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7XG4gIE1vbml0b3JpbmdIZWFkZXJXaWRnZXQsXG4gIE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSxcbn0gZnJvbSBcIi4uLy4uL2Rhc2hib2FyZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ09wdGlvbnNcbiAgZXh0ZW5kcyBCYXNlTW9uaXRvcmluZ1Byb3BzIHtcbiAgcmVhZG9ubHkgYWRkSXRlcmF0b3JNYXhBZ2VBbGFybT86IFJlY29yZDxzdHJpbmcsIE1heEl0ZXJhdG9yQWdlVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUHV0UmVjb3Jkc1Rocm90dGxlZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkXG4gID47XG4gIHJlYWRvbmx5IGFkZFB1dFJlY29yZHNGYWlsZWRBbGFybT86IFJlY29yZDxzdHJpbmcsIFJlY29yZHNGYWlsZWRUaHJlc2hvbGQ+O1xuICByZWFkb25seSBhZGRUaHJvdHRsZWRSZWNvcmRzQWxhcm0/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkPjtcbiAgcmVhZG9ubHkgYWRkUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0/OiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZHNUaHJvdHRsZWRUaHJlc2hvbGRcbiAgPjtcbiAgcmVhZG9ubHkgYWRkV3JpdGVQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEFsYXJtPzogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmRzVGhyb3R0bGVkVGhyZXNob2xkXG4gID47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHNcbiAgZXh0ZW5kcyBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgICBLaW5lc2lzRGF0YVN0cmVhbU1vbml0b3JpbmdPcHRpb25zIHt9XG5cbmV4cG9ydCBjbGFzcyBLaW5lc2lzRGF0YVN0cmVhbU1vbml0b3JpbmcgZXh0ZW5kcyBNb25pdG9yaW5nIHtcbiAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RyZWFtVXJsPzogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGtpbmVzaXNBbGFybUZhY3Rvcnk6IEtpbmVzaXNBbGFybUZhY3Rvcnk7XG4gIHJlYWRvbmx5IGFnZUFubm90YXRpb25zOiBIb3Jpem9udGFsQW5ub3RhdGlvbltdO1xuICByZWFkb25seSBwcm92aXNpb25lZENhcGFjaXR5QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG4gIHJlYWRvbmx5IHJlY29yZENvdW50QW5ub3RhdGlvbnM6IEhvcml6b250YWxBbm5vdGF0aW9uW107XG5cbiAgcmVhZG9ubHkgbWV0cmljR2V0UmVjb3JkU3VtQnl0ZXM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1ldHJpY0dldFJlY29yZHNJdGVyYXRvckFnZTogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgbWV0cmljR2V0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBtZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IG1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQ6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IGluY29taW5nRGF0YVN1bUJ5dGVzTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBpbmNvbWluZ0RhdGFTdW1Db3VudE1ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgcHV0UmVjb3JkU3VtQnl0ZXNNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZExhdGVuY3lBdmVyYWdlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRTdWNjZXNzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZHNTdW1CeXRlc01ldHJpYzogTWV0cmljV2l0aEFsYXJtU3VwcG9ydDtcbiAgcmVhZG9ubHkgcHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzU3VjY2Vzc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzVG90YWxSZWNvcmRzQ291bnRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHB1dFJlY29yZHNTdWNjZXNzZnVsUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSBwdXRSZWNvcmRzVGhyb3R0bGVkUmVjb3Jkc0NvdW50TWV0cmljOiBNZXRyaWNXaXRoQWxhcm1TdXBwb3J0O1xuICByZWFkb25seSByZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWM6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IE1vbml0b3JpbmdTY29wZSwgcHJvcHM6IEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZ1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIHByb3BzKTtcblxuICAgIGNvbnN0IG5hbWluZ1N0cmF0ZWd5ID0gbmV3IE1vbml0b3JpbmdOYW1pbmdTdHJhdGVneSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGZhbGxiYWNrQ29uc3RydWN0TmFtZTogcHJvcHMuc3RyZWFtTmFtZSxcbiAgICB9KTtcbiAgICB0aGlzLnRpdGxlID0gbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUh1bWFuUmVhZGFibGVOYW1lKCk7XG4gICAgdGhpcy5zdHJlYW1VcmwgPSBzY29wZVxuICAgICAgLmNyZWF0ZUF3c0NvbnNvbGVVcmxGYWN0b3J5KClcbiAgICAgIC5nZXRLaW5lc2lzRGF0YVN0cmVhbVVybChwcm9wcy5zdHJlYW1OYW1lKTtcblxuICAgIGNvbnN0IGFsYXJtRmFjdG9yeSA9IHRoaXMuY3JlYXRlQWxhcm1GYWN0b3J5KFxuICAgICAgbmFtaW5nU3RyYXRlZ3kucmVzb2x2ZUFsYXJtRnJpZW5kbHlOYW1lKCksXG4gICAgKTtcbiAgICB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkgPSBuZXcgS2luZXNpc0FsYXJtRmFjdG9yeShhbGFybUZhY3RvcnkpO1xuICAgIHRoaXMucHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zID0gW107XG4gICAgdGhpcy5hZ2VBbm5vdGF0aW9ucyA9IFtdO1xuICAgIHRoaXMucmVjb3JkQ291bnRBbm5vdGF0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgbWV0cmljRmFjdG9yeSA9IG5ldyBLaW5lc2lzRGF0YVN0cmVhbU1ldHJpY0ZhY3RvcnkoXG4gICAgICBzY29wZS5jcmVhdGVNZXRyaWNGYWN0b3J5KCksXG4gICAgICBwcm9wcyxcbiAgICApO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3JkU3VtQnl0ZXMgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdW1CeXRlcygpO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlTWF4TXMoKTtcbiAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNMYXRlbmN5QXZlcmFnZSA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNMYXRlbmN5QXZlcmFnZU1zKCk7XG4gICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzU3VtQ291bnQgPSBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdW1Db3VudCgpO1xuICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc1N1Y2Nlc3NDb3VudCA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLmluY29taW5nRGF0YVN1bUJ5dGVzTWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdEYXRhU3VtQnl0ZXMoKTtcbiAgICB0aGlzLmluY29taW5nRGF0YVN1bUNvdW50TWV0cmljID1cbiAgICAgIG1ldHJpY0ZhY3RvcnkubWV0cmljSW5jb21pbmdEYXRhU3VtQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZFN1bUJ5dGVzTWV0cmljID0gbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRTdW1CeXRlcygpO1xuICAgIHRoaXMucHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRMYXRlbmN5QXZlcmFnZU1zKCk7XG4gICAgdGhpcy5wdXRSZWNvcmRTdWNjZXNzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNTdW1CeXRlc01ldHJpYyA9IG1ldHJpY0ZhY3RvcnkubWV0cmljUHV0UmVjb3Jkc1N1bUJ5dGVzKCk7XG4gICAgdGhpcy5wdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2VNcygpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1N1Y2Nlc3NDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNTdWNjZXNzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudCgpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1N1Y2Nlc3NmdWxSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzU3VjY2Vzc2Z1bFJlY29yZHNDb3VudCgpO1xuICAgIHRoaXMucHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYyA9XG4gICAgICBtZXRyaWNGYWN0b3J5Lm1ldHJpY1B1dFJlY29yZHNUaHJvdHRsZWRSZWNvcmRzQ291bnQoKTtcbiAgICB0aGlzLnB1dFJlY29yZHNGYWlsZWRSZWNvcmRzQ291bnRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNQdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50KCk7XG4gICAgdGhpcy5yZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWQoKTtcbiAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMgPVxuICAgICAgbWV0cmljRmFjdG9yeS5tZXRyaWNXcml0ZVByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkKCk7XG5cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZEl0ZXJhdG9yTWF4QWdlQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkuYWRkSXRlcmF0b3JNYXhBZ2VBbGFybShcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzSXRlcmF0b3JBZ2UsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5hZ2VBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFB1dFJlY29yZHNUaHJvdHRsZWRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9IHByb3BzLmFkZFB1dFJlY29yZHNUaHJvdHRsZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9IHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQdXRSZWNvcmRzVGhyb3R0bGVkQWxhcm0oXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1Rocm90dGxlZFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgYWxhcm1Qcm9wcyxcbiAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICk7XG4gICAgICB0aGlzLnJlY29yZENvdW50QW5ub3RhdGlvbnMucHVzaChjcmVhdGVkQWxhcm0uYW5ub3RhdGlvbik7XG4gICAgICB0aGlzLmFkZEFsYXJtKGNyZWF0ZWRBbGFybSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGlzYW1iaWd1YXRvciBpbiBwcm9wcy5hZGRQdXRSZWNvcmRzRmFpbGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPSBwcm9wcy5hZGRQdXRSZWNvcmRzRmFpbGVkQWxhcm1bZGlzYW1iaWd1YXRvcl07XG4gICAgICBjb25zdCBjcmVhdGVkQWxhcm0gPSB0aGlzLmtpbmVzaXNBbGFybUZhY3RvcnkuYWRkUHV0UmVjb3Jkc0ZhaWxlZEFsYXJtKFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNGYWlsZWRSZWNvcmRzQ291bnRNZXRyaWMsXG4gICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWNvcmRDb3VudEFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRpc2FtYmlndWF0b3IgaW4gcHJvcHMuYWRkUmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0pIHtcbiAgICAgIGNvbnN0IGFsYXJtUHJvcHMgPVxuICAgICAgICBwcm9wcy5hZGRSZWFkUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQcm92aXNpb25lZFJlYWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybShcbiAgICAgICAgICB0aGlzLnJlYWRQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZE1ldHJpYyxcbiAgICAgICAgICBhbGFybVByb3BzLFxuICAgICAgICAgIGRpc2FtYmlndWF0b3IsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnByb3Zpc2lvbmVkQ2FwYWNpdHlBbm5vdGF0aW9ucy5wdXNoKGNyZWF0ZWRBbGFybS5hbm5vdGF0aW9uKTtcbiAgICAgIHRoaXMuYWRkQWxhcm0oY3JlYXRlZEFsYXJtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBkaXNhbWJpZ3VhdG9yIGluIHByb3BzLmFkZFdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybSkge1xuICAgICAgY29uc3QgYWxhcm1Qcm9wcyA9XG4gICAgICAgIHByb3BzLmFkZFdyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRBbGFybVtkaXNhbWJpZ3VhdG9yXTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBbGFybSA9XG4gICAgICAgIHRoaXMua2luZXNpc0FsYXJtRmFjdG9yeS5hZGRQcm92aXNpb25lZFdyaXRlVGhyb3VnaHB1dEV4Y2VlZGVkQWxhcm0oXG4gICAgICAgICAgdGhpcy53cml0ZVByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljLFxuICAgICAgICAgIGFsYXJtUHJvcHMsXG4gICAgICAgICAgZGlzYW1iaWd1YXRvcixcbiAgICAgICAgKTtcbiAgICAgIHRoaXMucHJvdmlzaW9uZWRDYXBhY2l0eUFubm90YXRpb25zLnB1c2goY3JlYXRlZEFsYXJtLmFubm90YXRpb24pO1xuICAgICAgdGhpcy5hZGRBbGFybShjcmVhdGVkQWxhcm0pO1xuICAgIH1cblxuICAgIHByb3BzLnVzZUNyZWF0ZWRBbGFybXM/LmNvbnN1bWUodGhpcy5jcmVhdGVkQWxhcm1zKCkpO1xuICB9XG5cbiAgc3VtbWFyeVdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlSXRlcmF0b3JBZ2VXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0U3VtbWFyeVdpZGdldEhlaWdodCksXG4gICAgICAgIHRoaXMuY3JlYXRlTGF0ZW5jeVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVDYXBhY2l0eVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRTdW1tYXJ5V2lkZ2V0SGVpZ2h0KSxcbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIHdpZGdldHMoKTogSVdpZGdldFtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5jcmVhdGVUaXRsZVdpZGdldCgpLFxuICAgICAgbmV3IFJvdyhcbiAgICAgICAgdGhpcy5jcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQoUXVhcnRlcldpZHRoLCBEZWZhdWx0R3JhcGhXaWRnZXRIZWlnaHQpLFxuICAgICAgICB0aGlzLmNyZWF0ZUl0ZXJhdG9yQWdlV2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVMYXRlbmN5V2lkZ2V0KFF1YXJ0ZXJXaWR0aCwgRGVmYXVsdEdyYXBoV2lkZ2V0SGVpZ2h0KSxcbiAgICAgICAgdGhpcy5jcmVhdGVDYXBhY2l0eVdpZGdldChRdWFydGVyV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICApLFxuICAgICAgdGhpcy5jcmVhdGVGaXJzdEFkZGl0aW9uYWxSb3coKSxcbiAgICAgIHRoaXMuY3JlYXRlU2Vjb25kQWRkaXRpb25hbFJvdygpLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZpcnN0QWRkaXRpb25hbFJvdygpIHtcbiAgICByZXR1cm4gbmV3IFJvdyhcbiAgICAgIHRoaXMuY3JlYXRlUmVjb3JkU2l6ZVdpZGdldChIYWxmV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgICB0aGlzLmNyZWF0ZU9wZXJhdGlvbldpZGdldChIYWxmV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVNlY29uZEFkZGl0aW9uYWxSb3coKSB7XG4gICAgcmV0dXJuIG5ldyBSb3coXG4gICAgICB0aGlzLmNyZWF0ZVJlY29yZE51bWJlcldpZGdldChGdWxsV2lkdGgsIERlZmF1bHRHcmFwaFdpZGdldEhlaWdodCksXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVRpdGxlV2lkZ2V0KCkge1xuICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ0hlYWRlcldpZGdldCh7XG4gICAgICBmYW1pbHk6IFwiS2luZXNpcyBEYXRhIFN0cmVhbVwiLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBnb1RvTGlua1VybDogdGhpcy5zdHJlYW1VcmwsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJbmNvbWluZ0RhdGFXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiSW5jb21pbmdcIixcbiAgICAgIGxlZnQ6IFt0aGlzLmluY29taW5nRGF0YVN1bUNvdW50TWV0cmljXSxcbiAgICAgIGxlZnRZQXhpczogQ291bnRBeGlzRnJvbVplcm8sXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVJdGVyYXRvckFnZVdpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJJdGVyYXRvclwiLFxuICAgICAgbGVmdDogW3RoaXMubWV0cmljR2V0UmVjb3Jkc0l0ZXJhdG9yQWdlXSxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5hZ2VBbm5vdGF0aW9ucyxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUxhdGVuY3lXaWRnZXQod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IEdyYXBoV2lkZ2V0KHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgdGl0bGU6IFwiTGF0ZW5jeSAoQXZlcmFnZSlcIixcbiAgICAgIGxlZnQ6IFtcbiAgICAgICAgdGhpcy5tZXRyaWNHZXRSZWNvcmRzTGF0ZW5jeUF2ZXJhZ2UsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkTGF0ZW5jeUF2ZXJhZ2VNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc0xhdGVuY3lBdmVyYWdlTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogVGltZUF4aXNNaWxsaXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZUNhcGFjaXR5V2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlByb3Zpc2lvbmVkIENhcGFjaXR5IEV4Y2VlZGVkXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMucmVhZFByb3Zpc2lvbmVkVGhyb3VnaHB1dEV4Y2VlZGVkTWV0cmljLFxuICAgICAgICB0aGlzLndyaXRlUHJvdmlzaW9uZWRUaHJvdWdocHV0RXhjZWVkZWRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICAgIGxlZnRBbm5vdGF0aW9uczogdGhpcy5wcm92aXNpb25lZENhcGFjaXR5QW5ub3RhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVSZWNvcmRTaXplV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIkJ5dGVzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljR2V0UmVjb3JkU3VtQnl0ZXMsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkU3VtQnl0ZXNNZXRyaWMsXG4gICAgICAgIHRoaXMucHV0UmVjb3Jkc1N1bUJ5dGVzTWV0cmljLFxuICAgICAgXSxcbiAgICAgIGxlZnRZQXhpczogU2l6ZUF4aXNCeXRlc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlT3BlcmF0aW9uV2lkZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG5ldyBHcmFwaFdpZGdldCh7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHRpdGxlOiBcIlN1Y2Nlc3NmdWwgT3BlcmF0aW9uc1wiLFxuICAgICAgbGVmdDogW1xuICAgICAgICB0aGlzLm1ldHJpY0dldFJlY29yZHNTdWNjZXNzQ291bnQsXG4gICAgICAgIHRoaXMucHV0UmVjb3JkU3VjY2Vzc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNTdWNjZXNzQ291bnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdFlBeGlzOiBDb3VudEF4aXNGcm9tWmVybyxcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVJlY29yZE51bWJlcldpZGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgR3JhcGhXaWRnZXQoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICB0aXRsZTogXCJSZWNvcmRzXCIsXG4gICAgICBsZWZ0OiBbXG4gICAgICAgIHRoaXMubWV0cmljR2V0UmVjb3Jkc1N1bUNvdW50LFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNUb3RhbFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzU3VjY2Vzc2Z1bFJlY29yZHNDb3VudE1ldHJpYyxcbiAgICAgICAgdGhpcy5wdXRSZWNvcmRzRmFpbGVkUmVjb3Jkc0NvdW50TWV0cmljLFxuICAgICAgICB0aGlzLnB1dFJlY29yZHNUaHJvdHRsZWRSZWNvcmRzQ291bnRNZXRyaWMsXG4gICAgICBdLFxuICAgICAgbGVmdEFubm90YXRpb25zOiB0aGlzLnJlY29yZENvdW50QW5ub3RhdGlvbnMsXG4gICAgICBsZWZ0WUF4aXM6IENvdW50QXhpc0Zyb21aZXJvLFxuICAgIH0pO1xuICB9XG59XG4iXX0=