terraform-cdk-serverless-github-actions-runner-controller 0.0.2 → 0.0.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.
package/lib/lib/aws.js CHANGED
@@ -11,6 +11,8 @@ const data_aws_subnets_1 = require("@cdktf/provider-aws/lib/data-aws-subnets");
11
11
  const ecs_cluster_1 = require("@cdktf/provider-aws/lib/ecs-cluster");
12
12
  const ecs_service_1 = require("@cdktf/provider-aws/lib/ecs-service");
13
13
  const ecs_task_definition_1 = require("@cdktf/provider-aws/lib/ecs-task-definition");
14
+ const efs_file_system_1 = require("@cdktf/provider-aws/lib/efs-file-system");
15
+ const efs_mount_target_1 = require("@cdktf/provider-aws/lib/efs-mount-target");
14
16
  const iam_policy_1 = require("@cdktf/provider-aws/lib/iam-policy");
15
17
  const iam_role_1 = require("@cdktf/provider-aws/lib/iam-role");
16
18
  const iam_role_policy_attachment_1 = require("@cdktf/provider-aws/lib/iam-role-policy-attachment");
@@ -18,62 +20,67 @@ const provider_1 = require("@cdktf/provider-aws/lib/provider");
18
20
  const cdktf_1 = require("cdktf");
19
21
  const constructs_1 = require("constructs");
20
22
  const variables_1 = require("./variables");
21
- const efs_file_system_1 = require("@cdktf/provider-aws/lib/efs-file-system");
22
- const efs_mount_target_1 = require("@cdktf/provider-aws/lib/efs-mount-target");
23
23
  class Aws extends constructs_1.Construct {
24
- constructor(scope, id) {
24
+ constructor(scope, id, props) {
25
25
  super(scope, id);
26
26
  new provider_1.AwsProvider(this, 'aws', {});
27
27
  const identity = new data_aws_caller_identity_1.DataAwsCallerIdentity(this, 'Identity', {});
28
28
  const region = new data_aws_region_1.DataAwsRegion(this, 'Region', {});
29
- const { pat, githubConfigUrl } = (0, variables_1.commonVariables)(this);
29
+ const { pat, githubConfigUrl, autoscalerImage } = (0, variables_1.commonVariables)(this);
30
30
  const cluster = new ecs_cluster_1.EcsCluster(this, 'Cluster', {
31
- name: 'gha-runner-cluster',
31
+ name: props.clusterName,
32
32
  });
33
- const runnerRole = new iam_role_1.IamRole(this, 'RunnerRole', {
33
+ const subnets = new data_aws_subnets_1.DataAwsSubnets(this, 'Subnets', {
34
+ filter: props.subnetFilters,
35
+ });
36
+ const securityGroups = new data_aws_security_groups_1.DataAwsSecurityGroups(this, 'SecurityGroups', {
37
+ filter: props.securityGroupFilters,
38
+ });
39
+ const autoscalerRole = new iam_role_1.IamRole(this, 'AutoscalerRole', {
34
40
  assumeRolePolicy: cdktf_1.Fn.jsonencode({
35
- 'Version': '2012-10-17',
36
- 'Statement': [
41
+ Version: '2012-10-17',
42
+ Statement: [
37
43
  {
38
- 'Effect': 'Allow',
39
- 'Principal': {
40
- 'Service': 'ecs-tasks.amazonaws.com'
44
+ Effect: 'Allow',
45
+ Principal: {
46
+ Service: 'ecs-tasks.amazonaws.com',
41
47
  },
42
- 'Action': 'sts:AssumeRole'
43
- }
44
- ]
45
- })
48
+ Action: 'sts:AssumeRole',
49
+ },
50
+ ],
51
+ }),
46
52
  });
47
- const autoscalerRole = new iam_role_1.IamRole(this, 'AutoscalerRole', {
53
+ const runnerRole = new iam_role_1.IamRole(this, 'RunnerRole', {
48
54
  assumeRolePolicy: cdktf_1.Fn.jsonencode({
49
- 'Version': '2012-10-17',
50
- 'Statement': [
55
+ Version: '2012-10-17',
56
+ Statement: [
51
57
  {
52
- 'Effect': 'Allow',
53
- 'Principal': {
54
- 'Service': 'ecs-tasks.amazonaws.com'
58
+ Effect: 'Allow',
59
+ Principal: {
60
+ Service: 'ecs-tasks.amazonaws.com',
55
61
  },
56
- 'Action': 'sts:AssumeRole'
57
- }
58
- ]
59
- })
62
+ Action: 'sts:AssumeRole',
63
+ },
64
+ ],
65
+ }),
60
66
  });
61
67
  const ecsTaskExecutionRole = new iam_role_1.IamRole(this, 'TaskExecutionRole', {
62
68
  assumeRolePolicy: cdktf_1.Fn.jsonencode({
63
- 'Version': '2012-10-17',
64
- 'Statement': [
69
+ Version: '2012-10-17',
70
+ Statement: [
65
71
  {
66
- 'Effect': 'Allow',
67
- 'Principal': {
68
- 'Service': 'ecs-tasks.amazonaws.com'
72
+ Effect: 'Allow',
73
+ Principal: {
74
+ Service: 'ecs-tasks.amazonaws.com',
69
75
  },
70
- 'Action': 'sts:AssumeRole'
71
- }
72
- ]
76
+ Action: 'sts:AssumeRole',
77
+ },
78
+ ],
73
79
  }),
74
- managedPolicyArns: [
75
- 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy'
76
- ]
80
+ });
81
+ new iam_role_policy_attachment_1.IamRolePolicyAttachment(this, 'TeskExecutionRoleAttachment', {
82
+ policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy',
83
+ role: ecsTaskExecutionRole.name,
77
84
  });
78
85
  const runnerLogGroup = new cloudwatch_log_group_1.CloudwatchLogGroup(this, 'RunnerLogGroup', {
79
86
  name: '/ecs/GHA',
@@ -81,99 +88,152 @@ class Aws extends constructs_1.Construct {
81
88
  const autoscalerLogGroup = new cloudwatch_log_group_1.CloudwatchLogGroup(this, 'AutoscalerLogGroup', {
82
89
  name: '/ecs/Autoscaler',
83
90
  });
84
- const subnets = new data_aws_subnets_1.DataAwsSubnets(this, 'Subnets', {});
85
- const securityGroups = new data_aws_security_groups_1.DataAwsSecurityGroups(this, 'SecurityGroups');
86
- // EFS volume to allow sharing data between tasks
87
- const efs = new efs_file_system_1.EfsFileSystem(this, 'efs', {
88
- throughputMode: 'elastic',
89
- tags: {
90
- Name: 'work'
91
- }
92
- });
93
- const externalsEfs = new efs_file_system_1.EfsFileSystem(this, 'externalsEfs', {
94
- throughputMode: 'elastic',
95
- tags: {
96
- Name: 'externals'
97
- }
98
- });
99
- // Each subnet in VPC are on different AZs, so creating mountpoint to each
100
- const iterator = cdktf_1.TerraformIterator.fromList(subnets.ids);
101
- new efs_mount_target_1.EfsMountTarget(this, 'EfsMountTarget', {
102
- forEach: iterator,
103
- fileSystemId: efs.id,
104
- subnetId: iterator.value
105
- });
106
- new efs_mount_target_1.EfsMountTarget(this, 'ExternalsEfsMountTarget', {
107
- forEach: iterator,
108
- fileSystemId: externalsEfs.id,
109
- subnetId: iterator.value
110
- });
111
- const runnerVolumeName = 'work';
112
- const externalsVolumeName = 'externals';
113
- const runnerContainerDefinitions = [
91
+ const autoscalerContainerDefinition = {
92
+ name: 'autoscaler',
93
+ image: autoscalerImage.stringValue,
94
+ essential: true,
95
+ environment: [
96
+ {
97
+ name: 'PAT',
98
+ value: pat.value,
99
+ },
100
+ {
101
+ name: 'GITHUB_CONFIG_URL',
102
+ value: githubConfigUrl.value,
103
+ },
104
+ {
105
+ name: 'ECS_CLUSTER',
106
+ value: cluster.arn,
107
+ },
108
+ {
109
+ name: 'ECS_SUBNETS',
110
+ value: cdktf_1.Fn.join(',', subnets.ids),
111
+ },
112
+ {
113
+ name: 'ECS_SECURITY_GROUPS',
114
+ value: cdktf_1.Fn.join(',', securityGroups.ids),
115
+ },
116
+ {
117
+ name: 'SCALE_SET_NAME',
118
+ value: 'ecs-runner-set',
119
+ },
120
+ ],
121
+ logConfiguration: {
122
+ logDriver: 'awslogs',
123
+ options: {
124
+ 'awslogs-group': autoscalerLogGroup.name,
125
+ 'awslogs-region': region.name,
126
+ 'awslogs-stream-prefix': 'ecs',
127
+ },
128
+ },
129
+ };
130
+ const runnerVolume = [];
131
+ const runnerContainerDefinition = {
132
+ name: 'runner',
133
+ image: 'ghcr.io/actions/actions-runner:2.323.0',
134
+ essential: true,
135
+ entryPoint: ['/home/runner/run.sh'],
136
+ environment: [
137
+ {
138
+ name: 'ECS_CLUSTER_NAME',
139
+ value: cluster.name,
140
+ },
141
+ {
142
+ name: 'ACTIONS_RUNNER_POD_NAME',
143
+ value: 'gha-pod',
144
+ },
145
+ {
146
+ name: 'ECS_SUBNETS',
147
+ value: cdktf_1.Fn.join(',', subnets.ids),
148
+ },
149
+ {
150
+ name: 'ECS_SECURITY_GROUPS',
151
+ value: cdktf_1.Fn.join(',', securityGroups.ids),
152
+ },
153
+ {
154
+ name: 'ECS_TASK_ROLE',
155
+ value: runnerRole.arn,
156
+ },
157
+ {
158
+ name: 'ECS_EXECUTION_ROLE',
159
+ value: ecsTaskExecutionRole.arn,
160
+ },
161
+ ],
162
+ mountPoints: [],
163
+ logConfiguration: {
164
+ logDriver: 'awslogs',
165
+ options: {
166
+ 'awslogs-group': runnerLogGroup.name,
167
+ 'awslogs-region': region.name,
168
+ 'awslogs-stream-prefix': 'ecs',
169
+ },
170
+ },
171
+ };
172
+ if (props.containerSupport) {
173
+ // EFS volume to allow sharing data between tasks
174
+ const efs = new efs_file_system_1.EfsFileSystem(this, 'efs', {
175
+ throughputMode: 'elastic',
176
+ tags: {
177
+ Name: 'work',
178
+ },
179
+ });
180
+ const externalsEfs = new efs_file_system_1.EfsFileSystem(this, 'externalsEfs', {
181
+ throughputMode: 'elastic',
182
+ tags: {
183
+ Name: 'externals',
184
+ },
185
+ });
186
+ // Each subnet in VPC are on different AZs, so creating mountpoint to each
187
+ const iterator = cdktf_1.TerraformIterator.fromList(subnets.ids);
188
+ new efs_mount_target_1.EfsMountTarget(this, 'EfsMountTarget', {
189
+ forEach: iterator,
190
+ fileSystemId: efs.id,
191
+ subnetId: iterator.value,
192
+ });
193
+ new efs_mount_target_1.EfsMountTarget(this, 'ExternalsEfsMountTarget', {
194
+ forEach: iterator,
195
+ fileSystemId: externalsEfs.id,
196
+ subnetId: iterator.value,
197
+ });
198
+ const runnerVolumeName = 'work';
199
+ const externalsVolumeName = 'externals';
200
+ runnerVolume.push({
201
+ name: runnerVolumeName,
202
+ efsVolumeConfiguration: {
203
+ fileSystemId: efs.id,
204
+ },
205
+ },
206
+ // This doesn't work with same volume, as volume is initially empty so it can't map to it's "externals" directory
114
207
  {
115
- name: 'runner',
116
- image: 'ghcr.io/hi-fi/actions-runner:ecs',
117
- command: ['/bin/sh', '-c', 'export EXECID=$(cat /proc/sys/kernel/random/uuid) && sudo mkdir -p /tmp/_work/$EXECID && sudo chown runner:runner /tmp/_work/$EXECID && ln -s /tmp/_work/$EXECID _work && sudo chown runner:runner /tmp/externals && /home/runner/run.sh ; sudo rm -r /tmp/_work/$EXECID'],
118
- essential: true,
119
- environment: [
120
- {
121
- name: 'EFS_ID',
122
- value: efs.id
123
- },
124
- {
125
- name: 'EXTERNALS_EFS_ID',
126
- value: externalsEfs.id
127
- },
128
- {
129
- name: 'ECS_CLUSTER_NAME',
130
- value: cluster.name
131
- },
132
- {
133
- name: 'ACTIONS_RUNNER_POD_NAME',
134
- value: 'gha-pod'
135
- },
136
- {
137
- name: 'ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER',
138
- value: 'false'
139
- },
140
- {
141
- name: 'ECS_SUBNETS',
142
- value: cdktf_1.Fn.join(',', subnets.ids)
143
- },
144
- {
145
- name: 'ECS_SECURITY_GROUPS',
146
- value: cdktf_1.Fn.join(',', securityGroups.ids)
147
- },
148
- {
149
- name: 'ECS_TASK_ROLE',
150
- value: runnerRole.arn
151
- },
152
- {
153
- name: 'ECS_EXECUTION_ROLE',
154
- value: ecsTaskExecutionRole.arn
155
- }
156
- ],
157
- mountPoints: [
158
- {
159
- sourceVolume: runnerVolumeName,
160
- containerPath: '/tmp/_work',
161
- },
162
- {
163
- sourceVolume: externalsVolumeName,
164
- containerPath: '/tmp/externals',
165
- }
166
- ],
167
- logConfiguration: {
168
- logDriver: 'awslogs',
169
- options: {
170
- "awslogs-group": runnerLogGroup.name,
171
- "awslogs-region": region.name,
172
- "awslogs-stream-prefix": "ecs",
173
- }
174
- }
175
- }
176
- ];
208
+ name: externalsVolumeName,
209
+ efsVolumeConfiguration: {
210
+ fileSystemId: externalsEfs.id,
211
+ },
212
+ });
213
+ runnerContainerDefinition.mountPoints?.push({
214
+ sourceVolume: runnerVolumeName,
215
+ containerPath: '/tmp/_work',
216
+ }, {
217
+ sourceVolume: externalsVolumeName,
218
+ containerPath: '/tmp/externals',
219
+ });
220
+ runnerContainerDefinition.environment?.push({
221
+ name: 'EFS_ID',
222
+ value: efs.id,
223
+ }, {
224
+ name: 'EXTERNALS_EFS_ID',
225
+ value: externalsEfs.id,
226
+ }, {
227
+ name: 'ACTIONS_RUNNER_REQUIRE_JOB_CONTAINER',
228
+ value: 'false',
229
+ });
230
+ runnerContainerDefinition.command = [
231
+ '/bin/sh',
232
+ '-c',
233
+ 'export EXECID=$(cat /proc/sys/kernel/random/uuid) && sudo mkdir -p /tmp/_work/$EXECID && sudo chown runner:runner /tmp/_work/$EXECID && ln -s /tmp/_work/$EXECID _work && sudo chown runner:runner /tmp/externals && /home/runner/run.sh ; sudo rm -r /tmp/_work/$EXECID',
234
+ ];
235
+ runnerContainerDefinition.image = 'ghcr.io/hi-fi/actions-runner:ecs';
236
+ }
177
237
  // TODO: Images through caching: https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache.html (requires authentication)
178
238
  // TODO: Pass Execution role to job task: https://www.ernestchiang.com/en/posts/2021/using-amazon-ecs-exec/#1-grant-permissions-ecs-task-iam-role
179
239
  // TODO: Pass Task role to job task
@@ -181,194 +241,131 @@ class Aws extends constructs_1.Construct {
181
241
  family: 'GHA',
182
242
  taskRoleArn: runnerRole.arn,
183
243
  executionRoleArn: ecsTaskExecutionRole.arn,
184
- containerDefinitions: cdktf_1.Fn.jsonencode(runnerContainerDefinitions),
244
+ containerDefinitions: cdktf_1.Fn.jsonencode([runnerContainerDefinition]),
185
245
  cpu: '1024',
186
246
  memory: '2048',
187
- requiresCompatibilities: [
188
- 'FARGATE'
189
- ],
247
+ requiresCompatibilities: ['FARGATE'],
190
248
  runtimePlatform: {
191
249
  cpuArchitecture: 'X86_64',
192
- operatingSystemFamily: 'LINUX'
250
+ operatingSystemFamily: 'LINUX',
193
251
  },
194
252
  networkMode: 'awsvpc',
195
- volume: [
196
- {
197
- name: runnerVolumeName,
198
- efsVolumeConfiguration: {
199
- fileSystemId: efs.id,
200
- },
201
- },
202
- // This doesn't work with same volume, as volume is initially empty so it can't map to it's "externals" directory
203
- {
204
- name: externalsVolumeName,
205
- efsVolumeConfiguration: {
206
- fileSystemId: externalsEfs.id,
207
- }
208
- }
209
- ]
253
+ volume: runnerVolume,
254
+ });
255
+ autoscalerContainerDefinition.environment?.push({
256
+ name: 'TASK_DEFINITION_ARN',
257
+ value: runnerTaskDefinition.arn,
210
258
  });
211
259
  const autoscalerTaskDefinition = new ecs_task_definition_1.EcsTaskDefinition(this, 'AutoscalerTaskDefinition', {
212
260
  family: 'Autoscaler',
213
261
  taskRoleArn: autoscalerRole.arn,
214
262
  executionRoleArn: ecsTaskExecutionRole.arn,
215
- containerDefinitions: cdktf_1.Fn.jsonencode([
216
- {
217
- name: 'autoscaler',
218
- image: 'ghcr.io/hi-fi/gha-runners-on-managed-env:test',
219
- essential: true,
220
- environment: [
221
- {
222
- name: 'PAT',
223
- value: pat.value
224
- },
225
- {
226
- name: 'GITHUB_CONFIG_URL',
227
- value: githubConfigUrl.value
228
- },
229
- {
230
- name: 'TASK_DEFINITION_ARN',
231
- value: runnerTaskDefinition.arn
232
- },
233
- {
234
- name: 'ECS_CLUSTER',
235
- value: cluster.arn
236
- },
237
- {
238
- name: 'ECS_SUBNETS',
239
- value: cdktf_1.Fn.join(',', subnets.ids)
240
- },
241
- {
242
- name: 'ECS_SECURITY_GROUPS',
243
- value: cdktf_1.Fn.join(',', securityGroups.ids)
244
- },
245
- {
246
- name: 'SCALE_SET_NAME',
247
- value: 'ecs-runner-set'
248
- },
249
- ],
250
- logConfiguration: {
251
- logDriver: 'awslogs',
252
- options: {
253
- "awslogs-group": autoscalerLogGroup.name,
254
- "awslogs-region": region.name,
255
- "awslogs-stream-prefix": "ecs",
256
- }
257
- }
258
- }
259
- ]),
263
+ containerDefinitions: cdktf_1.Fn.jsonencode([autoscalerContainerDefinition]),
260
264
  cpu: '256',
261
265
  memory: '512',
262
- requiresCompatibilities: [
263
- 'FARGATE'
264
- ],
266
+ requiresCompatibilities: ['FARGATE'],
265
267
  runtimePlatform: {
266
268
  cpuArchitecture: 'X86_64',
267
- operatingSystemFamily: 'LINUX'
269
+ operatingSystemFamily: 'LINUX',
268
270
  },
269
271
  networkMode: 'awsvpc',
270
272
  });
273
+ const runnerPolicyDefinition = {
274
+ Version: '2012-10-17',
275
+ Statement: [
276
+ {
277
+ Sid: 'StartandMonitorTask',
278
+ Effect: 'Allow',
279
+ Action: [
280
+ 'ecs:RunTask',
281
+ 'ecs:TagResource',
282
+ 'ecs:ListTaskDefinitions',
283
+ 'ecs:ListTasks',
284
+ 'ecs:StopTask',
285
+ 'ecs:RegisterTaskDefinition',
286
+ 'ecs:DescribeTaskDefinition',
287
+ 'ecs:DeregisterTaskDefinition',
288
+ 'ecs:DeleteTaskDefinitions',
289
+ 'ecs:ExecuteCommand',
290
+ // Needed for waiting
291
+ 'ecs:DescribeTasks',
292
+ 'logs:GetLogEvents',
293
+ 'iam:PassRole',
294
+ 'logs:StartLiveTail',
295
+ 'logs:CreateLogStream',
296
+ ],
297
+ Resource: [
298
+ `arn:aws:ecs:${region.name}:${identity.accountId}:task-definition/gha-pod-workflow:*`,
299
+ cluster.arn,
300
+ // Triggerer has to be allowed to pass both task and task execution role
301
+ ecsTaskExecutionRole.arn,
302
+ runnerRole.arn,
303
+ `arn:aws:ecs:${region.name}:${identity.accountId}:task/${cluster.name}/*`,
304
+ //TODO: reorder rights so that listing is only one with star
305
+ '*',
306
+ ],
307
+ },
308
+ {
309
+ Sid: 'GetVpcInfo',
310
+ Effect: 'Allow',
311
+ Action: ['ec2:DescribeSubnets', 'ec2:DescribeSecurityGroups'],
312
+ Resource: '*',
313
+ },
314
+ {
315
+ Sid: 'ExecCommands',
316
+ Effect: 'Allow',
317
+ Action: [
318
+ 'ssmmessages:CreateControlChannel',
319
+ 'ssmmessages:CreateDataChannel',
320
+ 'ssmmessages:OpenControlChannel',
321
+ 'ssmmessages:OpenDataChannel',
322
+ ],
323
+ Resource: '*',
324
+ },
325
+ ],
326
+ };
271
327
  const runnerPolicy = new iam_policy_1.IamPolicy(this, 'RunnerPolicy', {
272
- policy: cdktf_1.Fn.jsonencode({
273
- 'Version': '2012-10-17',
274
- 'Statement': [
275
- {
276
- 'Sid': 'StartandMonitorTask',
277
- 'Effect': 'Allow',
278
- 'Action': [
279
- 'ecs:RunTask',
280
- 'ecs:TagResource',
281
- 'ecs:ListTaskDefinitions',
282
- 'ecs:ListTasks',
283
- 'ecs:StopTask',
284
- 'ecs:RegisterTaskDefinition',
285
- 'ecs:DescribeTaskDefinition',
286
- 'ecs:DeregisterTaskDefinition',
287
- 'ecs:DeleteTaskDefinitions',
288
- 'ecs:ExecuteCommand',
289
- // Needed for waiting
290
- 'ecs:DescribeTasks',
291
- 'logs:GetLogEvents',
292
- 'iam:PassRole',
293
- 'logs:StartLiveTail',
294
- 'logs:CreateLogStream',
295
- ],
296
- 'Resource': [
297
- `arn:aws:ecs:${region.name}:${identity.accountId}:task-definition/gha-pod-workflow:*`,
298
- cluster.arn,
299
- // Triggerer has to be allowed to pass both task and task execution role
300
- ecsTaskExecutionRole.arn,
301
- runnerRole.arn,
302
- `arn:aws:ecs:${region.name}:${identity.accountId}:task/${cluster.name}/*`,
303
- //TODO: reorder rights so that listing is only one with star
304
- '*'
305
- ]
306
- },
307
- {
308
- 'Sid': 'GetVpcInfo',
309
- 'Effect': 'Allow',
310
- 'Action': [
311
- 'ec2:DescribeSubnets',
312
- 'ec2:DescribeSecurityGroups'
313
- ],
314
- 'Resource': '*'
315
- },
316
- {
317
- 'Sid': 'ExecCommands',
318
- 'Effect': 'Allow',
319
- 'Action': [
320
- 'ssmmessages:CreateControlChannel',
321
- 'ssmmessages:CreateDataChannel',
322
- 'ssmmessages:OpenControlChannel',
323
- 'ssmmessages:OpenDataChannel'
324
- ],
325
- 'Resource': '*'
326
- }
327
- ]
328
- })
328
+ policy: cdktf_1.Fn.jsonencode(runnerPolicyDefinition),
329
329
  });
330
330
  new iam_role_policy_attachment_1.IamRolePolicyAttachment(this, 'RunnerPolicyAttachment', {
331
331
  policyArn: runnerPolicy.arn,
332
- role: runnerRole.name
332
+ role: runnerRole.name,
333
333
  });
334
334
  const autoscalerPolicy = new iam_policy_1.IamPolicy(this, 'AutoscalerPolicy', {
335
335
  policy: cdktf_1.Fn.jsonencode({
336
- 'Version': '2012-10-17',
337
- 'Statement': [
336
+ Version: '2012-10-17',
337
+ Statement: [
338
338
  {
339
- 'Sid': 'StartandMonitorTask',
340
- 'Effect': 'Allow',
341
- 'Action': [
339
+ Sid: 'StartandMonitorTask',
340
+ Effect: 'Allow',
341
+ Action: [
342
342
  'ecs:RunTask',
343
343
  // Needed for waiting
344
344
  'ecs:DescribeTasks',
345
345
  'logs:GetLogEvents',
346
346
  'iam:PassRole',
347
347
  ],
348
- 'Resource': [
348
+ Resource: [
349
349
  `${runnerTaskDefinition.arnWithoutRevision}:*`,
350
350
  // Triggerer has to be allowed to pass both task and task execution role
351
351
  ecsTaskExecutionRole.arn,
352
352
  runnerRole.arn,
353
353
  `arn:aws:ecs:${region.name}:${identity.accountId}:task/${cluster.name}/*`,
354
354
  `${runnerLogGroup.arn}:log-stream:*`,
355
- ]
355
+ ],
356
356
  },
357
357
  {
358
- 'Sid': 'GetVpcInfo',
359
- 'Effect': 'Allow',
360
- 'Action': [
361
- 'ec2:DescribeSubnets',
362
- 'ec2:DescribeSecurityGroups'
363
- ],
364
- 'Resource': '*'
365
- }
366
- ]
367
- })
358
+ Sid: 'GetVpcInfo',
359
+ Effect: 'Allow',
360
+ Action: ['ec2:DescribeSubnets', 'ec2:DescribeSecurityGroups'],
361
+ Resource: '*',
362
+ },
363
+ ],
364
+ }),
368
365
  });
369
366
  new iam_role_policy_attachment_1.IamRolePolicyAttachment(this, 'AutoscalerPolicyAttachment', {
370
367
  policyArn: autoscalerPolicy.arn,
371
- role: autoscalerRole.name
368
+ role: autoscalerRole.name,
372
369
  });
373
370
  new ecs_service_1.EcsService(this, 'AutoscalerService', {
374
371
  cluster: cluster.arn,
@@ -379,17 +376,15 @@ class Aws extends constructs_1.Construct {
379
376
  networkConfiguration: {
380
377
  assignPublicIp: true,
381
378
  subnets: subnets.ids,
382
- securityGroups: securityGroups.ids
379
+ securityGroups: securityGroups.ids,
383
380
  },
384
381
  lifecycle: {
385
- ignoreChanges: [
386
- 'desired_count'
387
- ]
388
- }
382
+ ignoreChanges: ['desired_count'],
383
+ },
389
384
  });
390
385
  }
391
386
  }
392
387
  exports.Aws = Aws;
393
388
  _a = JSII_RTTI_SYMBOL_1;
394
- Aws[_a] = { fqn: "terraform-cdk-serverless-github-actions-runner-controller.Aws", version: "0.0.2" };
395
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9hd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx1RkFBa0Y7QUFDbEYsK0ZBQXlGO0FBQ3pGLDZFQUF3RTtBQUN4RSwrRkFBeUY7QUFDekYsK0VBQTBFO0FBQzFFLHFFQUFpRTtBQUNqRSxxRUFBaUU7QUFDakUscUZBQWdGO0FBQ2hGLG1FQUErRDtBQUMvRCwrREFBMkQ7QUFDM0QsbUdBQTZGO0FBQzdGLCtEQUErRDtBQUMvRCxpQ0FBOEM7QUFDOUMsMkNBQXVDO0FBQ3ZDLDJDQUE4QztBQUM5Qyw2RUFBd0U7QUFFeEUsK0VBQTBFO0FBRTFFLE1BQWEsR0FBSSxTQUFRLHNCQUFTO0lBQzlCLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3BDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxzQkFBVyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFFNUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsSUFBSSxnREFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sTUFBTSxHQUFHLElBQUksK0JBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRXBELE1BQU0sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBQSwyQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZELE1BQU0sT0FBTyxHQUFHLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzVDLElBQUksRUFBRSxvQkFBb0I7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSxrQkFBTyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDL0MsZ0JBQWdCLEVBQUUsVUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDNUIsU0FBUyxF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RSxHQUFHLGNBQWMsQ0FBQyxHQUFHLGVBQWU7eUJBQ3ZDO3FCQUNKO29CQUNEO3dCQUNJLEtBQUssRUFBRSxZQUFZO3dCQUNuQixRQUFRLEVBQUUsT0FBTzt3QkFDakIsUUFBUSxFQUFFOzRCQUNOLHFCQUFxQjs0QkFDckIsNEJBQTRCO3lCQUMvQjt3QkFDRCxVQUFVLEVBQUUsR0FBRztxQkFDbEI7aUJBQ0o7YUFDSixDQUVBO1NBQ0osQ0FBQyxDQUFBO1FBQ0YsSUFBSSxvREFBdUIsQ0FBQyxJQUFJLEVBQUUsNEJBQTRCLEVBQUU7WUFDNUQsU0FBUyxFQUFFLGdCQUFnQixDQUFDLEdBQUc7WUFDL0IsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJO1NBQzVCLENBQUMsQ0FBQTtRQUVGLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUU7WUFDdEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ3BCLElBQUksRUFBRSxvQkFBb0I7WUFDMUIsWUFBWSxFQUFFLENBQUM7WUFDZixVQUFVLEVBQUUsU0FBUztZQUNyQixjQUFjLEVBQUUsd0JBQXdCLENBQUMsa0JBQWtCO1lBQzNELG9CQUFvQixFQUFFO2dCQUNsQixjQUFjLEVBQUUsSUFBSTtnQkFDcEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNwQixjQUFjLEVBQUUsY0FBYyxDQUFDLEdBQUc7YUFDckM7WUFDRCxTQUFTLEVBQUU7Z0JBQ1AsYUFBYSxFQUFFO29CQUNYLGVBQWU7aUJBQ2xCO2FBQ0o7U0FDSixDQUFDLENBQUE7SUFDTixDQUFDOztBQTVZTCxrQkE2WUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbG91ZHdhdGNoTG9nR3JvdXAgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9jbG91ZHdhdGNoLWxvZy1ncm91cCc7XG5pbXBvcnQgeyBEYXRhQXdzQ2FsbGVySWRlbnRpdHkgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9kYXRhLWF3cy1jYWxsZXItaWRlbnRpdHknO1xuaW1wb3J0IHsgRGF0YUF3c1JlZ2lvbiB9IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2RhdGEtYXdzLXJlZ2lvbic7XG5pbXBvcnQgeyBEYXRhQXdzU2VjdXJpdHlHcm91cHMgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9kYXRhLWF3cy1zZWN1cml0eS1ncm91cHMnO1xuaW1wb3J0IHsgRGF0YUF3c1N1Ym5ldHMgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9kYXRhLWF3cy1zdWJuZXRzJztcbmltcG9ydCB7IEVjc0NsdXN0ZXIgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lY3MtY2x1c3Rlcic7XG5pbXBvcnQgeyBFY3NTZXJ2aWNlIH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvZWNzLXNlcnZpY2UnO1xuaW1wb3J0IHsgRWNzVGFza0RlZmluaXRpb24gfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lY3MtdGFzay1kZWZpbml0aW9uJztcbmltcG9ydCB7IElhbVBvbGljeSB9IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2lhbS1wb2xpY3knO1xuaW1wb3J0IHsgSWFtUm9sZSB9IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2lhbS1yb2xlJztcbmltcG9ydCB7IElhbVJvbGVQb2xpY3lBdHRhY2htZW50IH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvaWFtLXJvbGUtcG9saWN5LWF0dGFjaG1lbnQnO1xuaW1wb3J0IHsgQXdzUHJvdmlkZXIgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9wcm92aWRlcic7XG5pbXBvcnQgeyBGbiwgVGVycmFmb3JtSXRlcmF0b3IgfSBmcm9tICdjZGt0Zic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGNvbW1vblZhcmlhYmxlcyB9IGZyb20gJy4vdmFyaWFibGVzJztcbmltcG9ydCB7IEVmc0ZpbGVTeXN0ZW0gfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lZnMtZmlsZS1zeXN0ZW0nO1xuaW1wb3J0IHsgdHlwZSBDb250YWluZXJEZWZpbml0aW9uIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjcydcbmltcG9ydCB7IEVmc01vdW50VGFyZ2V0IH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvZWZzLW1vdW50LXRhcmdldCc7XG5cbmV4cG9ydCBjbGFzcyBBd3MgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgICAgICBuZXcgQXdzUHJvdmlkZXIodGhpcywgJ2F3cycsIHtcblxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IG5ldyBEYXRhQXdzQ2FsbGVySWRlbnRpdHkodGhpcywgJ0lkZW50aXR5Jywge30pO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBEYXRhQXdzUmVnaW9uKHRoaXMsICdSZWdpb24nLCB7fSlcblxuICAgICAgICBjb25zdCB7IHBhdCwgZ2l0aHViQ29uZmlnVXJsIH0gPSBjb21tb25WYXJpYWJsZXModGhpcyk7XG5cbiAgICAgICAgY29uc3QgY2x1c3RlciA9IG5ldyBFY3NDbHVzdGVyKHRoaXMsICdDbHVzdGVyJywge1xuICAgICAgICAgICAgbmFtZTogJ2doYS1ydW5uZXItY2x1c3RlcicsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJ1bm5lclJvbGUgPSBuZXcgSWFtUm9sZSh0aGlzLCAnUnVubmVyUm9sZScsIHtcbiAgICAgICAgICAgIGFzc3VtZVJvbGVQb2xpY3k6IEZuLmpzb25lbmNvZGUoe1xuICAgICAgICAgICAgICAgICdWZXJzaW9uJzogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgICAgICdTdGF0ZW1lbnQnOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdFZmZlY3QnOiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaW5jaXBhbCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmljZSc6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uJzogJ3N0czpBc3N1bWVSb2xlJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBhdXRvc2NhbGVyUm9sZSA9IG5ldyBJYW1Sb2xlKHRoaXMsICdBdXRvc2NhbGVyUm9sZScsIHtcbiAgICAgICAgICAgIGFzc3VtZVJvbGVQb2xpY3k6IEZuLmpzb25lbmNvZGUoe1xuICAgICAgICAgICAgICAgICdWZXJzaW9uJzogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgICAgICdTdGF0ZW1lbnQnOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdFZmZlY3QnOiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaW5jaXBhbCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmljZSc6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uJzogJ3N0czpBc3N1bWVSb2xlJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBlY3NUYXNrRXhlY3V0aW9uUm9sZSA9IG5ldyBJYW1Sb2xlKHRoaXMsICdUYXNrRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgICAgICAgIGFzc3VtZVJvbGVQb2xpY3k6IEZuLmpzb25lbmNvZGUoe1xuICAgICAgICAgICAgICAgICdWZXJzaW9uJzogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgICAgICdTdGF0ZW1lbnQnOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdFZmZlY3QnOiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1ByaW5jaXBhbCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2VydmljZSc6ICdlY3MtdGFza3MuYW1hem9uYXdzLmNvbSdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uJzogJ3N0czpBc3N1bWVSb2xlJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYW5hZ2VkUG9saWN5QXJuczogW1xuICAgICAgICAgICAgICAgICdhcm46YXdzOmlhbTo6YXdzOnBvbGljeS9zZXJ2aWNlLXJvbGUvQW1hem9uRUNTVGFza0V4ZWN1dGlvblJvbGVQb2xpY3knXG4gICAgICAgICAgICBdXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgcnVubmVyTG9nR3JvdXAgPSBuZXcgQ2xvdWR3YXRjaExvZ0dyb3VwKHRoaXMsICdSdW5uZXJMb2dHcm91cCcsIHtcbiAgICAgICAgICAgIG5hbWU6ICcvZWNzL0dIQScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGF1dG9zY2FsZXJMb2dHcm91cCA9IG5ldyBDbG91ZHdhdGNoTG9nR3JvdXAodGhpcywgJ0F1dG9zY2FsZXJMb2dHcm91cCcsIHtcbiAgICAgICAgICAgIG5hbWU6ICcvZWNzL0F1dG9zY2FsZXInLFxuICAgICAgICB9KTtcblxuXG4gICAgICAgIGNvbnN0IHN1Ym5ldHMgPSBuZXcgRGF0YUF3c1N1Ym5ldHModGhpcywgJ1N1Ym5ldHMnLCB7fSk7XG5cbiAgICAgICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSBuZXcgRGF0YUF3c1NlY3VyaXR5R3JvdXBzKHRoaXMsICdTZWN1cml0eUdyb3VwcycpO1xuXG4gICAgICAgIC8vIEVGUyB2b2x1bWUgdG8gYWxsb3cgc2hhcmluZyBkYXRhIGJldHdlZW4gdGFza3NcbiAgICAgICAgY29uc3QgZWZzID0gbmV3IEVmc0ZpbGVTeXN0ZW0odGhpcywgJ2VmcycsIHtcbiAgICAgICAgICAgIHRocm91Z2hwdXRNb2RlOiAnZWxhc3RpYycsXG4gICAgICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgICAgICAgTmFtZTogJ3dvcmsnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZXh0ZXJuYWxzRWZzID0gbmV3IEVmc0ZpbGVTeXN0ZW0odGhpcywgJ2V4dGVybmFsc0VmcycsIHtcbiAgICAgICAgICAgIHRocm91Z2hwdXRNb2RlOiAnZWxhc3RpYycsXG4gICAgICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgICAgICAgTmFtZTogJ2V4dGVybmFscydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvLyBFYWNoIHN1Ym5ldCBpbiBWUEMgYXJlIG9uIGRpZmZlcmVudCBBWnMsIHNvIGNyZWF0aW5nIG1vdW50cG9pbnQgdG8gZWFjaFxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IFRlcnJhZm9ybUl0ZXJhdG9yLmZyb21MaXN0KHN1Ym5ldHMuaWRzKVxuXG4gICAgICAgIG5ldyBFZnNNb3VudFRhcmdldCh0aGlzLCAnRWZzTW91bnRUYXJnZXQnLCB7XG4gICAgICAgICAgICBmb3JFYWNoOiBpdGVyYXRvcixcbiAgICAgICAgICAgIGZpbGVTeXN0ZW1JZDogZWZzLmlkLFxuICAgICAgICAgICAgc3VibmV0SWQ6IGl0ZXJhdG9yLnZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBFZnNNb3VudFRhcmdldCh0aGlzLCAnRXh0ZXJuYWxzRWZzTW91bnRUYXJnZXQnLCB7XG4gICAgICAgICAgICBmb3JFYWNoOiBpdGVyYXRvcixcbiAgICAgICAgICAgIGZpbGVTeXN0ZW1JZDogZXh0ZXJuYWxzRWZzLmlkLFxuICAgICAgICAgICAgc3VibmV0SWQ6IGl0ZXJhdG9yLnZhbHVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJ1bm5lclZvbHVtZU5hbWUgPSAnd29yayc7XG4gICAgICAgIGNvbnN0IGV4dGVybmFsc1ZvbHVtZU5hbWUgPSAnZXh0ZXJuYWxzJztcbiAgICAgICAgY29uc3QgcnVubmVyQ29udGFpbmVyRGVmaW5pdGlvbnM6IENvbnRhaW5lckRlZmluaXRpb25bXSA9IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdydW5uZXInLFxuICAgICAgICAgICAgaW1hZ2U6ICdnaGNyLmlvL2hpLWZpL2FjdGlvbnMtcnVubmVyOmVjcycsXG4gICAgICAgICAgICBjb21tYW5kOiBbJy9iaW4vc2gnLCAnLWMnLCAnZXhwb3J0IEVYRUNJRD0kKGNhdCAvcHJvYy9zeXMva2VybmVsL3JhbmRvbS91dWlkKSAmJiBzdWRvIG1rZGlyIC1wIC90bXAvX3dvcmsvJEVYRUNJRCAmJiBzdWRvIGNob3duIHJ1bm5lcjpydW5uZXIgL3RtcC9fd29yay8kRVhFQ0lEICYmIGxuIC1zIC90bXAvX3dvcmsvJEVYRUNJRCBfd29yayAmJiBzdWRvIGNob3duIHJ1bm5lcjpydW5uZXIgL3RtcC9leHRlcm5hbHMgJiYgL2hvbWUvcnVubmVyL3J1bi5zaCA7IHN1ZG8gcm0gLXIgL3RtcC9fd29yay8kRVhFQ0lEJ10sXG4gICAgICAgICAgICBlc3NlbnRpYWw6IHRydWUsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0VGU19JRCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlZnMuaWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0VYVEVSTkFMU19FRlNfSUQnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXh0ZXJuYWxzRWZzLmlkXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdFQ1NfQ0xVU1RFUl9OQU1FJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNsdXN0ZXIubmFtZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQUNUSU9OU19SVU5ORVJfUE9EX05BTUUnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2doYS1wb2QnXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBQ1RJT05TX1JVTk5FUl9SRVFVSVJFX0pPQl9DT05UQUlORVInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2ZhbHNlJ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRUNTX1NVQk5FVFMnLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRm4uam9pbignLCcsIHN1Ym5ldHMuaWRzKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRUNTX1NFQ1VSSVRZX0dST1VQUycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBGbi5qb2luKCcsJywgc2VjdXJpdHlHcm91cHMuaWRzKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRUNTX1RBU0tfUk9MRScsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBydW5uZXJSb2xlLmFyblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRUNTX0VYRUNVVElPTl9ST0xFJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVjc1Rhc2tFeGVjdXRpb25Sb2xlLmFyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBtb3VudFBvaW50czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlVm9sdW1lOiBydW5uZXJWb2x1bWVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJQYXRoOiAnL3RtcC9fd29yaycsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZVZvbHVtZTogZXh0ZXJuYWxzVm9sdW1lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUGF0aDogJy90bXAvZXh0ZXJuYWxzJyxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbG9nQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIGxvZ0RyaXZlcjogJ2F3c2xvZ3MnLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhd3Nsb2dzLWdyb3VwXCI6IHJ1bm5lckxvZ0dyb3VwLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIFwiYXdzbG9ncy1yZWdpb25cIjogcmVnaW9uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIFwiYXdzbG9ncy1zdHJlYW0tcHJlZml4XCI6IFwiZWNzXCIsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XVxuICAgICAgICAvLyBUT0RPOiBJbWFnZXMgdGhyb3VnaCBjYWNoaW5nOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNSL2xhdGVzdC91c2VyZ3VpZGUvcHVsbC10aHJvdWdoLWNhY2hlLmh0bWwgKHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uKVxuICAgICAgICAvLyBUT0RPOiBQYXNzIEV4ZWN1dGlvbiByb2xlIHRvIGpvYiB0YXNrOiBodHRwczovL3d3dy5lcm5lc3RjaGlhbmcuY29tL2VuL3Bvc3RzLzIwMjEvdXNpbmctYW1hem9uLWVjcy1leGVjLyMxLWdyYW50LXBlcm1pc3Npb25zLWVjcy10YXNrLWlhbS1yb2xlXG4gICAgICAgIC8vIFRPRE86IFBhc3MgVGFzayByb2xlIHRvIGpvYiB0YXNrXG4gICAgICAgIGNvbnN0IHJ1bm5lclRhc2tEZWZpbml0aW9uID0gbmV3IEVjc1Rhc2tEZWZpbml0aW9uKHRoaXMsICdSdW5uZXJUYXNrRGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgIGZhbWlseTogJ0dIQScsXG4gICAgICAgICAgICB0YXNrUm9sZUFybjogcnVubmVyUm9sZS5hcm4sXG4gICAgICAgICAgICBleGVjdXRpb25Sb2xlQXJuOiBlY3NUYXNrRXhlY3V0aW9uUm9sZS5hcm4sXG4gICAgICAgICAgICBjb250YWluZXJEZWZpbml0aW9uczogRm4uanNvbmVuY29kZShydW5uZXJDb250YWluZXJEZWZpbml0aW9ucyksXG4gICAgICAgICAgICBjcHU6ICcxMDI0JyxcbiAgICAgICAgICAgIG1lbW9yeTogJzIwNDgnLFxuICAgICAgICAgICAgcmVxdWlyZXNDb21wYXRpYmlsaXRpZXM6IFtcbiAgICAgICAgICAgICAgICAnRkFSR0FURSdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6ICdYODZfNjQnLFxuICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbUZhbWlseTogJ0xJTlVYJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldHdvcmtNb2RlOiAnYXdzdnBjJyxcbiAgICAgICAgICAgIHZvbHVtZTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogcnVubmVyVm9sdW1lTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZWZzVm9sdW1lQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVN5c3RlbUlkOiBlZnMuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGRvZXNuJ3Qgd29yayB3aXRoIHNhbWUgdm9sdW1lLCBhcyB2b2x1bWUgaXMgaW5pdGlhbGx5IGVtcHR5IHNvIGl0IGNhbid0IG1hcCB0byBpdCdzIFwiZXh0ZXJuYWxzXCIgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBleHRlcm5hbHNWb2x1bWVOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlZnNWb2x1bWVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3lzdGVtSWQ6IGV4dGVybmFsc0Vmcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBhdXRvc2NhbGVyVGFza0RlZmluaXRpb24gPSBuZXcgRWNzVGFza0RlZmluaXRpb24odGhpcywgJ0F1dG9zY2FsZXJUYXNrRGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgIGZhbWlseTogJ0F1dG9zY2FsZXInLFxuICAgICAgICAgICAgdGFza1JvbGVBcm46IGF1dG9zY2FsZXJSb2xlLmFybixcbiAgICAgICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IGVjc1Rhc2tFeGVjdXRpb25Sb2xlLmFybixcbiAgICAgICAgICAgIGNvbnRhaW5lckRlZmluaXRpb25zOiBGbi5qc29uZW5jb2RlKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdXRvc2NhbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2U6ICdnaGNyLmlvL2hpLWZpL2doYS1ydW5uZXJzLW9uLW1hbmFnZWQtZW52OnRlc3QnLFxuICAgICAgICAgICAgICAgICAgICBlc3NlbnRpYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50OiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1BBVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhdC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnR0lUSFVCX0NPTkZJR19VUkwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnaXRodWJDb25maWdVcmwudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1RBU0tfREVGSU5JVElPTl9BUk4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBydW5uZXJUYXNrRGVmaW5pdGlvbi5hcm5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0VDU19DTFVTVEVSJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2x1c3Rlci5hcm5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0VDU19TVUJORVRTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRm4uam9pbignLCcsIHN1Ym5ldHMuaWRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRUNTX1NFQ1VSSVRZX0dST1VQUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEZuLmpvaW4oJywnLCBzZWN1cml0eUdyb3Vwcy5pZHMpXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTQ0FMRV9TRVRfTkFNRScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdlY3MtcnVubmVyLXNldCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIGxvZ0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RyaXZlcjogJ2F3c2xvZ3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXdzbG9ncy1ncm91cFwiOiBhdXRvc2NhbGVyTG9nR3JvdXAubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImF3c2xvZ3MtcmVnaW9uXCI6IHJlZ2lvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYXdzbG9ncy1zdHJlYW0tcHJlZml4XCI6IFwiZWNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIGNwdTogJzI1NicsXG4gICAgICAgICAgICBtZW1vcnk6ICc1MTInLFxuICAgICAgICAgICAgcmVxdWlyZXNDb21wYXRpYmlsaXRpZXM6IFtcbiAgICAgICAgICAgICAgICAnRkFSR0FURSdcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICAgICAgICBjcHVBcmNoaXRlY3R1cmU6ICdYODZfNjQnLFxuICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbUZhbWlseTogJ0xJTlVYJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldHdvcmtNb2RlOiAnYXdzdnBjJyxcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBydW5uZXJQb2xpY3kgPSBuZXcgSWFtUG9saWN5KHRoaXMsICdSdW5uZXJQb2xpY3knLCB7XG4gICAgICAgICAgICBwb2xpY3k6IEZuLmpzb25lbmNvZGUoe1xuICAgICAgICAgICAgICAgICdWZXJzaW9uJzogJzIwMTItMTAtMTcnLFxuICAgICAgICAgICAgICAgICdTdGF0ZW1lbnQnOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTaWQnOiAnU3RhcnRhbmRNb25pdG9yVGFzaycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnRWZmZWN0JzogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb24nOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VjczpSdW5UYXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOlRhZ1Jlc291cmNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOkxpc3RUYXNrRGVmaW5pdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlY3M6TGlzdFRhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOlN0b3BUYXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOlJlZ2lzdGVyVGFza0RlZmluaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlY3M6RGVzY3JpYmVUYXNrRGVmaW5pdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VjczpEZXJlZ2lzdGVyVGFza0RlZmluaXRpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlY3M6RGVsZXRlVGFza0RlZmluaXRpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOkV4ZWN1dGVDb21tYW5kJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWVkZWQgZm9yIHdhaXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOkRlc2NyaWJlVGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dzOkdldExvZ0V2ZW50cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ3M6U3RhcnRMaXZlVGFpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ3M6Q3JlYXRlTG9nU3RyZWFtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2UnOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFybjphd3M6ZWNzOiR7cmVnaW9uLm5hbWV9OiR7aWRlbnRpdHkuYWNjb3VudElkfTp0YXNrLWRlZmluaXRpb24vZ2hhLXBvZC13b3JrZmxvdzoqYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmFybixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyZXIgaGFzIHRvIGJlIGFsbG93ZWQgdG8gcGFzcyBib3RoIHRhc2sgYW5kIHRhc2sgZXhlY3V0aW9uIHJvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY3NUYXNrRXhlY3V0aW9uUm9sZS5hcm4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmVyUm9sZS5hcm4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFybjphd3M6ZWNzOiR7cmVnaW9uLm5hbWV9OiR7aWRlbnRpdHkuYWNjb3VudElkfTp0YXNrLyR7Y2x1c3Rlci5uYW1lfS8qYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IHJlb3JkZXIgcmlnaHRzIHNvIHRoYXQgbGlzdGluZyBpcyBvbmx5IG9uZSB3aXRoIHN0YXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKidcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZCc6ICdHZXRWcGNJbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdFZmZlY3QnOiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbic6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWMyOkRlc2NyaWJlU3VibmV0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdSZXNvdXJjZSc6ICcqJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnU2lkJzogJ0V4ZWNDb21tYW5kcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnRWZmZWN0JzogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb24nOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3NtbWVzc2FnZXM6Q3JlYXRlRGF0YUNoYW5uZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzc21tZXNzYWdlczpPcGVuQ29udHJvbENoYW5uZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWwnXG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc291cmNlJzogJyonXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcblxuICAgICAgICBuZXcgSWFtUm9sZVBvbGljeUF0dGFjaG1lbnQodGhpcywgJ1J1bm5lclBvbGljeUF0dGFjaG1lbnQnLCB7XG4gICAgICAgICAgICBwb2xpY3lBcm46IHJ1bm5lclBvbGljeS5hcm4sXG4gICAgICAgICAgICByb2xlOiBydW5uZXJSb2xlLm5hbWVcbiAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBhdXRvc2NhbGVyUG9saWN5ID0gbmV3IElhbVBvbGljeSh0aGlzLCAnQXV0b3NjYWxlclBvbGljeScsIHtcbiAgICAgICAgICAgIHBvbGljeTogRm4uanNvbmVuY29kZSh7XG4gICAgICAgICAgICAgICAgJ1ZlcnNpb24nOiAnMjAxMi0xMC0xNycsXG4gICAgICAgICAgICAgICAgJ1N0YXRlbWVudCc6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZCc6ICdTdGFydGFuZE1vbml0b3JUYXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdFZmZlY3QnOiAnQWxsb3cnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbic6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWNzOlJ1blRhc2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWRlZCBmb3Igd2FpdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlY3M6RGVzY3JpYmVUYXNrcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ3M6R2V0TG9nRXZlbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWFtOlBhc3NSb2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2UnOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cnVubmVyVGFza0RlZmluaXRpb24uYXJuV2l0aG91dFJldmlzaW9ufToqYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyZXIgaGFzIHRvIGJlIGFsbG93ZWQgdG8gcGFzcyBib3RoIHRhc2sgYW5kIHRhc2sgZXhlY3V0aW9uIHJvbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY3NUYXNrRXhlY3V0aW9uUm9sZS5hcm4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVubmVyUm9sZS5hcm4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFybjphd3M6ZWNzOiR7cmVnaW9uLm5hbWV9OiR7aWRlbnRpdHkuYWNjb3VudElkfTp0YXNrLyR7Y2x1c3Rlci5uYW1lfS8qYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtydW5uZXJMb2dHcm91cC5hcm59OmxvZy1zdHJlYW06KmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTaWQnOiAnR2V0VnBjSW5mbycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnRWZmZWN0JzogJ0FsbG93JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb24nOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VjMjpEZXNjcmliZVN1Ym5ldHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYzI6RGVzY3JpYmVTZWN1cml0eUdyb3VwcydcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2UnOiAnKidcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgICBuZXcgSWFtUm9sZVBvbGljeUF0dGFjaG1lbnQodGhpcywgJ0F1dG9zY2FsZXJQb2xpY3lBdHRhY2htZW50Jywge1xuICAgICAgICAgICAgcG9saWN5QXJuOiBhdXRvc2NhbGVyUG9saWN5LmFybixcbiAgICAgICAgICAgIHJvbGU6IGF1dG9zY2FsZXJSb2xlLm5hbWVcbiAgICAgICAgfSlcblxuICAgICAgICBuZXcgRWNzU2VydmljZSh0aGlzLCAnQXV0b3NjYWxlclNlcnZpY2UnLCB7XG4gICAgICAgICAgICBjbHVzdGVyOiBjbHVzdGVyLmFybixcbiAgICAgICAgICAgIG5hbWU6ICdhdXRvc2NhbGVyLXNlcnZpY2UnLFxuICAgICAgICAgICAgZGVzaXJlZENvdW50OiAxLFxuICAgICAgICAgICAgbGF1bmNoVHlwZTogJ0ZBUkdBVEUnLFxuICAgICAgICAgICAgdGFza0RlZmluaXRpb246IGF1dG9zY2FsZXJUYXNrRGVmaW5pdGlvbi5hcm5XaXRob3V0UmV2aXNpb24sXG4gICAgICAgICAgICBuZXR3b3JrQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgICAgIGFzc2lnblB1YmxpY0lwOiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1Ym5ldHM6IHN1Ym5ldHMuaWRzLFxuICAgICAgICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBzZWN1cml0eUdyb3Vwcy5pZHNcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsaWZlY3ljbGU6IHtcbiAgICAgICAgICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICdkZXNpcmVkX2NvdW50J1xuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
389
+ Aws[_a] = { fqn: "terraform-cdk-serverless-github-actions-runner-controller.Aws", version: "0.0.4" };
390
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9hd3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx1RkFBaUY7QUFDakYsK0ZBQXdGO0FBQ3hGLDZFQUF1RTtBQUN2RSwrRkFHeUQ7QUFDekQsK0VBR2lEO0FBQ2pELHFFQUFnRTtBQUNoRSxxRUFBZ0U7QUFDaEUscUZBR29EO0FBQ3BELDZFQUF1RTtBQUN2RSwrRUFBeUU7QUFDekUsbUVBQThEO0FBQzlELCtEQUEwRDtBQUMxRCxtR0FBNEY7QUFDNUYsK0RBQThEO0FBQzlELGlDQUEwRDtBQUMxRCwyQ0FBc0M7QUFDdEMsMkNBQTZDO0FBaUI3QyxNQUFhLEdBQUksU0FBUSxzQkFBUztJQUNoQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLHNCQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLGdEQUFxQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSwrQkFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFcEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBQSwyQkFBZSxFQUFDLElBQUksQ0FBQyxDQUFBO1FBRXZFLE1BQU0sT0FBTyxHQUFHLElBQUksd0JBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzlDLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVztTQUN4QixDQUFDLENBQUE7UUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLGlDQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUNsRCxNQUFNLEVBQUUsS0FBSyxD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RSxtQkFBbUIsRUFBRTtZQUN4QyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDcEIsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixZQUFZLEVBQUUsQ0FBQztZQUNmLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLGNBQWMsRUFBRSx3QkFBd0IsQ0FBQyxrQkFBa0I7WUFDM0Qsb0JBQW9CLEVBQUU7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2dCQUNwQixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ3BCLGNBQWMsRUFBRSxjQUFjLENBQUMsR0FBRzthQUNuQztZQUNELFNBQVMsRUFBRTtnQkFDVCxhQUFhLEVBQUUsQ0FBQyxlQUFlLENBQUM7YUFDakM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDOztBQWxhSCxrQkFtYUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbnRhaW5lckRlZmluaXRpb24gfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNzJ1xuaW1wb3J0IHsgQ2xvdWR3YXRjaExvZ0dyb3VwIH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvY2xvdWR3YXRjaC1sb2ctZ3JvdXAnXG5pbXBvcnQgeyBEYXRhQXdzQ2FsbGVySWRlbnRpdHkgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9kYXRhLWF3cy1jYWxsZXItaWRlbnRpdHknXG5pbXBvcnQgeyBEYXRhQXdzUmVnaW9uIH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvZGF0YS1hd3MtcmVnaW9uJ1xuaW1wb3J0IHtcbiAgRGF0YUF3c1NlY3VyaXR5R3JvdXBzLFxuICBEYXRhQXdzU2VjdXJpdHlHcm91cHNGaWx0ZXIsXG59IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2RhdGEtYXdzLXNlY3VyaXR5LWdyb3VwcydcbmltcG9ydCB7XG4gIERhdGFBd3NTdWJuZXRzLFxuICBEYXRhQXdzU3VibmV0c0ZpbHRlcixcbn0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvZGF0YS1hd3Mtc3VibmV0cydcbmltcG9ydCB7IEVjc0NsdXN0ZXIgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lY3MtY2x1c3RlcidcbmltcG9ydCB7IEVjc1NlcnZpY2UgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lY3Mtc2VydmljZSdcbmltcG9ydCB7XG4gIEVjc1Rhc2tEZWZpbml0aW9uLFxuICBFY3NUYXNrRGVmaW5pdGlvblZvbHVtZSxcbn0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvZWNzLXRhc2stZGVmaW5pdGlvbidcbmltcG9ydCB7IEVmc0ZpbGVTeXN0ZW0gfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9lZnMtZmlsZS1zeXN0ZW0nXG5pbXBvcnQgeyBFZnNNb3VudFRhcmdldCB9IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2Vmcy1tb3VudC10YXJnZXQnXG5pbXBvcnQgeyBJYW1Qb2xpY3kgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9pYW0tcG9saWN5J1xuaW1wb3J0IHsgSWFtUm9sZSB9IGZyb20gJ0BjZGt0Zi9wcm92aWRlci1hd3MvbGliL2lhbS1yb2xlJ1xuaW1wb3J0IHsgSWFtUm9sZVBvbGljeUF0dGFjaG1lbnQgfSBmcm9tICdAY2RrdGYvcHJvdmlkZXItYXdzL2xpYi9pYW0tcm9sZS1wb2xpY3ktYXR0YWNobWVudCdcbmltcG9ydCB7IEF3c1Byb3ZpZGVyIH0gZnJvbSAnQGNka3RmL3Byb3ZpZGVyLWF3cy9saWIvcHJvdmlkZXInXG5pbXBvcnQgeyBGbiwgSVJlc29sdmFibGUsIFRlcnJhZm9ybUl0ZXJhdG9yIH0gZnJvbSAnY2RrdGYnXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJ1xuaW1wb3J0IHsgY29tbW9uVmFyaWFibGVzIH0gZnJvbSAnLi92YXJpYWJsZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUHJvcHMge1xuICAvLyBOYW1lIG9mIHRoZSBFQ1MgY2x1c3RlciB0byBjcmVhdGUgYW5kIHVzZS5cbiAgcmVhZG9ubHkgY2x1c3Rlck5hbWU6IHN0cmluZ1xuICAvLyBVdGlsaXplIHJ1bm5lci1jb250YWluZXItaG9va3MgdG8gYWxsb3cgc3VwcG9ydCBmb3Igc2VydmljZSBhbmQgYnVpbGQgY29udGFpbmVyIGFzIHdlbGwgYXMgY29udGFpbmVyIGFjdGlvbnMgYW5kIHN0ZXBzLlxuICByZWFkb25seSBjb250YWluZXJTdXBwb3J0OiBib29sZWFuXG4gIC8qKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NFQzIvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVTdWJuZXRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym5ldEZpbHRlcnM/OiBEYXRhQXdzU3VibmV0c0ZpbHRlcltdIHwgSVJlc29sdmFibGVcbiAgLyoqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2NsaS9sYXRlc3QvcmVmZXJlbmNlL2VjMi9kZXNjcmliZS1zZWN1cml0eS1ncm91cHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cEZpbHRlcnM/OiBEYXRhQXdzU2VjdXJpdHlHcm91cHNGaWx0ZXJbXSB8IElSZXNvbHZhYmxlXG59XG5cbmV4cG9ydCBjbGFzcyBBd3MgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXdzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBuZXcgQXdzUHJvdmlkZXIodGhpcywgJ2F3cycsIHt9KVxuXG4gICAgY29uc3QgaWRlbnRpdHkgPSBuZXcgRGF0YUF3c0NhbGxlcklkZW50aXR5KHRoaXMsICdJZGVudGl0eScsIHt9KVxuXG4gICAgY29uc3QgcmVnaW9uID0gbmV3IERhdGFBd3NSZWdpb24odGhpcywgJ1JlZ2lvbicsIHt9KVxuXG4gICAgY29uc3QgeyBwYXQsIGdpdGh1YkNvbmZpZ1VybCwgYXV0b3NjYWxlckltYWdlIH0gPSBjb21tb25WYXJpYWJsZXModGhpcylcblxuICAgIGNvbnN0IGNsdXN0ZXIgPSBuZXcgRWNzQ2x1c3Rlcih0aGlzLCAnQ2x1c3RlcicsIHtcbiAgICAgIG5hbWU6IHByb3BzLmNsdXN0ZXJOYW1lLFxuICAgIH0pXG5cbiAgICBjb25zdCBzdWJuZXRzID0gbmV3IERhdGFBd3NTdWJuZXRzKHRoaXMsICdTdWJuZXRzJywge1xuICAgICAgZmlsdGVyOiBwcm9wcy5zdWJuZXRGaWx0ZXJzLFxuICAgIH0pXG5cbiAgICBjb25zdCBzZWN1cml0eUdyb3VwcyA9IG5ldyBEYXRhQXdzU2VjdXJpdHlHcm91cHModGhpcywgJ1NlY3VyaXR5R3JvdXBzJywge1xuICAgICAgZmlsdGVyOiBwcm9wcy5zZWN1cml0eUdyb3VwRmlsdGVycyxcbiAgICB9KVxuXG4gICAgY29uc3QgYXV0b3NjYWxlclJvbGUgPSBuZXcgSWFtUm9sZSh0aGlzLCAnQXV0b3NjYWxlclJvbGUnLCB7XG4gICAgICBhc3N1bWVSb2xlUG9saWN5OiBGbi5qc29uZW5jb2RlKHtcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ2Vjcy10YXNrcy5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pXG5cbiAgICBjb25zdCBydW5uZXJSb2xlID0gbmV3IElhbVJvbGUodGhpcywgJ1J1bm5lclJvbGUnLCB7XG4gICAgICBhc3N1bWVSb2xlUG9saWN5OiBGbi5qc29uZW5jb2RlKHtcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ2Vjcy10YXNrcy5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pXG5cbiAgICBjb25zdCBlY3NUYXNrRXhlY3V0aW9uUm9sZSA9IG5ldyBJYW1Sb2xlKHRoaXMsICdUYXNrRXhlY3V0aW9uUm9sZScsIHtcbiAgICAgIGFzc3VtZVJvbGVQb2xpY3k6IEZuLmpzb25lbmNvZGUoe1xuICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIFByaW5jaXBhbDoge1xuICAgICAgICAgICAgICBTZXJ2aWNlOiAnZWNzLXRhc2tzLmFtYXpvbmF3cy5jb20nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIEFjdGlvbjogJ3N0czpBc3N1bWVSb2xlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSlcblxuICAgIG5ldyBJYW1Sb2xlUG9saWN5QXR0YWNobWVudCh0aGlzLCAnVGVza0V4ZWN1dGlvblJvbGVBdHRhY2htZW50Jywge1xuICAgICAgcG9saWN5QXJuOlxuICAgICAgICAnYXJuOmF3czppYW06OmF3czpwb2xpY3kvc2VydmljZS1yb2xlL0FtYXpvbkVDU1Rhc2tFeGVjdXRpb25Sb2xlUG9saWN5JyxcbiAgICAgIHJvbGU6IGVjc1Rhc2tFeGVjdXRpb25Sb2xlLm5hbWUsXG4gICAgfSlcblxuICAgIGNvbnN0IHJ1bm5lckxvZ0dyb3VwID0gbmV3IENsb3Vkd2F0Y2hMb2dHcm91cCh0aGlzLCAnUnVubmVyTG9nR3JvdXAnLCB7XG4gICAgICBuYW1lOiAnL2Vjcy9HSEEnLFxuICAgIH0pXG5cbiAgICBjb25zdCBhdXRvc2NhbGVyTG9nR3JvdXAgPSBuZXcgQ2xvdWR3YXRjaExvZ0dyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgICdBdXRvc2NhbGVyTG9nR3JvdXAnLFxuICAgICAge1xuICAgICAgICBuYW1lOiAnL2Vjcy9BdXRvc2NhbGVyJyxcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgY29uc3QgYXV0b3NjYWxlckNvbnRhaW5lckRlZmluaXRpb246IENvbnRhaW5lckRlZmluaXRpb24gPSB7XG4gICAgICBuYW1lOiAnYXV0b3NjYWxlcicsXG4gICAgICBpbWFnZTogYXV0b3NjYWxlckltYWdlLnN0cmluZ1ZhbHVlLFxuICAgICAgZXNzZW50aWFsOiB0cnVlLFxuICAgICAgZW52aXJvbm1lbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdQQVQnLFxuICAgICAgICAgIHZhbHVlOiBwYXQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnR0lUSFVCX0NPTkZJR19VUkwnLFxuICAgICAgICAgIHZhbHVlOiBnaXRodWJDb25maWdVcmwudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRUNTX0NMVVNURVInLFxuICAgICAgICAgIHZhbHVlOiBjbHVzdGVyLmFybixcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdFQ1NfU1VCTkVUUycsXG4gICAgICAgICAgdmFsdWU6IEZuLmpvaW4oJywnLCBzdWJuZXRzLmlkcyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRUNTX1NFQ1VSSVRZX0dST1VQUycsXG4gICAgICAgICAgdmFsdWU6IEZuLmpvaW4oJywnLCBzZWN1cml0eUdyb3Vwcy5pZHMpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ1NDQUxFX1NFVF9OQU1FJyxcbiAgICAgICAgICB2YWx1ZTogJ2Vjcy1ydW5uZXItc2V0JyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBsb2dDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIGxvZ0RyaXZlcjogJ2F3c2xvZ3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgJ2F3c2xvZ3MtZ3JvdXAnOiBhdXRvc2NhbGVyTG9nR3JvdXAubmFtZSxcbiAgICAgICAgICAnYXdzbG9ncy1yZWdpb24nOiByZWdpb24ubmFtZSxcbiAgICAgICAgICAnYXdzbG9ncy1zdHJlYW0tcHJlZml4JzogJ2VjcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHJ1bm5lclZvbHVtZTogRWNzVGFza0RlZmluaXRpb25Wb2x1bWVbXSA9IFtdXG5cbiAgICBjb25zdCBydW5uZXJDb250YWluZXJEZWZpbml0aW9uOiBDb250YWluZXJEZWZpbml0aW9uID0ge1xuICAgICAgbmFtZTogJ3J1bm5lcicsXG4gICAgICBpbWFnZTogJ2doY3IuaW8vYWN0aW9ucy9hY3Rpb25zLXJ1bm5lcjoyLjMyMy4wJyxcbiAgICAgIGVzc2VudGlhbDogdHJ1ZSxcbiAgICAgIGVudHJ5UG9pbnQ6IFsnL2hvbWUvcnVubmVyL3J1bi5zaCddLFxuICAgICAgZW52aXJvbm1lbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdFQ1NfQ0xVU1RFUl9OQU1FJyxcbiAgICAgICAgICB2YWx1ZTogY2x1c3Rlci5uYW1lLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0FDVElPTlNfUlVOTkVSX1BPRF9OQU1FJyxcbiAgICAgICAgICB2YWx1ZTogJ2doYS1wb2QnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0VDU19TVUJORVRTJyxcbiAgICAgICAgICB2YWx1ZTogRm4uam9pbignLCcsIHN1Ym5ldHMuaWRzKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdFQ1NfU0VDVVJJVFlfR1JPVVBTJyxcbiAgICAgICAgICB2YWx1ZTogRm4uam9pbignLCcsIHNlY3VyaXR5R3JvdXBzLmlkcyksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnRUNTX1RBU0tfUk9MRScsXG4gICAgICAgICAgdmFsdWU6IHJ1bm5lclJvbGUuYXJuLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0VDU19FWEVDVVRJT05fUk9MRScsXG4gICAgICAgICAgdmFsdWU6IGVjc1Rhc2tFeGVjdXRpb25Sb2xlLmFybixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBtb3VudFBvaW50czogW10sXG4gICAgICBsb2dDb25maWd1cmF0aW9uOiB7XG4gICAgICAgIGxvZ0RyaXZlcjogJ2F3c2xvZ3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgJ2F3c2xvZ3MtZ3JvdXAnOiBydW5uZXJMb2dHcm91cC5uYW1lLFxuICAgICAgICAgICdhd3Nsb2dzLXJlZ2lvbic6IHJlZ2lvbi5uYW1lLFxuICAgICAgICAgICdhd3Nsb2dzLXN0cmVhbS1wcmVmaXgnOiAnZWNzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNvbnRhaW5lclN1cHBvcnQpIHtcbiAgICAgIC8vIEVGUyB2b2x1bWUgdG8gYWxsb3cgc2hhcmluZyBkYXRhIGJldHdlZW4gdGFza3NcbiAgICAgIGNvbnN0IGVmcyA9IG5ldyBFZnNGaWxlU3lzdGVtKHRoaXMsICdlZnMnLCB7XG4gICAgICAgIHRocm91Z2hwdXRNb2RlOiAnZWxhc3RpYycsXG4gICAgICAgIHRhZ3M6IHtcbiAgICAgICAgICBOYW1lOiAnd29yaycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBleHRlcm5hbHNFZnMgPSBuZXcgRWZzRmlsZVN5c3RlbSh0aGlzLCAnZXh0ZXJuYWxzRWZzJywge1xuICAgICAgICB0aHJvdWdocHV0TW9kZTogJ2VsYXN0aWMnLFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgTmFtZTogJ2V4dGVybmFscycsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICAvLyBFYWNoIHN1Ym5ldCBpbiBWUEMgYXJlIG9uIGRpZmZlcmVudCBBWnMsIHNvIGNyZWF0aW5nIG1vdW50cG9pbnQgdG8gZWFjaFxuICAgICAgY29uc3QgaXRlcmF0b3IgPSBUZXJyYWZvcm1JdGVyYXRvci5mcm9tTGlzdChzdWJuZXRzLmlkcylcblxuICAgICAgbmV3IEVmc01vdW50VGFyZ2V0KHRoaXMsICdFZnNNb3VudFRhcmdldCcsIHtcbiAgICAgICAgZm9yRWFjaDogaXRlcmF0b3IsXG4gICAgICAgIGZpbGVTeXN0ZW1JZDogZWZzLmlkLFxuICAgICAgICBzdWJuZXRJZDogaXRlcmF0b3IudmFsdWUsXG4gICAgICB9KVxuXG4gICAgICBuZXcgRWZzTW91bnRUYXJnZXQodGhpcywgJ0V4dGVybmFsc0Vmc01vdW50VGFyZ2V0Jywge1xuICAgICAgICBmb3JFYWNoOiBpdGVyYXRvcixcbiAgICAgICAgZmlsZVN5c3RlbUlkOiBleHRlcm5hbHNFZnMuaWQsXG4gICAgICAgIHN1Ym5ldElkOiBpdGVyYXRvci52YWx1ZSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHJ1bm5lclZvbHVtZU5hbWUgPSAnd29yaydcbiAgICAgIGNvbnN0IGV4dGVybmFsc1ZvbHVtZU5hbWUgPSAnZXh0ZXJuYWxzJ1xuXG4gICAgICBydW5uZXJWb2x1bWUucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IHJ1bm5lclZvbHVtZU5hbWUsXG4gICAgICAgICAgZWZzVm9sdW1lQ29uZmlndXJhdGlvbjoge1xuICAgICAgICAgICAgZmlsZVN5c3RlbUlkOiBlZnMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBzYW1lIHZvbHVtZSwgYXMgdm9sdW1lIGlzIGluaXRpYWxseSBlbXB0eSBzbyBpdCBjYW4ndCBtYXAgdG8gaXQncyBcImV4dGVybmFsc1wiIGRpcmVjdG9yeVxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogZXh0ZXJuYWxzVm9sdW1lTmFtZSxcbiAgICAgICAgICBlZnNWb2x1bWVDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICBmaWxlU3lzdGVtSWQ6IGV4dGVybmFsc0Vmcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBydW5uZXJDb250YWluZXJEZWZpbml0aW9uLm1vdW50UG9pbnRzPy5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlVm9sdW1lOiBydW5uZXJWb2x1bWVOYW1lLFxuICAgICAgICAgIGNvbnRhaW5lclBhdGg6ICcvdG1wL193b3JrJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNvdXJjZVZvbHVtZTogZXh0ZXJuYWxzVm9sdW1lTmFtZSxcbiAgICAgICAgICBjb250YWluZXJQYXRoOiAnL3RtcC9leHRlcm5hbHMnLFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBydW5uZXJDb250YWluZXJEZWZpbml0aW9uLmVudmlyb25tZW50Py5wdXNoKFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0VGU19JRCcsXG4gICAgICAgICAgdmFsdWU6IGVmcy5pZCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdFWFRFUk5BTFNfRUZTX0lEJyxcbiAgICAgICAgICB2YWx1ZTogZXh0ZXJuYWxzRWZzLmlkLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0FDVElPTlNfUlVOTkVSX1JFUVVJUkVfSk9CX0NPTlRBSU5FUicsXG4gICAgICAgICAgdmFsdWU6ICdmYWxzZScsXG4gICAgICAgIH0sXG4gICAgICApXG5cbiAgICAgIHJ1bm5lckNvbnRhaW5lckRlZmluaXRpb24uY29tbWFuZCA9IFtcbiAgICAgICAgJy9iaW4vc2gnLFxuICAgICAgICAnLWMnLFxuICAgICAgICAnZXhwb3J0IEVYRUNJRD0kKGNhdCAvcHJvYy9zeXMva2VybmVsL3JhbmRvbS91dWlkKSAmJiBzdWRvIG1rZGlyIC1wIC90bXAvX3dvcmsvJEVYRUNJRCAmJiBzdWRvIGNob3duIHJ1bm5lcjpydW5uZXIgL3RtcC9fd29yay8kRVhFQ0lEICYmIGxuIC1zIC90bXAvX3dvcmsvJEVYRUNJRCBfd29yayAmJiBzdWRvIGNob3duIHJ1bm5lcjpydW5uZXIgL3RtcC9leHRlcm5hbHMgJiYgL2hvbWUvcnVubmVyL3J1bi5zaCA7IHN1ZG8gcm0gLXIgL3RtcC9fd29yay8kRVhFQ0lEJyxcbiAgICAgIF1cbiAgICAgIHJ1bm5lckNvbnRhaW5lckRlZmluaXRpb24uaW1hZ2UgPSAnZ2hjci5pby9oaS1maS9hY3Rpb25zLXJ1bm5lcjplY3MnXG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1hZ2VzIHRocm91Z2ggY2FjaGluZzogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUi9sYXRlc3QvdXNlcmd1aWRlL3B1bGwtdGhyb3VnaC1jYWNoZS5odG1sIChyZXF1aXJlcyBhdXRoZW50aWNhdGlvbilcbiAgICAvLyBUT0RPOiBQYXNzIEV4ZWN1dGlvbiByb2xlIHRvIGpvYiB0YXNrOiBodHRwczovL3d3dy5lcm5lc3RjaGlhbmcuY29tL2VuL3Bvc3RzLzIwMjEvdXNpbmctYW1hem9uLWVjcy1leGVjLyMxLWdyYW50LXBlcm1pc3Npb25zLWVjcy10YXNrLWlhbS1yb2xlXG4gICAgLy8gVE9ETzogUGFzcyBUYXNrIHJvbGUgdG8gam9iIHRhc2tcbiAgICBjb25zdCBydW5uZXJUYXNrRGVmaW5pdGlvbiA9IG5ldyBFY3NUYXNrRGVmaW5pdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICAnUnVubmVyVGFza0RlZmluaXRpb24nLFxuICAgICAge1xuICAgICAgICBmYW1pbHk6ICdHSEEnLFxuICAgICAgICB0YXNrUm9sZUFybjogcnVubmVyUm9sZS5hcm4sXG4gICAgICAgIGV4ZWN1dGlvblJvbGVBcm46IGVjc1Rhc2tFeGVjdXRpb25Sb2xlLmFybixcbiAgICAgICAgY29udGFpbmVyRGVmaW5pdGlvbnM6IEZuLmpzb25lbmNvZGUoW3J1bm5lckNvbnRhaW5lckRlZmluaXRpb25dKSxcbiAgICAgICAgY3B1OiAnMTAyNCcsXG4gICAgICAgIG1lbW9yeTogJzIwNDgnLFxuICAgICAgICByZXF1aXJlc0NvbXBhdGliaWxpdGllczogWydGQVJHQVRFJ10sXG4gICAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICAgIGNwdUFyY2hpdGVjdHVyZTogJ1g4Nl82NCcsXG4gICAgICAgICAgb3BlcmF0aW5nU3lzdGVtRmFtaWx5OiAnTElOVVgnLFxuICAgICAgICB9LFxuICAgICAgICBuZXR3b3JrTW9kZTogJ2F3c3ZwYycsXG4gICAgICAgIHZvbHVtZTogcnVubmVyVm9sdW1lLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBhdXRvc2NhbGVyQ29udGFpbmVyRGVmaW5pdGlvbi5lbnZpcm9ubWVudD8ucHVzaCh7XG4gICAgICBuYW1lOiAnVEFTS19ERUZJTklUSU9OX0FSTicsXG4gICAgICB2YWx1ZTogcnVubmVyVGFza0RlZmluaXRpb24uYXJuLFxuICAgIH0pXG5cbiAgICBjb25zdCBhdXRvc2NhbGVyVGFza0RlZmluaXRpb24gPSBuZXcgRWNzVGFza0RlZmluaXRpb24oXG4gICAgICB0aGlzLFxuICAgICAgJ0F1dG9zY2FsZXJUYXNrRGVmaW5pdGlvbicsXG4gICAgICB7XG4gICAgICAgIGZhbWlseTogJ0F1dG9zY2FsZXInLFxuICAgICAgICB0YXNrUm9sZUFybjogYXV0b3NjYWxlclJvbGUuYXJuLFxuICAgICAgICBleGVjdXRpb25Sb2xlQXJuOiBlY3NUYXNrRXhlY3V0aW9uUm9sZS5hcm4sXG4gICAgICAgIGNvbnRhaW5lckRlZmluaXRpb25zOiBGbi5qc29uZW5jb2RlKFthdXRvc2NhbGVyQ29udGFpbmVyRGVmaW5pdGlvbl0pLFxuICAgICAgICBjcHU6ICcyNTYnLFxuICAgICAgICBtZW1vcnk6ICc1MTInLFxuICAgICAgICByZXF1aXJlc0NvbXBhdGliaWxpdGllczogWydGQVJHQVRFJ10sXG4gICAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICAgIGNwdUFyY2hpdGVjdHVyZTogJ1g4Nl82NCcsXG4gICAgICAgICAgb3BlcmF0aW5nU3lzdGVtRmFtaWx5OiAnTElOVVgnLFxuICAgICAgICB9LFxuICAgICAgICBuZXR3b3JrTW9kZTogJ2F3c3ZwYycsXG4gICAgICB9LFxuICAgIClcblxuICAgIGNvbnN0IHJ1bm5lclBvbGljeURlZmluaXRpb24gPSB7XG4gICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIFNpZDogJ1N0YXJ0YW5kTW9uaXRvclRhc2snLFxuICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICBBY3Rpb246IFtcbiAgICAgICAgICAgICdlY3M6UnVuVGFzaycsXG4gICAgICAgICAgICAnZWNzOlRhZ1Jlc291cmNlJyxcbiAgICAgICAgICAgICdlY3M6TGlzdFRhc2tEZWZpbml0aW9ucycsXG4gICAgICAgICAgICAnZWNzOkxpc3RUYXNrcycsXG4gICAgICAgICAgICAnZWNzOlN0b3BUYXNrJyxcbiAgICAgICAgICAgICdlY3M6UmVnaXN0ZXJUYXNrRGVmaW5pdGlvbicsXG4gICAgICAgICAgICAnZWNzOkRlc2NyaWJlVGFza0RlZmluaXRpb24nLFxuICAgICAgICAgICAgJ2VjczpEZXJlZ2lzdGVyVGFza0RlZmluaXRpb24nLFxuICAgICAgICAgICAgJ2VjczpEZWxldGVUYXNrRGVmaW5pdGlvbnMnLFxuICAgICAgICAgICAgJ2VjczpFeGVjdXRlQ29tbWFuZCcsXG4gICAgICAgICAgICAvLyBOZWVkZWQgZm9yIHdhaXRpbmdcbiAgICAgICAgICAgICdlY3M6RGVzY3JpYmVUYXNrcycsXG4gICAgICAgICAgICAnbG9nczpHZXRMb2dFdmVudHMnLFxuICAgICAgICAgICAgJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgICAgICAnbG9nczpTdGFydExpdmVUYWlsJyxcbiAgICAgICAgICAgICdsb2dzOkNyZWF0ZUxvZ1N0cmVhbScsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBSZXNvdXJjZTogW1xuICAgICAgICAgICAgYGFybjphd3M6ZWNzOiR7cmVnaW9uLm5hbWV9OiR7aWRlbnRpdHkuYWNjb3VudElkfTp0YXNrLWRlZmluaXRpb24vZ2hhLXBvZC13b3JrZmxvdzoqYCxcbiAgICAgICAgICAgIGNsdXN0ZXIuYXJuLFxuICAgICAgICAgICAgLy8gVHJpZ2dlcmVyIGhhcyB0byBiZSBhbGxvd2VkIHRvIHBhc3MgYm90aCB0YXNrIGFuZCB0YXNrIGV4ZWN1dGlvbiByb2xlXG4gICAgICAgICAgICBlY3NUYXNrRXhlY3V0aW9uUm9sZS5hcm4sXG4gICAgICAgICAgICBydW5uZXJSb2xlLmFybixcbiAgICAgICAgICAgIGBhcm46YXdzOmVjczoke3JlZ2lvbi5uYW1lfToke2lkZW50aXR5LmFjY291bnRJZH06dGFzay8ke2NsdXN0ZXIubmFtZX0vKmAsXG4gICAgICAgICAgICAvL1RPRE86IHJlb3JkZXIgcmlnaHRzIHNvIHRoYXQgbGlzdGluZyBpcyBvbmx5IG9uZSB3aXRoIHN0YXJcbiAgICAgICAgICAgICcqJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgU2lkOiAnR2V0VnBjSW5mbycsXG4gICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgIEFjdGlvbjogWydlYzI6RGVzY3JpYmVTdWJuZXRzJywgJ2VjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzJ10sXG4gICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFNpZDogJ0V4ZWNDb21tYW5kcycsXG4gICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgJ3NzbW1lc3NhZ2VzOkNyZWF0ZUNvbnRyb2xDaGFubmVsJyxcbiAgICAgICAgICAgICdzc21tZXNzYWdlczpDcmVhdGVEYXRhQ2hhbm5lbCcsXG4gICAgICAgICAgICAnc3NtbWVzc2FnZXM6T3BlbkNvbnRyb2xDaGFubmVsJyxcbiAgICAgICAgICAgICdzc21tZXNzYWdlczpPcGVuRGF0YUNoYW5uZWwnLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgUmVzb3VyY2U6ICcqJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfVxuXG4gICAgY29uc3QgcnVubmVyUG9saWN5ID0gbmV3IElhbVBvbGljeSh0aGlzLCAnUnVubmVyUG9saWN5Jywge1xuICAgICAgcG9saWN5OiBGbi5qc29uZW5jb2RlKHJ1bm5lclBvbGljeURlZmluaXRpb24pLFxuICAgIH0pXG5cbiAgICBuZXcgSWFtUm9sZVBvbGljeUF0dGFjaG1lbnQodGhpcywgJ1J1bm5lclBvbGljeUF0dGFjaG1lbnQnLCB7XG4gICAgICBwb2xpY3lBcm46IHJ1bm5lclBvbGljeS5hcm4sXG4gICAgICByb2xlOiBydW5uZXJSb2xlLm5hbWUsXG4gICAgfSlcblxuICAgIGNvbnN0IGF1dG9zY2FsZXJQb2xpY3kgPSBuZXcgSWFtUG9saWN5KHRoaXMsICdBdXRvc2NhbGVyUG9saWN5Jywge1xuICAgICAgcG9saWN5OiBGbi5qc29uZW5jb2RlKHtcbiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnLFxuICAgICAgICBTdGF0ZW1lbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBTaWQ6ICdTdGFydGFuZE1vbml0b3JUYXNrJyxcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIEFjdGlvbjogW1xuICAgICAgICAgICAgICAnZWNzOlJ1blRhc2snLFxuICAgICAgICAgICAgICAvLyBOZWVkZWQgZm9yIHdhaXRpbmdcbiAgICAgICAgICAgICAgJ2VjczpEZXNjcmliZVRhc2tzJyxcbiAgICAgICAgICAgICAgJ2xvZ3M6R2V0TG9nRXZlbnRzJyxcbiAgICAgICAgICAgICAgJ2lhbTpQYXNzUm9sZScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgUmVzb3VyY2U6IFtcbiAgICAgICAgICAgICAgYCR7cnVubmVyVGFza0RlZmluaXRpb24uYXJuV2l0aG91dFJldmlzaW9ufToqYCxcbiAgICAgICAgICAgICAgLy8gVHJpZ2dlcmVyIGhhcyB0byBiZSBhbGxvd2VkIHRvIHBhc3MgYm90aCB0YXNrIGFuZCB0YXNrIGV4ZWN1dGlvbiByb2xlXG4gICAgICAgICAgICAgIGVjc1Rhc2tFeGVjdXRpb25Sb2xlLmFybixcbiAgICAgICAgICAgICAgcnVubmVyUm9sZS5hcm4sXG4gICAgICAgICAgICAgIGBhcm46YXdzOmVjczoke3JlZ2lvbi5uYW1lfToke2lkZW50aXR5LmFjY291bnRJZH06dGFzay8ke2NsdXN0ZXIubmFtZX0vKmAsXG4gICAgICAgICAgICAgIGAke3J1bm5lckxvZ0dyb3VwLmFybn06bG9nLXN0cmVhbToqYCxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBTaWQ6ICdHZXRWcGNJbmZvJyxcbiAgICAgICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgICAgIEFjdGlvbjogWydlYzI6RGVzY3JpYmVTdWJuZXRzJywgJ2VjMjpEZXNjcmliZVNlY3VyaXR5R3JvdXBzJ10sXG4gICAgICAgICAgICBSZXNvdXJjZTogJyonLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICB9KVxuICAgIG5ldyBJYW1Sb2xlUG9saWN5QXR0YWNobWVudCh0aGlzLCAnQXV0b3NjYWxlclBvbGljeUF0dGFjaG1lbnQnLCB7XG4gICAgICBwb2xpY3lBcm46IGF1dG9zY2FsZXJQb2xpY3kuYXJuLFxuICAgICAgcm9sZTogYXV0b3NjYWxlclJvbGUubmFtZSxcbiAgICB9KVxuXG4gICAgbmV3IEVjc1NlcnZpY2UodGhpcywgJ0F1dG9zY2FsZXJTZXJ2aWNlJywge1xuICAgICAgY2x1c3RlcjogY2x1c3Rlci5hcm4sXG4gICAgICBuYW1lOiAnYXV0b3NjYWxlci1zZXJ2aWNlJyxcbiAgICAgIGRlc2lyZWRDb3VudDogMSxcbiAgICAgIGxhdW5jaFR5cGU6ICdGQVJHQVRFJyxcbiAgICAgIHRhc2tEZWZpbml0aW9uOiBhdXRvc2NhbGVyVGFza0RlZmluaXRpb24uYXJuV2l0aG91dFJldmlzaW9uLFxuICAgICAgbmV0d29ya0NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgYXNzaWduUHVibGljSXA6IHRydWUsXG4gICAgICAgIHN1Ym5ldHM6IHN1Ym5ldHMuaWRzLFxuICAgICAgICBzZWN1cml0eUdyb3Vwczogc2VjdXJpdHlHcm91cHMuaWRzLFxuICAgICAgfSxcbiAgICAgIGxpZmVjeWNsZToge1xuICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbJ2Rlc2lyZWRfY291bnQnXSxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxufVxuIl19