@liflig/cdk 3.22.18 → 3.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import * as cloudwatchActions from "aws-cdk-lib/aws-cloudwatch-actions";
2
+ import * as lambda from "aws-cdk-lib/aws-lambda";
2
3
  import type * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
3
4
  import * as sns from "aws-cdk-lib/aws-sns";
4
5
  import * as constructs from "constructs";
@@ -15,11 +16,15 @@ export interface SlackAlarmProps {
15
16
  slackWebhookUrlSecret: secretsmanager.ISecret;
16
17
  }
17
18
  /**
18
- * SNS Topic that can be used to action alarms, with a Lambda
19
+ * Creates
20
+ * - SNS Topic that can be used to action alarms, with a Lambda
19
21
  * that will send a message to Slack for the alarm.
22
+ * - A reusable Lambda that accepts CloudWatch Logs subscription events and posts
23
+ * formatted error messages to Slack.
20
24
  */
21
25
  export declare class SlackAlarm extends constructs.Construct {
22
26
  readonly alarmTopic: sns.Topic;
23
27
  readonly snsAction: cloudwatchActions.SnsAction;
28
+ readonly logHandler: lambda.Function;
24
29
  constructor(scope: constructs.Construct, id: string, props: SlackAlarmProps);
25
30
  }
@@ -7,21 +7,25 @@ import { Effect, PolicyStatement } from "aws-cdk-lib/aws-iam";
7
7
  import * as lambda from "aws-cdk-lib/aws-lambda";
8
8
  import * as sns from "aws-cdk-lib/aws-sns";
9
9
  import * as constructs from "constructs";
10
- const __filename = fileURLToPath(import.meta.url);
11
- const __dirname = path.dirname(__filename);
10
+ const __file = fileURLToPath(import.meta.url);
11
+ const __dir = path.dirname(__file);
12
12
  /**
13
- * SNS Topic that can be used to action alarms, with a Lambda
13
+ * Creates
14
+ * - SNS Topic that can be used to action alarms, with a Lambda
14
15
  * that will send a message to Slack for the alarm.
16
+ * - A reusable Lambda that accepts CloudWatch Logs subscription events and posts
17
+ * formatted error messages to Slack.
15
18
  */
16
19
  export class SlackAlarm extends constructs.Construct {
17
20
  alarmTopic;
18
21
  snsAction;
22
+ logHandler;
19
23
  constructor(scope, id, props) {
20
24
  super(scope, id);
21
25
  this.alarmTopic = new sns.Topic(this, "Topic");
22
26
  this.snsAction = new cloudwatchActions.SnsAction(this.alarmTopic);
23
27
  const slackLambda = new lambda.Function(this, "Function", {
24
- code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/slack-alarm-lambda")),
28
+ code: lambda.Code.fromAsset(path.join(__dir, "../../assets/slack-alarm-lambda")),
25
29
  description: "Receives CloudWatch Alarms through SNS and sends a formatted version to Slack",
26
30
  handler: "index.handler",
27
31
  memorySize: 128,
@@ -33,6 +37,20 @@ export class SlackAlarm extends constructs.Construct {
33
37
  ENVIRONMENT_NAME: props.envName,
34
38
  },
35
39
  });
40
+ this.logHandler = new lambda.Function(this, "LogHandler", {
41
+ code: lambda.Code.fromAsset(path.join(__dir, "../../assets", "slack-error-log-handler-lambda")),
42
+ description: "Receives CloudWatch Logs subscription events and sends formatted errors to Slack",
43
+ handler: "index.handler",
44
+ memorySize: 128,
45
+ runtime: lambda.Runtime.PYTHON_3_14,
46
+ timeout: Duration.seconds(10),
47
+ environment: {
48
+ SLACK_URL_SECRET_NAME: props.slackWebhookUrlSecret.secretName,
49
+ PROJECT_NAME: props.projectName,
50
+ ENVIRONMENT_NAME: props.envName,
51
+ },
52
+ });
53
+ props.slackWebhookUrlSecret.grantRead(this.logHandler);
36
54
  props.slackWebhookUrlSecret.grantRead(slackLambda);
37
55
  slackLambda.addPermission("InvokePermission", {
38
56
  action: "lambda:InvokeFunction",
@@ -51,4 +69,4 @@ export class SlackAlarm extends constructs.Construct {
51
69
  });
52
70
  }
53
71
  }
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL3NsYWNrLWFsYXJtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLEtBQUssaUJBQWlCLE1BQU0sb0NBQW9DLENBQUE7QUFDdkUsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNqRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0FBZTFDOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDbEMsVUFBVSxDQUFXO0lBQ3JCLFNBQVMsQ0FBNkI7SUFFdEQsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFzQjtRQUN6RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUU5QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUN4RCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGlDQUFpQyxDQUFDLENBQ3hEO1lBQ0QsV0FBVyxFQUNULCtFQUErRTtZQUNqRixPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRztZQUNmLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsRUFBRTtnQkFDWCxxQkFBcUIsRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsVUFBVTtnQkFDN0QsWUFBWSxFQUFFLEtBQUssQ0FBQyxXQUFXO2dCQUMvQixnQkFBZ0IsRUFBRSxLQUFLLENBQUMsT0FBTzthQUNoQztTQUNGLENBQUMsQ0FBQTtRQUVGLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFbEQsV0FBVyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRTtZQUM1QyxNQUFNLEVBQUUsdUJBQXVCO1lBQy9CLFNBQVMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztZQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1NBQ3BDLENBQUMsQ0FBQTtRQUNGLFdBQVcsQ0FBQyxlQUFlLENBQ3pCLElBQUksZUFBZSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLDJCQUEyQixDQUFDO1lBQ3RDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztZQUNwQixTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUE7UUFFRCxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUN6QyxRQUFRLEVBQUUsV0FBVyxDQUFDLFdBQVc7WUFDakMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtTQUN2QixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiXG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoQWN0aW9ucyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gtYWN0aW9uc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0IHR5cGUgKiBhcyBzZWNyZXRzbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCJcbmltcG9ydCAqIGFzIHNucyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNuc1wiXG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhY2tBbGFybVByb3BzIHtcbiAgcHJvamVjdE5hbWU6IHN0cmluZ1xuICBlbnZOYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIEEgcGxhaW50ZXh0IHNlY3JldCBjb250YWluaW5nIHRoZSBVUkwgb2YgYSBTbGFjayBpbmNvbWluZyB3ZWJob29rLlxuICAgKiBUaGUgd2ViaG9vayBzaG91bGQgYmUgY3JlYXRlZCB0aHJvdWdoIGEgU2xhY2sgYXBwLCBhbmQgb25seSBhbGxvd3MgcG9zdGluZyB0byBvbmUgc3BlY2lmaWMgU2xhY2sgY2hhbm5lbC5cbiAgICogU2VlIFNsYWNrJ3Mgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiAoZS5nLiwgaHR0cHM6Ly9hcGkuc2xhY2suY29tL21lc3NhZ2luZy93ZWJob29rcykgZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogTk9URTogSW5jb21pbmcgd2ViaG9va3MgY3JlYXRlZCB0aHJvdWdoIGxlZ2FjeSBjdXN0b20gaW50ZWdyYXRpb25zIGluIFNsYWNrIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgKi9cbiAgc2xhY2tXZWJob29rVXJsU2VjcmV0OiBzZWNyZXRzbWFuYWdlci5JU2VjcmV0XG59XG5cbi8qKlxuICogU05TIFRvcGljIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWN0aW9uIGFsYXJtcywgd2l0aCBhIExhbWJkYVxuICogdGhhdCB3aWxsIHNlbmQgYSBtZXNzYWdlIHRvIFNsYWNrIGZvciB0aGUgYWxhcm0uXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGFja0FsYXJtIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYWxhcm1Ub3BpYzogc25zLlRvcGljXG4gIHB1YmxpYyByZWFkb25seSBzbnNBY3Rpb246IGNsb3Vkd2F0Y2hBY3Rpb25zLlNuc0FjdGlvblxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNsYWNrQWxhcm1Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuYWxhcm1Ub3BpYyA9IG5ldyBzbnMuVG9waWModGhpcywgXCJUb3BpY1wiKVxuXG4gICAgdGhpcy5zbnNBY3Rpb24gPSBuZXcgY2xvdWR3YXRjaEFjdGlvbnMuU25zQWN0aW9uKHRoaXMuYWxhcm1Ub3BpYylcblxuICAgIGNvbnN0IHNsYWNrTGFtYmRhID0gbmV3IGxhbWJkYS5GdW5jdGlvbih0aGlzLCBcIkZ1bmN0aW9uXCIsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi8uLi9hc3NldHMvc2xhY2stYWxhcm0tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlJlY2VpdmVzIENsb3VkV2F0Y2ggQWxhcm1zIHRocm91Z2ggU05TIGFuZCBzZW5kcyBhIGZvcm1hdHRlZCB2ZXJzaW9uIHRvIFNsYWNrXCIsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzEzLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg2KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFNMQUNLX1VSTF9TRUNSRVRfTkFNRTogcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LnNlY3JldE5hbWUsXG4gICAgICAgIFBST0pFQ1RfTkFNRTogcHJvcHMucHJvamVjdE5hbWUsXG4gICAgICAgIEVOVklST05NRU5UX05BTUU6IHByb3BzLmVudk5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBwcm9wcy5zbGFja1dlYmhvb2tVcmxTZWNyZXQuZ3JhbnRSZWFkKHNsYWNrTGFtYmRhKVxuXG4gICAgc2xhY2tMYW1iZGEuYWRkUGVybWlzc2lvbihcIkludm9rZVBlcm1pc3Npb25cIiwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJzbnMuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIHNvdXJjZUFybjogdGhpcy5hbGFybVRvcGljLnRvcGljQXJuLFxuICAgIH0pXG4gICAgc2xhY2tMYW1iZGEuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImNsb3Vkd2F0Y2g6RGVzY3JpYmVBbGFybXNcIl0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBuZXcgc25zLlN1YnNjcmlwdGlvbih0aGlzLCBcIlN1YnNjcmlwdGlvblwiLCB7XG4gICAgICBlbmRwb2ludDogc2xhY2tMYW1iZGEuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm90b2NvbDogc25zLlN1YnNjcmlwdGlvblByb3RvY29sLkxBTUJEQSxcbiAgICAgIHRvcGljOiB0aGlzLmFsYXJtVG9waWMsXG4gICAgfSlcbiAgfVxufVxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWxhcm1zL3NsYWNrLWFsYXJtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLEtBQUssaUJBQWlCLE1BQU0sb0NBQW9DLENBQUE7QUFDdkUsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBQzdELE9BQU8sS0FBSyxNQUFNLE1BQU0sd0JBQXdCLENBQUE7QUFFaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBZWxDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDbEMsVUFBVSxDQUFXO0lBQ3JCLFNBQVMsQ0FBNkI7SUFDdEMsVUFBVSxDQUFpQjtJQUUzQyxZQUFZLEtBQTJCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQ3pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTlDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ3hELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsaUNBQWlDLENBQUMsQ0FDcEQ7WUFDRCxXQUFXLEVBQ1QsK0VBQStFO1lBQ2pGLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDNUIsV0FBVyxFQUFFO2dCQUNYLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVO2dCQUM3RCxZQUFZLEVBQUUsS0FBSyxDQUFDLFdBQVc7Z0JBQy9CLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxPQUFPO2FBQ2hDO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN4RCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUNuRTtZQUNELFdBQVcsRUFDVCxrRkFBa0Y7WUFDcEYsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ25DLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixXQUFXLEVBQUU7Z0JBQ1gscUJBQXFCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQVU7Z0JBQzdELFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVztnQkFDL0IsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLE9BQU87YUFDaEM7U0FDRixDQUFDLENBQUE7UUFFRixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN0RCxLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRWxELFdBQVcsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDNUMsTUFBTSxFQUFFLHVCQUF1QjtZQUMvQixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7WUFDeEQsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtTQUNwQyxDQUFDLENBQUE7UUFDRixXQUFXLENBQUMsZUFBZSxDQUN6QixJQUFJLGVBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQztZQUN0QyxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDcEIsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUMsQ0FDSCxDQUFBO1FBRUQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDekMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxXQUFXO1lBQ2pDLFFBQVEsRUFBRSxHQUFHLENBQUMsb0JBQW9CLENBQUMsTUFBTTtZQUN6QyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIlxuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaEFjdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCB7IEVmZmVjdCwgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCB0eXBlICogYXMgc2VjcmV0c21hbmFnZXIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBzbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zbnNcIlxuaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5cbmNvbnN0IF9fZmlsZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKVxuY29uc3QgX19kaXIgPSBwYXRoLmRpcm5hbWUoX19maWxlKVxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrQWxhcm1Qcm9wcyB7XG4gIHByb2plY3ROYW1lOiBzdHJpbmdcbiAgZW52TmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBBIHBsYWludGV4dCBzZWNyZXQgY29udGFpbmluZyB0aGUgVVJMIG9mIGEgU2xhY2sgaW5jb21pbmcgd2ViaG9vay5cbiAgICogVGhlIHdlYmhvb2sgc2hvdWxkIGJlIGNyZWF0ZWQgdGhyb3VnaCBhIFNsYWNrIGFwcCwgYW5kIG9ubHkgYWxsb3dzIHBvc3RpbmcgdG8gb25lIHNwZWNpZmljIFNsYWNrIGNoYW5uZWwuXG4gICAqIFNlZSBTbGFjaydzIG9mZmljaWFsIGRvY3VtZW50YXRpb24gKGUuZy4sIGh0dHBzOi8vYXBpLnNsYWNrLmNvbS9tZXNzYWdpbmcvd2ViaG9va3MpIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIE5PVEU6IEluY29taW5nIHdlYmhvb2tzIGNyZWF0ZWQgdGhyb3VnaCBsZWdhY3kgY3VzdG9tIGludGVncmF0aW9ucyBpbiBTbGFjayBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHNsYWNrV2ViaG9va1VybFNlY3JldDogc2VjcmV0c21hbmFnZXIuSVNlY3JldFxufVxuXG4vKipcbiAqIENyZWF0ZXNcbiAqIC0gU05TIFRvcGljIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWN0aW9uIGFsYXJtcywgd2l0aCBhIExhbWJkYVxuICogdGhhdCB3aWxsIHNlbmQgYSBtZXNzYWdlIHRvIFNsYWNrIGZvciB0aGUgYWxhcm0uXG4gKiAtIEEgcmV1c2FibGUgTGFtYmRhIHRoYXQgYWNjZXB0cyBDbG91ZFdhdGNoIExvZ3Mgc3Vic2NyaXB0aW9uIGV2ZW50cyBhbmQgcG9zdHNcbiAqIGZvcm1hdHRlZCBlcnJvciBtZXNzYWdlcyB0byBTbGFjay5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsYWNrQWxhcm0gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhbGFybVRvcGljOiBzbnMuVG9waWNcbiAgcHVibGljIHJlYWRvbmx5IHNuc0FjdGlvbjogY2xvdWR3YXRjaEFjdGlvbnMuU25zQWN0aW9uXG4gIHB1YmxpYyByZWFkb25seSBsb2dIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb25cblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTbGFja0FsYXJtUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFsYXJtVG9waWMgPSBuZXcgc25zLlRvcGljKHRoaXMsIFwiVG9waWNcIilcblxuICAgIHRoaXMuc25zQWN0aW9uID0gbmV3IGNsb3Vkd2F0Y2hBY3Rpb25zLlNuc0FjdGlvbih0aGlzLmFsYXJtVG9waWMpXG5cbiAgICBjb25zdCBzbGFja0xhbWJkYSA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJGdW5jdGlvblwiLCB7XG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2RpciwgXCIuLi8uLi9hc3NldHMvc2xhY2stYWxhcm0tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlJlY2VpdmVzIENsb3VkV2F0Y2ggQWxhcm1zIHRocm91Z2ggU05TIGFuZCBzZW5kcyBhIGZvcm1hdHRlZCB2ZXJzaW9uIHRvIFNsYWNrXCIsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLlBZVEhPTl8zXzEzLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyg2KSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFNMQUNLX1VSTF9TRUNSRVRfTkFNRTogcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LnNlY3JldE5hbWUsXG4gICAgICAgIFBST0pFQ1RfTkFNRTogcHJvcHMucHJvamVjdE5hbWUsXG4gICAgICAgIEVOVklST05NRU5UX05BTUU6IHByb3BzLmVudk5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ0hhbmRsZXIgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiTG9nSGFuZGxlclwiLCB7XG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2RpciwgXCIuLi8uLi9hc3NldHNcIiwgXCJzbGFjay1lcnJvci1sb2ctaGFuZGxlci1sYW1iZGFcIiksXG4gICAgICApLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUmVjZWl2ZXMgQ2xvdWRXYXRjaCBMb2dzIHN1YnNjcmlwdGlvbiBldmVudHMgYW5kIHNlbmRzIGZvcm1hdHRlZCBlcnJvcnMgdG8gU2xhY2tcIixcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgbWVtb3J5U2l6ZTogMTI4LFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFNMQUNLX1VSTF9TRUNSRVRfTkFNRTogcHJvcHMuc2xhY2tXZWJob29rVXJsU2VjcmV0LnNlY3JldE5hbWUsXG4gICAgICAgIFBST0pFQ1RfTkFNRTogcHJvcHMucHJvamVjdE5hbWUsXG4gICAgICAgIEVOVklST05NRU5UX05BTUU6IHByb3BzLmVudk5hbWUsXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBwcm9wcy5zbGFja1dlYmhvb2tVcmxTZWNyZXQuZ3JhbnRSZWFkKHRoaXMubG9nSGFuZGxlcilcbiAgICBwcm9wcy5zbGFja1dlYmhvb2tVcmxTZWNyZXQuZ3JhbnRSZWFkKHNsYWNrTGFtYmRhKVxuXG4gICAgc2xhY2tMYW1iZGEuYWRkUGVybWlzc2lvbihcIkludm9rZVBlcm1pc3Npb25cIiwge1xuICAgICAgYWN0aW9uOiBcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiLFxuICAgICAgcHJpbmNpcGFsOiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJzbnMuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIHNvdXJjZUFybjogdGhpcy5hbGFybVRvcGljLnRvcGljQXJuLFxuICAgIH0pXG4gICAgc2xhY2tMYW1iZGEuYWRkVG9Sb2xlUG9saWN5KFxuICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcImNsb3Vkd2F0Y2g6RGVzY3JpYmVBbGFybXNcIl0sXG4gICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl0sXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBuZXcgc25zLlN1YnNjcmlwdGlvbih0aGlzLCBcIlN1YnNjcmlwdGlvblwiLCB7XG4gICAgICBlbmRwb2ludDogc2xhY2tMYW1iZGEuZnVuY3Rpb25Bcm4sXG4gICAgICBwcm90b2NvbDogc25zLlN1YnNjcmlwdGlvblByb3RvY29sLkxBTUJEQSxcbiAgICAgIHRvcGljOiB0aGlzLmFsYXJtVG9waWMsXG4gICAgfSlcbiAgfVxufVxuIl19
@@ -1,10 +1,107 @@
1
1
  import * as cdk from "aws-cdk-lib";
2
+ import type * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
2
3
  import * as ec2 from "aws-cdk-lib/aws-ec2";
3
4
  import * as ecs from "aws-cdk-lib/aws-ecs";
4
5
  import * as elb from "aws-cdk-lib/aws-elasticloadbalancingv2";
6
+ import type * as lambda from "aws-cdk-lib/aws-lambda";
5
7
  import * as logs from "aws-cdk-lib/aws-logs";
6
8
  import * as constructs from "constructs";
7
- import type { Parameter } from "../configure-parameters/configure-parameters";
9
+ import { ServiceAlarms } from "../alarms";
10
+ import type { Parameter } from "../configure-parameters";
11
+ /**
12
+ * Configure service alarms.
13
+ *
14
+ * Alarms are enabled by default when a config object with `alarmAction` and
15
+ * `warningAction` is provided. To explicitly disable automatic alarms use
16
+ * `{ enabled: false }`.
17
+ */
18
+ export type ServiceAlarmsConfig = {
19
+ enabled: false;
20
+ } | {
21
+ alarmAction: cloudwatch.IAlarmAction;
22
+ warningAction: cloudwatch.IAlarmAction;
23
+ loadBalancerFullName: string;
24
+ /** Optional Lambda function that will receive
25
+ * forwarded log events */
26
+ logHandler?: lambda.IFunction;
27
+ /**
28
+ * Individual alarm configuration overrides defaults.
29
+ */
30
+ jsonErrorAlarm?: {
31
+ /**
32
+ * @default true
33
+ */
34
+ enabled?: boolean;
35
+ alarmDescription?: string;
36
+ enableOkAlarm?: boolean;
37
+ action?: cloudwatch.IAlarmAction;
38
+ };
39
+ uncaughtJavaExceptionAlarm?: {
40
+ /**
41
+ * @default false
42
+ */
43
+ enabled?: boolean;
44
+ alarmDescription?: string;
45
+ enableOkAlarm?: boolean;
46
+ action?: cloudwatch.IAlarmAction;
47
+ };
48
+ targetHealthAlarm?: {
49
+ /**
50
+ * @default true
51
+ */
52
+ enabled?: boolean;
53
+ action?: cloudwatch.IAlarmAction;
54
+ period?: cdk.Duration;
55
+ evaluationPeriods?: number;
56
+ threshold?: number;
57
+ description?: string;
58
+ };
59
+ tooMany5xxResponsesFromTargetsAlarm?: {
60
+ /**
61
+ * @default true
62
+ */
63
+ enabled?: boolean;
64
+ action?: cloudwatch.IAlarmAction;
65
+ period?: cdk.Duration;
66
+ evaluationPeriods?: number;
67
+ threshold?: number;
68
+ description?: string;
69
+ };
70
+ targetResponseTimeAlarm?: {
71
+ /**
72
+ * @default true
73
+ */
74
+ enabled?: boolean;
75
+ action?: cloudwatch.IAlarmAction;
76
+ period?: cdk.Duration;
77
+ evaluationPeriods?: number;
78
+ threshold?: cdk.Duration;
79
+ description?: string;
80
+ };
81
+ single5xxResponseAlarm?: {
82
+ /**
83
+ * @default true
84
+ */
85
+ enabled?: boolean;
86
+ /**
87
+ * An action to use for CloudWatch alarm state changes instead of the default action
88
+ */
89
+ action?: cloudwatch.IAlarmAction;
90
+ /**
91
+ * @default 60 seconds
92
+ */
93
+ period?: cdk.Duration;
94
+ /**
95
+ * @default 1
96
+ */
97
+ evaluationPeriods?: number;
98
+ /**
99
+ * @default 1
100
+ */
101
+ threshold?: number;
102
+ description?: string;
103
+ };
104
+ };
8
105
  export interface FargateServiceProps {
9
106
  serviceName: string;
10
107
  vpc: ec2.IVpc;
@@ -66,6 +163,18 @@ export interface FargateServiceProps {
66
163
  * @default false
67
164
  */
68
165
  enableCircuitBreaker?: boolean;
166
+ /**
167
+ * Either
168
+ * - `{ enabled: false }` to disable all alarms.
169
+ * - object with required `alarmAction`, `warningAction`, and `loadBalancerFullName`.
170
+ *
171
+ * When enabled, the construct will:
172
+ * - (By default) add a log-based JSON error alarm (enabled by default).
173
+ * - (By default) add target-group related alarms (target health, 5xx responses, response time)
174
+ * when a target group is present.
175
+ * - (Opt-in) optionally enable the uncaught Java exception alarm
176
+ */
177
+ alarms: ServiceAlarmsConfig;
69
178
  }
70
179
  export declare class FargateService extends constructs.Construct {
71
180
  readonly fargateService: ecs.FargateService;
@@ -73,5 +182,6 @@ export declare class FargateService extends constructs.Construct {
73
182
  readonly taskDefinition: ecs.TaskDefinition;
74
183
  readonly targetGroup: elb.ApplicationTargetGroup | undefined;
75
184
  readonly logGroup: logs.LogGroup;
185
+ readonly serviceAlarms: ServiceAlarms | undefined;
76
186
  constructor(scope: constructs.Construct, id: string, props: FargateServiceProps);
77
187
  }
@@ -5,6 +5,7 @@ import * as ecs from "aws-cdk-lib/aws-ecs";
5
5
  import * as elb from "aws-cdk-lib/aws-elasticloadbalancingv2";
6
6
  import * as logs from "aws-cdk-lib/aws-logs";
7
7
  import * as constructs from "constructs";
8
+ import { ServiceAlarms } from "../alarms";
8
9
  import { ConfigureParameters } from "../configure-parameters";
9
10
  export class FargateService extends constructs.Construct {
10
11
  fargateService;
@@ -12,6 +13,7 @@ export class FargateService extends constructs.Construct {
12
13
  taskDefinition;
13
14
  targetGroup;
14
15
  logGroup;
16
+ serviceAlarms;
15
17
  constructor(scope, id, props) {
16
18
  super(scope, id);
17
19
  /**
@@ -37,7 +39,7 @@ export class FargateService extends constructs.Construct {
37
39
  });
38
40
  parameters.grantRead(this.taskDefinition.taskRole);
39
41
  const port = props.containerPort ?? 8080;
40
- const container = this.taskDefinition.addContainer("Container", {
42
+ this.taskDefinition.addContainer("Container", {
41
43
  logging: ecs.LogDriver.awsLogs({
42
44
  logGroup: this.logGroup,
43
45
  streamPrefix: "ecs",
@@ -111,6 +113,48 @@ export class FargateService extends constructs.Construct {
111
113
  ...props.overrideHealthCheck,
112
114
  });
113
115
  }
116
+ // Require explicit alarmAction and warningAction when enabled.
117
+ if (props.alarms && "alarmAction" in props.alarms) {
118
+ const alarms = props.alarms;
119
+ this.serviceAlarms = new ServiceAlarms(this, "Alarms", {
120
+ serviceName: props.serviceName,
121
+ alarmAction: alarms.alarmAction,
122
+ warningAction: alarms.warningAction,
123
+ logHandler: alarms.logHandler,
124
+ });
125
+ // Enabled by default (opt-out).
126
+ const jsonErrorOverrides = alarms.jsonErrorAlarm;
127
+ if (jsonErrorOverrides?.enabled ?? true) {
128
+ this.serviceAlarms.addJsonErrorAlarm({
129
+ logGroup: this.logGroup,
130
+ alarmDescription: jsonErrorOverrides?.alarmDescription,
131
+ enableOkAlarm: jsonErrorOverrides?.enableOkAlarm,
132
+ action: jsonErrorOverrides?.action,
133
+ });
134
+ }
135
+ // Not enabled by default (opt-in).
136
+ const javaExceptionOverrides = alarms.uncaughtJavaExceptionAlarm;
137
+ if (javaExceptionOverrides?.enabled) {
138
+ this.serviceAlarms.addUncaughtJavaExceptionAlarm({
139
+ logGroup: this.logGroup,
140
+ alarmDescription: javaExceptionOverrides.alarmDescription,
141
+ enableOkAlarm: javaExceptionOverrides.enableOkAlarm,
142
+ action: javaExceptionOverrides.action,
143
+ enabled: true,
144
+ });
145
+ }
146
+ if (!props.skipTargetGroup) {
147
+ // All alarms enabled by-default (opt-out individually)
148
+ this.serviceAlarms.addTargetGroupAlarms({
149
+ targetGroupFullName: this.targetGroup.targetGroupFullName,
150
+ loadBalancerFullName: alarms.loadBalancerFullName,
151
+ targetHealthAlarm: alarms.targetHealthAlarm,
152
+ single5xxResponseAlarm: alarms.single5xxResponseAlarm,
153
+ tooMany5xxResponsesFromTargetsAlarm: alarms.tooMany5xxResponsesFromTargetsAlarm,
154
+ targetResponseTimeAlarm: alarms.targetResponseTimeAlarm,
155
+ });
156
+ }
157
+ }
114
158
  }
115
159
  }
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vjcy9mYXJnYXRlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN0QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBRTFDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLEdBQUcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM3RCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBa0U3RCxNQUFNLE9BQU8sY0FBZSxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3RDLGNBQWMsQ0FBb0I7SUFDbEMsYUFBYSxDQUFtQjtJQUNoQyxjQUFjLENBQW9CO0lBQ2xDLFdBQVcsQ0FBd0M7SUFDbkQsUUFBUSxDQUFlO0lBRXZDLFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTBCO1FBRTFCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEI7Ozs7V0FJRztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUNsQix1RUFBdUUsRUFDdkUsSUFBSSxDQUNMLENBQUE7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFDLElBQUksRUFBRTtZQUMvQyxTQUFTLEVBQUUsZUFBZSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsSUFDWixhQUFhO1lBQ2IsVUFBVSxFQUFFLEtBQUssQ0FBQyxV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QkFDcEMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUM5QixJQUFJLEVBQUUsU0FBUztnQkFDZixxQkFBcUIsRUFBRSxDQUFDO2dCQUN4QixHQUFHLEtBQUssQ0FBQyxtQkFBbUI7YUFDN0IsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCB0eXBlIHsgQ2ZuU2VydmljZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCJcbmltcG9ydCAqIGFzIGVjcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiXG5pbXBvcnQgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsgQ29uZmlndXJlUGFyYW1ldGVycyB9IGZyb20gXCIuLi9jb25maWd1cmUtcGFyYW1ldGVyc1wiXG5pbXBvcnQgdHlwZSB7IFBhcmFtZXRlciB9IGZyb20gXCIuLi9jb25maWd1cmUtcGFyYW1ldGVycy9jb25maWd1cmUtcGFyYW1ldGVyc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFyZ2F0ZVNlcnZpY2VQcm9wcyB7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmdcbiAgdnBjOiBlYzIuSVZwY1xuICBjbHVzdGVyOiBlY3MuSUNsdXN0ZXJcbiAgZGVzaXJlZENvdW50OiBudW1iZXJcbiAgZWNzSW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZVxuICBwb3J0TWFwcGluZ3M/OiBlY3MuUG9ydE1hcHBpbmdbXVxuICBjb250YWluZXJIZWFsdGhDaGVjaz86IGVjcy5IZWFsdGhDaGVja1xuICAvKipcbiAgICogQGRlZmF1bHQgMjU2XG4gICAqL1xuICBjcHU/OiBudW1iZXJcbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcnVudGltZVBsYXRmb3JtPzogZWNzLlJ1bnRpbWVQbGF0Zm9ybVxuICAvKipcbiAgICogQGRlZmF1bHQgNTEyXG4gICAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlclxuICAvKipcbiAgICogQGRlZmF1bHQgMiB3ZWVrc1xuICAgKi9cbiAgbG9nc1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5c1xuICAvKipcbiAgICogQGRlZmF1bHQgQXdzTG9nRHJpdmVyTW9kZS5CTE9DS0lOR1xuICAgKi9cbiAgbG9nRHJpdmVyTW9kZT86IGVjcy5Bd3NMb2dEcml2ZXJNb2RlXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAxNSBzZWNvbmRzXG4gICAqL1xuICBkZXJlZ2lzdHJhdGlvbkRlbGF5PzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBAZGVmYXVsdCA4MDgwXG4gICAqL1xuICBjb250YWluZXJQb3J0PzogbnVtYmVyXG4gIC8qKlxuICAgKiBAZGVmYXVsdCA2MCBzZWNvbmRzXG4gICAqL1xuICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kPzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhcyB3b3JrYXJvdW5kIHdoZW4gYWRkaW5nIHRoZSBzZXJ2aWNlIHRvIGEgbG9hZCBiYWxhbmNlciBhZnRlclxuICAgKiBpdCBoYXMgYmVlbiBjcmVhdGVkLiBGb3IgYXZvaWRpbmcgJ0hlYWx0aCBjaGVjayBncmFjZSBwZXJpb2QgaXMgb25seSB2YWxpZCBmb3Igc2VydmljZXMgY29uZmlndXJlZCB0byB1c2UgbG9hZCBiYWxhbmNlcnMnXG4gICAqIExpbmsgdG8gR2l0SHViIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE5ODQyXG4gICAqL1xuICBza2lwSGVhbHRoQ2hlY2tHcmFjZVBlcmlvZD86IGJvb2xlYW5cbiAgcGFyYW1ldGVycz86IFBhcmFtZXRlcltdXG4gIG92ZXJyaWRlRmFyZ2F0ZVNlcnZpY2VQcm9wcz86IFBhcnRpYWw8ZWNzLkZhcmdhdGVTZXJ2aWNlUHJvcHM+XG4gIG92ZXJyaWRlSGVhbHRoQ2hlY2s/OiBQYXJ0aWFsPGVsYi5IZWFsdGhDaGVjaz5cbiAgb3ZlcnJpZGVUYXJnZXRHcm91cFByb3BzPzogUGFydGlhbDxlbGIuQXBwbGljYXRpb25UYXJnZXRHcm91cFByb3BzPlxuICBvdmVycmlkZUNvbnRhaW5lclByb3BzPzogUGFydGlhbDxlY3MuQ29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbnM+XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCBlY3MuU2VjcmV0PlxuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwVGFyZ2V0R3JvdXA/OiBib29sZWFuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZW5hYmxlQ2lyY3VpdEJyZWFrZXI/OiBib29sZWFuXG59XG5cbmV4cG9ydCBjbGFzcyBGYXJnYXRlU2VydmljZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGZhcmdhdGVTZXJ2aWNlOiBlY3MuRmFyZ2F0ZVNlcnZpY2VcbiAgcHVibGljIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA6IGVjMi5TZWN1cml0eUdyb3VwXG4gIHB1YmxpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLlRhc2tEZWZpbml0aW9uXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRHcm91cDogZWxiLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IEZhcmdhdGVTZXJ2aWNlUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGlzIGZsYWcgdG8gZGlzYWJsZSB0aGlzIHN0YWNrIGNyZWF0aW5nIGEgY29tcGxldGVseSBuZXcgc2VydmljZSBhbmQgYXR0ZW1wdGluZyByZXBsYWNlIHdoZW4gZW5hYmxpbmcgY2lyY3VpdCBicmVha2Vyc1xuICAgICAqIE1pdGlnYXRpbmcgdGhlIGRlcGxveW1lbnQgZXJyb3I6ICdhIHNlcnZpY2Ugd2l0aCB0aGUgbmFtZSA8Li4uPiBhbHJlYWR5IGV4aXN0cydcbiAgICAgKiBTZWU6IGdpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8yMjQ2N1xuICAgICAqL1xuICAgIHRoaXMubm9kZS5zZXRDb250ZXh0KFxuICAgICAgXCJAYXdzLWNkay9hd3MtZWNzOmRpc2FibGVFeHBsaWNpdERlcGxveW1lbnRDb250cm9sbGVyRm9yQ2lyY3VpdEJyZWFrZXJcIixcbiAgICAgIHRydWUsXG4gICAgKVxuXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG5ldyBDb25maWd1cmVQYXJhbWV0ZXJzKHRoaXMsIHtcbiAgICAgIHNzbVByZWZpeDogYC9saWZsaWctY2RrLyR7Y2RrLlN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZX0vJHtcbiAgICAgICAgdGhpcy5ub2RlLmFkZHJcbiAgICAgIH0vcGFyYW1ldGVyc2AsXG4gICAgICBwYXJhbWV0ZXJzOiBwcm9wcy5wYXJhbWV0ZXJzID8/IFtdLFxuICAgIH0pXG5cbiAgICB0aGlzLmxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJMb2dHcm91cFwiLCB7XG4gICAgICByZXRlbnRpb246IHByb3BzLmxvZ3NSZXRlbnRpb24gPz8gbG9ncy5SZXRlbnRpb25EYXlzLlRXT19XRUVLUyxcbiAgICB9KVxuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsIFwiU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICB9KVxuXG4gICAgdGhpcy50YXNrRGVmaW5pdGlvbiA9IG5ldyBlY3MuRmFyZ2F0ZVRhc2tEZWZpbml0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIFwiVGFza0RlZmluaXRpb25cIixcbiAgICAgIHtcbiAgICAgICAgY3B1OiBwcm9wcy5jcHUgPz8gMjU2LFxuICAgICAgICBtZW1vcnlMaW1pdE1pQjogcHJvcHMubWVtb3J5TGltaXRNaUIgPz8gNTEyLFxuICAgICAgICBydW50aW1lUGxhdGZvcm06IHByb3BzLnJ1bnRpbWVQbGF0Zm9ybSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgcGFyYW1ldGVycy5ncmFudFJlYWQodGhpcy50YXNrRGVmaW5pdGlvbi50YXNrUm9sZSlcblxuICAgIGNvbnN0IHBvcnQgPSBwcm9wcy5jb250YWluZXJQb3J0ID8/IDgwODBcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcihcIkNvbnRhaW5lclwiLCB7XG4gICAgICBsb2dnaW5nOiBlY3MuTG9nRHJpdmVyLmF3c0xvZ3Moe1xuICAgICAgICBsb2dHcm91cDogdGhpcy5sb2dHcm91cCxcbiAgICAgICAgc3RyZWFtUHJlZml4OiBcImVjc1wiLFxuICAgICAgICBkYXRldGltZUZvcm1hdDogXCIlWS0lbS0lZFQlSDolTTolU1wiLFxuICAgICAgICBtb2RlOiBwcm9wcy5sb2dEcml2ZXJNb2RlID8/IGVjcy5Bd3NMb2dEcml2ZXJNb2RlLkJMT0NLSU5HLFxuICAgICAgfSksXG4gICAgICBpbWFnZTogcHJvcHMuZWNzSW1hZ2UsXG4gICAgICBzZWNyZXRzOiBwcm9wcy5zZWNyZXRzLFxuICAgICAgaGVhbHRoQ2hlY2s6IHByb3BzLmNvbnRhaW5lckhlYWx0aENoZWNrLFxuICAgICAgcG9ydE1hcHBpbmdzOiBwcm9wcy5wb3J0TWFwcGluZ3MgPz8gW1xuICAgICAgICB7XG4gICAgICAgICAgY29udGFpbmVyUG9ydDogcG9ydCxcbiAgICAgICAgICBob3N0UG9ydDogcG9ydCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBTU01fUFJFRklYOiBwYXJhbWV0ZXJzLnNzbVByZWZpeCxcbiAgICAgICAgLy8gTm90IHJlYWQgYnkgdGhlIGFwcGxpY2F0aW9uLCBvbmx5IHVzZWQgdG8gaGVscCB3aXRoIHJlZGVwbG95bWVudHMuXG4gICAgICAgIFBBUkFNU19IQVNIOiBwYXJhbWV0ZXJzLmhhc2hWYWx1ZSxcbiAgICAgICAgLi4uKHByb3BzLmVudmlyb25tZW50ID8/IHt9KSxcbiAgICAgIH0sXG4gICAgICBsaW51eFBhcmFtZXRlcnM6IG5ldyBlY3MuTGludXhQYXJhbWV0ZXJzKHRoaXMsIFwiTGludXhQYXJhbWV0ZXJzXCIsIHtcbiAgICAgICAgaW5pdFByb2Nlc3NFbmFibGVkOiB0cnVlLFxuICAgICAgfSksXG4gICAgICAuLi5wcm9wcy5vdmVycmlkZUNvbnRhaW5lclByb3BzLFxuICAgIH0pXG5cbiAgICBjb25zdCBlbmFibGVDaXJjdWl0QnJlYWtlciA9IHByb3BzLmVuYWJsZUNpcmN1aXRCcmVha2VyID8/IGZhbHNlXG5cbiAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlID0gbmV3IGVjcy5GYXJnYXRlU2VydmljZSh0aGlzLCBcIlNlcnZpY2VcIiwge1xuICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICB9LFxuICAgICAgdGFza0RlZmluaXRpb246IHRoaXMudGFza0RlZmluaXRpb24sXG4gICAgICBjbHVzdGVyOiBwcm9wcy5jbHVzdGVyLFxuICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCxcbiAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IHByb3BzLmhlYWx0aENoZWNrR3JhY2VQZXJpb2QsXG4gICAgICBkZXNpcmVkQ291bnQ6IHByb3BzLmRlc2lyZWRDb3VudCxcbiAgICAgIGFzc2lnblB1YmxpY0lwOiB0cnVlLFxuICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLnNlY3VyaXR5R3JvdXBdLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBlY3MuRmFyZ2F0ZVBsYXRmb3JtVmVyc2lvbi5WRVJTSU9OMV80LFxuICAgICAgZW5hYmxlRXhlY3V0ZUNvbW1hbmQ6IHRydWUsXG4gICAgICBjaXJjdWl0QnJlYWtlcjogZW5hYmxlQ2lyY3VpdEJyZWFrZXJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBlbmFibGU6IHRydWUsXG4gICAgICAgICAgICByb2xsYmFjazogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVGYXJnYXRlU2VydmljZVByb3BzLFxuICAgIH0pXG5cbiAgICBpZiAocHJvcHMuc2tpcEhlYWx0aENoZWNrR3JhY2VQZXJpb2QpIHtcbiAgICAgIDsoXG4gICAgICAgIHRoaXMuZmFyZ2F0ZVNlcnZpY2Uubm9kZS5kZWZhdWx0Q2hpbGQgYXMgQ2ZuU2VydmljZVxuICAgICAgKS5oZWFsdGhDaGVja0dyYWNlUGVyaW9kU2Vjb25kcyA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1ldGVycy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlLm5vZGUuYWRkRGVwZW5kZW5jeShwYXJhbSlcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLnNraXBUYXJnZXRHcm91cCkge1xuICAgICAgdGhpcy50YXJnZXRHcm91cCA9IG5ldyBlbGIuQXBwbGljYXRpb25UYXJnZXRHcm91cCh0aGlzLCBcIlRhcmdldEdyb3VwXCIsIHtcbiAgICAgICAgcHJvdG9jb2w6IGVsYi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgIHBvcnQ6IHBvcnQsXG4gICAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgICB0YXJnZXRUeXBlOiBlbGIuVGFyZ2V0VHlwZS5JUCxcbiAgICAgICAgdGFyZ2V0czogW3RoaXMuZmFyZ2F0ZVNlcnZpY2VdLFxuICAgICAgICBkZXJlZ2lzdHJhdGlvbkRlbGF5OlxuICAgICAgICAgIHByb3BzLmRlcmVnaXN0cmF0aW9uRGVsYXkgPz8gY2RrLkR1cmF0aW9uLnNlY29uZHMoMTUpLFxuICAgICAgICAuLi5wcm9wcy5vdmVycmlkZVRhcmdldEdyb3VwUHJvcHMsXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnRhcmdldEdyb3VwLmNvbmZpZ3VyZUhlYWx0aENoZWNrKHtcbiAgICAgICAgaW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICBwYXRoOiBcIi9oZWFsdGhcIixcbiAgICAgICAgaGVhbHRoeVRocmVzaG9sZENvdW50OiAyLFxuICAgICAgICAuLi5wcm9wcy5vdmVycmlkZUhlYWx0aENoZWNrLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFyZ2F0ZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vjcy9mYXJnYXRlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUV0QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFBO0FBRTFDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUE7QUFDMUMsT0FBTyxLQUFLLEdBQUcsTUFBTSx3Q0FBd0MsQ0FBQTtBQUU3RCxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBQzVDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUE7QUE0SzdELE1BQU0sT0FBTyxjQUFlLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDdEMsY0FBYyxDQUFvQjtJQUNsQyxhQUFhLENBQW1CO0lBQ2hDLGNBQWMsQ0FBb0I7SUFDbEMsV0FBVyxDQUF3QztJQUNuRCxRQUFRLENBQWU7SUFDdkIsYUFBYSxDQUEyQjtJQUV4RCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUEwQjtRQUUxQixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FDbEIsdUVBQXVFLEVBQ3ZFLElBQUksQ0FDTCxDQUFBO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDL0MsU0FBUyxFQUFFLGVBQWUsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUNw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T0FBTyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLENBQUM7b0JBQy9DLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUMsZ0JBQWdCO29CQUN6RCxhQUFhLEVBQUUsc0JBQXNCLENBQUMsYUFBYTtvQkFDbkQsTUFBTSxFQUFFLHNCQUFzQixDQUFDLE1BQU07b0JBQ3JDLE9BQU8sRUFBRSxJQUFJO2lCQUNkLENBQUMsQ0FBQTtZQUNKLENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUMzQix1REFBdUQ7Z0JBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7b0JBQ3RDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxXQUFZLENBQUMsbUJBQW1CO29CQUMxRCxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO29CQUNqRCxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCO29CQUMzQyxzQkFBc0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCO29CQUNyRCxtQ0FBbUMsRUFDakMsTUFBTSxDQUFDLG1DQUFtQztvQkFDNUMsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLHVCQUF1QjtpQkFDeEQsQ0FBQyxDQUFBO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IER1cmF0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB0eXBlICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCB0eXBlIHsgQ2ZuU2VydmljZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCJcbmltcG9ydCAqIGFzIGVjcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiXG5pbXBvcnQgKiBhcyBlbGIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCJcbmltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsgU2VydmljZUFsYXJtcyB9IGZyb20gXCIuLi9hbGFybXNcIlxuaW1wb3J0IHR5cGUgeyBQYXJhbWV0ZXIgfSBmcm9tIFwiLi4vY29uZmlndXJlLXBhcmFtZXRlcnNcIlxuaW1wb3J0IHsgQ29uZmlndXJlUGFyYW1ldGVycyB9IGZyb20gXCIuLi9jb25maWd1cmUtcGFyYW1ldGVyc1wiXG5cbi8qKlxuICogQ29uZmlndXJlIHNlcnZpY2UgYWxhcm1zLlxuICpcbiAqIEFsYXJtcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IHdoZW4gYSBjb25maWcgb2JqZWN0IHdpdGggYGFsYXJtQWN0aW9uYCBhbmRcbiAqIGB3YXJuaW5nQWN0aW9uYCBpcyBwcm92aWRlZC4gVG8gZXhwbGljaXRseSBkaXNhYmxlIGF1dG9tYXRpYyBhbGFybXMgdXNlXG4gKiBgeyBlbmFibGVkOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IHR5cGUgU2VydmljZUFsYXJtc0NvbmZpZyA9XG4gIHwgeyBlbmFibGVkOiBmYWxzZSB9XG4gIHwge1xuICAgICAgYWxhcm1BY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICB3YXJuaW5nQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgbG9hZEJhbGFuY2VyRnVsbE5hbWU6IHN0cmluZ1xuICAgICAgLyoqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZVxuICAgICAgICogZm9yd2FyZGVkIGxvZyBldmVudHMgKi9cbiAgICAgIGxvZ0hhbmRsZXI/OiBsYW1iZGEuSUZ1bmN0aW9uXG4gICAgICAvKipcbiAgICAgICAqIEluZGl2aWR1YWwgYWxhcm0gY29uZmlndXJhdGlvbiBvdmVycmlkZXMgZGVmYXVsdHMuXG4gICAgICAgKi9cbiAgICAgIGpzb25FcnJvckFsYXJtPzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICBlbmFibGVPa0FsYXJtPzogYm9vbGVhblxuICAgICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgfVxuICAgICAgdW5jYXVnaHRKYXZhRXhjZXB0aW9uQWxhcm0/OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgICBlbmFibGVPa0FsYXJtPzogYm9vbGVhblxuICAgICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgfVxuICAgICAgdGFyZ2V0SGVhbHRoQWxhcm0/OiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgICAqL1xuICAgICAgICBlbmFibGVkPzogYm9vbGVhblxuICAgICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgICBwZXJpb2Q/OiBjZGsuRHVyYXRpb25cbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXJcbiAgICAgICAgdGhyZXNob2xkPzogbnVtYmVyXG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgICB9XG4gICAgICB0b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybT86IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICAgIHBlcmlvZD86IGNkay5EdXJhdGlvblxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kcz86IG51bWJlclxuICAgICAgICB0aHJlc2hvbGQ/OiBudW1iZXJcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgIH1cbiAgICAgIHRhcmdldFJlc3BvbnNlVGltZUFsYXJtPzoge1xuICAgICAgICAvKipcbiAgICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICAgKi9cbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgICAgYWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgICAgICAgcGVyaW9kPzogY2RrLkR1cmF0aW9uXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG4gICAgICAgIHRocmVzaG9sZD86IGNkay5EdXJhdGlvblxuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgfVxuICAgICAgc2luZ2xlNXh4UmVzcG9uc2VBbGFybT86IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAgICovXG4gICAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25cbiAgICAgICAgICovXG4gICAgICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVmYXVsdCA2MCBzZWNvbmRzXG4gICAgICAgICAqL1xuICAgICAgICBwZXJpb2Q/OiBjZGsuRHVyYXRpb25cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZWZhdWx0IDFcbiAgICAgICAgICovXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVmYXVsdCAxXG4gICAgICAgICAqL1xuICAgICAgICB0aHJlc2hvbGQ/OiBudW1iZXJcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgIH1cbiAgICB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFyZ2F0ZVNlcnZpY2VQcm9wcyB7XG4gIHNlcnZpY2VOYW1lOiBzdHJpbmdcbiAgdnBjOiBlYzIuSVZwY1xuICBjbHVzdGVyOiBlY3MuSUNsdXN0ZXJcbiAgZGVzaXJlZENvdW50OiBudW1iZXJcbiAgZWNzSW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZVxuICBwb3J0TWFwcGluZ3M/OiBlY3MuUG9ydE1hcHBpbmdbXVxuICBjb250YWluZXJIZWFsdGhDaGVjaz86IGVjcy5IZWFsdGhDaGVja1xuICAvKipcbiAgICogQGRlZmF1bHQgMjU2XG4gICAqL1xuICBjcHU/OiBudW1iZXJcbiAgLyoqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgcnVudGltZVBsYXRmb3JtPzogZWNzLlJ1bnRpbWVQbGF0Zm9ybVxuICAvKipcbiAgICogQGRlZmF1bHQgNTEyXG4gICAqL1xuICBtZW1vcnlMaW1pdE1pQj86IG51bWJlclxuICAvKipcbiAgICogQGRlZmF1bHQgMiB3ZWVrc1xuICAgKi9cbiAgbG9nc1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5c1xuICAvKipcbiAgICogQGRlZmF1bHQgQXdzTG9nRHJpdmVyTW9kZS5CTE9DS0lOR1xuICAgKi9cbiAgbG9nRHJpdmVyTW9kZT86IGVjcy5Bd3NMb2dEcml2ZXJNb2RlXG4gIC8qKlxuICAgKiBAZGVmYXVsdCAxNSBzZWNvbmRzXG4gICAqL1xuICBkZXJlZ2lzdHJhdGlvbkRlbGF5PzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBAZGVmYXVsdCA4MDgwXG4gICAqL1xuICBjb250YWluZXJQb3J0PzogbnVtYmVyXG4gIC8qKlxuICAgKiBAZGVmYXVsdCA2MCBzZWNvbmRzXG4gICAqL1xuICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kPzogY2RrLkR1cmF0aW9uXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBhcyB3b3JrYXJvdW5kIHdoZW4gYWRkaW5nIHRoZSBzZXJ2aWNlIHRvIGEgbG9hZCBiYWxhbmNlciBhZnRlclxuICAgKiBpdCBoYXMgYmVlbiBjcmVhdGVkLiBGb3IgYXZvaWRpbmcgJ0hlYWx0aCBjaGVjayBncmFjZSBwZXJpb2QgaXMgb25seSB2YWxpZCBmb3Igc2VydmljZXMgY29uZmlndXJlZCB0byB1c2UgbG9hZCBiYWxhbmNlcnMnXG4gICAqIExpbmsgdG8gR2l0SHViIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzE5ODQyXG4gICAqL1xuICBza2lwSGVhbHRoQ2hlY2tHcmFjZVBlcmlvZD86IGJvb2xlYW5cbiAgcGFyYW1ldGVycz86IFBhcmFtZXRlcltdXG4gIG92ZXJyaWRlRmFyZ2F0ZVNlcnZpY2VQcm9wcz86IFBhcnRpYWw8ZWNzLkZhcmdhdGVTZXJ2aWNlUHJvcHM+XG4gIG92ZXJyaWRlSGVhbHRoQ2hlY2s/OiBQYXJ0aWFsPGVsYi5IZWFsdGhDaGVjaz5cbiAgb3ZlcnJpZGVUYXJnZXRHcm91cFByb3BzPzogUGFydGlhbDxlbGIuQXBwbGljYXRpb25UYXJnZXRHcm91cFByb3BzPlxuICBvdmVycmlkZUNvbnRhaW5lclByb3BzPzogUGFydGlhbDxlY3MuQ29udGFpbmVyRGVmaW5pdGlvbk9wdGlvbnM+XG4gIHNlY3JldHM/OiBSZWNvcmQ8c3RyaW5nLCBlY3MuU2VjcmV0PlxuICBlbnZpcm9ubWVudD86IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgLyoqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwVGFyZ2V0R3JvdXA/OiBib29sZWFuXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZW5hYmxlQ2lyY3VpdEJyZWFrZXI/OiBib29sZWFuXG4gIC8qKlxuICAgKiAgRWl0aGVyXG4gICAqICAtIGB7IGVuYWJsZWQ6IGZhbHNlIH1gIHRvIGRpc2FibGUgYWxsIGFsYXJtcy5cbiAgICogIC0gb2JqZWN0IHdpdGggcmVxdWlyZWQgYGFsYXJtQWN0aW9uYCwgYHdhcm5pbmdBY3Rpb25gLCBhbmQgYGxvYWRCYWxhbmNlckZ1bGxOYW1lYC5cbiAgICpcbiAgICogIFdoZW4gZW5hYmxlZCwgdGhlIGNvbnN0cnVjdCB3aWxsOlxuICAgKiAgLSAoQnkgZGVmYXVsdCkgYWRkIGEgbG9nLWJhc2VkIEpTT04gZXJyb3IgYWxhcm0gKGVuYWJsZWQgYnkgZGVmYXVsdCkuXG4gICAqICAtIChCeSBkZWZhdWx0KSBhZGQgdGFyZ2V0LWdyb3VwIHJlbGF0ZWQgYWxhcm1zICh0YXJnZXQgaGVhbHRoLCA1eHggcmVzcG9uc2VzLCByZXNwb25zZSB0aW1lKVxuICAgKiAgd2hlbiBhIHRhcmdldCBncm91cCBpcyBwcmVzZW50LlxuICAgKiAgLSAoT3B0LWluKSBvcHRpb25hbGx5IGVuYWJsZSB0aGUgdW5jYXVnaHQgSmF2YSBleGNlcHRpb24gYWxhcm1cbiAgICovXG4gIGFsYXJtczogU2VydmljZUFsYXJtc0NvbmZpZ1xufVxuXG5leHBvcnQgY2xhc3MgRmFyZ2F0ZVNlcnZpY2UgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBmYXJnYXRlU2VydmljZTogZWNzLkZhcmdhdGVTZXJ2aWNlXG4gIHB1YmxpYyByZWFkb25seSBzZWN1cml0eUdyb3VwOiBlYzIuU2VjdXJpdHlHcm91cFxuICBwdWJsaWMgcmVhZG9ubHkgdGFza0RlZmluaXRpb246IGVjcy5UYXNrRGVmaW5pdGlvblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0R3JvdXA6IGVsYi5BcHBsaWNhdGlvblRhcmdldEdyb3VwIHwgdW5kZWZpbmVkXG4gIHB1YmxpYyByZWFkb25seSBsb2dHcm91cDogbG9ncy5Mb2dHcm91cFxuICBwdWJsaWMgcmVhZG9ubHkgc2VydmljZUFsYXJtczogU2VydmljZUFsYXJtcyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBGYXJnYXRlU2VydmljZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBmbGFnIHRvIGRpc2FibGUgdGhpcyBzdGFjayBjcmVhdGluZyBhIGNvbXBsZXRlbHkgbmV3IHNlcnZpY2UgYW5kIGF0dGVtcHRpbmcgcmVwbGFjZSB3aGVuIGVuYWJsaW5nIGNpcmN1aXQgYnJlYWtlcnNcbiAgICAgKiBNaXRpZ2F0aW5nIHRoZSBkZXBsb3ltZW50IGVycm9yOiAnYSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgPC4uLj4gYWxyZWFkeSBleGlzdHMnXG4gICAgICogU2VlOiBnaXRodWIuY29tL2F3cy9hd3MtY2RrL3B1bGwvMjI0NjdcbiAgICAgKi9cbiAgICB0aGlzLm5vZGUuc2V0Q29udGV4dChcbiAgICAgIFwiQGF3cy1jZGsvYXdzLWVjczpkaXNhYmxlRXhwbGljaXREZXBsb3ltZW50Q29udHJvbGxlckZvckNpcmN1aXRCcmVha2VyXCIsXG4gICAgICB0cnVlLFxuICAgIClcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBuZXcgQ29uZmlndXJlUGFyYW1ldGVycyh0aGlzLCB7XG4gICAgICBzc21QcmVmaXg6IGAvbGlmbGlnLWNkay8ke2Nkay5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9LyR7XG4gICAgICAgIHRoaXMubm9kZS5hZGRyXG4gICAgICB9L3BhcmFtZXRlcnNgLFxuICAgICAgcGFyYW1ldGVyczogcHJvcHMucGFyYW1ldGVycyA/PyBbXSxcbiAgICB9KVxuXG4gICAgdGhpcy5sb2dHcm91cCA9IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiTG9nR3JvdXBcIiwge1xuICAgICAgcmV0ZW50aW9uOiBwcm9wcy5sb2dzUmV0ZW50aW9uID8/IGxvZ3MuUmV0ZW50aW9uRGF5cy5UV09fV0VFS1MsXG4gICAgfSlcblxuICAgIHRoaXMuc2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcIlNlY3VyaXR5R3JvdXBcIiwge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgfSlcblxuICAgIHRoaXMudGFza0RlZmluaXRpb24gPSBuZXcgZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIlRhc2tEZWZpbml0aW9uXCIsXG4gICAgICB7XG4gICAgICAgIGNwdTogcHJvcHMuY3B1ID8/IDI1NixcbiAgICAgICAgbWVtb3J5TGltaXRNaUI6IHByb3BzLm1lbW9yeUxpbWl0TWlCID8/IDUxMixcbiAgICAgICAgcnVudGltZVBsYXRmb3JtOiBwcm9wcy5ydW50aW1lUGxhdGZvcm0sXG4gICAgICB9LFxuICAgIClcblxuICAgIHBhcmFtZXRlcnMuZ3JhbnRSZWFkKHRoaXMudGFza0RlZmluaXRpb24udGFza1JvbGUpXG5cbiAgICBjb25zdCBwb3J0ID0gcHJvcHMuY29udGFpbmVyUG9ydCA/PyA4MDgwXG4gICAgdGhpcy50YXNrRGVmaW5pdGlvbi5hZGRDb250YWluZXIoXCJDb250YWluZXJcIiwge1xuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXA6IHRoaXMubG9nR3JvdXAsXG4gICAgICAgIHN0cmVhbVByZWZpeDogXCJlY3NcIixcbiAgICAgICAgZGF0ZXRpbWVGb3JtYXQ6IFwiJVktJW0tJWRUJUg6JU06JVNcIixcbiAgICAgICAgbW9kZTogcHJvcHMubG9nRHJpdmVyTW9kZSA/PyBlY3MuQXdzTG9nRHJpdmVyTW9kZS5CTE9DS0lORyxcbiAgICAgIH0pLFxuICAgICAgaW1hZ2U6IHByb3BzLmVjc0ltYWdlLFxuICAgICAgc2VjcmV0czogcHJvcHMuc2VjcmV0cyxcbiAgICAgIGhlYWx0aENoZWNrOiBwcm9wcy5jb250YWluZXJIZWFsdGhDaGVjayxcbiAgICAgIHBvcnRNYXBwaW5nczogcHJvcHMucG9ydE1hcHBpbmdzID8/IFtcbiAgICAgICAge1xuICAgICAgICAgIGNvbnRhaW5lclBvcnQ6IHBvcnQsXG4gICAgICAgICAgaG9zdFBvcnQ6IHBvcnQsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgU1NNX1BSRUZJWDogcGFyYW1ldGVycy5zc21QcmVmaXgsXG4gICAgICAgIC8vIE5vdCByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgb25seSB1c2VkIHRvIGhlbHAgd2l0aCByZWRlcGxveW1lbnRzLlxuICAgICAgICBQQVJBTVNfSEFTSDogcGFyYW1ldGVycy5oYXNoVmFsdWUsXG4gICAgICAgIC4uLihwcm9wcy5lbnZpcm9ubWVudCA/PyB7fSksXG4gICAgICB9LFxuICAgICAgbGludXhQYXJhbWV0ZXJzOiBuZXcgZWNzLkxpbnV4UGFyYW1ldGVycyh0aGlzLCBcIkxpbnV4UGFyYW1ldGVyc1wiLCB7XG4gICAgICAgIGluaXRQcm9jZXNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVDb250YWluZXJQcm9wcyxcbiAgICB9KVxuXG4gICAgY29uc3QgZW5hYmxlQ2lyY3VpdEJyZWFrZXIgPSBwcm9wcy5lbmFibGVDaXJjdWl0QnJlYWtlciA/PyBmYWxzZVxuXG4gICAgdGhpcy5mYXJnYXRlU2VydmljZSA9IG5ldyBlY3MuRmFyZ2F0ZVNlcnZpY2UodGhpcywgXCJTZXJ2aWNlXCIsIHtcbiAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgc3VibmV0VHlwZTogZWMyLlN1Ym5ldFR5cGUuUFVCTElDLFxuICAgICAgfSxcbiAgICAgIHRhc2tEZWZpbml0aW9uOiB0aGlzLnRhc2tEZWZpbml0aW9uLFxuICAgICAgY2x1c3RlcjogcHJvcHMuY2x1c3RlcixcbiAgICAgIG1pbkhlYWx0aHlQZXJjZW50OiAxMDAsXG4gICAgICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBwcm9wcy5oZWFsdGhDaGVja0dyYWNlUGVyaW9kLFxuICAgICAgZGVzaXJlZENvdW50OiBwcm9wcy5kZXNpcmVkQ291bnQsXG4gICAgICBhc3NpZ25QdWJsaWNJcDogdHJ1ZSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5zZWN1cml0eUdyb3VwXSxcbiAgICAgIHBsYXRmb3JtVmVyc2lvbjogZWNzLkZhcmdhdGVQbGF0Zm9ybVZlcnNpb24uVkVSU0lPTjFfNCxcbiAgICAgIGVuYWJsZUV4ZWN1dGVDb21tYW5kOiB0cnVlLFxuICAgICAgY2lyY3VpdEJyZWFrZXI6IGVuYWJsZUNpcmN1aXRCcmVha2VyXG4gICAgICAgID8ge1xuICAgICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICAgICAgcm9sbGJhY2s6IHRydWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIC4uLnByb3BzLm92ZXJyaWRlRmFyZ2F0ZVNlcnZpY2VQcm9wcyxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLnNraXBIZWFsdGhDaGVja0dyYWNlUGVyaW9kKSB7XG4gICAgICA7KFxuICAgICAgICB0aGlzLmZhcmdhdGVTZXJ2aWNlLm5vZGUuZGVmYXVsdENoaWxkIGFzIENmblNlcnZpY2VcbiAgICAgICkuaGVhbHRoQ2hlY2tHcmFjZVBlcmlvZFNlY29uZHMgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtZXRlcnMucGFyYW1ldGVycykge1xuICAgICAgdGhpcy5mYXJnYXRlU2VydmljZS5ub2RlLmFkZERlcGVuZGVuY3kocGFyYW0pXG4gICAgfVxuXG4gICAgaWYgKCFwcm9wcy5za2lwVGFyZ2V0R3JvdXApIHtcbiAgICAgIHRoaXMudGFyZ2V0R3JvdXAgPSBuZXcgZWxiLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAodGhpcywgXCJUYXJnZXRHcm91cFwiLCB7XG4gICAgICAgIHByb3RvY29sOiBlbGIuQXBwbGljYXRpb25Qcm90b2NvbC5IVFRQLFxuICAgICAgICBwb3J0OiBwb3J0LFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgdGFyZ2V0VHlwZTogZWxiLlRhcmdldFR5cGUuSVAsXG4gICAgICAgIHRhcmdldHM6IFt0aGlzLmZhcmdhdGVTZXJ2aWNlXSxcbiAgICAgICAgZGVyZWdpc3RyYXRpb25EZWxheTpcbiAgICAgICAgICBwcm9wcy5kZXJlZ2lzdHJhdGlvbkRlbGF5ID8/IGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSxcbiAgICAgICAgLi4ucHJvcHMub3ZlcnJpZGVUYXJnZXRHcm91cFByb3BzLFxuICAgICAgfSlcblxuICAgICAgdGhpcy50YXJnZXRHcm91cC5jb25maWd1cmVIZWFsdGhDaGVjayh7XG4gICAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgcGF0aDogXCIvaGVhbHRoXCIsXG4gICAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMixcbiAgICAgICAgLi4ucHJvcHMub3ZlcnJpZGVIZWFsdGhDaGVjayxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gUmVxdWlyZSBleHBsaWNpdCBhbGFybUFjdGlvbiBhbmQgd2FybmluZ0FjdGlvbiB3aGVuIGVuYWJsZWQuXG4gICAgaWYgKHByb3BzLmFsYXJtcyAmJiBcImFsYXJtQWN0aW9uXCIgaW4gcHJvcHMuYWxhcm1zKSB7XG4gICAgICBjb25zdCBhbGFybXMgPSBwcm9wcy5hbGFybXNcblxuICAgICAgdGhpcy5zZXJ2aWNlQWxhcm1zID0gbmV3IFNlcnZpY2VBbGFybXModGhpcywgXCJBbGFybXNcIiwge1xuICAgICAgICBzZXJ2aWNlTmFtZTogcHJvcHMuc2VydmljZU5hbWUsXG4gICAgICAgIGFsYXJtQWN0aW9uOiBhbGFybXMuYWxhcm1BY3Rpb24sXG4gICAgICAgIHdhcm5pbmdBY3Rpb246IGFsYXJtcy53YXJuaW5nQWN0aW9uLFxuICAgICAgICBsb2dIYW5kbGVyOiBhbGFybXMubG9nSGFuZGxlcixcbiAgICAgIH0pXG5cbiAgICAgIC8vIEVuYWJsZWQgYnkgZGVmYXVsdCAob3B0LW91dCkuXG4gICAgICBjb25zdCBqc29uRXJyb3JPdmVycmlkZXMgPSBhbGFybXMuanNvbkVycm9yQWxhcm1cbiAgICAgIGlmIChqc29uRXJyb3JPdmVycmlkZXM/LmVuYWJsZWQgPz8gdHJ1ZSkge1xuICAgICAgICB0aGlzLnNlcnZpY2VBbGFybXMuYWRkSnNvbkVycm9yQWxhcm0oe1xuICAgICAgICAgIGxvZ0dyb3VwOiB0aGlzLmxvZ0dyb3VwLFxuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGpzb25FcnJvck92ZXJyaWRlcz8uYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgICBlbmFibGVPa0FsYXJtOiBqc29uRXJyb3JPdmVycmlkZXM/LmVuYWJsZU9rQWxhcm0sXG4gICAgICAgICAgYWN0aW9uOiBqc29uRXJyb3JPdmVycmlkZXM/LmFjdGlvbixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gTm90IGVuYWJsZWQgYnkgZGVmYXVsdCAob3B0LWluKS5cbiAgICAgIGNvbnN0IGphdmFFeGNlcHRpb25PdmVycmlkZXMgPSBhbGFybXMudW5jYXVnaHRKYXZhRXhjZXB0aW9uQWxhcm1cbiAgICAgIGlmIChqYXZhRXhjZXB0aW9uT3ZlcnJpZGVzPy5lbmFibGVkKSB7XG4gICAgICAgIHRoaXMuc2VydmljZUFsYXJtcy5hZGRVbmNhdWdodEphdmFFeGNlcHRpb25BbGFybSh7XG4gICAgICAgICAgbG9nR3JvdXA6IHRoaXMubG9nR3JvdXAsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogamF2YUV4Y2VwdGlvbk92ZXJyaWRlcy5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgICAgIGVuYWJsZU9rQWxhcm06IGphdmFFeGNlcHRpb25PdmVycmlkZXMuZW5hYmxlT2tBbGFybSxcbiAgICAgICAgICBhY3Rpb246IGphdmFFeGNlcHRpb25PdmVycmlkZXMuYWN0aW9uLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmICghcHJvcHMuc2tpcFRhcmdldEdyb3VwKSB7XG4gICAgICAgIC8vIEFsbCBhbGFybXMgZW5hYmxlZCBieS1kZWZhdWx0IChvcHQtb3V0IGluZGl2aWR1YWxseSlcbiAgICAgICAgdGhpcy5zZXJ2aWNlQWxhcm1zLmFkZFRhcmdldEdyb3VwQWxhcm1zKHtcbiAgICAgICAgICB0YXJnZXRHcm91cEZ1bGxOYW1lOiB0aGlzLnRhcmdldEdyb3VwIS50YXJnZXRHcm91cEZ1bGxOYW1lLFxuICAgICAgICAgIGxvYWRCYWxhbmNlckZ1bGxOYW1lOiBhbGFybXMubG9hZEJhbGFuY2VyRnVsbE5hbWUsXG4gICAgICAgICAgdGFyZ2V0SGVhbHRoQWxhcm06IGFsYXJtcy50YXJnZXRIZWFsdGhBbGFybSxcbiAgICAgICAgICBzaW5nbGU1eHhSZXNwb25zZUFsYXJtOiBhbGFybXMuc2luZ2xlNXh4UmVzcG9uc2VBbGFybSxcbiAgICAgICAgICB0b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybTpcbiAgICAgICAgICAgIGFsYXJtcy50b29NYW55NXh4UmVzcG9uc2VzRnJvbVRhcmdldHNBbGFybSxcbiAgICAgICAgICB0YXJnZXRSZXNwb25zZVRpbWVBbGFybTogYWxhcm1zLnRhcmdldFJlc3BvbnNlVGltZUFsYXJtLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -38,7 +38,7 @@ export class LoadBalancer extends constructs.Construct {
38
38
  targetType: elb.TargetType.INSTANCE,
39
39
  });
40
40
  this.httpsListener = this.loadBalancer.addListener("HttpsListener", {
41
- sslPolicy: elb.SslPolicy.TLS12,
41
+ sslPolicy: elb.SslPolicy.RECOMMENDED_TLS,
42
42
  protocol: elb.ApplicationProtocol.HTTPS,
43
43
  port: 443,
44
44
  certificates: props.certificates,
@@ -57,4 +57,4 @@ export class LoadBalancer extends constructs.Construct {
57
57
  this.loadBalancer.logAccessLogs(this.accessLogsBucket);
58
58
  }
59
59
  }
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1iYWxhbmNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkLWJhbGFuY2VyL2xvYWQtYmFsYW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFFbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEtBQUssR0FBRyxNQUFNLHdDQUF3QyxDQUFBO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUN2RSxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBU3hDLE1BQU0sT0FBTyxZQUFhLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDcEMsWUFBWSxDQUE2QjtJQUN6QyxhQUFhLENBQXlCO0lBQ3RDLGdCQUFnQixDQUFXO0lBRTNDLFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQXdCO1FBRXhCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3hFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFDbEMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTTthQUNsQyxDQUFDO1lBQ0YsR0FBRyxLQUFLLENBQUMseUJBQXlCO1NBQ25DLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZO2FBQ2QsV0FBVyxDQUFDLGNBQWMsRUFBRTtZQUMzQixJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7YUFDRCxTQUFTLENBQUMsZUFBZSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUM5QixJQUFJLEVBQUUsS0FBSztnQkFDWCxRQUFRLEVBQUUsT0FBTztnQkFDakIsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztTQUNILENBQUMsQ0FBQTtRQUVKLG9EQUFvRDtRQUNwRCw0REFBNEQ7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FDdkQsSUFBSSxFQUNKLG9CQUFvQixFQUNwQjtZQUNFLFFBQVEsRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSTtZQUN0QyxJQUFJLEVBQUUsRUFBRTtZQUNSLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVE7U0FDcEMsQ0FDRixDQUFBO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDbEUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSztZQUM5QixRQUFRLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEtBQUs7WUFDdkMsSUFBSSxFQUFFLEdBQUc7WUFDVCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsbUJBQW1CLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxHQUFHLEtBQUssQ0FBQywwQkFBMEI7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDOUQsVUFBVSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO1lBQzFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO1lBQ2pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUNsQzthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgdHlwZSAqIGFzIGNlcnRpZmljYXRlbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgZWxiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgeyBMaXN0ZW5lckFjdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlclByb3BzIHtcbiAgY2VydGlmaWNhdGVzOiBjZXJ0aWZpY2F0ZW1hbmFnZXIuSUNlcnRpZmljYXRlW11cbiAgdnBjOiBlYzIuSVZwY1xuICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzPzogUGFydGlhbDxlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJQcm9wcz5cbiAgb3ZlcnJpZGVIdHRwc0xpc3RlbmVyUHJvcHM/OiBQYXJ0aWFsPGVsYi5CYXNlQXBwbGljYXRpb25MaXN0ZW5lclByb3BzPlxufVxuXG5leHBvcnQgY2xhc3MgTG9hZEJhbGFuY2VyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZEJhbGFuY2VyOiBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJcbiAgcHVibGljIHJlYWRvbmx5IGh0dHBzTGlzdGVuZXI6IGVsYi5BcHBsaWNhdGlvbkxpc3RlbmVyXG4gIHB1YmxpYyByZWFkb25seSBhY2Nlc3NMb2dzQnVja2V0OiBzMy5CdWNrZXRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTG9hZEJhbGFuY2VyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IGVsYi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBcIkxvYWRCYWxhbmNlclwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGludGVybmV0RmFjaW5nOiB0cnVlLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMoe1xuICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICB9KSxcbiAgICAgIC4uLnByb3BzLm92ZXJyaWRlTG9hZEJhbGFuY2VyUHJvcHMsXG4gICAgfSlcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyXG4gICAgICAuYWRkTGlzdGVuZXIoXCJIdHRwTGlzdGVuZXJcIiwge1xuICAgICAgICBwb3J0OiA4MCxcbiAgICAgIH0pXG4gICAgICAuYWRkQWN0aW9uKFwiSHR0cHNSZWRpcmVjdFwiLCB7XG4gICAgICAgIGFjdGlvbjogTGlzdGVuZXJBY3Rpb24ucmVkaXJlY3Qoe1xuICAgICAgICAgIHBvcnQ6IFwiNDQzXCIsXG4gICAgICAgICAgcHJvdG9jb2w6IFwiSFRUUFNcIixcbiAgICAgICAgICBwZXJtYW5lbnQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgfSlcblxuICAgIC8vIFRoZSBMb2FkIEJhbGFuY2VyIHJlcXVpcmUgYSBkZWZhdWx0IHRhcmdldCBncm91cC5cbiAgICAvLyBXZSB3aWxsIG5vdCBjb25uZWN0IGFueXRoaW5nIHRvIHRoZSBkZWZhdWx0IHRhcmdldCBncm91cC5cbiAgICBjb25zdCBkZWZhdWx0VGFyZ2V0R3JvdXAgPSBuZXcgZWxiLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgXCJEZWZhdWx0VGFyZ2V0R3JvdXBcIixcbiAgICAgIHtcbiAgICAgICAgcHJvdG9jb2w6IGVsYi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgIHBvcnQ6IDgwLFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgdGFyZ2V0VHlwZTogZWxiLlRhcmdldFR5cGUuSU5TVEFOQ0UsXG4gICAgICB9LFxuICAgIClcblxuICAgIHRoaXMuaHR0cHNMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFwiSHR0cHNMaXN0ZW5lclwiLCB7XG4gICAgICBzc2xQb2xpY3k6IGVsYi5Tc2xQb2xpY3kuVExTMTIsXG4gICAgICBwcm90b2NvbDogZWxiLkFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFMsXG4gICAgICBwb3J0OiA0NDMsXG4gICAgICBjZXJ0aWZpY2F0ZXM6IHByb3BzLmNlcnRpZmljYXRlcyxcbiAgICAgIGRlZmF1bHRUYXJnZXRHcm91cHM6IFtkZWZhdWx0VGFyZ2V0R3JvdXBdLFxuICAgICAgLi4ucHJvcHMub3ZlcnJpZGVIdHRwc0xpc3RlbmVyUHJvcHMsXG4gICAgfSlcblxuICAgIHRoaXMuYWNjZXNzTG9nc0J1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgXCJBY2Nlc3NMb2dzQnVja2V0XCIsIHtcbiAgICAgIGVuY3J5cHRpb246IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgICAgIGJsb2NrUHVibGljQWNjZXNzOiBzMy5CbG9ja1B1YmxpY0FjY2Vzcy5CTE9DS19BTEwsXG4gICAgICBsaWZlY3ljbGVSdWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhwaXJhdGlvbjogY2RrLkR1cmF0aW9uLmRheXMoMzApLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgdGhpcy5sb2FkQmFsYW5jZXIubG9nQWNjZXNzTG9ncyh0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQpXG4gIH1cbn1cbiJdfQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1iYWxhbmNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2FkLWJhbGFuY2VyL2xvYWQtYmFsYW5jZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxhQUFhLENBQUE7QUFFbEMsT0FBTyxLQUFLLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEtBQUssR0FBRyxNQUFNLHdDQUF3QyxDQUFBO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUN2RSxPQUFPLEtBQUssRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ3hDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBU3hDLE1BQU0sT0FBTyxZQUFhLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDcEMsWUFBWSxDQUE2QjtJQUN6QyxhQUFhLENBQXlCO0lBQ3RDLGdCQUFnQixDQUFXO0lBRTNDLFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQXdCO1FBRXhCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3hFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFVBQVUsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztnQkFDbEMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTTthQUNsQyxDQUFDO1lBQ0YsR0FBRyxLQUFLLENBQUMseUJBQXlCO1NBQ25DLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZO2FBQ2QsV0FBVyxDQUFDLGNBQWMsRUFBRTtZQUMzQixJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7YUFDRCxTQUFTLENBQUMsZUFBZSxFQUFFO1lBQzFCLE1BQU0sRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO2dCQUM5QixJQUFJLEVBQUUsS0FBSztnQkFDWCxRQUFRLEVBQUUsT0FBTztnQkFDakIsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztTQUNILENBQUMsQ0FBQTtRQUVKLG9EQUFvRDtRQUNwRCw0REFBNEQ7UUFDNUQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FDdkQsSUFBSSxFQUNKLG9CQUFvQixFQUNwQjtZQUNFLFFBQVEsRUFBRSxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSTtZQUN0QyxJQUFJLEVBQUUsRUFBRTtZQUNSLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLFFBQVE7U0FDcEMsQ0FDRixDQUFBO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUU7WUFDbEUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZTtZQUN4QyxRQUFRLEVBQUUsR0FBRyxDQUFDLG1CQUFtQixDQUFDLEtBQUs7WUFDdkMsSUFBSSxFQUFFLEdBQUc7WUFDVCxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsbUJBQW1CLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxHQUFHLEtBQUssQ0FBQywwQkFBMEI7U0FDcEMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDOUQsVUFBVSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVO1lBQzFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO1lBQ2pELGNBQWMsRUFBRTtnQkFDZDtvQkFDRSxVQUFVLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2lCQUNsQzthQUNGO1NBQ0YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFDeEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgdHlwZSAqIGFzIGNlcnRpZmljYXRlbWFuYWdlciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiXG5pbXBvcnQgKiBhcyBlYzIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIlxuaW1wb3J0ICogYXMgZWxiIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgeyBMaXN0ZW5lckFjdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiXG5pbXBvcnQgKiBhcyBzMyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRCYWxhbmNlclByb3BzIHtcbiAgY2VydGlmaWNhdGVzOiBjZXJ0aWZpY2F0ZW1hbmFnZXIuSUNlcnRpZmljYXRlW11cbiAgdnBjOiBlYzIuSVZwY1xuICBvdmVycmlkZUxvYWRCYWxhbmNlclByb3BzPzogUGFydGlhbDxlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJQcm9wcz5cbiAgb3ZlcnJpZGVIdHRwc0xpc3RlbmVyUHJvcHM/OiBQYXJ0aWFsPGVsYi5CYXNlQXBwbGljYXRpb25MaXN0ZW5lclByb3BzPlxufVxuXG5leHBvcnQgY2xhc3MgTG9hZEJhbGFuY2VyIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgbG9hZEJhbGFuY2VyOiBlbGIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJcbiAgcHVibGljIHJlYWRvbmx5IGh0dHBzTGlzdGVuZXI6IGVsYi5BcHBsaWNhdGlvbkxpc3RlbmVyXG4gIHB1YmxpYyByZWFkb25seSBhY2Nlc3NMb2dzQnVja2V0OiBzMy5CdWNrZXRcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTG9hZEJhbGFuY2VyUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyID0gbmV3IGVsYi5BcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBcIkxvYWRCYWxhbmNlclwiLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGludGVybmV0RmFjaW5nOiB0cnVlLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMoe1xuICAgICAgICBzdWJuZXRUeXBlOiBlYzIuU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICB9KSxcbiAgICAgIC4uLnByb3BzLm92ZXJyaWRlTG9hZEJhbGFuY2VyUHJvcHMsXG4gICAgfSlcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyXG4gICAgICAuYWRkTGlzdGVuZXIoXCJIdHRwTGlzdGVuZXJcIiwge1xuICAgICAgICBwb3J0OiA4MCxcbiAgICAgIH0pXG4gICAgICAuYWRkQWN0aW9uKFwiSHR0cHNSZWRpcmVjdFwiLCB7XG4gICAgICAgIGFjdGlvbjogTGlzdGVuZXJBY3Rpb24ucmVkaXJlY3Qoe1xuICAgICAgICAgIHBvcnQ6IFwiNDQzXCIsXG4gICAgICAgICAgcHJvdG9jb2w6IFwiSFRUUFNcIixcbiAgICAgICAgICBwZXJtYW5lbnQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgfSlcblxuICAgIC8vIFRoZSBMb2FkIEJhbGFuY2VyIHJlcXVpcmUgYSBkZWZhdWx0IHRhcmdldCBncm91cC5cbiAgICAvLyBXZSB3aWxsIG5vdCBjb25uZWN0IGFueXRoaW5nIHRvIHRoZSBkZWZhdWx0IHRhcmdldCBncm91cC5cbiAgICBjb25zdCBkZWZhdWx0VGFyZ2V0R3JvdXAgPSBuZXcgZWxiLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgXCJEZWZhdWx0VGFyZ2V0R3JvdXBcIixcbiAgICAgIHtcbiAgICAgICAgcHJvdG9jb2w6IGVsYi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICAgIHBvcnQ6IDgwLFxuICAgICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgICAgdGFyZ2V0VHlwZTogZWxiLlRhcmdldFR5cGUuSU5TVEFOQ0UsXG4gICAgICB9LFxuICAgIClcblxuICAgIHRoaXMuaHR0cHNMaXN0ZW5lciA9IHRoaXMubG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFwiSHR0cHNMaXN0ZW5lclwiLCB7XG4gICAgICBzc2xQb2xpY3k6IGVsYi5Tc2xQb2xpY3kuUkVDT01NRU5ERURfVExTLFxuICAgICAgcHJvdG9jb2w6IGVsYi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFBTLFxuICAgICAgcG9ydDogNDQzLFxuICAgICAgY2VydGlmaWNhdGVzOiBwcm9wcy5jZXJ0aWZpY2F0ZXMsXG4gICAgICBkZWZhdWx0VGFyZ2V0R3JvdXBzOiBbZGVmYXVsdFRhcmdldEdyb3VwXSxcbiAgICAgIC4uLnByb3BzLm92ZXJyaWRlSHR0cHNMaXN0ZW5lclByb3BzLFxuICAgIH0pXG5cbiAgICB0aGlzLmFjY2Vzc0xvZ3NCdWNrZXQgPSBuZXcgczMuQnVja2V0KHRoaXMsIFwiQWNjZXNzTG9nc0J1Y2tldFwiLCB7XG4gICAgICBlbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgbGlmZWN5Y2xlUnVsZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4cGlyYXRpb246IGNkay5EdXJhdGlvbi5kYXlzKDMwKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSlcblxuICAgIHRoaXMubG9hZEJhbGFuY2VyLmxvZ0FjY2Vzc0xvZ3ModGhpcy5hY2Nlc3NMb2dzQnVja2V0KVxuICB9XG59XG4iXX0=
@@ -1,8 +1,81 @@
1
1
  import * as cdk from "aws-cdk-lib";
2
+ import type * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
2
3
  import * as ec2 from "aws-cdk-lib/aws-ec2";
3
4
  import * as rds from "aws-cdk-lib/aws-rds";
4
5
  import type * as sm from "aws-cdk-lib/aws-secretsmanager";
5
6
  import * as constructs from "constructs";
7
+ /**
8
+ * Configure database alarms.
9
+ *
10
+ * Alarms are enabled by default (when you supply an `alarmAction` and
11
+ * `warningAction`). To explicitly disable automatic alarms use
12
+ * `{ enabled: false }`.
13
+ */
14
+ export type DatabaseAlarmsConfig = {
15
+ enabled: false;
16
+ } | {
17
+ /**
18
+ * When alarms are enabled, both actions are required.
19
+ */
20
+ alarmAction: cloudwatch.IAlarmAction;
21
+ warningAction: cloudwatch.IAlarmAction;
22
+ /**
23
+ * CPU credits alarm config
24
+ */
25
+ cpuCreditsAlarm?: {
26
+ /**
27
+ * @default true if instance type is burstable
28
+ */
29
+ enabled?: boolean;
30
+ /** Whether to attach OK actions for this alarm. @default true */
31
+ enableOkAlarm?: boolean;
32
+ action?: cloudwatch.IAlarmAction;
33
+ /** @default 10% of maximum earned credits for instance type */
34
+ threshold?: number;
35
+ appendToAlarmDescription?: string;
36
+ };
37
+ /**
38
+ * Storage space alarm overrides
39
+ */
40
+ storageSpaceAlarms?: {
41
+ /**
42
+ * Set to `false` to disable all storage space alarms (both low and critically low).
43
+ * @default true
44
+ */
45
+ enabled?: boolean;
46
+ lowStorageSpaceAlarm?: {
47
+ action?: cloudwatch.IAlarmAction;
48
+ /** Whether to attach OK actions for this alarm. @default true */
49
+ enableOkAlarm?: boolean;
50
+ /** @default 25% of allocated storage */
51
+ threshold?: cdk.Size;
52
+ };
53
+ criticallyLowStorageSpaceAlarm?: {
54
+ action?: cloudwatch.IAlarmAction;
55
+ /** Whether to attach OK actions for this alarm. @default true */
56
+ enableOkAlarm?: boolean;
57
+ /** @default 5% of allocated storage */
58
+ threshold?: cdk.Size;
59
+ };
60
+ appendToAlarmDescription?: string;
61
+ };
62
+ /**
63
+ * CPU utilization alarm overrides.
64
+ */
65
+ cpuUtilizationAlarm?: {
66
+ enabled?: boolean;
67
+ /** Whether to attach OK actions for this alarm. @default true */
68
+ enableOkAlarm?: boolean;
69
+ action?: cloudwatch.IAlarmAction;
70
+ /** @default 80 */
71
+ threshold?: number;
72
+ /** @default 5 */
73
+ evaluationPeriods?: number;
74
+ /** @default 2 minutes */
75
+ period?: cdk.Duration;
76
+ appendToAlarmDescription?: string;
77
+ };
78
+ };
6
79
  export interface DatabaseProps extends cdk.StackProps {
7
80
  vpc: ec2.IVpc;
8
81
  engine: rds.IInstanceEngine;
@@ -37,6 +110,16 @@ export interface DatabaseProps extends cdk.StackProps {
37
110
  */
38
111
  usePublicSubnets?: boolean;
39
112
  overrideDbOptions?: Partial<rds.DatabaseInstanceSourceProps>;
113
+ /**
114
+ * Configure database alarms.
115
+ *
116
+ * This property is required and must be one of two shapes:
117
+ * - `{ enabled: false }` to explicitly disable automatic alarms
118
+ * - `{ alarmAction, warningAction }` to enable alarms and provide both channels
119
+ *
120
+ * Default: enabled.
121
+ */
122
+ alarms: DatabaseAlarmsConfig;
40
123
  }
41
124
  export declare class Database extends constructs.Construct {
42
125
  readonly secret: sm.ISecret;