@renovosolutions/cdk-library-cloudwatch-alarms
Version:
AWS CDK Construct Library to automatically create CloudWatch Alarms for resources in a CDK app based on resource type.
159 lines • 24.5 kB
JavaScript
;
var _a, _b, _c, _d;
Object.defineProperty(exports, "__esModule", { value: true });
exports.VpnRecommendedAlarmsAspect = exports.VpnConnection = exports.VpnConnectionRecommendedAlarms = exports.VpnConnectionTunnelStateAlarm = exports.VpnRecommendedAlarmsMetrics = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const common_1 = require("./common");
/**
* The recommended metrics for VPN alarms.
*/
var VpnRecommendedAlarmsMetrics;
(function (VpnRecommendedAlarmsMetrics) {
/**
* Percentage of how close a file system is to reaching the I/O limit of the General Purpose
* performance mode.
*/
VpnRecommendedAlarmsMetrics["TUNNEL_STATE"] = "TunnelState";
})(VpnRecommendedAlarmsMetrics || (exports.VpnRecommendedAlarmsMetrics = VpnRecommendedAlarmsMetrics = {}));
/**
* This alarm helps you understand if the state of one or more tunnels is DOWN.
*
* For troubleshooting, see VPN tunnel troubleshooting.
*
* The alarm is triggered when the monitored value is less than 1.
*/
class VpnConnectionTunnelStateAlarm extends aws_cdk_lib_1.aws_cloudwatch.Alarm {
constructor(scope, id, props) {
const alarmName = props.alarmName ?? `${props.vpnConnection.ref} - ${VpnRecommendedAlarmsMetrics.TUNNEL_STATE}`;
const period = props.period ?? aws_cdk_lib_1.Duration.minutes(5);
const evaluationPeriods = props.evaluationPeriods ?? 3;
const datapointsToAlarm = props.datapointsToAlarm ?? 3;
const threshold = props.threshold ?? 1;
const treatMissingData = props.treatMissingData ?? aws_cdk_lib_1.aws_cloudwatch.TreatMissingData.MISSING;
const alarmDescription = props.alarmDescription ?? 'This alarm is used to detect if at least one tunnel is in the DOWN state for this VPN,'
+ ' so that you can troubleshoot the impacted VPN. This alarm will always be in the ALARM state for networks that only have a single tunnel configured.';
(0, common_1.validateTotalAlarmPeriod)(period, evaluationPeriods, alarmName);
super(scope, id, {
alarmName,
metric: new aws_cdk_lib_1.aws_cloudwatch.Metric({
namespace: 'AWS/VPN',
metricName: VpnRecommendedAlarmsMetrics.TUNNEL_STATE,
dimensionsMap: {
VpnId: props.vpnConnection.ref,
},
period,
statistic: 'Minimum',
}),
threshold,
evaluationPeriods,
datapointsToAlarm,
treatMissingData,
comparisonOperator: aws_cdk_lib_1.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD,
alarmDescription,
});
if (props.alarmAction)
this.addAlarmAction(props.alarmAction);
if (props.okAction)
this.addOkAction(props.okAction);
if (props.insufficientDataAction)
this.addInsufficientDataAction(props.insufficientDataAction);
}
}
exports.VpnConnectionTunnelStateAlarm = VpnConnectionTunnelStateAlarm;
_a = JSII_RTTI_SYMBOL_1;
VpnConnectionTunnelStateAlarm[_a] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.VpnConnectionTunnelStateAlarm", version: "0.0.13" };
;
/**
* A construct that creates the recommended alarms for an VpnConnection.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#VPN
*/
class VpnConnectionRecommendedAlarms extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
if (!props.excludeAlarms?.includes(VpnRecommendedAlarmsMetrics.TUNNEL_STATE)) {
this.alarmTunnelState = new VpnConnectionTunnelStateAlarm(this, `${props.vpnConnection.node.id}_TunnelState`, {
vpnConnection: props.vpnConnection,
treatMissingData: props.treatMissingData,
...props.configTunnelStateAlarm,
});
if (props.defaultAlarmAction &&
(!props.configTunnelStateAlarm || !props.configTunnelStateAlarm.alarmAction)) {
this.alarmTunnelState.addAlarmAction(props.defaultAlarmAction);
}
if (props.defaultOkAction &&
(!props.configTunnelStateAlarm || !props.configTunnelStateAlarm.okAction)) {
this.alarmTunnelState.addOkAction(props.defaultOkAction);
}
if (props.defaultInsufficientDataAction &&
(!props.configTunnelStateAlarm || !props.configTunnelStateAlarm.insufficientDataAction)) {
this.alarmTunnelState.addInsufficientDataAction(props.defaultInsufficientDataAction);
}
}
}
}
exports.VpnConnectionRecommendedAlarms = VpnConnectionRecommendedAlarms;
_b = JSII_RTTI_SYMBOL_1;
VpnConnectionRecommendedAlarms[_b] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.VpnConnectionRecommendedAlarms", version: "0.0.13" };
/**
* An extension for the CfnVPNConnection construct that provides methods
* to create recommended alarms.
*/
class VpnConnection extends aws_cdk_lib_1.aws_ec2.CfnVPNConnection {
constructor(scope, id, props) {
super(scope, id, props);
}
/**
* Creates an alarm that monitors the TunnelState for the VPN vpnConnection.
*/
alarmTunnelState(props) {
return new VpnConnectionTunnelStateAlarm(this, 'TunnelStateAlarm', {
vpnConnection: this,
...props,
});
}
/**
* Creates the recommended alarms for the VpnConnection.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#VPN
*/
applyRecommendedAlarms(props) {
return new VpnConnectionRecommendedAlarms(this, 'VpnConnectionRecommendedAlarms', {
vpnConnection: this,
...props,
});
}
}
exports.VpnConnection = VpnConnection;
_c = JSII_RTTI_SYMBOL_1;
VpnConnection[_c] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.VpnConnection", version: "0.0.13" };
/**
* Configures the recommended alarms for an VpnConnection.
*
* @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#VPN
*/
class VpnRecommendedAlarmsAspect {
constructor(props) {
this.props = props;
}
visit(node) {
if (node instanceof aws_cdk_lib_1.aws_ec2.CfnVPNConnection) {
if (this.props?.excludeResources && this.props.excludeResources.includes(node.node.id)) {
return;
}
else {
const vpnConnection = node;
new VpnConnectionRecommendedAlarms(vpnConnection, 'VpnConnectionRecommendedAlarmsFromAspect', {
vpnConnection,
...this.props,
});
}
}
}
}
exports.VpnRecommendedAlarmsAspect = VpnRecommendedAlarmsAspect;
_d = JSII_RTTI_SYMBOL_1;
VpnRecommendedAlarmsAspect[_d] = { fqn: "@renovosolutions/cdk-library-cloudwatch-alarms.VpnRecommendedAlarmsAspect", version: "0.0.13" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Zwbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUtxQjtBQUNyQiwyQ0FBbUQ7QUFDbkQscUNBQW9FO0FBRXBFOztHQUVHO0FBQ0gsSUFBWSwyQkFNWDtBQU5ELFdBQVksMkJBQTJCO0lBQ3JDOzs7T0FHRztJQUNILDJEQUE0QixDQUFBO0FBQzlCLENBQUMsRUFOVywyQkFBMkIsMkNBQTNCLDJCQUEyQixRQU10QztBQWtFRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLDZCQUE4QixTQUFRLDRCQUFVLENBQUMsS0FBSztJQUNqRSxZQUFZLEtBQWlCLEVBQUUsRUFBVSxFQUFFLEtBQXlDO1FBQ2xGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNoSCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixJQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksNEJBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7UUFDdkYsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLElBQUksd0ZBQXdGO2NBQ3ZJLHNKQUFzSixDQUFDO1FBRTNKLElBQUEsaUNBQXdCLEVBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FB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LENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksZ0JBQWdCLENBQUMsS0FBaUM7UUFDdkQsT0FBTyxJQUFJLDZCQUE2QixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNqRSxhQUFhLEVBQUUsSUFBSTtZQUNuQixHQUFHLEtBQUs7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLHNCQUFzQixDQUFDLEtBQTRDO1FBQ3hFLE9BQU8sSUFBSSw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsZ0NBQWdDLEVBQUU7WUFDaEYsYUFBYSxFQUFFLElBQUk7WUFDbkIsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF6Qkgsc0NBMEJDOzs7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSwwQkFBMEI7SUFDckMsWUFBNkIsS0FBNEM7UUFBNUMsVUFBSyxHQUFMLEtBQUssQ0FBdUM7SUFBRyxDQUFDO0lBRXRFLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxxQkFBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDekMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDdkYsT0FBTztZQUNULENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLGFBQWEsR0FBRyxJQUE0QixDQUFDO2dCQUVuRCxJQUFJLDhCQUE4QixDQUFDLGFBQWEsRUFBRSwwQ0FBMEMsRUFBRTtvQkFDNUYsYUFBYTtvQkFDYixHQUFHLElBQUksQ0FBQyxLQUFLO2lCQUNkLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUFoQkgsZ0VBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUFzcGVjdCxcbiAgYXdzX2VjMiBhcyBlYzIsXG4gIGF3c19jbG91ZHdhdGNoIGFzIGNsb3Vkd2F0Y2gsXG4gIER1cmF0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEFsYXJtQmFzZVByb3BzLCB2YWxpZGF0ZVRvdGFsQWxhcm1QZXJpb2QgfSBmcm9tICcuL2NvbW1vbic7XG5cbi8qKlxuICogVGhlIHJlY29tbWVuZGVkIG1ldHJpY3MgZm9yIFZQTiBhbGFybXMuXG4gKi9cbmV4cG9ydCBlbnVtIFZwblJlY29tbWVuZGVkQWxhcm1zTWV0cmljcyB7XG4gIC8qKlxuICAgKiBQZXJjZW50YWdlIG9mIGhvdyBjbG9zZSBhIGZpbGUgc3lzdGVtIGlzIHRvIHJlYWNoaW5nIHRoZSBJL08gbGltaXQgb2YgdGhlIEdlbmVyYWwgUHVycG9zZVxuICAgKiBwZXJmb3JtYW5jZSBtb2RlLlxuICAgKi9cbiAgVFVOTkVMX1NUQVRFID0gJ1R1bm5lbFN0YXRlJyxcbn1cblxuLyoqXG4gKiBUaGUgY29tbW9uIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhbGFybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBuQWxhcm1CYXNlQ29uZmlnIGV4dGVuZHMgQWxhcm1CYXNlUHJvcHMge1xuICAvKipcbiAgICogVGhlIHBlcmlvZCBvdmVyIHdoaWNoIHRoZSBzcGVjaWZpZWQgc3RhdGlzdGljIGlzIGFwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLm1pbnV0ZXMoNSlcbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZD86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIFRoZSBjb21tb24gcHJvcGVydGllcyBmb3IgdGhlIFZwbkNvbm5lY3Rpb24gYWxhcm1zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZwbkNvbm5lY3Rpb25BbGFybVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBWcG5Db25uZWN0aW9uIHRvIG1vbml0b3IuXG4gICAqL1xuICByZWFkb25seSB2cG5Db25uZWN0aW9uOiBlYzIuQ2ZuVlBOQ29ubmVjdGlvbjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgVHVubmVsU3RhdGUgYWxhcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBuVHVubmVsU3RhdGVBbGFybUNvbmZpZyBleHRlbmRzIFZwbkFsYXJtQmFzZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBBIHZhbHVlIGxlc3MgdGhhbiAxIGluZGljYXRlcyB0aGF0IGF0IGxlYXN0IG9uZSB0dW5uZWwgaXMgaW4gRE9XTiBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBwZXJpb2RzIG92ZXIgd2hpY2ggZGF0YSBpcyBjb21wYXJlZCB0byB0aGUgc3BlY2lmaWVkIHRocmVzaG9sZC5cbiAgICpcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIHRoYXQgbXVzdCBiZSBicmVhY2hpbmcgdG8gdHJpZ2dlciB0aGUgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IDNcbiAgICovXG4gIHJlYWRvbmx5IGRhdGFwb2ludHNUb0FsYXJtPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGFsYXJtIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdnBuQ29ubmVjdGlvbklkICsgJyAtIFR1bm5lbFN0YXRlJ1xuICAgKi9cbiAgcmVhZG9ubHkgYWxhcm1OYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IGlmIGF0IGxlYXN0IG9uZSB0dW5uZWwgaXMgaW4gdGhlIERPV04gc3RhdGUgZm9yIHRoaXMgVlBOLCBzbyB0aGF0IHlvdSBjYW4gdHJvdWJsZXNob290XG4gICAqIHRoZSBpbXBhY3RlZCBWUE4uIFRoaXMgYWxhcm0gd2lsbCBhbHdheXMgYmUgaW4gdGhlIEFMQVJNIHN0YXRlIGZvciBuZXR3b3JrcyB0aGF0IG9ubHkgaGF2ZSBhIHNpbmdsZSB0dW5uZWwgY29uZmlndXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBWcG5Db25uZWN0aW9uVHVubmVsU3RhdGVBbGFybSBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVnBuQ29ubmVjdGlvblR1bm5lbFN0YXRlQWxhcm1Qcm9wcyBleHRlbmRzIFZwbkNvbm5lY3Rpb25BbGFybVByb3BzLCBWcG5UdW5uZWxTdGF0ZUFsYXJtQ29uZmlnIHt9XG5cbi8qKlxuICogVGhpcyBhbGFybSBoZWxwcyB5b3UgdW5kZXJzdGFuZCBpZiB0aGUgc3RhdGUgb2Ygb25lIG9yIG1vcmUgdHVubmVscyBpcyBET1dOLlxuICpcbiAqIEZvciB0cm91Ymxlc2hvb3RpbmcsIHNlZSBWUE4gdHVubmVsIHRyb3VibGVzaG9vdGluZy5cbiAqXG4gKiBUaGUgYWxhcm0gaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIG1vbml0b3JlZCB2YWx1ZSBpcyBsZXNzIHRoYW4gMS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZwbkNvbm5lY3Rpb25UdW5uZWxTdGF0ZUFsYXJtIGV4dGVuZHMgY2xvdWR3YXRjaC5BbGFybSB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVnBuQ29ubmVjdGlvblR1bm5lbFN0YXRlQWxhcm1Qcm9wcykge1xuICAgIGNvbnN0IGFsYXJtTmFtZSA9IHByb3BzLmFsYXJtTmFtZSA/PyBgJHtwcm9wcy52cG5Db25uZWN0aW9uLnJlZn0gLSAke1ZwblJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5UVU5ORUxfU1RBVEV9YDtcbiAgICBjb25zdCBwZXJpb2QgPSBwcm9wcy5wZXJpb2QgPz8gRHVyYXRpb24ubWludXRlcyg1KTtcbiAgICBjb25zdCBldmFsdWF0aW9uUGVyaW9kcyA9IHByb3BzLmV2YWx1YXRpb25QZXJpb2RzID8/IDM7XG4gICAgY29uc3QgZGF0YXBvaW50c1RvQWxhcm0gPSBwcm9wcy5kYXRhcG9pbnRzVG9BbGFybSA/PyAzO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHByb3BzLnRocmVzaG9sZCA/PyAxO1xuICAgIGNvbnN0IHRyZWF0TWlzc2luZ0RhdGEgPSBwcm9wcy50cmVhdE1pc3NpbmdEYXRhID8/IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5NSVNTSU5HO1xuICAgIGNvbnN0IGFsYXJtRGVzY3JpcHRpb24gPSBwcm9wcy5hbGFybURlc2NyaXB0aW9uID8/ICdUaGlzIGFsYXJtIGlzIHVzZWQgdG8gZGV0ZWN0IGlmIGF0IGxlYXN0IG9uZSB0dW5uZWwgaXMgaW4gdGhlIERPV04gc3RhdGUgZm9yIHRoaXMgVlBOLCdcbiAgICAgICsgJyBzbyB0aGF0IHlvdSBjYW4gdHJvdWJsZXNob290IHRoZSBpbXBhY3RlZCBWUE4uIFRoaXMgYWxhcm0gd2lsbCBhbHdheXMgYmUgaW4gdGhlIEFMQVJNIHN0YXRlIGZvciBuZXR3b3JrcyB0aGF0IG9ubHkgaGF2ZSBhIHNpbmdsZSB0dW5uZWwgY29uZmlndXJlZC4nO1xuXG4gICAgdmFsaWRhdGVUb3RhbEFsYXJtUGVyaW9kKHBlcmlvZCwgZXZhbHVhdGlvblBlcmlvZHMsIGFsYXJtTmFtZSk7XG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGFsYXJtTmFtZSxcbiAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgbmFtZXNwYWNlOiAnQVdTL1ZQTicsXG4gICAgICAgIG1ldHJpY05hbWU6IFZwblJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5UVU5ORUxfU1RBVEUsXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBWcG5JZDogcHJvcHMudnBuQ29ubmVjdGlvbi5yZWYsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZCxcbiAgICAgICAgc3RhdGlzdGljOiAnTWluaW11bScsXG4gICAgICB9KSxcbiAgICAgIHRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICB0cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xELFxuICAgICAgYWxhcm1EZXNjcmlwdGlvbixcbiAgICB9KTtcblxuICAgIGlmIChwcm9wcy5hbGFybUFjdGlvbikgdGhpcy5hZGRBbGFybUFjdGlvbihwcm9wcy5hbGFybUFjdGlvbik7XG4gICAgaWYgKHByb3BzLm9rQWN0aW9uKSB0aGlzLmFkZE9rQWN0aW9uKHByb3BzLm9rQWN0aW9uKTtcbiAgICBpZiAocHJvcHMuaW5zdWZmaWNpZW50RGF0YUFjdGlvbikgdGhpcy5hZGRJbnN1ZmZpY2llbnREYXRhQWN0aW9uKHByb3BzLmluc3VmZmljaWVudERhdGFBY3Rpb24pO1xuICB9XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb25zIGZvciB0aGUgcmVjb21tZW5kZWQgYWxhcm1zIGZvciBhbiBWUE4gU2VydmljZS5cbiAqXG4gKiBEZWZhdWx0IGFjdGlvbnMgYXJlIG92ZXJyaWRkZW4gYnkgdGhlIGFjdGlvbnMgc3BlY2lmaWVkIGluIHRoZVxuICogaW5kaXZpZHVhbCBhbGFybSBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNDb25maWcge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgYWN0aW9uIHRvIHRha2Ugd2hlbiBhbiBhbGFybSBpcyB0cmlnZ2VyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFsYXJtQWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIGFsYXJtIGVudGVycyB0aGUgb2sgc3RhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdE9rQWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb247XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24gdG8gdGFrZSB3aGVuIGFuIGFsYXJtIGhhcyBpbnN1ZmZpY2llbnQgZGF0YS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0SW5zdWZmaWNpZW50RGF0YUFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uO1xuICAvKipcbiAgICogSG93IHRvIGhhbmRsZSBtaXNzaW5nIGRhdGEgZm9yIHRoaXMgYWxhcm0uXG4gICAqXG4gICAqIEBkZWZhdWx0IFRyZWF0TWlzc2luZ0RhdGEuTUlTU0lOR1xuICAgKi9cbiAgcmVhZG9ubHkgdHJlYXRNaXNzaW5nRGF0YT86IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YTtcbiAgLyoqXG4gICAqIEFsYXJtIG1ldHJpY3MgdG8gZXhjbHVkZSBmcm9tIHRoZSByZWNvbW1lbmRlZCBhbGFybXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZUFsYXJtcz86IFZwblJlY29tbWVuZGVkQWxhcm1zTWV0cmljc1tdO1xuICAvKipcbiAgICogVGhlIHJlc291cmNlcyB0byBleGNsdWRlIGZyb20gdGhlIHJlY29tbWVuZGVkIGFsYXJtcy5cbiAgICpcbiAgICogVXNlIGEgcmVzb3VyY2VzIGlkIHRvIGV4Y2x1ZGUgYSBzcGVjaWZpYyByZXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVSZXNvdXJjZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVHVubmVsU3RhdGUgYWxhcm0uXG4gICAqL1xuICByZWFkb25seSBjb25maWdUdW5uZWxTdGF0ZUFsYXJtPzogVnBuVHVubmVsU3RhdGVBbGFybUNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgVnBuQ29ubmVjdGlvblJlY29tbWVuZGVkQWxhcm1zIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNQcm9wcyBleHRlbmRzIFZwbkNvbm5lY3Rpb25SZWNvbW1lbmRlZEFsYXJtc0NvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgVnBuQ29ubmVjdGlvbiB0byBtb25pdG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgdnBuQ29ubmVjdGlvbjogZWMyLkNmblZQTkNvbm5lY3Rpb247XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIGFuIFZwbkNvbm5lY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9CZXN0X1ByYWN0aWNlX1JlY29tbWVuZGVkX0FsYXJtc19BV1NfU2VydmljZXMuaHRtbCNWUE5cbiAqL1xuZXhwb3J0IGNsYXNzIFZwbkNvbm5lY3Rpb25SZWNvbW1lbmRlZEFsYXJtcyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgVHVubmVsU3RhdGUgYWxhcm0uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYWxhcm1UdW5uZWxTdGF0ZT86IFZwbkNvbm5lY3Rpb25UdW5uZWxTdGF0ZUFsYXJtO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBpZiAoIXByb3BzLmV4Y2x1ZGVBbGFybXM/LmluY2x1ZGVzKFZwblJlY29tbWVuZGVkQWxhcm1zTWV0cmljcy5UVU5ORUxfU1RBVEUpKSB7XG4gICAgICB0aGlzLmFsYXJtVHVubmVsU3RhdGUgPSBuZXcgVnBuQ29ubmVjdGlvblR1bm5lbFN0YXRlQWxhcm0odGhpcywgYCR7cHJvcHMudnBuQ29ubmVjdGlvbi5ub2RlLmlkfV9UdW5uZWxTdGF0ZWAsIHtcbiAgICAgICAgdnBuQ29ubmVjdGlvbjogcHJvcHMudnBuQ29ubmVjdGlvbixcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogcHJvcHMudHJlYXRNaXNzaW5nRGF0YSxcbiAgICAgICAgLi4ucHJvcHMuY29uZmlnVHVubmVsU3RhdGVBbGFybSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHByb3BzLmRlZmF1bHRBbGFybUFjdGlvbiAmJlxuICAgICAgICAoIXByb3BzLmNvbmZpZ1R1bm5lbFN0YXRlQWxhcm0gfHwgIXByb3BzLmNvbmZpZ1R1bm5lbFN0YXRlQWxhcm0uYWxhcm1BY3Rpb24pXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hbGFybVR1bm5lbFN0YXRlLmFkZEFsYXJtQWN0aW9uKHByb3BzLmRlZmF1bHRBbGFybUFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcHMuZGVmYXVsdE9rQWN0aW9uICYmXG4gICAgICAgICghcHJvcHMuY29uZmlnVHVubmVsU3RhdGVBbGFybSB8fCAhcHJvcHMuY29uZmlnVHVubmVsU3RhdGVBbGFybS5va0FjdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFsYXJtVHVubmVsU3RhdGUuYWRkT2tBY3Rpb24ocHJvcHMuZGVmYXVsdE9rQWN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wcy5kZWZhdWx0SW5zdWZmaWNpZW50RGF0YUFjdGlvbiAmJlxuICAgICAgICAoIXByb3BzLmNvbmZpZ1R1bm5lbFN0YXRlQWxhcm0gfHwgIXByb3BzLmNvbmZpZ1R1bm5lbFN0YXRlQWxhcm0uaW5zdWZmaWNpZW50RGF0YUFjdGlvbilcbiAgICAgICkge1xuICAgICAgICB0aGlzLmFsYXJtVHVubmVsU3RhdGUuYWRkSW5zdWZmaWNpZW50RGF0YUFjdGlvbihwcm9wcy5kZWZhdWx0SW5zdWZmaWNpZW50RGF0YUFjdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQW4gZXh0ZW5zaW9uIGZvciB0aGUgQ2ZuVlBOQ29ubmVjdGlvbiBjb25zdHJ1Y3QgdGhhdCBwcm92aWRlcyBtZXRob2RzXG4gKiB0byBjcmVhdGUgcmVjb21tZW5kZWQgYWxhcm1zLlxuICovXG5leHBvcnQgY2xhc3MgVnBuQ29ubmVjdGlvbiBleHRlbmRzIGVjMi5DZm5WUE5Db25uZWN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IGVjMi5DZm5WUE5Db25uZWN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGFsYXJtIHRoYXQgbW9uaXRvcnMgdGhlIFR1bm5lbFN0YXRlIGZvciB0aGUgVlBOIHZwbkNvbm5lY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYWxhcm1UdW5uZWxTdGF0ZShwcm9wcz86IFZwblR1bm5lbFN0YXRlQWxhcm1Db25maWcpOiBWcG5Db25uZWN0aW9uVHVubmVsU3RhdGVBbGFybSB7XG4gICAgcmV0dXJuIG5ldyBWcG5Db25uZWN0aW9uVHVubmVsU3RhdGVBbGFybSh0aGlzLCAnVHVubmVsU3RhdGVBbGFybScsIHtcbiAgICAgIHZwbkNvbm5lY3Rpb246IHRoaXMsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIHRoZSBWcG5Db25uZWN0aW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Jlc3RfUHJhY3RpY2VfUmVjb21tZW5kZWRfQWxhcm1zX0FXU19TZXJ2aWNlcy5odG1sI1ZQTlxuICAgKi9cbiAgcHVibGljIGFwcGx5UmVjb21tZW5kZWRBbGFybXMocHJvcHM/OiBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNDb25maWcpOiBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXMge1xuICAgIHJldHVybiBuZXcgVnBuQ29ubmVjdGlvblJlY29tbWVuZGVkQWxhcm1zKHRoaXMsICdWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXMnLCB7XG4gICAgICB2cG5Db25uZWN0aW9uOiB0aGlzLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIHRoZSByZWNvbW1lbmRlZCBhbGFybXMgZm9yIGFuIFZwbkNvbm5lY3Rpb24uXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRXYXRjaC9sYXRlc3QvbW9uaXRvcmluZy9CZXN0X1ByYWN0aWNlX1JlY29tbWVuZGVkX0FsYXJtc19BV1NfU2VydmljZXMuaHRtbCNWUE5cbiAqL1xuZXhwb3J0IGNsYXNzIFZwblJlY29tbWVuZGVkQWxhcm1zQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcHM/OiBWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNDb25maWcpIHt9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGVjMi5DZm5WUE5Db25uZWN0aW9uKSB7XG4gICAgICBpZiAodGhpcy5wcm9wcz8uZXhjbHVkZVJlc291cmNlcyAmJiB0aGlzLnByb3BzLmV4Y2x1ZGVSZXNvdXJjZXMuaW5jbHVkZXMobm9kZS5ub2RlLmlkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2cG5Db25uZWN0aW9uID0gbm9kZSBhcyBlYzIuQ2ZuVlBOQ29ubmVjdGlvbjtcblxuICAgICAgICBuZXcgVnBuQ29ubmVjdGlvblJlY29tbWVuZGVkQWxhcm1zKHZwbkNvbm5lY3Rpb24sICdWcG5Db25uZWN0aW9uUmVjb21tZW5kZWRBbGFybXNGcm9tQXNwZWN0Jywge1xuICAgICAgICAgIHZwbkNvbm5lY3Rpb24sXG4gICAgICAgICAgLi4udGhpcy5wcm9wcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=