@liflig/cdk 2.21.3 → 2.21.4

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.
Files changed (33) hide show
  1. package/lib/index.d.ts +1 -4
  2. package/lib/index.js +2 -6
  3. package/package.json +12 -12
  4. package/lib/cdk-deploy/cdk-deploy.d.ts +0 -63
  5. package/lib/cdk-deploy/cdk-deploy.js +0 -174
  6. package/lib/cdk-deploy/index.d.ts +0 -1
  7. package/lib/cdk-deploy/index.js +0 -6
  8. package/lib/cdk-deploy/start-deploy-handler.d.ts +0 -8
  9. package/lib/cdk-deploy/start-deploy-handler.js +0 -65
  10. package/lib/cdk-deploy/status-handler.d.ts +0 -6
  11. package/lib/cdk-deploy/status-handler.js +0 -80
  12. package/lib/ecs-update-image/artifact-status.d.ts +0 -39
  13. package/lib/ecs-update-image/artifact-status.js +0 -41
  14. package/lib/ecs-update-image/ecs-update-image.d.ts +0 -41
  15. package/lib/ecs-update-image/ecs-update-image.js +0 -97
  16. package/lib/ecs-update-image/index.d.ts +0 -3
  17. package/lib/ecs-update-image/index.js +0 -10
  18. package/lib/ecs-update-image/start-deploy-handler.d.ts +0 -6
  19. package/lib/ecs-update-image/start-deploy-handler.js +0 -95
  20. package/lib/ecs-update-image/status-handler.d.ts +0 -11
  21. package/lib/ecs-update-image/status-handler.js +0 -67
  22. package/lib/ecs-update-image/tag.d.ts +0 -47
  23. package/lib/ecs-update-image/tag.js +0 -67
  24. package/lib/pipelines/conventions.d.ts +0 -14
  25. package/lib/pipelines/conventions.js +0 -24
  26. package/lib/pipelines/deploy-env.d.ts +0 -18
  27. package/lib/pipelines/deploy-env.js +0 -96
  28. package/lib/pipelines/index.d.ts +0 -2
  29. package/lib/pipelines/index.js +0 -8
  30. package/lib/pipelines/liflig-cdk-deployer-deps.d.ts +0 -13
  31. package/lib/pipelines/liflig-cdk-deployer-deps.js +0 -35
  32. package/lib/pipelines/pipeline.d.ts +0 -78
  33. package/lib/pipelines/pipeline.js +0 -229
@@ -1,96 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DeployEnv = void 0;
4
- const constructs = require("constructs");
5
- const ec2 = require("aws-cdk-lib/aws-ec2");
6
- const ecr = require("aws-cdk-lib/aws-ecr");
7
- const ecs = require("aws-cdk-lib/aws-ecs");
8
- const iam = require("aws-cdk-lib/aws-iam");
9
- const logs = require("aws-cdk-lib/aws-logs");
10
- const sfn = require("aws-cdk-lib/aws-stepfunctions");
11
- const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
12
- const cdk = require("aws-cdk-lib");
13
- const conventions_1 = require("./conventions");
14
- class DeployEnv extends constructs.Construct {
15
- constructor(scope, id, props) {
16
- super(scope, id);
17
- const cluster = this.getOrCreateCluster(props.vpc);
18
- // We don't reuse the task definition across multiple pipelines
19
- // so that we can easier find the correct logs for each pipeline.
20
- const taskDefinition = new ecs.TaskDefinition(this, "TaskDefinition", {
21
- memoryMiB: "1024",
22
- cpu: "256",
23
- compatibility: ecs.Compatibility.FARGATE,
24
- });
25
- const containerDefinition = taskDefinition.addContainer("app", {
26
- image: ecs.ContainerImage.fromEcrRepository(ecr.Repository.fromRepositoryArn(this, "Repository",
27
- // See https://github.com/capralifecycle/liflig-cdk-deployer
28
- "arn:aws:ecr:eu-west-1:001112238813:repository/incub-common-liflig-cdk-deployer"), "1-experimental.2"),
29
- logging: ecs.LogDriver.awsLogs({
30
- logGroup: new logs.LogGroup(this, "LogGroup", {
31
- removalPolicy: cdk.RemovalPolicy.DESTROY,
32
- retention: logs.RetentionDays.ONE_MONTH,
33
- }),
34
- streamPrefix: "app",
35
- }),
36
- });
37
- const cdkRole = iam.Role.fromRoleArn(this, `CdkRole-${props.envName}`, `arn:aws:iam::${props.accountId}:role/${conventions_1.cdkDeployRoleName}`);
38
- cdkRole.grant(taskDefinition.taskRole, "sts:AssumeRole");
39
- props.artefactBucket.grantRead(taskDefinition.taskRole);
40
- this.chain = sfn.Chain.start(new tasks.EcsRunTask(this, `Deploy ${props.envName}`, {
41
- resultPath: sfn.JsonPath.DISCARD,
42
- securityGroups: [this.getOrCreateTaskSecurityGroup(props.vpc)],
43
- integrationPattern: sfn.IntegrationPattern.RUN_JOB,
44
- cluster,
45
- assignPublicIp: true,
46
- launchTarget: new tasks.EcsFargateLaunchTarget(),
47
- taskDefinition,
48
- containerOverrides: [
49
- {
50
- containerDefinition,
51
- environment: [
52
- {
53
- name: "CDK_TARGET_ROLE_ARN",
54
- value: cdkRole.roleArn,
55
- },
56
- {
57
- name: "CDK_ENV_NAME",
58
- value: props.envName,
59
- },
60
- {
61
- name: "CDK_CLOUD_ASSEMBLY",
62
- value: sfn.JsonPath.stringAt("$.CloudAssembly"),
63
- },
64
- {
65
- name: "CDK_VARIABLES",
66
- value: sfn.JsonPath.stringAt("$.Variables"),
67
- },
68
- ],
69
- },
70
- ],
71
- }));
72
- if (props.afterSuccessfulDeploy != null) {
73
- this.chain = this.chain.next(props.afterSuccessfulDeploy);
74
- }
75
- }
76
- // Reuse ECS cluster for multiple pipelines in same stack.
77
- getOrCreateCluster(vpc) {
78
- var _a;
79
- const stack = cdk.Stack.of(this);
80
- const uniqueId = "pipeline.04ad36b1.cluster";
81
- return ((_a = stack.node.tryFindChild(uniqueId)) !== null && _a !== void 0 ? _a : new ecs.Cluster(stack, uniqueId, {
82
- vpc,
83
- }));
84
- }
85
- // Reuse security group for multiple pipelines in same stack.
86
- getOrCreateTaskSecurityGroup(vpc) {
87
- var _a;
88
- const stack = cdk.Stack.of(this);
89
- const uniqueId = "pipeline.04ad36b1.security-group";
90
- return ((_a = stack.node.tryFindChild(uniqueId)) !== null && _a !== void 0 ? _a : new ec2.SecurityGroup(stack, uniqueId, {
91
- vpc,
92
- }));
93
- }
94
- }
95
- exports.DeployEnv = DeployEnv;
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LWVudi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZXMvZGVwbG95LWVudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBd0M7QUFDeEMsMkNBQTBDO0FBQzFDLDJDQUEwQztBQUMxQywyQ0FBMEM7QUFDMUMsMkNBQTBDO0FBQzFDLDZDQUE0QztBQUU1QyxxREFBb0Q7QUFDcEQsNkRBQTREO0FBQzVELG1DQUFrQztBQUNsQywrQ0FBaUQ7QUFVakQsTUFBYSxTQUFVLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFHakQsWUFBWSxLQUEyQixFQUFFLEVBQVUsRUFBRSxLQUFxQjtRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7UUFFbEQsK0RBQStEO1FBQy9ELGlFQUFpRTtRQUVqRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ3BFLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLEdBQUcsRUFBRSxLQUFLO1lBQ1YsYUFBYSxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsT0FBTztTQUN6QyxDQUFDLENBQUE7UUFFRixNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFO1lBQzdELEtBQUssRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUN6QyxHQUFHLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUM5QixJQUFJLEVBQ0osWUFBWTtZQUNaLDREQUE0RDtZQUM1RCxnRkFBZ0YsQ0FDakYsRUFDRCxrQkFBa0IsQ0FDbkI7WUFDRCxPQUFPLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdCLFFBQVEsRUFBRSxJQUFJLElBQUks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TyxDQUNMLE1BQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUF1QixtQ0FDeEQsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDckMsR0FBRztTQUNKLENBQUMsQ0FDSCxDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBN0dELDhCQTZHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCJcbmltcG9ydCAqIGFzIGVjciBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjclwiXG5pbXBvcnQgKiBhcyBlY3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgc2ZuIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiXG5pbXBvcnQgKiBhcyB0YXNrcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgeyBjZGtEZXBsb3lSb2xlTmFtZSB9IGZyb20gXCIuL2NvbnZlbnRpb25zXCJcblxuaW50ZXJmYWNlIERlcGxveUVudlByb3BzIHtcbiAgYWNjb3VudElkOiBzdHJpbmdcbiAgYWZ0ZXJTdWNjZXNzZnVsRGVwbG95Pzogc2ZuLkNoYWluXG4gIGFydGVmYWN0QnVja2V0OiBzMy5JQnVja2V0XG4gIGVudk5hbWU6IHN0cmluZ1xuICB2cGM6IGVjMi5JVnBjXG59XG5cbmV4cG9ydCBjbGFzcyBEZXBsb3lFbnYgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHB1YmxpYyBjaGFpbjogc2ZuLkNoYWluXG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGVwbG95RW52UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBjbHVzdGVyID0gdGhpcy5nZXRPckNyZWF0ZUNsdXN0ZXIocHJvcHMudnBjKVxuXG4gICAgLy8gV2UgZG9uJ3QgcmV1c2UgdGhlIHRhc2sgZGVmaW5pdGlvbiBhY3Jvc3MgbXVsdGlwbGUgcGlwZWxpbmVzXG4gICAgLy8gc28gdGhhdCB3ZSBjYW4gZWFzaWVyIGZpbmQgdGhlIGNvcnJlY3QgbG9ncyBmb3IgZWFjaCBwaXBlbGluZS5cblxuICAgIGNvbnN0IHRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5UYXNrRGVmaW5pdGlvbih0aGlzLCBcIlRhc2tEZWZpbml0aW9uXCIsIHtcbiAgICAgIG1lbW9yeU1pQjogXCIxMDI0XCIsXG4gICAgICBjcHU6IFwiMjU2XCIsXG4gICAgICBjb21wYXRpYmlsaXR5OiBlY3MuQ29tcGF0aWJpbGl0eS5GQVJHQVRFLFxuICAgIH0pXG5cbiAgICBjb25zdCBjb250YWluZXJEZWZpbml0aW9uID0gdGFza0RlZmluaXRpb24uYWRkQ29udGFpbmVyKFwiYXBwXCIsIHtcbiAgICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbUVjclJlcG9zaXRvcnkoXG4gICAgICAgIGVjci5SZXBvc2l0b3J5LmZyb21SZXBvc2l0b3J5QXJuKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJSZXBvc2l0b3J5XCIsXG4gICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWxpZmVjeWNsZS9saWZsaWctY2RrLWRlcGxveWVyXG4gICAgICAgICAgXCJhcm46YXdzOmVjcjpldS13ZXN0LTE6MDAxMTEyMjM4ODEzOnJlcG9zaXRvcnkvaW5jdWItY29tbW9uLWxpZmxpZy1jZGstZGVwbG95ZXJcIixcbiAgICAgICAgKSxcbiAgICAgICAgXCIxLWV4cGVyaW1lbnRhbC4yXCIsXG4gICAgICApLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlci5hd3NMb2dzKHtcbiAgICAgICAgbG9nR3JvdXA6IG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiTG9nR3JvdXBcIiwge1xuICAgICAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgICAgICAgcmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgICB9KSxcbiAgICAgICAgc3RyZWFtUHJlZml4OiBcImFwcFwiLFxuICAgICAgfSksXG4gICAgfSlcblxuICAgIGNvbnN0IGNka1JvbGUgPSBpYW0uUm9sZS5mcm9tUm9sZUFybihcbiAgICAgIHRoaXMsXG4gICAgICBgQ2RrUm9sZS0ke3Byb3BzLmVudk5hbWV9YCxcbiAgICAgIGBhcm46YXdzOmlhbTo6JHtwcm9wcy5hY2NvdW50SWR9OnJvbGUvJHtjZGtEZXBsb3lSb2xlTmFtZX1gLFxuICAgIClcblxuICAgIGNka1JvbGUuZ3JhbnQodGFza0RlZmluaXRpb24udGFza1JvbGUsIFwic3RzOkFzc3VtZVJvbGVcIilcblxuICAgIHByb3BzLmFydGVmYWN0QnVja2V0LmdyYW50UmVhZCh0YXNrRGVmaW5pdGlvbi50YXNrUm9sZSlcblxuICAgIHRoaXMuY2hhaW4gPSBzZm4uQ2hhaW4uc3RhcnQoXG4gICAgICBuZXcgdGFza3MuRWNzUnVuVGFzayh0aGlzLCBgRGVwbG95ICR7cHJvcHMuZW52TmFtZX1gLCB7XG4gICAgICAgIHJlc3VsdFBhdGg6IHNmbi5Kc29uUGF0aC5ESVNDQVJELFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZ2V0T3JDcmVhdGVUYXNrU2VjdXJpdHlHcm91cChwcm9wcy52cGMpXSxcbiAgICAgICAgaW50ZWdyYXRpb25QYXR0ZXJuOiBzZm4uSW50ZWdyYXRpb25QYXR0ZXJuLlJVTl9KT0IsXG4gICAgICAgIGNsdXN0ZXIsXG4gICAgICAgIGFzc2lnblB1YmxpY0lwOiB0cnVlLFxuICAgICAgICBsYXVuY2hUYXJnZXQ6IG5ldyB0YXNrcy5FY3NGYXJnYXRlTGF1bmNoVGFyZ2V0KCksXG4gICAgICAgIHRhc2tEZWZpbml0aW9uLFxuICAgICAgICBjb250YWluZXJPdmVycmlkZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb250YWluZXJEZWZpbml0aW9uLFxuICAgICAgICAgICAgZW52aXJvbm1lbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiQ0RLX1RBUkdFVF9ST0xFX0FSTlwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBjZGtSb2xlLnJvbGVBcm4sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcIkNES19FTlZfTkFNRVwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBwcm9wcy5lbnZOYW1lLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDREtfQ0xPVURfQVNTRU1CTFlcIixcbiAgICAgICAgICAgICAgICB2YWx1ZTogc2ZuLkpzb25QYXRoLnN0cmluZ0F0KFwiJC5DbG91ZEFzc2VtYmx5XCIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogXCJDREtfVkFSSUFCTEVTXCIsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHNmbi5Kc29uUGF0aC5zdHJpbmdBdChcIiQuVmFyaWFibGVzXCIpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgaWYgKHByb3BzLmFmdGVyU3VjY2Vzc2Z1bERlcGxveSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmNoYWluID0gdGhpcy5jaGFpbi5uZXh0KHByb3BzLmFmdGVyU3VjY2Vzc2Z1bERlcGxveSlcbiAgICB9XG4gIH1cblxuICAvLyBSZXVzZSBFQ1MgY2x1c3RlciBmb3IgbXVsdGlwbGUgcGlwZWxpbmVzIGluIHNhbWUgc3RhY2suXG4gIHByaXZhdGUgZ2V0T3JDcmVhdGVDbHVzdGVyKHZwYzogZWMyLklWcGMpOiBlY3MuQ2x1c3RlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBjZGsuU3RhY2sub2YodGhpcylcbiAgICBjb25zdCB1bmlxdWVJZCA9IFwicGlwZWxpbmUuMDRhZDM2YjEuY2x1c3RlclwiXG4gICAgcmV0dXJuIChcbiAgICAgIChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZCh1bmlxdWVJZCkgYXMgZWNzLkNsdXN0ZXIpID8/XG4gICAgICBuZXcgZWNzLkNsdXN0ZXIoc3RhY2ssIHVuaXF1ZUlkLCB7XG4gICAgICAgIHZwYyxcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgLy8gUmV1c2Ugc2VjdXJpdHkgZ3JvdXAgZm9yIG11bHRpcGxlIHBpcGVsaW5lcyBpbiBzYW1lIHN0YWNrLlxuICBwcml2YXRlIGdldE9yQ3JlYXRlVGFza1NlY3VyaXR5R3JvdXAodnBjOiBlYzIuSVZwYyk6IGVjMi5TZWN1cml0eUdyb3VwIHtcbiAgICBjb25zdCBzdGFjayA9IGNkay5TdGFjay5vZih0aGlzKVxuICAgIGNvbnN0IHVuaXF1ZUlkID0gXCJwaXBlbGluZS4wNGFkMzZiMS5zZWN1cml0eS1ncm91cFwiXG4gICAgcmV0dXJuIChcbiAgICAgIChzdGFjay5ub2RlLnRyeUZpbmRDaGlsZCh1bmlxdWVJZCkgYXMgZWMyLlNlY3VyaXR5R3JvdXApID8/XG4gICAgICBuZXcgZWMyLlNlY3VyaXR5R3JvdXAoc3RhY2ssIHVuaXF1ZUlkLCB7XG4gICAgICAgIHZwYyxcbiAgICAgIH0pXG4gICAgKVxuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export { LifligCdkDeployerDeps, LifligCdkDeployerDepsProps, } from "./liflig-cdk-deployer-deps";
2
- export { Pipeline, PipelineEnvironment, PipelineProps } from "./pipeline";
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Pipeline = exports.LifligCdkDeployerDeps = void 0;
4
- var liflig_cdk_deployer_deps_1 = require("./liflig-cdk-deployer-deps");
5
- Object.defineProperty(exports, "LifligCdkDeployerDeps", { enumerable: true, get: function () { return liflig_cdk_deployer_deps_1.LifligCdkDeployerDeps; } });
6
- var pipeline_1 = require("./pipeline");
7
- Object.defineProperty(exports, "Pipeline", { enumerable: true, get: function () { return pipeline_1.Pipeline; } });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVFQUdtQztBQUZqQyxpSUFBQSxxQkFBcUIsT0FBQTtBQUd2Qix1Q0FBeUU7QUFBaEUsb0dBQUEsUUFBUSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHtcbiAgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzLFxuICBMaWZsaWdDZGtEZXBsb3llckRlcHNQcm9wcyxcbn0gZnJvbSBcIi4vbGlmbGlnLWNkay1kZXBsb3llci1kZXBzXCJcbmV4cG9ydCB7IFBpcGVsaW5lLCBQaXBlbGluZUVudmlyb25tZW50LCBQaXBlbGluZVByb3BzIH0gZnJvbSBcIi4vcGlwZWxpbmVcIlxuIl19
@@ -1,13 +0,0 @@
1
- import * as constructs from "constructs";
2
- export interface LifligCdkDeployerDepsProps {
3
- trustedAccountIds: string[];
4
- }
5
- /**
6
- * Resources needed so liflig-cdk-deployer can deploy to the account.
7
- *
8
- * This must exist in each target account that the pipeline should
9
- * be able to deploy into.
10
- */
11
- export declare class LifligCdkDeployerDeps extends constructs.Construct {
12
- constructor(scope: constructs.Construct, id: string, props: LifligCdkDeployerDepsProps);
13
- }
@@ -1,35 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LifligCdkDeployerDeps = void 0;
4
- const constructs = require("constructs");
5
- const iam = require("aws-cdk-lib/aws-iam");
6
- const cdk = require("aws-cdk-lib");
7
- const conventions_1 = require("./conventions");
8
- /**
9
- * Resources needed so liflig-cdk-deployer can deploy to the account.
10
- *
11
- * This must exist in each target account that the pipeline should
12
- * be able to deploy into.
13
- */
14
- class LifligCdkDeployerDeps extends constructs.Construct {
15
- constructor(scope, id, props) {
16
- super(scope, id);
17
- const account = cdk.Stack.of(this).account;
18
- // The role used when running "cdk deploy".
19
- const cdkRole = new iam.Role(this, "CdkRole", {
20
- roleName: conventions_1.cdkDeployRoleName,
21
- assumedBy: new iam.CompositePrincipal(...props.trustedAccountIds.map((it) => new iam.AccountPrincipal(it))),
22
- });
23
- // Roles used by CDK CLI for the actual deployment.
24
- // (For use under new-style synthesize.)
25
- cdkRole.addToPolicy(new iam.PolicyStatement({
26
- actions: ["sts:AssumeRole"],
27
- resources: [
28
- `arn:aws:iam::${account}:role/*-deploy-role-*`,
29
- `arn:aws:iam::${account}:role/*-publishing-role-*`,
30
- ],
31
- }));
32
- }
33
- }
34
- exports.LifligCdkDeployerDeps = LifligCdkDeployerDeps;
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1kZXBsb3llci1kZXBzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lcy9saWZsaWctY2RrLWRlcGxveWVyLWRlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDJDQUEwQztBQUMxQyxtQ0FBa0M7QUFDbEMsK0NBQWlEO0FBTWpEOzs7OztHQUtHO0FBQ0gsTUFBYSxxQkFBc0IsU0FBUSxVQUFVLENBQUMsU0FBUztJQUM3RCxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUFpQztRQUVqQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQTtRQUUxQywyQ0FBMkM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDNUMsUUFBUSxFQUFFLCtCQUFpQjtZQUMzQixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsa0JBQWtCLENBQ25DLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDckU7U0FDRixDQUFDLENBQUE7UUFFRixtREFBbUQ7UUFDbkQsd0NBQXdDO1FBQ3hDLE9BQU8sQ0FBQyxXQUFXLENBQ2pCLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMzQixTQUFTLEVBQUU7Z0JBQ1QsZ0JBQWdCLE9BQU8sdUJBQXVCO2dCQUM5QyxnQkFBZ0IsT0FBTywyQkFBMkI7YUFDbkQ7U0FDRixDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQTlCRCxzREE4QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCB7IGNka0RlcGxveVJvbGVOYW1lIH0gZnJvbSBcIi4vY29udmVudGlvbnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmxpZ0Nka0RlcGxveWVyRGVwc1Byb3BzIHtcbiAgdHJ1c3RlZEFjY291bnRJZHM6IHN0cmluZ1tdXG59XG5cbi8qKlxuICogUmVzb3VyY2VzIG5lZWRlZCBzbyBsaWZsaWctY2RrLWRlcGxveWVyIGNhbiBkZXBsb3kgdG8gdGhlIGFjY291bnQuXG4gKlxuICogVGhpcyBtdXN0IGV4aXN0IGluIGVhY2ggdGFyZ2V0IGFjY291bnQgdGhhdCB0aGUgcGlwZWxpbmUgc2hvdWxkXG4gKiBiZSBhYmxlIHRvIGRlcGxveSBpbnRvLlxuICovXG5leHBvcnQgY2xhc3MgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzIGV4dGVuZHMgY29uc3RydWN0cy5Db25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTGlmbGlnQ2RrRGVwbG95ZXJEZXBzUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IGFjY291bnQgPSBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudFxuXG4gICAgLy8gVGhlIHJvbGUgdXNlZCB3aGVuIHJ1bm5pbmcgXCJjZGsgZGVwbG95XCIuXG4gICAgY29uc3QgY2RrUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBcIkNka1JvbGVcIiwge1xuICAgICAgcm9sZU5hbWU6IGNka0RlcGxveVJvbGVOYW1lLFxuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkNvbXBvc2l0ZVByaW5jaXBhbChcbiAgICAgICAgLi4ucHJvcHMudHJ1c3RlZEFjY291bnRJZHMubWFwKChpdCkgPT4gbmV3IGlhbS5BY2NvdW50UHJpbmNpcGFsKGl0KSksXG4gICAgICApLFxuICAgIH0pXG5cbiAgICAvLyBSb2xlcyB1c2VkIGJ5IENESyBDTEkgZm9yIHRoZSBhY3R1YWwgZGVwbG95bWVudC5cbiAgICAvLyAoRm9yIHVzZSB1bmRlciBuZXctc3R5bGUgc3ludGhlc2l6ZS4pXG4gICAgY2RrUm9sZS5hZGRUb1BvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3RzOkFzc3VtZVJvbGVcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOmlhbTo6JHthY2NvdW50fTpyb2xlLyotZGVwbG95LXJvbGUtKmAsXG4gICAgICAgICAgYGFybjphd3M6aWFtOjoke2FjY291bnR9OnJvbGUvKi1wdWJsaXNoaW5nLXJvbGUtKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApXG4gIH1cbn1cbiJdfQ==
@@ -1,78 +0,0 @@
1
- import * as constructs from "constructs";
2
- import * as ec2 from "aws-cdk-lib/aws-ec2";
3
- import * as s3 from "aws-cdk-lib/aws-s3";
4
- import * as sfn from "aws-cdk-lib/aws-stepfunctions";
5
- export interface PipelineProps {
6
- /**
7
- * Bucket holding pipeline configuration and trigger file.
8
- *
9
- * @default - use existing bucket based on Griid conventions
10
- */
11
- artifactsBucket?: s3.IBucket;
12
- /**
13
- * Environments for this pipeline. Each environment is deployed sequentially
14
- * in the order given.
15
- */
16
- environments: PipelineEnvironment[];
17
- /**
18
- * Name of pipeline. This is used for the path where configuration
19
- * is stored in S3.
20
- */
21
- pipelineName: string;
22
- /**
23
- * Trigger the pipeline when the trigger file is written.
24
- *
25
- * @default - true
26
- */
27
- triggerEnabled?: boolean;
28
- /**
29
- * VPC used for Fargate resources.
30
- */
31
- vpc: ec2.IVpc;
32
- }
33
- export interface PipelineEnvironment {
34
- /**
35
- * Account number hosting the environment.
36
- */
37
- accountId: string;
38
- /**
39
- * Additional tasks to run after the environment has been deployed.
40
- */
41
- afterSuccessfulDeploy?: sfn.Chain;
42
- /**
43
- * Name of environment.
44
- */
45
- name: string;
46
- }
47
- /**
48
- * Pipeline for doing a multi-account CDK deployment based
49
- * on a built CDK Cloud Assembly and parameters stored in S3.
50
- *
51
- * The accounts being deployed to must be provisioned with
52
- * the LifligCdkDeployerDeps construct so expected IAM
53
- * roles is present.
54
- *
55
- * The pipeline starts by writing an empty file to
56
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/trigger
57
- *
58
- * The CDK deploy process is handled by liflig-cdk-deployer.
59
- * See https://github.com/capralifecycle/liflig-cdk-deployer
60
- *
61
- * Configuration files are read from S3 at the path
62
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/
63
- *
64
- * - cloud-assembly.json which has the format described as
65
- * CDK_CLOUD_ASSEMBLY in liflig-cdk-deployer
66
- *
67
- * - variables*.json which can be zero or more files
68
- * with string-string map that will be concatenated to
69
- * form the format described as CDK_VARIABLES in
70
- * liflig-cdk-deployer
71
- *
72
- * The separation of Cloud Assembly details and variables enables
73
- * separation of IaC code and application code if they are not
74
- * colocated in the same repository.
75
- */
76
- export declare class Pipeline extends constructs.Construct {
77
- constructor(scope: constructs.Construct, id: string, props: PipelineProps);
78
- }
@@ -1,229 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Pipeline = void 0;
4
- const constructs = require("constructs");
5
- const events = require("aws-cdk-lib/aws-events");
6
- const eventsTargets = require("aws-cdk-lib/aws-events-targets");
7
- const iam = require("aws-cdk-lib/aws-iam");
8
- const lambda = require("aws-cdk-lib/aws-lambda");
9
- const sfn = require("aws-cdk-lib/aws-stepfunctions");
10
- const aws_stepfunctions_1 = require("aws-cdk-lib/aws-stepfunctions");
11
- const tasks = require("aws-cdk-lib/aws-stepfunctions-tasks");
12
- const cdk = require("aws-cdk-lib");
13
- const griid_1 = require("../griid");
14
- const conventions_1 = require("./conventions");
15
- const deploy_env_1 = require("./deploy-env");
16
- /**
17
- * Pipeline for doing a multi-account CDK deployment based
18
- * on a built CDK Cloud Assembly and parameters stored in S3.
19
- *
20
- * The accounts being deployed to must be provisioned with
21
- * the LifligCdkDeployerDeps construct so expected IAM
22
- * roles is present.
23
- *
24
- * The pipeline starts by writing an empty file to
25
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/trigger
26
- *
27
- * The CDK deploy process is handled by liflig-cdk-deployer.
28
- * See https://github.com/capralifecycle/liflig-cdk-deployer
29
- *
30
- * Configuration files are read from S3 at the path
31
- * s3://<artifacts-bucket>/pipelines/<pipeline-name>/
32
- *
33
- * - cloud-assembly.json which has the format described as
34
- * CDK_CLOUD_ASSEMBLY in liflig-cdk-deployer
35
- *
36
- * - variables*.json which can be zero or more files
37
- * with string-string map that will be concatenated to
38
- * form the format described as CDK_VARIABLES in
39
- * liflig-cdk-deployer
40
- *
41
- * The separation of Cloud Assembly details and variables enables
42
- * separation of IaC code and application code if they are not
43
- * colocated in the same repository.
44
- */
45
- class Pipeline extends constructs.Construct {
46
- constructor(scope, id, props) {
47
- var _a, _b;
48
- super(scope, id);
49
- const s3Prefix = (0, conventions_1.pipelineS3Prefix)(props.pipelineName);
50
- const s3TriggerKey = (0, conventions_1.pipelineS3TriggerKey)(props.pipelineName);
51
- const artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, griid_1.getGriidArtefactBucket)(this);
52
- const checkCanRunFn = new lambda.SingletonFunction(this, "CheckCanRunFn", {
53
- uuid: "30ad3abb-f774-4804-a6ef-2c2f4a247362",
54
- code: new lambda.InlineCode(`exports.handler = ${checkCanRunHandler.toString()};`),
55
- runtime: lambda.Runtime.NODEJS_18_X,
56
- handler: "index.handler",
57
- timeout: cdk.Duration.seconds(10),
58
- });
59
- const checkCanRunTask = new tasks.LambdaInvoke(this, "Check if the process can run", {
60
- lambdaFunction: checkCanRunFn,
61
- outputPath: "$.Payload",
62
- payload: sfn.TaskInput.fromObject({
63
- "stateMachineId.$": "$$.StateMachine.Id",
64
- "executionId.$": "$$.Execution.Id",
65
- }),
66
- });
67
- const wait = new sfn.Wait(this, "Wait before rechecking status", {
68
- time: sfn.WaitTime.duration(cdk.Duration.seconds(15)),
69
- });
70
- const skip = new sfn.Succeed(this, "Skip");
71
- const collectFilesFn = new lambda.SingletonFunction(this, "CollectFilesFn", {
72
- uuid: "c49cbfe1-50e0-4721-8964-fb20f4e5a7ad",
73
- code: new lambda.InlineCode(`exports.handler = ${collectFilesHandler.toString()};`),
74
- runtime: lambda.Runtime.NODEJS_18_X,
75
- handler: "index.handler",
76
- timeout: cdk.Duration.seconds(30),
77
- });
78
- artifactsBucket.grantRead(collectFilesFn);
79
- const collectFilesTask = new tasks.LambdaInvoke(this, "Collect files from S3", {
80
- lambdaFunction: collectFilesFn,
81
- outputPath: "$.Payload",
82
- payload: sfn.TaskInput.fromObject({
83
- bucketName: artifactsBucket.bucketName,
84
- bucketPrefix: s3Prefix,
85
- envNames: props.environments.map((it) => it.name),
86
- }),
87
- });
88
- let run = sfn.Chain.start(collectFilesTask);
89
- const ifHavingStacks = (name, work) => new sfn.Choice(this, `Check if ${name} has stacks`)
90
- .when(aws_stepfunctions_1.Condition.or(aws_stepfunctions_1.Condition.isNull(`$.StackCountPerEnv.${name}`), aws_stepfunctions_1.Condition.numberEquals(`$.StackCountPerEnv.${name}`, 0)), new sfn.Pass(this, `Skip ${name}`))
91
- .otherwise(work)
92
- .afterwards();
93
- for (const env of props.environments) {
94
- const it = new deploy_env_1.DeployEnv(this, env.name, {
95
- accountId: env.accountId,
96
- afterSuccessfulDeploy: env.afterSuccessfulDeploy,
97
- artefactBucket: artifactsBucket,
98
- envName: env.name,
99
- vpc: props.vpc,
100
- });
101
- run = run.next(ifHavingStacks(env.name, it.chain));
102
- }
103
- const definition = sfn.Chain.start(checkCanRunTask).next(new sfn.Choice(this, "Can run?")
104
- .when(aws_stepfunctions_1.Condition.stringEquals("$.CanRunState", "CONTINUE"), run)
105
- .when(aws_stepfunctions_1.Condition.stringEquals("$.CanRunState", "SKIP"), skip)
106
- .otherwise(wait.next(checkCanRunTask)));
107
- const machine = new sfn.StateMachine(this, "StateMachine", {
108
- definition,
109
- // https://docs.aws.amazon.com/step-functions/latest/dg/sfn-stuck-execution.html
110
- timeout: cdk.Duration.hours(3),
111
- });
112
- new iam.Policy(this, "CheckCanRunPolicy", {
113
- roles: [checkCanRunFn.role],
114
- statements: [
115
- new iam.PolicyStatement({
116
- actions: ["states:ListExecutions"],
117
- resources: [machine.stateMachineArn],
118
- }),
119
- ],
120
- });
121
- if ((_b = props.triggerEnabled) !== null && _b !== void 0 ? _b : true) {
122
- artifactsBucket.onCloudTrailWriteObject("Trigger", {
123
- paths: [s3TriggerKey],
124
- target: new eventsTargets.SfnStateMachine(machine, {
125
- input: events.RuleTargetInput.fromObject({}),
126
- }),
127
- });
128
- }
129
- }
130
- }
131
- exports.Pipeline = Pipeline;
132
- // This is a self-contained function that will be serialized as a lambda.
133
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
134
- const collectFilesHandler = async (event) => {
135
- // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
136
- const { S3Client, ListObjectsV2Command, GetObjectCommand } = await Promise.resolve().then(() => require("@aws-sdk/client-s3"));
137
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
138
- const s3Client = new S3Client();
139
- console.log("Event received: ", event);
140
- const bucketName = event.bucketName;
141
- const bucketPrefix = event.bucketPrefix;
142
- const envNames = event.envNames;
143
- if (bucketPrefix.slice(-1) !== "/") {
144
- throw new Error(`Expected bucket prefix to end with '/' but its value is '${bucketPrefix}'`);
145
- }
146
- async function listObjects() {
147
- const { Contents } = await s3Client.send(new ListObjectsV2Command({
148
- Bucket: bucketName,
149
- Prefix: bucketPrefix,
150
- }));
151
- return Contents;
152
- }
153
- async function getObject(key) {
154
- const { Body } = await s3Client.send(new GetObjectCommand({
155
- Bucket: bucketName,
156
- Key: key,
157
- }));
158
- return Body.toString();
159
- }
160
- let cloudAssembly = null;
161
- let variables = {};
162
- const files = await listObjects();
163
- for (const file of files !== null && files !== void 0 ? files : []) {
164
- const key = file.Key;
165
- const filename = key.slice(bucketPrefix.length);
166
- console.log(`File: ${filename}`);
167
- if (filename === "cloud-assembly.json") {
168
- console.log("Found Cloud Assembly");
169
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
170
- cloudAssembly = JSON.parse(await getObject(key));
171
- }
172
- else if (/^variables.*\.json$/.test(filename)) {
173
- console.log("Found variables file");
174
- variables = {
175
- ...variables,
176
- ...JSON.parse(await getObject(key)),
177
- };
178
- }
179
- else {
180
- console.log("Ignoring unknown file");
181
- }
182
- }
183
- if (cloudAssembly === null) {
184
- throw new Error("cloud-assembly.json not found");
185
- }
186
- return {
187
- CloudAssembly: JSON.stringify(cloudAssembly),
188
- Variables: JSON.stringify(variables),
189
- StackCountPerEnv: Object.fromEntries(envNames.map((name) => {
190
- var _a, _b;
191
- return [
192
- name,
193
- (_b = (_a = cloudAssembly.environments.find((it) => it.name === name)) === null || _a === void 0 ? void 0 : _a.stackNames.length) !== null && _b !== void 0 ? _b : 0,
194
- ];
195
- })),
196
- };
197
- };
198
- // This is a self-contained function that will be serialized as a lambda.
199
- const checkCanRunHandler = async (event) => {
200
- // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
201
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
202
- const { SFNClient, ListExecutionsCommand, ExecutionStatus } = await Promise.resolve().then(() => require("@aws-sdk/client-sfn"));
203
- const sfnClient = new SFNClient();
204
- console.log("Event received: ", event);
205
- const stateMachineArn = event["stateMachineId"];
206
- const currentExecutionArn = event["executionId"];
207
- const { executions } = await sfnClient.send(new ListExecutionsCommand({
208
- stateMachineArn,
209
- statusFilter: ExecutionStatus.RUNNING,
210
- }));
211
- if (!executions) {
212
- throw new Error("Could not list executions");
213
- }
214
- console.log("Executions: ", executions);
215
- const currentExecution = executions.find((it) => it.executionArn == currentExecutionArn);
216
- if (!currentExecution) {
217
- throw new Error("Could not find current execution");
218
- }
219
- const newer = executions.filter((it) => {
220
- if (!it.startDate || !currentExecution.startDate) {
221
- return false;
222
- }
223
- return it.startDate > currentExecution.startDate;
224
- }).length;
225
- return {
226
- CanRunState: newer > 0 ? "SKIP" : executions.length == 1 ? "CONTINUE" : "WAIT",
227
- };
228
- };
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL3BpcGVsaW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxpREFBZ0Q7QUFDaEQsZ0VBQStEO0FBQy9ELDJDQUEwQztBQUMxQyxpREFBZ0Q7QUFFaEQscURBQW9EO0FBQ3BELHFFQUF5RDtBQUN6RCw2REFBNEQ7QUFDNUQsbUNBQWtDO0FBRWxDLG9DQUFpRDtBQUNqRCwrQ0FBc0U7QUFDdEUsNkNBQXdDO0FBOEN4Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQWEsUUFBUyxTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ2hELFlBQVksS0FBMkIsRUFBRSxFQUFVLEVBQUUsS0FBb0I7O1FBQ3ZFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxRQUFRLEdBQUcsSUFBQSw4QkFBZ0IsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDckQsTUFBTSxZQUFZLEdBQUcsSUFBQSxrQ0FBb0IsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFN0QsTUFBTSxlQUFlLEdBQ25CLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksSUFBQSw4QkFBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUV2RCxNQUFNLGFBQWEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ3hFLElBQUksRUFBRSxzQ0FBc0M7WUFDNUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FDekIscUJBQXFCLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQ3REO1lBQ0QsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVztZQUNuQyxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsR0FBRyxDQUFDLFFB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QUFDLE1BQU0sQ0FBQTtJQUVULE9BQU87UUFDTCxXQUFXLEVBQ1QsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNO0tBQ3BFLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiXG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBzZm4gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zdGVwZnVuY3Rpb25zXCJcbmltcG9ydCB7IENvbmRpdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiXG5pbXBvcnQgKiBhcyB0YXNrcyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3NcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgdHlwZSB7IEhhbmRsZXIgfSBmcm9tIFwiYXdzLWxhbWJkYVwiXG5pbXBvcnQgeyBnZXRHcmlpZEFydGVmYWN0QnVja2V0IH0gZnJvbSBcIi4uL2dyaWlkXCJcbmltcG9ydCB7IHBpcGVsaW5lUzNQcmVmaXgsIHBpcGVsaW5lUzNUcmlnZ2VyS2V5IH0gZnJvbSBcIi4vY29udmVudGlvbnNcIlxuaW1wb3J0IHsgRGVwbG95RW52IH0gZnJvbSBcIi4vZGVwbG95LWVudlwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgaG9sZGluZyBwaXBlbGluZSBjb25maWd1cmF0aW9uIGFuZCB0cmlnZ2VyIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGV4aXN0aW5nIGJ1Y2tldCBiYXNlZCBvbiBHcmlpZCBjb252ZW50aW9uc1xuICAgKi9cbiAgYXJ0aWZhY3RzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogRW52aXJvbm1lbnRzIGZvciB0aGlzIHBpcGVsaW5lLiBFYWNoIGVudmlyb25tZW50IGlzIGRlcGxveWVkIHNlcXVlbnRpYWxseVxuICAgKiBpbiB0aGUgb3JkZXIgZ2l2ZW4uXG4gICAqL1xuICBlbnZpcm9ubWVudHM6IFBpcGVsaW5lRW52aXJvbm1lbnRbXVxuICAvKipcbiAgICogTmFtZSBvZiBwaXBlbGluZS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgcGF0aCB3aGVyZSBjb25maWd1cmF0aW9uXG4gICAqIGlzIHN0b3JlZCBpbiBTMy5cbiAgICovXG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBwaXBlbGluZSB3aGVuIHRoZSB0cmlnZ2VyIGZpbGUgaXMgd3JpdHRlbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0cnVlXG4gICAqL1xuICB0cmlnZ2VyRW5hYmxlZD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFZQQyB1c2VkIGZvciBGYXJnYXRlIHJlc291cmNlcy5cbiAgICovXG4gIHZwYzogZWMyLklWcGNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUVudmlyb25tZW50IHtcbiAgLyoqXG4gICAqIEFjY291bnQgbnVtYmVyIGhvc3RpbmcgdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgYWNjb3VudElkOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgdGFza3MgdG8gcnVuIGFmdGVyIHRoZSBlbnZpcm9ubWVudCBoYXMgYmVlbiBkZXBsb3llZC5cbiAgICovXG4gIGFmdGVyU3VjY2Vzc2Z1bERlcGxveT86IHNmbi5DaGFpblxuICAvKipcbiAgICogTmFtZSBvZiBlbnZpcm9ubWVudC5cbiAgICovXG4gIG5hbWU6IHN0cmluZ1xufVxuXG4vKipcbiAqIFBpcGVsaW5lIGZvciBkb2luZyBhIG11bHRpLWFjY291bnQgQ0RLIGRlcGxveW1lbnQgYmFzZWRcbiAqIG9uIGEgYnVpbHQgQ0RLIENsb3VkIEFzc2VtYmx5IGFuZCBwYXJhbWV0ZXJzIHN0b3JlZCBpbiBTMy5cbiAqXG4gKiBUaGUgYWNjb3VudHMgYmVpbmcgZGVwbG95ZWQgdG8gbXVzdCBiZSBwcm92aXNpb25lZCB3aXRoXG4gKiB0aGUgTGlmbGlnQ2RrRGVwbG95ZXJEZXBzIGNvbnN0cnVjdCBzbyBleHBlY3RlZCBJQU1cbiAqIHJvbGVzIGlzIHByZXNlbnQuXG4gKlxuICogVGhlIHBpcGVsaW5lIHN0YXJ0cyBieSB3cml0aW5nIGFuIGVtcHR5IGZpbGUgdG9cbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vdHJpZ2dlclxuICpcbiAqIFRoZSBDREsgZGVwbG95IHByb2Nlc3MgaXMgaGFuZGxlZCBieSBsaWZsaWctY2RrLWRlcGxveWVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jYXByYWxpZmVjeWNsZS9saWZsaWctY2RrLWRlcGxveWVyXG4gKlxuICogQ29uZmlndXJhdGlvbiBmaWxlcyBhcmUgcmVhZCBmcm9tIFMzIGF0IHRoZSBwYXRoXG4gKiBzMzovLzxhcnRpZmFjdHMtYnVja2V0Pi9waXBlbGluZXMvPHBpcGVsaW5lLW5hbWU+L1xuICpcbiAqICAtIGNsb3VkLWFzc2VtYmx5Lmpzb24gd2hpY2ggaGFzIHRoZSBmb3JtYXQgZGVzY3JpYmVkIGFzXG4gKiAgICBDREtfQ0xPVURfQVNTRU1CTFkgaW4gbGlmbGlnLWNkay1kZXBsb3llclxuICpcbiAqICAtIHZhcmlhYmxlcyouanNvbiB3aGljaCBjYW4gYmUgemVybyBvciBtb3JlIGZpbGVzXG4gKiAgICB3aXRoIHN0cmluZy1zdHJpbmcgbWFwIHRoYXQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgdG9cbiAqICAgIGZvcm0gdGhlIGZvcm1hdCBkZXNjcmliZWQgYXMgQ0RLX1ZBUklBQkxFUyBpblxuICogICAgbGlmbGlnLWNkay1kZXBsb3llclxuICpcbiAqIFRoZSBzZXBhcmF0aW9uIG9mIENsb3VkIEFzc2VtYmx5IGRldGFpbHMgYW5kIHZhcmlhYmxlcyBlbmFibGVzXG4gKiBzZXBhcmF0aW9uIG9mIElhQyBjb2RlIGFuZCBhcHBsaWNhdGlvbiBjb2RlIGlmIHRoZXkgYXJlIG5vdFxuICogY29sb2NhdGVkIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IHMzUHJlZml4ID0gcGlwZWxpbmVTM1ByZWZpeChwcm9wcy5waXBlbGluZU5hbWUpXG4gICAgY29uc3QgczNUcmlnZ2VyS2V5ID0gcGlwZWxpbmVTM1RyaWdnZXJLZXkocHJvcHMucGlwZWxpbmVOYW1lKVxuXG4gICAgY29uc3QgYXJ0aWZhY3RzQnVja2V0ID1cbiAgICAgIHByb3BzLmFydGlmYWN0c0J1Y2tldCA/PyBnZXRHcmlpZEFydGVmYWN0QnVja2V0KHRoaXMpXG5cbiAgICBjb25zdCBjaGVja0NhblJ1bkZuID0gbmV3IGxhbWJkYS5TaW5nbGV0b25GdW5jdGlvbih0aGlzLCBcIkNoZWNrQ2FuUnVuRm5cIiwge1xuICAgICAgdXVpZDogXCIzMGFkM2FiYi1mNzc0LTQ4MDQtYTZlZi0yYzJmNGEyNDczNjJcIixcbiAgICAgIGNvZGU6IG5ldyBsYW1iZGEuSW5saW5lQ29kZShcbiAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y2hlY2tDYW5SdW5IYW5kbGVyLnRvU3RyaW5nKCl9O2AsXG4gICAgICApLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE4X1gsXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICB9KVxuXG4gICAgY29uc3QgY2hlY2tDYW5SdW5UYXNrID0gbmV3IHRhc2tzLkxhbWJkYUludm9rZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkNoZWNrIGlmIHRoZSBwcm9jZXNzIGNhbiBydW5cIixcbiAgICAgIHtcbiAgICAgICAgbGFtYmRhRnVuY3Rpb246IGNoZWNrQ2FuUnVuRm4sXG4gICAgICAgIG91dHB1dFBhdGg6IFwiJC5QYXlsb2FkXCIsXG4gICAgICAgIHBheWxvYWQ6IHNmbi5UYXNrSW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgXCJzdGF0ZU1hY2hpbmVJZC4kXCI6IFwiJCQuU3RhdGVNYWNoaW5lLklkXCIsXG4gICAgICAgICAgXCJleGVjdXRpb25JZC4kXCI6IFwiJCQuRXhlY3V0aW9uLklkXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBjb25zdCB3YWl0ID0gbmV3IHNmbi5XYWl0KHRoaXMsIFwiV2FpdCBiZWZvcmUgcmVjaGVja2luZyBzdGF0dXNcIiwge1xuICAgICAgdGltZTogc2ZuLldhaXRUaW1lLmR1cmF0aW9uKGNkay5EdXJhdGlvbi5zZWNvbmRzKDE1KSksXG4gICAgfSlcblxuICAgIGNvbnN0IHNraXAgPSBuZXcgc2ZuLlN1Y2NlZWQodGhpcywgXCJTa2lwXCIpXG5cbiAgICBjb25zdCBjb2xsZWN0RmlsZXNGbiA9IG5ldyBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24oXG4gICAgICB0aGlzLFxuICAgICAgXCJDb2xsZWN0RmlsZXNGblwiLFxuICAgICAge1xuICAgICAgICB1dWlkOiBcImM0OWNiZmUxLTUwZTAtNDcyMS04OTY0LWZiMjBmNGU1YTdhZFwiLFxuICAgICAgICBjb2RlOiBuZXcgbGFtYmRhLklubGluZUNvZGUoXG4gICAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y29sbGVjdEZpbGVzSGFuZGxlci50b1N0cmluZygpfTtgLFxuICAgICAgICApLFxuICAgICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5OT0RFSlNfMThfWCxcbiAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgYXJ0aWZhY3RzQnVja2V0LmdyYW50UmVhZChjb2xsZWN0RmlsZXNGbilcblxuICAgIGNvbnN0IGNvbGxlY3RGaWxlc1Rhc2sgPSBuZXcgdGFza3MuTGFtYmRhSW52b2tlKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQ29sbGVjdCBmaWxlcyBmcm9tIFMzXCIsXG4gICAgICB7XG4gICAgICAgIGxhbWJkYUZ1bmN0aW9uOiBjb2xsZWN0RmlsZXNGbixcbiAgICAgICAgb3V0cHV0UGF0aDogXCIkLlBheWxvYWRcIixcbiAgICAgICAgcGF5bG9hZDogc2ZuLlRhc2tJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBidWNrZXROYW1lOiBhcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICBidWNrZXRQcmVmaXg6IHMzUHJlZml4LFxuICAgICAgICAgIGVudk5hbWVzOiBwcm9wcy5lbnZpcm9ubWVudHMubWFwKChpdCkgPT4gaXQubmFtZSksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBsZXQgcnVuOiBzZm4uQ2hhaW4gPSBzZm4uQ2hhaW4uc3RhcnQoY29sbGVjdEZpbGVzVGFzaylcblxuICAgIGNvbnN0IGlmSGF2aW5nU3RhY2tzID0gKG5hbWU6IHN0cmluZywgd29yazogc2ZuLkNoYWluKSA9PlxuICAgICAgbmV3IHNmbi5DaG9pY2UodGhpcywgYENoZWNrIGlmICR7bmFtZX0gaGFzIHN0YWNrc2ApXG4gICAgICAgIC53aGVuKFxuICAgICAgICAgIENvbmRpdGlvbi5vcihcbiAgICAgICAgICAgIENvbmRpdGlvbi5pc051bGwoYCQuU3RhY2tDb3VudFBlckVudi4ke25hbWV9YCksXG4gICAgICAgICAgICBDb25kaXRpb24ubnVtYmVyRXF1YWxzKGAkLlN0YWNrQ291bnRQZXJFbnYuJHtuYW1lfWAsIDApLFxuICAgICAgICAgICksXG4gICAgICAgICAgbmV3IHNmbi5QYXNzKHRoaXMsIGBTa2lwICR7bmFtZX1gKSxcbiAgICAgICAgKVxuICAgICAgICAub3RoZXJ3aXNlKHdvcmspXG4gICAgICAgIC5hZnRlcndhcmRzKClcblxuICAgIGZvciAoY29uc3QgZW52IG9mIHByb3BzLmVudmlyb25tZW50cykge1xuICAgICAgY29uc3QgaXQgPSBuZXcgRGVwbG95RW52KHRoaXMsIGVudi5uYW1lLCB7XG4gICAgICAgIGFjY291bnRJZDogZW52LmFjY291bnRJZCxcbiAgICAgICAgYWZ0ZXJTdWNjZXNzZnVsRGVwbG95OiBlbnYuYWZ0ZXJTdWNjZXNzZnVsRGVwbG95LFxuICAgICAgICBhcnRlZmFjdEJ1Y2tldDogYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICBlbnZOYW1lOiBlbnYubmFtZSxcbiAgICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB9KVxuXG4gICAgICBydW4gPSBydW4ubmV4dChpZkhhdmluZ1N0YWNrcyhlbnYubmFtZSwgaXQuY2hhaW4pKVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmluaXRpb246IHNmbi5DaGFpbiA9IHNmbi5DaGFpbi5zdGFydChjaGVja0NhblJ1blRhc2spLm5leHQoXG4gICAgICBuZXcgc2ZuLkNob2ljZSh0aGlzLCBcIkNhbiBydW4/XCIpXG4gICAgICAgIC53aGVuKENvbmRpdGlvbi5zdHJpbmdFcXVhbHMoXCIkLkNhblJ1blN0YXRlXCIsIFwiQ09OVElOVUVcIiksIHJ1bilcbiAgICAgICAgLndoZW4oQ29uZGl0aW9uLnN0cmluZ0VxdWFscyhcIiQuQ2FuUnVuU3RhdGVcIiwgXCJTS0lQXCIpLCBza2lwKVxuICAgICAgICAub3RoZXJ3aXNlKHdhaXQubmV4dChjaGVja0NhblJ1blRhc2spKSxcbiAgICApXG5cbiAgICBjb25zdCBtYWNoaW5lID0gbmV3IHNmbi5TdGF0ZU1hY2hpbmUodGhpcywgXCJTdGF0ZU1hY2hpbmVcIiwge1xuICAgICAgZGVmaW5pdGlvbixcbiAgICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zdGVwLWZ1bmN0aW9ucy9sYXRlc3QvZGcvc2ZuLXN0dWNrLWV4ZWN1dGlvbi5odG1sXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uaG91cnMoMyksXG4gICAgfSlcblxuICAgIG5ldyBpYW0uUG9saWN5KHRoaXMsIFwiQ2hlY2tDYW5SdW5Qb2xpY3lcIiwge1xuICAgICAgcm9sZXM6IFtjaGVja0NhblJ1bkZuLnJvbGUhXSxcbiAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcInN0YXRlczpMaXN0RXhlY3V0aW9uc1wiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IFttYWNoaW5lLnN0YXRlTWFjaGluZUFybl0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KVxuXG4gICAgaWYgKHByb3BzLnRyaWdnZXJFbmFibGVkID8/IHRydWUpIHtcbiAgICAgIGFydGlmYWN0c0J1Y2tldC5vbkNsb3VkVHJhaWxXcml0ZU9iamVjdChcIlRyaWdnZXJcIiwge1xuICAgICAgICBwYXRoczogW3MzVHJpZ2dlcktleV0sXG4gICAgICAgIHRhcmdldDogbmV3IGV2ZW50c1RhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKG1hY2hpbmUsIHtcbiAgICAgICAgICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHt9KSxcbiAgICAgICAgfSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2xvdWRBc3NlbWJseSB7XG4gIGNsb3VkQXNzZW1ibHlCdWNrZXROYW1lOiBzdHJpbmdcbiAgY2xvdWRBc3NlbWJseUJ1Y2tldEtleTogc3RyaW5nXG4gIGVudmlyb25tZW50czoge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIHN0YWNrTmFtZXM6IHN0cmluZ1tdXG4gIH1bXVxuICBwYXJhbWV0ZXJzOiB7XG4gICAgbmFtZTogc3RyaW5nXG4gICAgdmFsdWU6IHVua25vd24gfCB7IHR5cGU6IFwidmFyaWFibGVcIjsgdmFyaWFibGU6IHN0cmluZyB9XG4gIH1bXVxufVxuXG4vLyBUaGlzIGlzIGEgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYSBsYW1iZGEuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY29uc3QgY29sbGVjdEZpbGVzSGFuZGxlcjogSGFuZGxlciA9IGFzeW5jIChldmVudDogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlcyxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFzc2lnbm1lbnRcbiAgY29uc3QgeyBTM0NsaWVudCwgTGlzdE9iamVjdHNWMkNvbW1hbmQsIEdldE9iamVjdENvbW1hbmQgfSA9IGF3YWl0IGltcG9ydChcbiAgICBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiXG4gIClcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtY2FsbCxAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcblxuICBjb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCgpXG5cbiAgY29uc29sZS5sb2coXCJFdmVudCByZWNlaXZlZDogXCIsIGV2ZW50KVxuXG4gIGNvbnN0IGJ1Y2tldE5hbWUgPSBldmVudC5idWNrZXROYW1lIGFzIHN0cmluZ1xuICBjb25zdCBidWNrZXRQcmVmaXggPSBldmVudC5idWNrZXRQcmVmaXggYXMgc3RyaW5nXG4gIGNvbnN0IGVudk5hbWVzID0gZXZlbnQuZW52TmFtZXMgYXMgc3RyaW5nW11cblxuICBpZiAoYnVja2V0UHJlZml4LnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXhwZWN0ZWQgYnVja2V0IHByZWZpeCB0byBlbmQgd2l0aCAnLycgYnV0IGl0cyB2YWx1ZSBpcyAnJHtidWNrZXRQcmVmaXh9J2AsXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbGlzdE9iamVjdHMoKSB7XG4gICAgY29uc3QgeyBDb250ZW50cyB9ID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgUHJlZml4OiBidWNrZXRQcmVmaXgsXG4gICAgICB9KSxcbiAgICApXG4gICAgcmV0dXJuIENvbnRlbnRzXG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRPYmplY3Qoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHsgQm9keSB9ID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBHZXRPYmplY3RDb21tYW5kKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICBLZXk6IGtleSxcbiAgICAgIH0pLFxuICAgIClcbiAgICByZXR1cm4gQm9keSEudG9TdHJpbmcoKVxuICB9XG5cbiAgbGV0IGNsb3VkQXNzZW1ibHk6IENsb3VkQXNzZW1ibHkgfCBudWxsID0gbnVsbFxuICBsZXQgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge31cblxuICBjb25zdCBmaWxlcyA9IGF3YWl0IGxpc3RPYmplY3RzKClcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzID8/IFtdKSB7XG4gICAgY29uc3Qga2V5ID0gZmlsZS5LZXkhXG4gICAgY29uc3QgZmlsZW5hbWUgPSBrZXkuc2xpY2UoYnVja2V0UHJlZml4Lmxlbmd0aClcblxuICAgIGNvbnNvbGUubG9nKGBGaWxlOiAke2ZpbGVuYW1lfWApXG5cbiAgICBpZiAoZmlsZW5hbWUgPT09IFwiY2xvdWQtYXNzZW1ibHkuanNvblwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkZvdW5kIENsb3VkIEFzc2VtYmx5XCIpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICBjbG91ZEFzc2VtYmx5ID0gSlNPTi5wYXJzZShhd2FpdCBnZXRPYmplY3Qoa2V5KSlcbiAgICB9IGVsc2UgaWYgKC9edmFyaWFibGVzLipcXC5qc29uJC8udGVzdChmaWxlbmFtZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdmFyaWFibGVzIGZpbGVcIilcbiAgICAgIHZhcmlhYmxlcyA9IHtcbiAgICAgICAgLi4udmFyaWFibGVzLFxuICAgICAgICAuLi4oSlNPTi5wYXJzZShhd2FpdCBnZXRPYmplY3Qoa2V5KSkgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiksXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiSWdub3JpbmcgdW5rbm93biBmaWxlXCIpXG4gICAgfVxuICB9XG5cbiAgaWYgKGNsb3VkQXNzZW1ibHkgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJjbG91ZC1hc3NlbWJseS5qc29uIG5vdCBmb3VuZFwiKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBDbG91ZEFzc2VtYmx5OiBKU09OLnN0cmluZ2lmeShjbG91ZEFzc2VtYmx5KSxcbiAgICBWYXJpYWJsZXM6IEpTT04uc3RyaW5naWZ5KHZhcmlhYmxlcyksXG4gICAgU3RhY2tDb3VudFBlckVudjogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgZW52TmFtZXMubWFwKChuYW1lKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNsb3VkQXNzZW1ibHkuZW52aXJvbm1lbnRzLmZpbmQoKGl0KSA9PiBpdC5uYW1lID09PSBuYW1lKT8uc3RhY2tOYW1lc1xuICAgICAgICAgIC5sZW5ndGggPz8gMCxcbiAgICAgIF0pLFxuICAgICksXG4gIH1cbn1cblxuLy8gVGhpcyBpcyBhIHNlbGYtY29udGFpbmVkIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGEgbGFtYmRhLlxuY29uc3QgY2hlY2tDYW5SdW5IYW5kbGVyOiBIYW5kbGVyID0gYXN5bmMgKGV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXNzaWdubWVudFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1jYWxsLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuXG4gIGNvbnN0IHsgU0ZOQ2xpZW50LCBMaXN0RXhlY3V0aW9uc0NvbW1hbmQsIEV4ZWN1dGlvblN0YXR1cyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgIFwiQGF3cy1zZGsvY2xpZW50LXNmblwiXG4gIClcbiAgY29uc3Qgc2ZuQ2xpZW50ID0gbmV3IFNGTkNsaWVudCgpXG5cbiAgY29uc29sZS5sb2coXCJFdmVudCByZWNlaXZlZDogXCIsIGV2ZW50KVxuXG4gIGNvbnN0IHN0YXRlTWFjaGluZUFybiA9IGV2ZW50W1wic3RhdGVNYWNoaW5lSWRcIl1cbiAgY29uc3QgY3VycmVudEV4ZWN1dGlvbkFybiA9IGV2ZW50W1wiZXhlY3V0aW9uSWRcIl1cblxuICBjb25zdCB7IGV4ZWN1dGlvbnMgfSA9IGF3YWl0IHNmbkNsaWVudC5zZW5kKFxuICAgIG5ldyBMaXN0RXhlY3V0aW9uc0NvbW1hbmQoe1xuICAgICAgc3RhdGVNYWNoaW5lQXJuLFxuICAgICAgc3RhdHVzRmlsdGVyOiBFeGVjdXRpb25TdGF0dXMuUlVOTklORyxcbiAgICB9KSxcbiAgKVxuXG4gIGlmICghZXhlY3V0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBsaXN0IGV4ZWN1dGlvbnNcIilcbiAgfVxuXG4gIGNvbnNvbGUubG9nKFwiRXhlY3V0aW9uczogXCIsIGV4ZWN1dGlvbnMpXG5cbiAgY29uc3QgY3VycmVudEV4ZWN1dGlvbiA9IGV4ZWN1dGlvbnMuZmluZChcbiAgICAoaXQpID0+IGl0LmV4ZWN1dGlvbkFybiA9PSBjdXJyZW50RXhlY3V0aW9uQXJuLFxuICApXG5cbiAgaWYgKCFjdXJyZW50RXhlY3V0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGQgbm90IGZpbmQgY3VycmVudCBleGVjdXRpb25cIilcbiAgfVxuXG4gIGNvbnN0IG5ld2VyID0gZXhlY3V0aW9ucy5maWx0ZXIoKGl0KSA9PiB7XG4gICAgaWYgKCFpdC5zdGFydERhdGUgfHwgIWN1cnJlbnRFeGVjdXRpb24uc3RhcnREYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIGl0LnN0YXJ0RGF0ZSA+IGN1cnJlbnRFeGVjdXRpb24uc3RhcnREYXRlXG4gIH0pLmxlbmd0aFxuXG4gIHJldHVybiB7XG4gICAgQ2FuUnVuU3RhdGU6XG4gICAgICBuZXdlciA+IDAgPyBcIlNLSVBcIiA6IGV4ZWN1dGlvbnMubGVuZ3RoID09IDEgPyBcIkNPTlRJTlVFXCIgOiBcIldBSVRcIixcbiAgfVxufVxuIl19