@jjrawlins/cdk-diff-pr-github-action 0.0.71 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.jsii +982 -56
  2. package/API.md +1132 -186
  3. package/README.md +194 -14
  4. package/lib/CdkDiffIamTemplate.d.ts +36 -3
  5. package/lib/CdkDiffIamTemplate.js +116 -87
  6. package/lib/CdkDiffIamTemplateStackSet.d.ts +149 -0
  7. package/lib/CdkDiffIamTemplateStackSet.js +373 -0
  8. package/lib/CdkDiffStackWorkflow.js +1 -1
  9. package/lib/CdkDriftDetectionWorkflow.js +1 -1
  10. package/lib/CdkDriftIamTemplate.d.ts +36 -3
  11. package/lib/CdkDriftIamTemplate.js +92 -63
  12. package/lib/index.d.ts +1 -0
  13. package/lib/index.js +2 -1
  14. package/node_modules/@aws-sdk/client-sso/package.json +9 -9
  15. package/node_modules/@aws-sdk/core/package.json +5 -5
  16. package/node_modules/@aws-sdk/credential-provider-env/package.json +5 -5
  17. package/node_modules/@aws-sdk/credential-provider-http/package.json +5 -5
  18. package/node_modules/@aws-sdk/credential-provider-ini/package.json +12 -12
  19. package/node_modules/@aws-sdk/credential-provider-login/package.json +6 -6
  20. package/node_modules/@aws-sdk/credential-provider-node/package.json +10 -10
  21. package/node_modules/@aws-sdk/credential-provider-process/package.json +5 -5
  22. package/node_modules/@aws-sdk/credential-provider-sso/package.json +7 -7
  23. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +6 -6
  24. package/node_modules/@aws-sdk/middleware-host-header/package.json +4 -4
  25. package/node_modules/@aws-sdk/middleware-logger/package.json +4 -4
  26. package/node_modules/@aws-sdk/middleware-recursion-detection/package.json +4 -4
  27. package/node_modules/@aws-sdk/middleware-user-agent/package.json +5 -5
  28. package/node_modules/@aws-sdk/nested-clients/package.json +9 -9
  29. package/node_modules/@aws-sdk/region-config-resolver/package.json +4 -4
  30. package/node_modules/@aws-sdk/token-providers/package.json +3 -3
  31. package/node_modules/@aws-sdk/types/package.json +3 -3
  32. package/node_modules/@aws-sdk/util-locate-window/package.json +3 -3
  33. package/node_modules/@aws-sdk/util-user-agent-browser/package.json +4 -4
  34. package/node_modules/@aws-sdk/util-user-agent-node/package.json +5 -5
  35. package/node_modules/@aws-sdk/xml-builder/package.json +3 -3
  36. package/package.json +4 -4
package/README.md CHANGED
@@ -1,17 +1,22 @@
1
1
  # cdk-diff-pr-github-action
2
2
 
3
- A small Projen-based helper library that wires GitHub workflows for:
3
+ A library that provides GitHub workflows and IAM templates for:
4
4
  - Creating CloudFormation Change Sets for your CDK stacks on pull requests and commenting a formatted diff back on the PR.
5
5
  - Detecting CloudFormation drift on a schedule or manual trigger and producing a consolidated summary (optionally creating an issue).
6
+ - Deploying IAM roles across AWS Organizations using StackSets.
6
7
 
7
8
  It also provides ready‑to‑deploy IAM templates with the minimal permissions required for each workflow.
8
9
 
9
- This package exposes four constructs:
10
+ **Works with or without Projen** — The StackSet generator can be used standalone in any Node.js project.
11
+
12
+ This package exposes five constructs:
10
13
 
11
14
  - `CdkDiffStackWorkflow` — Generates one GitHub Actions workflow per stack to create a change set and render the diff back to the PR and Step Summary.
12
15
  - `CdkDiffIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Change Set workflow.
13
16
  - `CdkDriftDetectionWorkflow` — Generates a GitHub Actions workflow to detect CloudFormation drift per stack, upload machine‑readable results, and aggregate a summary.
14
17
  - `CdkDriftIamTemplate` — Emits a CloudFormation template file with minimal permissions for the Drift Detection workflow.
18
+ - `CdkDiffIamTemplateStackSet` — Creates a CloudFormation StackSet template for org-wide deployment of GitHub OIDC and IAM roles (Projen integration).
19
+ - `CdkDiffIamTemplateStackSetGenerator` — Pure generator class for StackSet templates (no Projen dependency).
15
20
 
16
21
  ## Quick start
17
22
 
@@ -102,7 +107,9 @@ If neither top‑level OIDC defaults nor all per‑stack values are supplied, th
102
107
 
103
108
  ## Usage: CdkDiffIamTemplate
104
109
 
105
- Emit an example IAM template you can deploy in your account for the Change Set workflow:
110
+ Emit an example IAM template you can deploy in your account for the Change Set workflow.
111
+
112
+ ### With Projen
106
113
 
107
114
  ```ts
108
115
  import { awscdk } from 'projen';
@@ -124,7 +131,33 @@ new CdkDiffIamTemplate({
124
131
  project.synth();
125
132
  ```
126
133
 
127
- This writes `cdk-diff-workflow-iam-template.yaml` at the project root (or your chosen `outputPath`). The template defines:
134
+ A Projen task is also added:
135
+
136
+ ```bash
137
+ npx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
138
+ ```
139
+
140
+ ### Without Projen (Standalone Generator)
141
+
142
+ ```ts
143
+ import { CdkDiffIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';
144
+ import * as fs from 'fs';
145
+
146
+ const template = CdkDiffIamTemplateGenerator.generateTemplate({
147
+ roleName: 'cdk-diff-role',
148
+ oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',
149
+ oidcRegion: 'us-east-1',
150
+ });
151
+
152
+ fs.writeFileSync('cdk-diff-iam-template.yaml', template);
153
+
154
+ // Get the deploy command
155
+ const deployCmd = CdkDiffIamTemplateGenerator.generateDeployCommand('cdk-diff-iam-template.yaml');
156
+ console.log('Deploy with:', deployCmd);
157
+ ```
158
+
159
+ ### What the template defines
160
+
128
161
  - Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume the change set role.
129
162
  - IAM role `CdkChangesetRole` with minimal permissions for:
130
163
  - CloudFormation Change Set operations
@@ -132,12 +165,6 @@ This writes `cdk-diff-workflow-iam-template.yaml` at the project root (or your c
132
165
  - `iam:PassRole` to `cloudformation.amazonaws.com`
133
166
  - Outputs exporting the role name and ARN.
134
167
 
135
- A Projen task is also added:
136
-
137
- ```bash
138
- npx projen deploy-cdkdiff-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
139
- ```
140
-
141
168
  Use the created role ARN as `changesetRoleToAssumeArn` in `CdkDiffStackWorkflow`.
142
169
 
143
170
  ---
@@ -276,7 +303,9 @@ Details:
276
303
 
277
304
  ## Usage: CdkDriftIamTemplate
278
305
 
279
- Emit an example IAM template you can deploy in your account for the Drift Detection workflow:
306
+ Emit an example IAM template you can deploy in your account for the Drift Detection workflow.
307
+
308
+ ### With Projen
280
309
 
281
310
  ```ts
282
311
  import { awscdk } from 'projen';
@@ -298,17 +327,168 @@ new CdkDriftIamTemplate({
298
327
  project.synth();
299
328
  ```
300
329
 
301
- This writes `cdk-drift-workflow-iam-template.yaml` at the project root (or your chosen `outputPath`). The template defines:
330
+ A Projen task is also added:
331
+
332
+ ```bash
333
+ npx projen deploy-cdkdrift-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
334
+ ```
335
+
336
+ ### Without Projen (Standalone Generator)
337
+
338
+ ```ts
339
+ import { CdkDriftIamTemplateGenerator } from '@jjrawlins/cdk-diff-pr-github-action';
340
+ import * as fs from 'fs';
341
+
342
+ const template = CdkDriftIamTemplateGenerator.generateTemplate({
343
+ roleName: 'cdk-drift-role',
344
+ oidcRoleArn: 'arn:aws:iam::123456789012:role/github-oidc-role',
345
+ oidcRegion: 'us-east-1',
346
+ });
347
+
348
+ fs.writeFileSync('cdk-drift-iam-template.yaml', template);
349
+
350
+ // Get the deploy command
351
+ const deployCmd = CdkDriftIamTemplateGenerator.generateDeployCommand('cdk-drift-iam-template.yaml');
352
+ console.log('Deploy with:', deployCmd);
353
+ ```
354
+
355
+ ### What the template defines
356
+
302
357
  - Parameter `GitHubOIDCRoleArn` with a default from `oidcRoleArn` — the ARN of your existing GitHub OIDC role allowed to assume this drift role.
303
358
  - IAM role `CdkDriftRole` with minimal permissions for CloudFormation drift detection operations.
304
359
  - Outputs exporting the role name and ARN.
305
360
 
306
- A Projen task is also added:
361
+ ---
362
+
363
+ ## Usage: CdkDiffIamTemplateStackSet (Org-Wide Deployment)
364
+
365
+ `CdkDiffIamTemplateStackSet` creates a CloudFormation StackSet template for deploying GitHub OIDC provider, OIDC role, and CDK diff/drift IAM roles across an entire AWS Organization. This is the recommended approach for organizations that want to enable CDK diff/drift workflows across multiple accounts.
366
+
367
+ ### Architecture
368
+
369
+ Each account in your organization gets:
370
+ - **GitHub OIDC Provider** — Authenticates GitHub Actions workflows
371
+ - **GitHubOIDCRole** — Trusts the OIDC provider with repo/branch restrictions
372
+ - **CdkChangesetRole** — For PR change set previews (trusts GitHubOIDCRole)
373
+ - **CdkDriftRole** — For drift detection (trusts GitHubOIDCRole)
374
+
375
+ This is a self-contained deployment with **no role chaining required**.
376
+
377
+ ### With Projen
307
378
 
379
+ ```ts
380
+ import { awscdk } from 'projen';
381
+ import { CdkDiffIamTemplateStackSet } from '@jjrawlins/cdk-diff-pr-github-action';
382
+
383
+ const project = new awscdk.AwsCdkConstructLibrary({ /* ... */ });
384
+
385
+ new CdkDiffIamTemplateStackSet({
386
+ project,
387
+ githubOidc: {
388
+ owner: 'my-org', // GitHub org or username
389
+ repositories: ['infra-repo', 'app-repo'], // Repos allowed to assume roles
390
+ branches: ['main', 'release/*'], // Branch patterns (default: ['*'])
391
+ },
392
+ targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'], // Target OUs
393
+ regions: ['us-east-1', 'eu-west-1'], // Target regions
394
+ // Optional settings:
395
+ // oidcRoleName: 'GitHubOIDCRole', // default
396
+ // changesetRoleName: 'CdkChangesetRole', // default
397
+ // driftRoleName: 'CdkDriftRole', // default
398
+ // roleSelection: StackSetRoleSelection.BOTH, // BOTH, CHANGESET_ONLY, or DRIFT_ONLY
399
+ // delegatedAdmin: true, // Use --call-as DELEGATED_ADMIN (default: true)
400
+ });
401
+
402
+ project.synth();
403
+ ```
404
+
405
+ This creates:
406
+ - `cdk-diff-workflow-stackset-template.yaml` — CloudFormation template
407
+ - Projen tasks for StackSet management
408
+
409
+ **Projen tasks:**
308
410
  ```bash
309
- npx projen deploy-cdkdrift-iam-template -- --parameter-overrides GitHubOIDCRoleArn=... # plus any extra AWS CLI args
411
+ npx projen stackset-create # Create the StackSet
412
+ npx projen stackset-update # Update the StackSet template
413
+ npx projen stackset-deploy-instances # Deploy to target OUs/regions
414
+ npx projen stackset-delete-instances # Remove stack instances
415
+ npx projen stackset-delete # Delete the StackSet
416
+ npx projen stackset-describe # Show StackSet status
417
+ npx projen stackset-list-instances # List all instances
418
+ ```
419
+
420
+ ### Without Projen (Standalone Generator)
421
+
422
+ For non-Projen projects, use `CdkDiffIamTemplateStackSetGenerator` directly:
423
+
424
+ ```ts
425
+ import {
426
+ CdkDiffIamTemplateStackSetGenerator
427
+ } from '@jjrawlins/cdk-diff-pr-github-action';
428
+ import * as fs from 'fs';
429
+
430
+ // Generate the CloudFormation template
431
+ const template = CdkDiffIamTemplateStackSetGenerator.generateTemplate({
432
+ githubOidc: {
433
+ owner: 'my-org',
434
+ repositories: ['infra-repo'],
435
+ branches: ['main'],
436
+ },
437
+ });
438
+
439
+ // Write to file
440
+ fs.writeFileSync('stackset-template.yaml', template);
441
+
442
+ // Get AWS CLI commands for StackSet operations
443
+ const commands = CdkDiffIamTemplateStackSetGenerator.generateCommands({
444
+ stackSetName: 'cdk-diff-workflow-iam-stackset',
445
+ templatePath: 'stackset-template.yaml',
446
+ targetOrganizationalUnitIds: ['ou-xxxx-xxxxxxxx'],
447
+ regions: ['us-east-1'],
448
+ });
449
+
450
+ console.log('Create StackSet:', commands['stackset-create']);
451
+ console.log('Deploy instances:', commands['stackset-deploy-instances']);
452
+ ```
453
+
454
+ ### GitHub Actions Workflow (Simplified)
455
+
456
+ With per-account OIDC, your workflow is simplified — no role chaining needed:
457
+
458
+ ```yaml
459
+ jobs:
460
+ diff:
461
+ runs-on: ubuntu-latest
462
+ permissions:
463
+ id-token: write
464
+ contents: read
465
+ steps:
466
+ - uses: actions/checkout@v4
467
+
468
+ - uses: aws-actions/configure-aws-credentials@v4
469
+ with:
470
+ role-to-assume: arn:aws:iam::${{ env.ACCOUNT_ID }}:role/GitHubOIDCRole
471
+ aws-region: us-east-1
472
+
473
+ - name: Assume Changeset Role
474
+ run: |
475
+ CREDS=$(aws sts assume-role \
476
+ --role-arn arn:aws:iam::${{ env.ACCOUNT_ID }}:role/CdkChangesetRole \
477
+ --role-session-name changeset-session)
478
+ # Export credentials...
310
479
  ```
311
480
 
481
+ ### GitHubOidcConfig options
482
+
483
+ | Property | Description |
484
+ |----------|-------------|
485
+ | `owner` | GitHub organization or username (required) |
486
+ | `repositories` | Array of repo names, or `['*']` for all repos (required) |
487
+ | `branches` | Array of branch patterns (default: `['*']`) |
488
+ | `additionalClaims` | Extra OIDC claims like `['pull_request', 'environment:production']` |
489
+
490
+ ---
491
+
312
492
  ## Testing
313
493
 
314
494
  This repository includes Jest tests that snapshot the synthesized outputs from Projen and assert that:
@@ -1,10 +1,43 @@
1
- export interface CdkDiffIamTemplateProps {
2
- readonly project: any;
1
+ /**
2
+ * Props for generating CDK Diff IAM templates (no Projen dependency)
3
+ */
4
+ export interface CdkDiffIamTemplateGeneratorProps {
5
+ /** Name for the IAM role */
3
6
  readonly roleName: string;
4
- readonly outputPath?: string;
7
+ /** ARN of the existing GitHub OIDC role that can assume this changeset role */
5
8
  readonly oidcRoleArn: string;
9
+ /** Region for the OIDC trust condition */
6
10
  readonly oidcRegion: string;
7
11
  }
12
+ /**
13
+ * Pure generator class for CDK Diff IAM templates.
14
+ * No Projen dependency - can be used in any project.
15
+ */
16
+ export declare class CdkDiffIamTemplateGenerator {
17
+ /**
18
+ * Generate the CloudFormation IAM template as a YAML string.
19
+ */
20
+ static generateTemplate(props: CdkDiffIamTemplateGeneratorProps): string;
21
+ /**
22
+ * Generate the AWS CLI deploy command for the IAM template.
23
+ */
24
+ static generateDeployCommand(templatePath?: string): string;
25
+ }
26
+ /**
27
+ * Props for the Projen-integrated CDK Diff IAM template construct
28
+ */
29
+ export interface CdkDiffIamTemplateProps extends CdkDiffIamTemplateGeneratorProps {
30
+ /** Projen project instance */
31
+ readonly project: any;
32
+ /** Output path for the template file (default: 'cdk-diff-workflow-iam-template.yaml') */
33
+ readonly outputPath?: string;
34
+ }
35
+ /**
36
+ * Projen construct that emits a CloudFormation template with minimal IAM permissions
37
+ * for the CDK Diff Stack Workflow.
38
+ *
39
+ * For non-Projen projects, use `CdkDiffIamTemplateGenerator` directly.
40
+ */
8
41
  export declare class CdkDiffIamTemplate {
9
42
  constructor(props: CdkDiffIamTemplateProps);
10
43
  }
@@ -1,101 +1,130 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.CdkDiffIamTemplate = void 0;
4
+ exports.CdkDiffIamTemplate = exports.CdkDiffIamTemplateGenerator = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const projen_1 = require("projen");
7
+ /**
8
+ * Pure generator class for CDK Diff IAM templates.
9
+ * No Projen dependency - can be used in any project.
10
+ */
11
+ class CdkDiffIamTemplateGenerator {
12
+ /**
13
+ * Generate the CloudFormation IAM template as a YAML string.
14
+ */
15
+ static generateTemplate(props) {
16
+ const lines = [
17
+ "AWSTemplateFormatVersion: '2010-09-09'",
18
+ "Description: 'IAM role for CDK Diff Stack Workflow construct'",
19
+ '',
20
+ 'Parameters:',
21
+ ' GitHubOIDCRoleArn:',
22
+ ' Type: String',
23
+ " Description: 'ARN of the existing GitHub OIDC role that can assume this changeset role'",
24
+ ` Default: '${props.oidcRoleArn}'`,
25
+ '',
26
+ 'Resources:',
27
+ ' # CloudFormation ChangeSet Role - minimal permissions for changeset operations',
28
+ ' CdkChangesetRole:',
29
+ ' Type: AWS::IAM::Role',
30
+ ' Properties:',
31
+ " RoleName: '" + props.roleName + "'",
32
+ ' AssumeRolePolicyDocument:',
33
+ " Version: '2012-10-17'",
34
+ ' Statement:',
35
+ ' - Effect: Allow',
36
+ ' Principal:',
37
+ ' AWS: !Ref GitHubOIDCRoleArn',
38
+ ' Action: sts:AssumeRole',
39
+ ' Condition:',
40
+ ' StringEquals:',
41
+ " aws:RequestedRegion: '" + props.oidcRegion + "'",
42
+ ' Policies:',
43
+ ' - PolicyName: CloudFormationChangeSetAccess',
44
+ ' PolicyDocument:',
45
+ " Version: '2012-10-17'",
46
+ ' Statement:',
47
+ ' # CloudFormation changeset operations',
48
+ ' - Effect: Allow',
49
+ ' Action:',
50
+ ' - cloudformation:CreateChangeSet',
51
+ ' - cloudformation:DescribeChangeSet',
52
+ ' - cloudformation:DeleteChangeSet',
53
+ ' - cloudformation:ListChangeSets',
54
+ ' - cloudformation:DescribeStacks',
55
+ " Resource: '*'",
56
+ ' # CDK bootstrap bucket access (for changeset creation)',
57
+ ' - Effect: Allow',
58
+ ' Action:',
59
+ ' - s3:GetObject',
60
+ ' - s3:PutObject',
61
+ ' - s3:DeleteObject',
62
+ ' - s3:ListBucket',
63
+ ' Resource:',
64
+ " - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*'",
65
+ " - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*/*'",
66
+ ' # CDK bootstrap parameter access',
67
+ ' - Effect: Allow',
68
+ ' Action:',
69
+ ' - ssm:GetParameter',
70
+ ' - ssm:GetParameters',
71
+ ' - ssm:GetParametersByPath',
72
+ " Resource: !Sub 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/cdk-bootstrap/*'",
73
+ ' # IAM PassRole for CDK operations',
74
+ ' - Effect: Allow',
75
+ ' Action:',
76
+ ' - iam:PassRole',
77
+ " Resource: '*'",
78
+ ' Condition:',
79
+ ' StringEquals:',
80
+ " 'iam:PassedToService': 'cloudformation.amazonaws.com'",
81
+ '',
82
+ 'Outputs:',
83
+ ' CdkChangesetRoleArn:',
84
+ " Description: 'ARN of the CDK changeset role'",
85
+ ' Value: !GetAtt CdkChangesetRole.Arn',
86
+ ' Export:',
87
+ " Name: !Sub '${AWS::StackName}-CdkChangesetRoleArn'",
88
+ '',
89
+ ' CdkChangesetRoleName:',
90
+ " Description: 'Name of the CDK changeset role'",
91
+ ' Value: !Ref CdkChangesetRole',
92
+ ' Export:',
93
+ " Name: !Sub '${AWS::StackName}-CdkChangesetRoleName'",
94
+ ];
95
+ return lines.join('\n');
96
+ }
97
+ /**
98
+ * Generate the AWS CLI deploy command for the IAM template.
99
+ */
100
+ static generateDeployCommand(templatePath = 'cdk-diff-workflow-iam-template.yaml') {
101
+ return `aws cloudformation deploy --template-file ${templatePath} --stack-name cdk-diff-workflow-iam-role --capabilities CAPABILITY_NAMED_IAM`;
102
+ }
103
+ }
104
+ exports.CdkDiffIamTemplateGenerator = CdkDiffIamTemplateGenerator;
105
+ _a = JSII_RTTI_SYMBOL_1;
106
+ CdkDiffIamTemplateGenerator[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplateGenerator", version: "1.0.0" };
107
+ /**
108
+ * Projen construct that emits a CloudFormation template with minimal IAM permissions
109
+ * for the CDK Diff Stack Workflow.
110
+ *
111
+ * For non-Projen projects, use `CdkDiffIamTemplateGenerator` directly.
112
+ */
7
113
  class CdkDiffIamTemplate {
8
114
  constructor(props) {
9
115
  const outputPath = props.outputPath ?? 'cdk-diff-workflow-iam-template.yaml';
116
+ // Generate template using the generator
117
+ const template = CdkDiffIamTemplateGenerator.generateTemplate(props);
118
+ new projen_1.TextFile(props.project, outputPath, { lines: template.split('\n') });
119
+ // Add deploy task
10
120
  props.project.addTask('deploy-cdkdiff-iam-template', {
11
121
  description: 'Deploy the CDK Diff IAM template via CloudFormation (accepts extra AWS CLI args, e.g., --parameter-overrides Key=Value...)',
12
122
  receiveArgs: true,
13
- exec: `aws cloudformation deploy --template-file ${outputPath} --stack-name cdk-diff-workflow-iam-role --capabilities CAPABILITY_NAMED_IAM`,
14
- });
15
- new projen_1.TextFile(props.project, outputPath, {
16
- lines: [
17
- "AWSTemplateFormatVersion: '2010-09-09'",
18
- "Description: 'IAM role for CDK Diff Stack Workflow construct'",
19
- '',
20
- 'Parameters:',
21
- ' GitHubOIDCRoleArn:',
22
- ' Type: String',
23
- " Description: 'ARN of the existing GitHub OIDC role that can assume this changeset role'",
24
- ` Default: '${props.oidcRoleArn}'`,
25
- '',
26
- 'Resources:',
27
- ' # CloudFormation ChangeSet Role - minimal permissions for changeset operations',
28
- ' CdkChangesetRole:',
29
- ' Type: AWS::IAM::Role',
30
- ' Properties:',
31
- " RoleName: '" + props.roleName + "'",
32
- ' AssumeRolePolicyDocument:',
33
- " Version: '2012-10-17'",
34
- ' Statement:',
35
- ' - Effect: Allow',
36
- ' Principal:',
37
- ' AWS: !Ref GitHubOIDCRoleArn',
38
- ' Action: sts:AssumeRole',
39
- ' Condition:',
40
- ' StringEquals:',
41
- " aws:RequestedRegion: '" + props.oidcRegion + "'",
42
- ' Policies:',
43
- ' - PolicyName: CloudFormationChangeSetAccess',
44
- ' PolicyDocument:',
45
- " Version: '2012-10-17'",
46
- ' Statement:',
47
- ' # CloudFormation changeset operations',
48
- ' - Effect: Allow',
49
- ' Action:',
50
- ' - cloudformation:CreateChangeSet',
51
- ' - cloudformation:DescribeChangeSet',
52
- ' - cloudformation:DeleteChangeSet',
53
- ' - cloudformation:ListChangeSets',
54
- ' - cloudformation:DescribeStacks',
55
- " Resource: '*'",
56
- ' # CDK bootstrap bucket access (for changeset creation)',
57
- ' - Effect: Allow',
58
- ' Action:',
59
- ' - s3:GetObject',
60
- ' - s3:PutObject',
61
- ' - s3:DeleteObject',
62
- ' - s3:ListBucket',
63
- ' Resource:',
64
- " - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*'",
65
- " - !Sub 'arn:aws:s3:::cdk-${AWS::AccountId}-${AWS::Region}-*/*'",
66
- ' # CDK bootstrap parameter access',
67
- ' - Effect: Allow',
68
- ' Action:',
69
- ' - ssm:GetParameter',
70
- ' - ssm:GetParameters',
71
- ' - ssm:GetParametersByPath',
72
- " Resource: !Sub 'arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/cdk-bootstrap/*'",
73
- ' # IAM PassRole for CDK operations',
74
- ' - Effect: Allow',
75
- ' Action:',
76
- ' - iam:PassRole',
77
- " Resource: '*'",
78
- ' Condition:',
79
- ' StringEquals:',
80
- " 'iam:PassedToService': 'cloudformation.amazonaws.com'",
81
- '',
82
- 'Outputs:',
83
- ' CdkChangesetRoleArn:',
84
- " Description: 'ARN of the CDK changeset role'",
85
- ' Value: !GetAtt CdkChangesetRole.Arn',
86
- ' Export:',
87
- " Name: !Sub '${AWS::StackName}-CdkChangesetRoleArn'",
88
- '',
89
- ' CdkChangesetRoleName:',
90
- " Description: 'Name of the CDK changeset role'",
91
- ' Value: !Ref CdkChangesetRole',
92
- ' Export:',
93
- " Name: !Sub '${AWS::StackName}-CdkChangesetRoleName'",
94
- ],
123
+ exec: CdkDiffIamTemplateGenerator.generateDeployCommand(outputPath),
95
124
  });
96
125
  }
97
126
  }
98
127
  exports.CdkDiffIamTemplate = CdkDiffIamTemplate;
99
- _a = JSII_RTTI_SYMBOL_1;
100
- CdkDiffIamTemplate[_a] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "0.0.71" };
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Nka0RpZmZJYW1UZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQVVsQyxNQUFhLGtCQUFrQjtJQUM3QixZQUFZLEtBQThCO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLElBQUkscUNBQXFDLENBQUM7UUFDN0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLEVBQUU7WUFDbkQsV0FBVyxFQUFFLDRIQUE0SDtZQUN6SSxXQUFXLEVBQUUsSUFBSTtZQUNqQixJQUFJLEVBQUUsNkNBQTZDLFVBQVUsOEVBQThFO1NBQzVJLENBQUMsQ0FBQztRQUVILElBQUksaUJBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRTtZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsd0NBQXdDO2dCQUN4QywrREFBK0Q7Z0JBQy9ELEVBQUU7Z0JBQ0YsYUFBYTtnQkFDYixzQkFBc0I7Z0JBQ3RCLGtCQUFrQjtnQkFDbEIsNkZBQTZGO2dCQUM3RixpQkFBaUIsS0FBSyxDQUFDLFdBQVcsR0FBRztnQkFDckMsRUFBRTtnQkFDRixZQUFZO2dCQUNaLGtGQUFrRjtnQkFDbEYscUJBQXFCO2dCQUNyQiwwQkFBMEI7Z0JBQzFCLGlCQUFpQjtnQkFDakIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHO2dCQUMxQyxpQ0FBaUM7Z0JBQ2pDLCtCQUErQjtnQkFDL0Isb0JBQW9CO2dCQUNwQiwyQkFBMkI7Z0JBQzNCLHdCQUF3QjtnQkFDeEIsMkNBQTJDO2dCQUMzQyxvQ0FBb0M7Z0JBQ3BDLHdCQUF3QjtnQkFDeEIsNkJBQTZCO2dCQUM3Qix3Q0FBd0MsR0FBRyxLQUFLLENBQUMsVUFBVSxHQUFHLEdBQUc7Z0JBQ2pFLGlCQUFpQjtnQkFDakIscURBQXFEO2dCQUNyRCwyQkFBMkI7Z0JBQzNCLG1DQUFtQztnQkFDbkMsd0JBQXdCO2dCQUN4QixxREFBcUQ7Z0JBQ3JELCtCQUErQjtnQkFDL0IseUJBQXlCO2dCQUN6QixvREFBb0Q7Z0JBQ3BELHNEQUFzRDtnQkFDdEQsb0RBQW9EO2dCQUNwRCxtREFBbUQ7Z0JBQ25ELG1EQUFtRDtnQkFDbkQsK0JBQStCO2dCQUMvQixzRUFBc0U7Z0JBQ3RFLCtCQUErQjtnQkFDL0IseUJBQXlCO2dCQUN6QixrQ0FBa0M7Z0JBQ2xDLGtDQUFrQztnQkFDbEMscUNBQXFDO2dCQUNyQyxtQ0FBbUM7Z0JBQ25DLDJCQUEyQjtnQkFDM0IsZ0ZBQWdGO2dCQUNoRixrRkFBa0Y7Z0JBQ2xGLGdEQUFnRDtnQkFDaEQsK0JBQStCO2dCQUMvQix5QkFBeUI7Z0JBQ3pCLHNDQUFzQztnQkFDdEMsdUNBQXVDO2dCQUN2Qyw2Q0FBNkM7Z0JBQzdDLHlHQUF5RztnQkFDekcsaURBQWlEO2dCQUNqRCwrQkFBK0I7Z0JBQy9CLHlCQUF5QjtnQkFDekIsa0NBQWtDO2dCQUNsQywrQkFBK0I7Z0JBQy9CLDRCQUE0QjtnQkFDNUIsaUNBQWlDO2dCQUNqQywyRUFBMkU7Z0JBQzNFLEVBQUU7Z0JBQ0YsVUFBVTtnQkFDVix3QkFBd0I7Z0JBQ3hCLGtEQUFrRDtnQkFDbEQseUNBQXlDO2dCQUN6QyxhQUFhO2dCQUNiLDBEQUEwRDtnQkFDMUQsRUFBRTtnQkFDRix5QkFBeUI7Z0JBQ3pCLG1EQUFtRDtnQkFDbkQsa0NBQWtDO2dCQUNsQyxhQUFhO2dCQUNiLDJEQUEyRDthQUM1RDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBMUZILGdEQTJGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSAncHJvamVuJztcblxuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVQcm9wcyB7XG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0cHV0UGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgb2lkY1JvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ2RrRGlmZklhbVRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IENka0RpZmZJYW1UZW1wbGF0ZVByb3BzKSB7XG4gICAgY29uc3Qgb3V0cHV0UGF0aCA9IHByb3BzLm91dHB1dFBhdGggPz8gJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJztcbiAgICBwcm9wcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveS1jZGtkaWZmLWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVwbG95IHRoZSBDREsgRGlmZiBJQU0gdGVtcGxhdGUgdmlhIENsb3VkRm9ybWF0aW9uIChhY2NlcHRzIGV4dHJhIEFXUyBDTEkgYXJncywgZS5nLiwgLS1wYXJhbWV0ZXItb3ZlcnJpZGVzIEtleT1WYWx1ZS4uLiknLFxuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICBleGVjOiBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlcGxveSAtLXRlbXBsYXRlLWZpbGUgJHtvdXRwdXRQYXRofSAtLXN0YWNrLW5hbWUgY2RrLWRpZmYtd29ya2Zsb3ctaWFtLXJvbGUgLS1jYXBhYmlsaXRpZXMgQ0FQQUJJTElUWV9OQU1FRF9JQU1gLFxuICAgIH0pO1xuXG4gICAgbmV3IFRleHRGaWxlKHByb3BzLnByb2plY3QsIG91dHB1dFBhdGgsIHtcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIFwiQVdTVGVtcGxhdGVGb3JtYXRWZXJzaW9uOiAnMjAxMC0wOS0wOSdcIixcbiAgICAgICAgXCJEZXNjcmlwdGlvbjogJ0lBTSByb2xlIGZvciBDREsgRGlmZiBTdGFjayBXb3JrZmxvdyBjb25zdHJ1Y3QnXCIsXG4gICAgICAgICcnLFxuICAgICAgICAnUGFyYW1ldGVyczonLFxuICAgICAgICAnICBHaXRIdWJPSURDUm9sZUFybjonLFxuICAgICAgICAnICAgIFR5cGU6IFN0cmluZycsXG4gICAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBleGlzdGluZyBHaXRIdWIgT0lEQyByb2xlIHRoYXQgY2FuIGFzc3VtZSB0aGlzIGNoYW5nZXNldCByb2xlJ1wiLFxuICAgICAgICBgICAgIERlZmF1bHQ6ICcke3Byb3BzLm9pZGNSb2xlQXJufSdgLFxuICAgICAgICAnJyxcbiAgICAgICAgJ1Jlc291cmNlczonLFxuICAgICAgICAnICAjIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlOicsXG4gICAgICAgICcgICAgVHlwZTogQVdTOjpJQU06OlJvbGUnLFxuICAgICAgICAnICAgIFByb3BlcnRpZXM6JyxcbiAgICAgICAgXCIgICAgICBSb2xlTmFtZTogJ1wiICsgcHJvcHMucm9sZU5hbWUgKyBcIidcIixcbiAgICAgICAgJyAgICAgIEFzc3VtZVJvbGVQb2xpY3lEb2N1bWVudDonLFxuICAgICAgICBcIiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAgICcgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgICAnICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAgICcgICAgICAgICAgICBQcmluY2lwYWw6JyxcbiAgICAgICAgJyAgICAgICAgICAgICAgQVdTOiAhUmVmIEdpdEh1Yk9JRENSb2xlQXJuJyxcbiAgICAgICAgJyAgICAgICAgICAgIEFjdGlvbjogc3RzOkFzc3VtZVJvbGUnLFxuICAgICAgICAnICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAgICcgICAgICAgICAgICAgIFN0cmluZ0VxdWFsczonLFxuICAgICAgICBcIiAgICAgICAgICAgICAgICBhd3M6UmVxdWVzdGVkUmVnaW9uOiAnXCIgKyBwcm9wcy5vaWRjUmVnaW9uICsgXCInXCIsXG4gICAgICAgICcgICAgICBQb2xpY2llczonLFxuICAgICAgICAnICAgICAgICAtIFBvbGljeU5hbWU6IENsb3VkRm9ybWF0aW9uQ2hhbmdlU2V0QWNjZXNzJyxcbiAgICAgICAgJyAgICAgICAgICBQb2xpY3lEb2N1bWVudDonLFxuICAgICAgICBcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgICAnICAgICAgICAgICAgU3RhdGVtZW50OicsXG4gICAgICAgICcgICAgICAgICAgICAgICMgQ2xvdWRGb3JtYXRpb24gY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpDcmVhdGVDaGFuZ2VTZXQnLFxuICAgICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZUNoYW5nZVNldCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkRlbGV0ZUNoYW5nZVNldCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkxpc3RDaGFuZ2VTZXRzJyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAgICcgICAgICAgICAgICAgICMgQ0RLIGJvb3RzdHJhcCBidWNrZXQgYWNjZXNzIChmb3IgY2hhbmdlc2V0IGNyZWF0aW9uKScsXG4gICAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkdldE9iamVjdCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOlB1dE9iamVjdCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkRlbGV0ZU9iamVjdCcsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOkxpc3RCdWNrZXQnLFxuICAgICAgICAnICAgICAgICAgICAgICAgIFJlc291cmNlOicsXG4gICAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSonXCIsXG4gICAgICAgIFwiICAgICAgICAgICAgICAgICAgLSAhU3ViICdhcm46YXdzOnMzOjo6Y2RrLSR7QVdTOjpBY2NvdW50SWR9LSR7QVdTOjpSZWdpb259LSovKidcIixcbiAgICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIHBhcmFtZXRlciBhY2Nlc3MnLFxuICAgICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICAgJyAgICAgICAgICAgICAgICAgIC0gc3NtOkdldFBhcmFtZXRlcnMnLFxuICAgICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyc0J5UGF0aCcsXG4gICAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAhU3ViICdhcm46YXdzOnNzbToke0FXUzo6UmVnaW9ufToke0FXUzo6QWNjb3VudElkfTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qJ1wiLFxuICAgICAgICAnICAgICAgICAgICAgICAjIElBTSBQYXNzUm9sZSBmb3IgQ0RLIG9wZXJhdGlvbnMnLFxuICAgICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgICAnICAgICAgICAgICAgICAgICAgLSBpYW06UGFzc1JvbGUnLFxuICAgICAgICBcIiAgICAgICAgICAgICAgICBSZXNvdXJjZTogJyonXCIsXG4gICAgICAgICcgICAgICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAgICcgICAgICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgICAgXCIgICAgICAgICAgICAgICAgICAgICdpYW06UGFzc2VkVG9TZXJ2aWNlJzogJ2Nsb3VkZm9ybWF0aW9uLmFtYXpvbmF3cy5jb20nXCIsXG4gICAgICAgICcnLFxuICAgICAgICAnT3V0cHV0czonLFxuICAgICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlQXJuOicsXG4gICAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAgICcgICAgVmFsdWU6ICFHZXRBdHQgQ2RrQ2hhbmdlc2V0Um9sZS5Bcm4nLFxuICAgICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAgICcnLFxuICAgICAgICAnICBDZGtDaGFuZ2VzZXRSb2xlTmFtZTonLFxuICAgICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICAgJyAgICBWYWx1ZTogIVJlZiBDZGtDaGFuZ2VzZXRSb2xlJyxcbiAgICAgICAgJyAgICBFeHBvcnQ6JyxcbiAgICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
128
+ _b = JSII_RTTI_SYMBOL_1;
129
+ CdkDiffIamTemplate[_b] = { fqn: "@jjrawlins/cdk-diff-pr-github-action.CdkDiffIamTemplate", version: "1.0.0" };
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2RrRGlmZklhbVRlbXBsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0Nka0RpZmZJYW1UZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUFrQztBQWNsQzs7O0dBR0c7QUFDSCxNQUFhLDJCQUEyQjtJQUN0Qzs7T0FFRztJQUNILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUF1QztRQUM3RCxNQUFNLEtBQUssR0FBRztZQUNaLHdDQUF3QztZQUN4QywrREFBK0Q7WUFDL0QsRUFBRTtZQUNGLGFBQWE7WUFDYixzQkFBc0I7WUFDdEIsa0JBQWtCO1lBQ2xCLDZGQUE2RjtZQUM3RixpQkFBaUIsS0FBSyxDQUFDLFdBQVcsR0FBRztZQUNyQyxFQUFFO1lBQ0YsWUFBWTtZQUNaLGtGQUFrRjtZQUNsRixxQkFBcUI7WUFDckIsMEJBQTBCO1lBQzFCLGlCQUFpQjtZQUNqQixtQkFBbUIsR0FBRyxLQUFLLENBQUMsUUFBUSxHQUFHLEdBQUc7WUFDMUMsaUNBQWlDO1lBQ2pDLCtCQUErQjtZQUMvQixvQkFBb0I7WUFDcEIsMkJBQTJCO1lBQzNCLHdCQUF3QjtZQUN4QiwyQ0FBMkM7WUFDM0Msb0NBQW9DO1lBQ3BDLHdCQUF3QjtZQUN4Qiw2QkFBNkI7WUFDN0Isd0NBQXdDLEdBQUcsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHO1lBQ2pFLGlCQUFpQjtZQUNqQixxREFBcUQ7WUFDckQsMkJBQTJCO1lBQzNCLG1DQUFtQztZQUNuQyx3QkFBd0I7WUFDeEIscURBQXFEO1lBQ3JELCtCQUErQjtZQUMvQix5QkFBeUI7WUFDekIsb0RBQW9EO1lBQ3BELHNEQUFzRDtZQUN0RCxvREFBb0Q7WUFDcEQsbURBQW1EO1lBQ25ELG1EQUFtRDtZQUNuRCwrQkFBK0I7WUFDL0Isc0VBQXNFO1lBQ3RFLCtCQUErQjtZQUMvQix5QkFBeUI7WUFDekIsa0NBQWtDO1lBQ2xDLGtDQUFrQztZQUNsQyxxQ0FBcUM7WUFDckMsbUNBQW1DO1lBQ25DLDJCQUEyQjtZQUMzQixnRkFBZ0Y7WUFDaEYsa0ZBQWtGO1lBQ2xGLGdEQUFnRDtZQUNoRCwrQkFBK0I7WUFDL0IseUJBQXlCO1lBQ3pCLHNDQUFzQztZQUN0Qyx1Q0FBdUM7WUFDdkMsNkNBQTZDO1lBQzdDLHlHQUF5RztZQUN6RyxpREFBaUQ7WUFDakQsK0JBQStCO1lBQy9CLHlCQUF5QjtZQUN6QixrQ0FBa0M7WUFDbEMsK0JBQStCO1lBQy9CLDRCQUE0QjtZQUM1QixpQ0FBaUM7WUFDakMsMkVBQTJFO1lBQzNFLEVBQUU7WUFDRixVQUFVO1lBQ1Ysd0JBQXdCO1lBQ3hCLGtEQUFrRDtZQUNsRCx5Q0FBeUM7WUFDekMsYUFBYTtZQUNiLDBEQUEwRDtZQUMxRCxFQUFFO1lBQ0YseUJBQXlCO1lBQ3pCLG1EQUFtRDtZQUNuRCxrQ0FBa0M7WUFDbEMsYUFBYTtZQUNiLDJEQUEyRDtTQUM1RCxDQUFDO1FBRUYsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxlQUF1QixxQ0FBcUM7UUFDdkYsT0FBTyw2Q0FBNkMsWUFBWSw4RUFBOEUsQ0FBQztJQUNqSixDQUFDOztBQTdGSCxrRUE4RkM7OztBQVlEOzs7OztHQUtHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDN0IsWUFBWSxLQUE4QjtRQUN4QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxJQUFJLHFDQUFxQyxDQUFDO1FBRTdFLHdDQUF3QztRQUN4QyxNQUFNLFFBQVEsR0FBRywyQkFBMkIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyRSxJQUFJLGlCQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekUsa0JBQWtCO1FBQ2xCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLDZCQUE2QixFQUFFO1lBQ25ELFdBQVcsRUFDVCw0SEFBNEg7WUFDOUgsV0FBVyxFQUFFLElBQUk7WUFDakIsSUFBSSxFQUFFLDJCQUEyQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztTQUNwRSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWZILGdEQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHRGaWxlIH0gZnJvbSAncHJvamVuJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgZ2VuZXJhdGluZyBDREsgRGlmZiBJQU0gdGVtcGxhdGVzIChubyBQcm9qZW4gZGVwZW5kZW5jeSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3JQcm9wcyB7XG4gIC8qKiBOYW1lIGZvciB0aGUgSUFNIHJvbGUgKi9cbiAgcmVhZG9ubHkgcm9sZU5hbWU6IHN0cmluZztcbiAgLyoqIEFSTiBvZiB0aGUgZXhpc3RpbmcgR2l0SHViIE9JREMgcm9sZSB0aGF0IGNhbiBhc3N1bWUgdGhpcyBjaGFuZ2VzZXQgcm9sZSAqL1xuICByZWFkb25seSBvaWRjUm9sZUFybjogc3RyaW5nO1xuICAvKiogUmVnaW9uIGZvciB0aGUgT0lEQyB0cnVzdCBjb25kaXRpb24gKi9cbiAgcmVhZG9ubHkgb2lkY1JlZ2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFB1cmUgZ2VuZXJhdG9yIGNsYXNzIGZvciBDREsgRGlmZiBJQU0gdGVtcGxhdGVzLlxuICogTm8gUHJvamVuIGRlcGVuZGVuY3kgLSBjYW4gYmUgdXNlZCBpbiBhbnkgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvciB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgQ2xvdWRGb3JtYXRpb24gSUFNIHRlbXBsYXRlIGFzIGEgWUFNTCBzdHJpbmcuXG4gICAqL1xuICBzdGF0aWMgZ2VuZXJhdGVUZW1wbGF0ZShwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgXCJBV1NUZW1wbGF0ZUZvcm1hdFZlcnNpb246ICcyMDEwLTA5LTA5J1wiLFxuICAgICAgXCJEZXNjcmlwdGlvbjogJ0lBTSByb2xlIGZvciBDREsgRGlmZiBTdGFjayBXb3JrZmxvdyBjb25zdHJ1Y3QnXCIsXG4gICAgICAnJyxcbiAgICAgICdQYXJhbWV0ZXJzOicsXG4gICAgICAnICBHaXRIdWJPSURDUm9sZUFybjonLFxuICAgICAgJyAgICBUeXBlOiBTdHJpbmcnLFxuICAgICAgXCIgICAgRGVzY3JpcHRpb246ICdBUk4gb2YgdGhlIGV4aXN0aW5nIEdpdEh1YiBPSURDIHJvbGUgdGhhdCBjYW4gYXNzdW1lIHRoaXMgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICBgICAgIERlZmF1bHQ6ICcke3Byb3BzLm9pZGNSb2xlQXJufSdgLFxuICAgICAgJycsXG4gICAgICAnUmVzb3VyY2VzOicsXG4gICAgICAnICAjIENsb3VkRm9ybWF0aW9uIENoYW5nZVNldCBSb2xlIC0gbWluaW1hbCBwZXJtaXNzaW9ucyBmb3IgY2hhbmdlc2V0IG9wZXJhdGlvbnMnLFxuICAgICAgJyAgQ2RrQ2hhbmdlc2V0Um9sZTonLFxuICAgICAgJyAgICBUeXBlOiBBV1M6OklBTTo6Um9sZScsXG4gICAgICAnICAgIFByb3BlcnRpZXM6JyxcbiAgICAgIFwiICAgICAgUm9sZU5hbWU6ICdcIiArIHByb3BzLnJvbGVOYW1lICsgXCInXCIsXG4gICAgICAnICAgICAgQXNzdW1lUm9sZVBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgVmVyc2lvbjogJzIwMTItMTAtMTcnXCIsXG4gICAgICAnICAgICAgICBTdGF0ZW1lbnQ6JyxcbiAgICAgICcgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICBQcmluY2lwYWw6JyxcbiAgICAgICcgICAgICAgICAgICAgIEFXUzogIVJlZiBHaXRIdWJPSURDUm9sZUFybicsXG4gICAgICAnICAgICAgICAgICAgQWN0aW9uOiBzdHM6QXNzdW1lUm9sZScsXG4gICAgICAnICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICBTdHJpbmdFcXVhbHM6JyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIGF3czpSZXF1ZXN0ZWRSZWdpb246ICdcIiArIHByb3BzLm9pZGNSZWdpb24gKyBcIidcIixcbiAgICAgICcgICAgICBQb2xpY2llczonLFxuICAgICAgJyAgICAgICAgLSBQb2xpY3lOYW1lOiBDbG91ZEZvcm1hdGlvbkNoYW5nZVNldEFjY2VzcycsXG4gICAgICAnICAgICAgICAgIFBvbGljeURvY3VtZW50OicsXG4gICAgICBcIiAgICAgICAgICAgIFZlcnNpb246ICcyMDEyLTEwLTE3J1wiLFxuICAgICAgJyAgICAgICAgICAgIFN0YXRlbWVudDonLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDbG91ZEZvcm1hdGlvbiBjaGFuZ2VzZXQgb3BlcmF0aW9ucycsXG4gICAgICAnICAgICAgICAgICAgICAtIEVmZmVjdDogQWxsb3cnLFxuICAgICAgJyAgICAgICAgICAgICAgICBBY3Rpb246JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIGNsb3VkZm9ybWF0aW9uOkNyZWF0ZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZXNjcmliZUNoYW5nZVNldCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBjbG91ZGZvcm1hdGlvbjpEZWxldGVDaGFuZ2VTZXQnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246TGlzdENoYW5nZVNldHMnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gY2xvdWRmb3JtYXRpb246RGVzY3JpYmVTdGFja3MnLFxuICAgICAgXCIgICAgICAgICAgICAgICAgUmVzb3VyY2U6ICcqJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIGJ1Y2tldCBhY2Nlc3MgKGZvciBjaGFuZ2VzZXQgY3JlYXRpb24pJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6R2V0T2JqZWN0JyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHMzOlB1dE9iamVjdCcsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzMzpEZWxldGVPYmplY3QnLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gczM6TGlzdEJ1Y2tldCcsXG4gICAgICAnICAgICAgICAgICAgICAgIFJlc291cmNlOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgIC0gIVN1YiAnYXJuOmF3czpzMzo6OmNkay0ke0FXUzo6QWNjb3VudElkfS0ke0FXUzo6UmVnaW9ufS0qJ1wiLFxuICAgICAgXCIgICAgICAgICAgICAgICAgICAtICFTdWIgJ2Fybjphd3M6czM6OjpjZGstJHtBV1M6OkFjY291bnRJZH0tJHtBV1M6OlJlZ2lvbn0tKi8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBDREsgYm9vdHN0cmFwIHBhcmFtZXRlciBhY2Nlc3MnLFxuICAgICAgJyAgICAgICAgICAgICAgLSBFZmZlY3Q6IEFsbG93JyxcbiAgICAgICcgICAgICAgICAgICAgICAgQWN0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgLSBzc206R2V0UGFyYW1ldGVyJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzJyxcbiAgICAgICcgICAgICAgICAgICAgICAgICAtIHNzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAhU3ViICdhcm46YXdzOnNzbToke0FXUzo6UmVnaW9ufToke0FXUzo6QWNjb3VudElkfTpwYXJhbWV0ZXIvY2RrLWJvb3RzdHJhcC8qJ1wiLFxuICAgICAgJyAgICAgICAgICAgICAgIyBJQU0gUGFzc1JvbGUgZm9yIENESyBvcGVyYXRpb25zJyxcbiAgICAgICcgICAgICAgICAgICAgIC0gRWZmZWN0OiBBbGxvdycsXG4gICAgICAnICAgICAgICAgICAgICAgIEFjdGlvbjonLFxuICAgICAgJyAgICAgICAgICAgICAgICAgIC0gaWFtOlBhc3NSb2xlJyxcbiAgICAgIFwiICAgICAgICAgICAgICAgIFJlc291cmNlOiAnKidcIixcbiAgICAgICcgICAgICAgICAgICAgICAgQ29uZGl0aW9uOicsXG4gICAgICAnICAgICAgICAgICAgICAgICAgU3RyaW5nRXF1YWxzOicsXG4gICAgICBcIiAgICAgICAgICAgICAgICAgICAgJ2lhbTpQYXNzZWRUb1NlcnZpY2UnOiAnY2xvdWRmb3JtYXRpb24uYW1hem9uYXdzLmNvbSdcIixcbiAgICAgICcnLFxuICAgICAgJ091dHB1dHM6JyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVBcm46JyxcbiAgICAgIFwiICAgIERlc2NyaXB0aW9uOiAnQVJOIG9mIHRoZSBDREsgY2hhbmdlc2V0IHJvbGUnXCIsXG4gICAgICAnICAgIFZhbHVlOiAhR2V0QXR0IENka0NoYW5nZXNldFJvbGUuQXJuJyxcbiAgICAgICcgICAgRXhwb3J0OicsXG4gICAgICBcIiAgICAgIE5hbWU6ICFTdWIgJyR7QVdTOjpTdGFja05hbWV9LUNka0NoYW5nZXNldFJvbGVBcm4nXCIsXG4gICAgICAnJyxcbiAgICAgICcgIENka0NoYW5nZXNldFJvbGVOYW1lOicsXG4gICAgICBcIiAgICBEZXNjcmlwdGlvbjogJ05hbWUgb2YgdGhlIENESyBjaGFuZ2VzZXQgcm9sZSdcIixcbiAgICAgICcgICAgVmFsdWU6ICFSZWYgQ2RrQ2hhbmdlc2V0Um9sZScsXG4gICAgICAnICAgIEV4cG9ydDonLFxuICAgICAgXCIgICAgICBOYW1lOiAhU3ViICcke0FXUzo6U3RhY2tOYW1lfS1DZGtDaGFuZ2VzZXRSb2xlTmFtZSdcIixcbiAgICBdO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHRoZSBBV1MgQ0xJIGRlcGxveSBjb21tYW5kIGZvciB0aGUgSUFNIHRlbXBsYXRlLlxuICAgKi9cbiAgc3RhdGljIGdlbmVyYXRlRGVwbG95Q29tbWFuZCh0ZW1wbGF0ZVBhdGg6IHN0cmluZyA9ICdjZGstZGlmZi13b3JrZmxvdy1pYW0tdGVtcGxhdGUueWFtbCcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlcGxveSAtLXRlbXBsYXRlLWZpbGUgJHt0ZW1wbGF0ZVBhdGh9IC0tc3RhY2stbmFtZSBjZGstZGlmZi13b3JrZmxvdy1pYW0tcm9sZSAtLWNhcGFiaWxpdGllcyBDQVBBQklMSVRZX05BTUVEX0lBTWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIFByb2plbi1pbnRlZ3JhdGVkIENESyBEaWZmIElBTSB0ZW1wbGF0ZSBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtEaWZmSWFtVGVtcGxhdGVQcm9wcyBleHRlbmRzIENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvclByb3BzIHtcbiAgLyoqIFByb2plbiBwcm9qZWN0IGluc3RhbmNlICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IGFueTtcbiAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgdGVtcGxhdGUgZmlsZSAoZGVmYXVsdDogJ2Nkay1kaWZmLXdvcmtmbG93LWlhbS10ZW1wbGF0ZS55YW1sJykgKi9cbiAgcmVhZG9ubHkgb3V0cHV0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9qZW4gY29uc3RydWN0IHRoYXQgZW1pdHMgYSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZSB3aXRoIG1pbmltYWwgSUFNIHBlcm1pc3Npb25zXG4gKiBmb3IgdGhlIENESyBEaWZmIFN0YWNrIFdvcmtmbG93LlxuICpcbiAqIEZvciBub24tUHJvamVuIHByb2plY3RzLCB1c2UgYENka0RpZmZJYW1UZW1wbGF0ZUdlbmVyYXRvcmAgZGlyZWN0bHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDZGtEaWZmSWFtVGVtcGxhdGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wczogQ2RrRGlmZklhbVRlbXBsYXRlUHJvcHMpIHtcbiAgICBjb25zdCBvdXRwdXRQYXRoID0gcHJvcHMub3V0cHV0UGF0aCA/PyAnY2RrLWRpZmYtd29ya2Zsb3ctaWFtLXRlbXBsYXRlLnlhbWwnO1xuXG4gICAgLy8gR2VuZXJhdGUgdGVtcGxhdGUgdXNpbmcgdGhlIGdlbmVyYXRvclxuICAgIGNvbnN0IHRlbXBsYXRlID0gQ2RrRGlmZklhbVRlbXBsYXRlR2VuZXJhdG9yLmdlbmVyYXRlVGVtcGxhdGUocHJvcHMpO1xuICAgIG5ldyBUZXh0RmlsZShwcm9wcy5wcm9qZWN0LCBvdXRwdXRQYXRoLCB7IGxpbmVzOiB0ZW1wbGF0ZS5zcGxpdCgnXFxuJykgfSk7XG5cbiAgICAvLyBBZGQgZGVwbG95IHRhc2tcbiAgICBwcm9wcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveS1jZGtkaWZmLWlhbS10ZW1wbGF0ZScsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVwbG95IHRoZSBDREsgRGlmZiBJQU0gdGVtcGxhdGUgdmlhIENsb3VkRm9ybWF0aW9uIChhY2NlcHRzIGV4dHJhIEFXUyBDTEkgYXJncywgZS5nLiwgLS1wYXJhbWV0ZXItb3ZlcnJpZGVzIEtleT1WYWx1ZS4uLiknLFxuICAgICAgcmVjZWl2ZUFyZ3M6IHRydWUsXG4gICAgICBleGVjOiBDZGtEaWZmSWFtVGVtcGxhdGVHZW5lcmF0b3IuZ2VuZXJhdGVEZXBsb3lDb21tYW5kKG91dHB1dFBhdGgpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=