cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
562 lines • 79.2 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MonitoringFacade = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const MonitoringAspect_1 = require("./MonitoringAspect");
const common_1 = require("../common");
const dashboard_1 = require("../dashboard");
const DynamicDashboardSegment_1 = require("../dashboard/DynamicDashboardSegment");
const monitoring_1 = require("../monitoring");
/**
* An implementation of a {@link MonitoringScope}.
*
* This is a convenient main entrypoint to monitor resources.
*
* Provides methods for retrieving and creating alarms based on added segments that are subclasses of
* {@link Monitoring}.
*/
class MonitoringFacade extends common_1.MonitoringScope {
constructor(scope, id, props) {
super(scope, id);
this.metricFactoryDefaults = props?.metricFactoryDefaults ?? {};
this.alarmFactoryDefaults = props?.alarmFactoryDefaults ?? {
alarmNamePrefix: id,
actionsEnabled: true,
};
this.dashboardFactory =
props?.dashboardFactory ??
new dashboard_1.DefaultDashboardFactory(this, `${id}-Dashboards`, {
dashboardNamePrefix: id,
});
this.createdSegments = [];
this.createdComposites = [];
this.createdClones = [];
}
// FACTORIES
// =========
createAlarmFactory(alarmNamePrefix) {
return new common_1.AlarmFactory(this, {
globalAlarmDefaults: this.alarmFactoryDefaults,
globalMetricDefaults: this.metricFactoryDefaults,
localAlarmNamePrefix: alarmNamePrefix,
});
}
createAwsConsoleUrlFactory() {
const stack = aws_cdk_lib_1.Stack.of(this);
const awsAccountId = this.metricFactoryDefaults.account ?? stack.account;
const awsAccountRegion = this.metricFactoryDefaults.region ?? stack.region;
return new common_1.AwsConsoleUrlFactory({ awsAccountRegion, awsAccountId });
}
createMetricFactory() {
return new common_1.MetricFactory(this, {
globalDefaults: this.metricFactoryDefaults,
});
}
createWidgetFactory() {
return new dashboard_1.DefaultWidgetFactory();
}
// GENERIC
// =======
/**
* Adds a dashboard segment which returns dynamic content depending on dashboard type.
*
* @param segment dynamic segment to add.
*/
addDynamicSegment(segment) {
this.dashboardFactory?.addDynamicSegment(segment);
this.createdSegments.push(segment);
return this;
}
/**
* Adds a dashboard segment to go on one of the {@link DefaultDashboards}.
*
* @param segment segment to add
* @param overrideProps props to specify which default dashboards this segment is added to.
*/
addSegment(segment, overrideProps) {
const adaptedSegment = new DynamicDashboardSegment_1.StaticSegmentDynamicAdapter({
segment,
overrideProps,
});
this.dashboardFactory?.addDynamicSegment(adaptedSegment);
this.createdSegments.push(segment);
return this;
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default detail dashboard
*/
createdDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.DETAIL);
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default summary dashboard
*/
createdSummaryDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.SUMMARY);
}
/**
* @deprecated - prefer calling dashboardFactory.getDashboard directly.
*
* @returns default alarms dashboard
*/
createdAlarmDashboard() {
return this.dashboardFactory?.getDashboard(dashboard_1.DefaultDashboards.ALARMS);
}
/**
* Returns the created alarms across all added segments that subclass {@link Monitoring}
* added up until now.
*/
createdAlarms() {
const monitoringAlarms = this.createdMonitorings().flatMap((monitoring) => monitoring.createdAlarms());
return monitoringAlarms.concat(this.createdClones);
}
/**
* Returns a subset of created alarms that are marked by a specific custom tag.
*
* @param customTag tag to filter alarms by
*/
createdAlarmsWithTag(customTag) {
return this.createdAlarms().filter((alarm) => alarm.customTags?.includes(customTag));
}
/**
* Returns a subset of created alarms that are marked by a specific disambiguator.
*
* @param disambiguator disambiguator to filter alarms by
*/
createdAlarmsWithDisambiguator(disambiguator) {
return this.createdAlarms().filter((alarm) => alarm.disambiguator === disambiguator);
}
/**
* Returns the added composite alarms.
*/
createdCompositeAlarms() {
return this.createdComposites;
}
/**
* Returns the added segments that subclass {@link Monitoring}.
*/
createdMonitorings() {
return this.createdSegments
.filter((s) => s instanceof common_1.Monitoring)
.map((s) => s);
}
/**
* Returns all the added segments.
*/
createdDashboardSegments() {
return Array.from(this.createdSegments);
}
// COMPOSITE ALARM CREATORS
// ========================
/**
* Finds a subset of created alarms that are marked by a specific custom tag and creates a composite alarm.
* This composite alarm is created with an 'OR' condition, so it triggers with any child alarm.
* NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls.
*
* @param customTag tag to filter alarms by
* @param props customization options
*/
createCompositeAlarmUsingTag(customTag, props) {
const alarms = this.createdAlarmsWithTag(customTag);
if (alarms.length > 0) {
const disambiguator = props?.disambiguator ?? customTag;
const alarmFactory = this.createAlarmFactory("Composite");
const composite = alarmFactory.addCompositeAlarm(alarms, {
...(props ?? {}),
disambiguator,
});
this.createdComposites.push(composite);
return composite;
}
return undefined;
}
/**
* Finds a subset of created alarms that are marked by a specific disambiguator and creates a composite alarm.
* This composite alarm is created with an 'OR' condition, so it triggers with any child alarm.
* NOTE: This composite alarm is not added among other alarms, so it is not returned by createdAlarms() calls.
*
* @param alarmDisambiguator disambiguator to filter alarms by
* @param props customization options
*/
createCompositeAlarmUsingDisambiguator(alarmDisambiguator, props) {
const alarms = this.createdAlarmsWithDisambiguator(alarmDisambiguator);
if (alarms.length > 0) {
const disambiguator = props?.disambiguator ?? alarmDisambiguator;
const alarmFactory = this.createAlarmFactory("Composite");
const composite = alarmFactory.addCompositeAlarm(alarms, {
...(props ?? {}),
disambiguator,
});
this.createdComposites.push(composite);
return composite;
}
return undefined;
}
// CLONE ALARMS
// ============
/**
* Applies a cloning function to each of the given alarms, creating a new collection of alarms
* that are adjusted by the function.
*
* @param sourceAlarms The alarms that should be used as sources for the clones.
* @param cloneFunction A function that will accept a source alarm and determine whether and how a new alarm should be cloned from it.
* @returns The list of clone alarms.
*/
cloneAlarms(sourceAlarms, cloneFunction) {
const cloned = [];
sourceAlarms.forEach((alarm) => {
const cloneAlarmProps = cloneFunction(alarm);
if (cloneAlarmProps) {
cloned.push(alarm.alarmDefinition.alarmFactory.addAlarm(alarm.alarmDefinition.metric, cloneAlarmProps));
}
});
this.createdClones.push(...cloned);
return cloned;
}
// BASIC WIDGETS
// =============
addLargeHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.LARGE), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addMediumHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.MEDIUM), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addSmallHeader(text, addToSummary, addToAlarm) {
this.addWidget(new dashboard_1.HeaderWidget(text, dashboard_1.HeaderLevel.SMALL), addToSummary ?? false, addToAlarm ?? false);
return this;
}
addWidget(widget, addToSummary, addToAlarm) {
this.addSegment(new dashboard_1.SingleWidgetDashboardSegment(widget), {
addToAlarmDashboard: addToAlarm ?? true,
addToSummaryDashboard: addToSummary ?? true,
addToDetailDashboard: true,
});
return this;
}
// RESOURCE MONITORING
// ===================
/**
* Uses an aspect to automatically monitor all resources in the given scope.
*
* @param scope Scope with resources to monitor.
* @param aspectProps Optional configuration.
*
* @experimental
*/
monitorScope(scope, aspectProps) {
const aspect = new MonitoringAspect_1.MonitoringAspect(this, aspectProps);
aws_cdk_lib_1.Aspects.of(scope).add(aspect);
return this;
}
monitorApiGateway(props) {
const segment = new monitoring_1.ApiGatewayMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorApiGatewayV2HttpApi(props) {
const segment = new monitoring_1.ApiGatewayV2HttpApiMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorAppSyncApi(props) {
const segment = new monitoring_1.AppSyncMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorAuroraCluster(props) {
const segment = new monitoring_1.AuroraClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCertificate(props) {
const segment = new monitoring_1.CertificateManagerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCloudFrontDistribution(props) {
const segment = new monitoring_1.CloudFrontDistributionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorCodeBuildProject(props) {
const segment = new monitoring_1.CodeBuildProjectMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDocumentDbCluster(props) {
const segment = new monitoring_1.DocumentDbMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDynamoTable(props) {
const segment = new monitoring_1.DynamoTableMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorDynamoTableGlobalSecondaryIndex(props) {
const segment = new monitoring_1.DynamoTableGlobalSecondaryIndexMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorEC2Instances(props) {
const segment = new monitoring_1.EC2Monitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorElasticsearchCluster(props) {
const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorOpenSearchCluster(props) {
const segment = new monitoring_1.OpenSearchClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorOpenSearchIngestionPipeline(props) {
const segment = new monitoring_1.OpenSearchIngestionPipelineMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorOpenSearchServerlessCollection(props) {
const segment = new monitoring_1.OpenSearchServerlessMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorOpenSearchServerlessIndex(props) {
const segment = new monitoring_1.OpenSearchServerlessIndexMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorElastiCacheCluster(props) {
const segment = new monitoring_1.ElastiCacheClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorGlueJob(props) {
const segment = new monitoring_1.GlueJobMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorFargateService(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService.service,
loadBalancer: props.fargateService.loadBalancer,
targetGroup: props.fargateService.targetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorSimpleFargateService(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
});
this.addSegment(segment, props);
return this;
}
monitorFargateNetworkLoadBalancer(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
loadBalancer: props.networkLoadBalancer,
targetGroup: props.networkTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorFargateApplicationLoadBalancer(props) {
const segment = new monitoring_1.FargateServiceMonitoring(this, {
...props,
fargateService: props.fargateService,
loadBalancer: props.applicationLoadBalancer,
targetGroup: props.applicationTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorEc2Service(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service.service,
loadBalancer: props.ec2Service.loadBalancer,
targetGroup: props.ec2Service.targetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorSimpleEc2Service(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
});
this.addSegment(segment, props);
return this;
}
monitorEc2NetworkLoadBalancer(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
loadBalancer: props.networkLoadBalancer,
targetGroup: props.networkTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorEc2ApplicationLoadBalancer(props) {
const segment = new monitoring_1.Ec2ServiceMonitoring(this, {
...props,
ec2Service: props.ec2Service,
loadBalancer: props.applicationLoadBalancer,
targetGroup: props.applicationTargetGroup,
});
this.addSegment(segment, props);
return this;
}
monitorQueueProcessingFargateService(props) {
monitoring_1.getQueueProcessingFargateServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment));
return this;
}
monitorQueueProcessingEc2Service(props) {
monitoring_1.getQueueProcessingEc2ServiceMonitoring(this, props).forEach((segment) => this.addSegment(segment));
return this;
}
monitorAutoScalingGroup(props) {
const segment = new monitoring_1.AutoScalingGroupMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisFirehose(props) {
const segment = new monitoring_1.KinesisFirehoseMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisDataStream(props) {
const segment = new monitoring_1.KinesisDataStreamMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorKinesisDataAnalytics(props) {
const segment = new monitoring_1.KinesisDataAnalyticsMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorLambdaFunction(props) {
const segment = new monitoring_1.LambdaFunctionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorNetworkLoadBalancer(props) {
const segment = new monitoring_1.NetworkLoadBalancerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRdsCluster(props) {
const segment = new monitoring_1.RdsClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRdsInstance(props) {
const segment = new monitoring_1.RdsInstanceMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorRedshiftCluster(props) {
const segment = new monitoring_1.RedshiftClusterMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSecretsManager(props) {
const segment = new monitoring_1.SecretsManagerMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSecretsManagerSecret(props) {
const segment = new monitoring_1.SecretsManagerSecretMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSnsTopic(props) {
const segment = new monitoring_1.SnsTopicMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSqsQueue(props) {
const segment = new monitoring_1.SqsQueueMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSqsQueueWithDlq(props) {
const segment = new monitoring_1.SqsQueueMonitoringWithDlq(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunction(props) {
const segment = new monitoring_1.StepFunctionMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionActivity(props) {
const segment = new monitoring_1.StepFunctionActivityMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionLambdaIntegration(props) {
const segment = new monitoring_1.StepFunctionLambdaIntegrationMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorStepFunctionServiceIntegration(props) {
const segment = new monitoring_1.StepFunctionServiceIntegrationMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorS3Bucket(props) {
const segment = new monitoring_1.S3BucketMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorLog(props) {
const segment = new monitoring_1.LogMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorSyntheticsCanary(props) {
const segment = new monitoring_1.SyntheticsCanaryMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorWebApplicationFirewallAclV2(props) {
const segment = new monitoring_1.WafV2Monitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorBilling(props) {
const segment = new monitoring_1.BillingMonitoring(this, props ?? {});
this.addSegment(segment, props);
return this;
}
monitorCustom(props) {
const segment = new monitoring_1.CustomMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
monitorFluentBit(props) {
const segment = new monitoring_1.FluentBitMonitoring(this, props);
this.addSegment(segment, props);
return this;
}
}
exports.MonitoringFacade = MonitoringFacade;
_a = JSII_RTTI_SYMBOL_1;
MonitoringFacade[_a] = { fqn: "cdk-monitoring-constructs.MonitoringFacade", version: "9.15.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9uaXRvcmluZ0ZhY2FkZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIk1vbml0b3JpbmdGYWNhZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFLN0MseURBQXNEO0FBQ3RELHNDQVdtQjtBQUNuQiw0Q0FVc0I7QUFDdEIsa0ZBRzhDO0FBRTlDLDhDQW1HdUI7QUFxQ3ZCOzs7Ozs7O0dBT0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLHdCQUFlO0lBV25ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxFQUFFLHFCQUFxQixJQUFJLEVBQUUsQ0FBQztRQUNoRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFFLG9CQUFvQixJQUFJO1lBQ3pELGVBQWUsRUFBRSxFQUFFO1lBQ25CLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCO1lBQ25CLEtBQUssRUFBRSxnQkFBZ0I7Z0JBQ3ZCLElBQUksbUNBQXVCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUU7b0JBQ3BELG1CQUFtQixFQUFFLEVBQUU7aUJBQ3hCLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVk7SUFDWixZQUFZO0lBRVosa0JBQWtCLENBQUMsZUFBdUI7UUFDeEMsT0FBTyxJQUFJLHFCQUFZLENBQUMsSUFBSSxFQUFFO1lBQzVCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUNo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QUksQ0FBQztJQUNkLENBQUM7O0FBaHRCSCw0Q0FpdEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXNwZWN0cywgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbXBvc2l0ZUFsYXJtLCBEYXNoYm9hcmQsIElXaWRnZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IE1vbml0b3JpbmdBc3BlY3RQcm9wcyB9IGZyb20gXCIuL0lNb25pdG9yaW5nQXNwZWN0XCI7XG5pbXBvcnQgeyBNb25pdG9yaW5nQXNwZWN0IH0gZnJvbSBcIi4vTW9uaXRvcmluZ0FzcGVjdFwiO1xuaW1wb3J0IHtcbiAgQWRkQWxhcm1Qcm9wcyxcbiAgQWRkQ29tcG9zaXRlQWxhcm1Qcm9wcyxcbiAgQWxhcm1GYWN0b3J5LFxuICBBbGFybUZhY3RvcnlEZWZhdWx0cyxcbiAgQWxhcm1XaXRoQW5ub3RhdGlvbixcbiAgQXdzQ29uc29sZVVybEZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnksXG4gIE1ldHJpY0ZhY3RvcnlEZWZhdWx0cyxcbiAgTW9uaXRvcmluZyxcbiAgTW9uaXRvcmluZ1Njb3BlLFxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge1xuICBEZWZhdWx0RGFzaGJvYXJkRmFjdG9yeSxcbiAgRGVmYXVsdERhc2hib2FyZHMsXG4gIERlZmF1bHRXaWRnZXRGYWN0b3J5LFxuICBIZWFkZXJMZXZlbCxcbiAgSGVhZGVyV2lkZ2V0LFxuICBJRGFzaGJvYXJkU2VnbWVudCxcbiAgSVdpZGdldEZhY3RvcnksXG4gIE1vbml0b3JpbmdEYXNoYm9hcmRzT3ZlcnJpZGVQcm9wcyxcbiAgU2luZ2xlV2lkZ2V0RGFzaGJvYXJkU2VnbWVudCxcbn0gZnJvbSBcIi4uL2Rhc2hib2FyZFwiO1xuaW1wb3J0IHtcbiAgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50LFxuICBTdGF0aWNTZWdtZW50RHluYW1pY0FkYXB0ZXIsXG59IGZyb20gXCIuLi9kYXNoYm9hcmQvRHluYW1pY0Rhc2hib2FyZFNlZ21lbnRcIjtcbmltcG9ydCB7IElEeW5hbWljRGFzaGJvYXJkRmFjdG9yeSB9IGZyb20gXCIuLi9kYXNoYm9hcmQvSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5XCI7XG5pbXBvcnQge1xuICBBcGlHYXRld2F5TW9uaXRvcmluZyxcbiAgQXBpR2F0ZXdheU1vbml0b3JpbmdQcm9wcyxcbiAgQXBpR2F0ZXdheVYySHR0cEFwaU1vbml0b3JpbmcsXG4gIEFwaUdhdGV3YXlWMkh0dHBBcGlNb25pdG9yaW5nUHJvcHMsXG4gIEFwcFN5bmNNb25pdG9yaW5nLFxuICBBcHBTeW5jTW9uaXRvcmluZ1Byb3BzLFxuICBBdXJvcmFDbHVzdGVyTW9uaXRvcmluZyxcbiAgQXVyb3JhQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgQXV0b1NjYWxpbmdHcm91cE1vbml0b3JpbmcsXG4gIEF1dG9TY2FsaW5nR3JvdXBNb25pdG9yaW5nUHJvcHMsXG4gIEJpbGxpbmdNb25pdG9yaW5nLFxuICBCaWxsaW5nTW9uaXRvcmluZ1Byb3BzLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nLFxuICBDZXJ0aWZpY2F0ZU1hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIENsb3VkRnJvbnREaXN0cmlidXRpb25Nb25pdG9yaW5nLFxuICBDbG91ZEZyb250RGlzdHJpYnV0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBDb2RlQnVpbGRQcm9qZWN0TW9uaXRvcmluZyxcbiAgQ29kZUJ1aWxkUHJvamVjdE1vbml0b3JpbmdQcm9wcyxcbiAgQ3VzdG9tTW9uaXRvcmluZyxcbiAgQ3VzdG9tTW9uaXRvcmluZ1Byb3BzLFxuICBEb2N1bWVudERiTW9uaXRvcmluZyxcbiAgRG9jdW1lbnREYk1vbml0b3JpbmdQcm9wcyxcbiAgRHluYW1vVGFibGVHbG9iYWxTZWNvbmRhcnlJbmRleE1vbml0b3JpbmcsXG4gIER5bmFtb1RhYmxlR2xvYmFsU2Vjb25kYXJ5SW5kZXhNb25pdG9yaW5nUHJvcHMsXG4gIER5bmFtb1RhYmxlTW9uaXRvcmluZyxcbiAgRHluYW1vVGFibGVNb25pdG9yaW5nUHJvcHMsXG4gIEVjMkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyTW9uaXRvcmluZ1Byb3BzLFxuICBFQzJNb25pdG9yaW5nLFxuICBFQzJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMk5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEVjMlNlcnZpY2VNb25pdG9yaW5nLFxuICBFYzJTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nLFxuICBFbGFzdGlDYWNoZUNsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgRmFyZ2F0ZU5ldHdvcmtMb2FkQmFsYW5jZXJNb25pdG9yaW5nUHJvcHMsXG4gIEZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIEZsdWVudEJpdE1vbml0b3JpbmcsXG4gIEZsdWVudEJpdE1vbml0b3JpbmdQcm9wcyxcbiAgZ2V0UXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmcsXG4gIGdldFF1ZXVlUHJvY2Vzc2luZ0ZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZyxcbiAgR2x1ZUpvYk1vbml0b3JpbmcsXG4gIEdsdWVKb2JNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhQW5hbHl0aWNzTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFBbmFseXRpY3NNb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNEYXRhU3RyZWFtTW9uaXRvcmluZyxcbiAgS2luZXNpc0RhdGFTdHJlYW1Nb25pdG9yaW5nUHJvcHMsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmcsXG4gIEtpbmVzaXNGaXJlaG9zZU1vbml0b3JpbmdQcm9wcyxcbiAgTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLFxuICBMYW1iZGFGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgTG9nTW9uaXRvcmluZyxcbiAgTG9nTW9uaXRvcmluZ1Byb3BzLFxuICBOZXR3b3JrTG9hZEJhbGFuY2VyTW9uaXRvcmluZyxcbiAgTmV0d29ya0xvYWRCYWxhbmNlck1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaENsdXN0ZXJNb25pdG9yaW5nLFxuICBPcGVuU2VhcmNoQ2x1c3Rlck1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZyxcbiAgT3BlblNlYXJjaEluZ2VzdGlvblBpcGVsaW5lTW9uaXRvcmluZ1Byb3BzLFxuICBPcGVuU2VhcmNoU2VydmVybGVzc0luZGV4TW9uaXRvcmluZyxcbiAgT3BlblNlYXJjaFNlcnZlcmxlc3NJbmRleE1vbml0b3JpbmdQcm9wcyxcbiAgT3BlblNlYXJjaFNlcnZlcmxlc3NNb25pdG9yaW5nLFxuICBPcGVuU2VhcmNoU2VydmVybGVzc01vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRWMyU2VydmljZU1vbml0b3JpbmdQcm9wcyxcbiAgUXVldWVQcm9jZXNzaW5nRmFyZ2F0ZVNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFJkc0NsdXN0ZXJNb25pdG9yaW5nLFxuICBSZHNDbHVzdGVyTW9uaXRvcmluZ1Byb3BzLFxuICBSZHNJbnN0YW5jZU1vbml0b3JpbmcsXG4gIFJkc0luc3RhbmNlTW9uaXRvcmluZ1Byb3BzLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nLFxuICBSZWRzaGlmdENsdXN0ZXJNb25pdG9yaW5nUHJvcHMsXG4gIFMzQnVja2V0TW9uaXRvcmluZyxcbiAgUzNCdWNrZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyTW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJNb25pdG9yaW5nUHJvcHMsXG4gIFNlY3JldHNNYW5hZ2VyU2VjcmV0TW9uaXRvcmluZyxcbiAgU2VjcmV0c01hbmFnZXJTZWNyZXRNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUVjMlNlcnZpY2VNb25pdG9yaW5nUHJvcHMsXG4gIFNpbXBsZUZhcmdhdGVTZXJ2aWNlTW9uaXRvcmluZ1Byb3BzLFxuICBTbnNUb3BpY01vbml0b3JpbmcsXG4gIFNuc1RvcGljTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmcsXG4gIFNxc1F1ZXVlTW9uaXRvcmluZ1Byb3BzLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxLFxuICBTcXNRdWV1ZU1vbml0b3JpbmdXaXRoRGxxUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkFjdGl2aXR5TW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uQWN0aXZpdHlNb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbkxhbWJkYUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uTGFtYmRhSW50ZWdyYXRpb25Nb25pdG9yaW5nUHJvcHMsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmcsXG4gIFN0ZXBGdW5jdGlvbk1vbml0b3JpbmdQcm9wcyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZyxcbiAgU3RlcEZ1bmN0aW9uU2VydmljZUludGVncmF0aW9uTW9uaXRvcmluZ1Byb3BzLFxuICBTeW50aGV0aWNzQ2FuYXJ5TW9uaXRvcmluZyxcbiAgU3ludGhldGljc0NhbmFyeU1vbml0b3JpbmdQcm9wcyxcbiAgV2FmVjJNb25pdG9yaW5nLFxuICBXYWZWMk1vbml0b3JpbmdQcm9wcyxcbn0gZnJvbSBcIi4uL21vbml0b3JpbmdcIjtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQsIHdoZW4gZ2l2ZW4gYW4gYWxhcm0sIHJldHVybnMgbW9kaWZpZWQgaW5wdXRzIHRoYXRcbiAqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGFsYXJtcywgc2xpZ2h0bHkgYWRqdXN0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgb25lLlxuICogVGhlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNsb25lIGFsYXJtcy5cbiAqXG4gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBmdW5jdGlvbiBjYW4gdXNlIHRoZSBvcmlnaW5hbCBhbGFybSBjb25maWd1cmF0aW9uIHRvIHNwZWNpZnkgYSBuZXcgYWxhcm0sXG4gKiBvciB0aGV5IGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIHNraXAgdGhlIGNyZWF0aW9uIG9mIGFuIGFsYXJtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYXJtQ2xvbmVGdW5jdGlvbiB7XG4gIChhbGFybTogQWxhcm1XaXRoQW5ub3RhdGlvbik6IEFkZEFsYXJtUHJvcHMgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0ZhY2FkZVByb3BzIHtcbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBtZXRyaWMgZmFjdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBlbXB0eSAobm8gcHJlZmVyZW5jZXMpXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNGYWN0b3J5RGVmYXVsdHM/OiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG5cbiAgLyoqXG4gICAqIERlZmF1bHRzIGZvciBhbGFybSBmYWN0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjdGlvbnMgZW5hYmxlZCwgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IGFsYXJtIG5hbWUgcHJlZml4XG4gICAqL1xuICByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0cz86IEFsYXJtRmFjdG9yeURlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0cyBmb3IgZGFzaGJvYXJkIGZhY3RvcnkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIER5bmFtaWNEYXNoYm9hcmRGYWN0b3J5fTsgZmFjYWRlIGxvZ2ljYWwgSUQgdXNlZCBhcyBkZWZhdWx0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEZhY3Rvcnk/OiBJRHluYW1pY0Rhc2hib2FyZEZhY3Rvcnk7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgTW9uaXRvcmluZ1Njb3BlfS5cbiAqXG4gKiBUaGlzIGlzIGEgY29udmVuaWVudCBtYWluIGVudHJ5cG9pbnQgdG8gbW9uaXRvciByZXNvdXJjZXMuXG4gKlxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZyBhbmQgY3JlYXRpbmcgYWxhcm1zIGJhc2VkIG9uIGFkZGVkIHNlZ21lbnRzIHRoYXQgYXJlIHN1YmNsYXNzZXMgb2ZcbiAqIHtAbGluayBNb25pdG9yaW5nfS5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vbml0b3JpbmdGYWNhZGUgZXh0ZW5kcyBNb25pdG9yaW5nU2NvcGUge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljRmFjdG9yeURlZmF1bHRzOiBNZXRyaWNGYWN0b3J5RGVmYXVsdHM7XG4gIHByb3RlY3RlZCByZWFkb25seSBhbGFybUZhY3RvcnlEZWZhdWx0czogQWxhcm1GYWN0b3J5RGVmYXVsdHM7XG4gIHB1YmxpYyByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSUR5bmFtaWNEYXNoYm9hcmRGYWN0b3J5O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JlYXRlZFNlZ21lbnRzOiAoXG4gICAgfCBJRGFzaGJvYXJkU2VnbWVudFxuICAgIHwgSUR5bmFtaWNEYXNoYm9hcmRTZWdtZW50XG4gIClbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNyZWF0ZWRD