@fjall/components-infrastructure 0.86.1 → 0.87.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +3 -3
  2. package/dist/lib/app.d.ts +166 -6
  3. package/dist/lib/app.js +212 -20
  4. package/dist/lib/aspects/resourceInventory.d.ts +4 -4
  5. package/dist/lib/aspects/resourceInventory.js +3 -3
  6. package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
  7. package/dist/lib/config/aws/identityCenter.js +1 -5
  8. package/dist/lib/config/aws/organisation.js +1 -4
  9. package/dist/lib/index.d.ts +1 -0
  10. package/dist/lib/index.js +7 -1
  11. package/dist/lib/patterns/aws/buildkite.js +3 -2
  12. package/dist/lib/patterns/aws/cdn.d.ts +164 -0
  13. package/dist/lib/patterns/aws/cdn.js +264 -0
  14. package/dist/lib/patterns/aws/compute.d.ts +278 -59
  15. package/dist/lib/patterns/aws/compute.js +384 -188
  16. package/dist/lib/patterns/aws/connections.d.ts +46 -0
  17. package/dist/lib/patterns/aws/connections.js +159 -0
  18. package/dist/lib/patterns/aws/database.d.ts +124 -11
  19. package/dist/lib/patterns/aws/database.js +188 -66
  20. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  21. package/dist/lib/patterns/aws/index.d.ts +3 -0
  22. package/dist/lib/patterns/aws/index.js +4 -1
  23. package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
  24. package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
  25. package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
  26. package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
  27. package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
  28. package/dist/lib/patterns/aws/interfaces/database.js +65 -0
  29. package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
  30. package/dist/lib/patterns/aws/interfaces/index.js +49 -0
  31. package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
  32. package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
  33. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
  34. package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
  35. package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
  36. package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
  37. package/dist/lib/patterns/aws/messaging.d.ts +183 -0
  38. package/dist/lib/patterns/aws/messaging.js +239 -0
  39. package/dist/lib/patterns/aws/network.js +4 -4
  40. package/dist/lib/patterns/aws/pattern.d.ts +67 -0
  41. package/dist/lib/patterns/aws/pattern.js +69 -0
  42. package/dist/lib/patterns/aws/payload.d.ts +87 -0
  43. package/dist/lib/patterns/aws/payload.js +526 -0
  44. package/dist/lib/patterns/aws/storage.d.ts +127 -15
  45. package/dist/lib/patterns/aws/storage.js +234 -38
  46. package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
  47. package/dist/lib/resources/aws/backup/backupVault.js +1 -2
  48. package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
  49. package/dist/lib/resources/aws/base/awsStack.js +1 -7
  50. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
  51. package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
  52. package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/cdn/index.js +18 -0
  54. package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
  55. package/dist/lib/resources/aws/compute/ec2.js +33 -6
  56. package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
  57. package/dist/lib/resources/aws/compute/ecs.js +31 -115
  58. package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
  59. package/dist/lib/resources/aws/compute/lambda.js +209 -32
  60. package/dist/lib/resources/aws/database/database.js +1 -1
  61. package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
  62. package/dist/lib/resources/aws/database/dynamodb.js +181 -0
  63. package/dist/lib/resources/aws/database/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/database/index.js +2 -1
  65. package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
  66. package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
  67. package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
  68. package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
  69. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
  70. package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
  71. package/dist/lib/resources/aws/index.d.ts +2 -0
  72. package/dist/lib/resources/aws/index.js +3 -1
  73. package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
  74. package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
  75. package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
  76. package/dist/lib/resources/aws/messaging/index.js +20 -0
  77. package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
  78. package/dist/lib/resources/aws/messaging/sns.js +70 -0
  79. package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
  80. package/dist/lib/resources/aws/messaging/sqs.js +231 -0
  81. package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
  82. package/dist/lib/resources/aws/messaging/utils.js +7 -0
  83. package/dist/lib/resources/aws/networking/ipam.js +1 -2
  84. package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
  85. package/dist/lib/resources/aws/networking/vpc.js +1 -2
  86. package/dist/lib/resources/aws/storage/ecr.js +8 -5
  87. package/dist/lib/resources/aws/storage/s3.js +1 -2
  88. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  89. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  90. package/dist/lib/utils/getConfig.js +3 -2
  91. package/dist/lib/utils/index.d.ts +1 -0
  92. package/dist/lib/utils/index.js +2 -1
  93. package/dist/lib/utils/manifestWriter.d.ts +174 -0
  94. package/dist/lib/utils/manifestWriter.js +233 -0
  95. package/dist/lib/utils/standardTagsAspect.js +1 -8
  96. package/dist/lib/utils/validationLogger.d.ts +34 -0
  97. package/dist/lib/utils/validationLogger.js +83 -0
  98. package/package.json +6 -3
  99. package/dist/lib/__tests__/setup.d.ts +0 -48
  100. package/dist/lib/__tests__/setup.js +0 -1
  101. package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
  102. package/dist/lib/patterns/aws/cicdRole.js +0 -68
  103. package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
  104. package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
  105. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
  106. package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
  107. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
  108. package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
  109. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
  110. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
  111. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
  112. package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
@@ -1,17 +1,57 @@
1
1
  import { Construct } from "constructs";
2
- import { type IBucket } from "aws-cdk-lib/aws-s3";
2
+ import { type IBucket, type EventType, type IBucketNotificationDestination, type NotificationKeyFilter } from "aws-cdk-lib/aws-s3";
3
+ import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
4
+ import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
3
5
  import type App from "../../app";
4
- import { type BackupVaultTier } from "../../resources/aws/storage";
5
- type S3BucketType = "private" | "website" | "publicRead";
6
+ import { S3Bucket, S3WebsiteBucket, S3PublicReadBucket, type BackupVaultTier } from "../../resources/aws/storage";
7
+ import { type StorageType, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage } from "./interfaces/storage.js";
8
+ import { type IStorageConnector } from "./interfaces/connector.js";
9
+ export { type StorageType, type IStorage, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage, type AnyStorage, isPrivateStorage, isWebsiteStorage, isPublicStorage } from "./interfaces/storage.js";
10
+ export type S3BucketType = "private" | "website" | "publicRead";
11
+ export interface StorageTypeConfig {
12
+ supportsPublicRead: boolean;
13
+ supportsWebsiteHosting: boolean;
14
+ defaultPublicAccess: boolean;
15
+ }
16
+ export declare const STORAGE_TYPE_CONFIG: Record<S3BucketType, StorageTypeConfig>;
17
+ export declare function getStorageTypeConfig(type: S3BucketType): StorageTypeConfig;
6
18
  type BaseS3Props = {
7
19
  backupVaultTier?: BackupVaultTier;
8
20
  versioned?: boolean;
9
21
  encryption?: "AES256" | "KMS";
10
22
  kmsKeyArn?: string;
11
23
  };
24
+ /**
25
+ * Configuration for automatic asset deployment to S3.
26
+ * When provided, creates a BucketDeployment that uploads files during CDK deploy.
27
+ */
28
+ export interface S3DeploymentConfig {
29
+ /** Path to the asset directory (relative to CDK app root) */
30
+ source: string;
31
+ /**
32
+ * Whether to remove files from bucket that aren't in the source.
33
+ * Default: true for static assets, false for caches that grow at runtime.
34
+ */
35
+ prune?: boolean;
36
+ /**
37
+ * Cache control settings for uploaded files.
38
+ * If not provided, no cache headers are set.
39
+ */
40
+ cacheControl?: {
41
+ /** Max age in seconds (e.g., 31536000 for 1 year) */
42
+ maxAge?: number;
43
+ /** Mark as immutable (browser won't revalidate) */
44
+ immutable?: boolean;
45
+ };
46
+ }
12
47
  export interface PrivateS3Props extends BaseS3Props {
13
48
  bucketType: "private";
14
49
  publicReadAccess?: boolean;
50
+ /**
51
+ * Optional deployment configuration.
52
+ * When provided, automatically uploads files to the bucket during CDK deploy.
53
+ */
54
+ deployment?: S3DeploymentConfig;
15
55
  }
16
56
  export interface WebsiteS3Props extends BaseS3Props {
17
57
  bucketType: "website";
@@ -26,23 +66,95 @@ export interface PublicReadS3Props extends BaseS3Props {
26
66
  bucketType: "publicRead";
27
67
  }
28
68
  export type IS3Props = PrivateS3Props | WebsiteS3Props | PublicReadS3Props;
69
+ /**
70
+ * Factory for creating S3 storage resources with type-safe return types.
71
+ *
72
+ * @example
73
+ * // Private bucket
74
+ * const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
75
+ * assets.grantPublicAccess(); // ✓ Available on PrivateStorage
76
+ *
77
+ * // Website bucket
78
+ * const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
79
+ * site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
80
+ */
29
81
  export declare class StorageFactory {
30
- static build<T extends IS3Props>(id: string, props: T): (app: App, scope: Construct) => S3Storage;
82
+ /** Build a private storage bucket */
83
+ static build(id: string, props: PrivateS3Props): (app: App, scope: Construct) => PrivateStorage;
84
+ /** Build a website storage bucket */
85
+ static build(id: string, props: WebsiteS3Props): (app: App, scope: Construct) => WebsiteStorage;
86
+ /** Build a public read storage bucket */
87
+ static build(id: string, props: PublicReadS3Props): (app: App, scope: Construct) => PublicStorage;
31
88
  }
32
- export declare class S3Storage extends Construct {
33
- id: string;
34
- scope: Construct;
35
- private bucket;
36
- private bucketType;
89
+ /**
90
+ * Base S3 storage class.
91
+ * Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
92
+ */
93
+ declare abstract class S3StorageBase extends Construct implements IStorageConnector {
94
+ readonly id: string;
95
+ readonly scope: Construct;
96
+ /** The type of storage resource. Used for runtime type narrowing. */
97
+ abstract readonly storageType: StorageType;
98
+ /** The connector type for unified connection processing. */
99
+ readonly connectorType: "storage";
100
+ protected bucket: S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
101
+ protected _bucketType: S3BucketType;
37
102
  constructor(scope: Construct, id: string, props: IS3Props);
38
- addS3Bucket(props: IS3Props): void;
39
- private addPrivateBucket;
40
- private addWebsiteBucket;
41
- private addPublicReadBucket;
42
- private addOutputs;
103
+ protected initialisePrivateBucket(props: PrivateS3Props): void;
104
+ protected initialiseWebsiteBucket(props: WebsiteS3Props): void;
105
+ protected initialisePublicReadBucket(props: PublicReadS3Props): void;
106
+ protected addOutputs(): void;
43
107
  getBucket(): IBucket;
44
108
  getBucketName(): string;
45
109
  getBucketArn(): string;
46
110
  getBucketType(): S3BucketType;
111
+ getBucketDomainName(): string;
112
+ getBucketRegionalDomainName(): string;
113
+ getS3Bucket(): S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
114
+ grantRead(grantee: IGrantable): Grant;
115
+ grantWrite(grantee: IGrantable): Grant;
116
+ grantReadWrite(grantee: IGrantable): Grant;
117
+ grantDelete(grantee: IGrantable): Grant;
118
+ grantPut(grantee: IGrantable): Grant;
119
+ addEventNotification(event: EventType, dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
120
+ addObjectCreatedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
121
+ addObjectRemovedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
122
+ }
123
+ /**
124
+ * Private S3 storage.
125
+ * Standard bucket with optional encryption and versioning.
126
+ */
127
+ export declare class PrivateStorage extends S3StorageBase implements IPrivateStorage {
128
+ readonly storageType: "private";
129
+ private _deployment?;
130
+ constructor(scope: Construct, id: string, props: PrivateS3Props);
131
+ private createDeployment;
132
+ /**
133
+ * Grant public access to objects under a prefix.
134
+ * Use with caution - makes objects publicly readable.
135
+ */
136
+ grantPublicAccess(...keyPrefix: string[]): Grant;
137
+ /**
138
+ * Get the BucketDeployment construct if one was created.
139
+ * Returns undefined if no deployment was configured.
140
+ */
141
+ getDeployment(): BucketDeployment | undefined;
142
+ }
143
+ /**
144
+ * Website S3 storage.
145
+ * Bucket configured for static website hosting.
146
+ */
147
+ export declare class WebsiteStorage extends S3StorageBase implements IWebsiteStorage {
148
+ readonly storageType: "website";
149
+ constructor(scope: Construct, id: string, props: WebsiteS3Props);
150
+ /** Get the website URL. */
151
+ getWebsiteUrl(): string;
152
+ }
153
+ /**
154
+ * Public read S3 storage.
155
+ * Bucket with public read access enabled.
156
+ */
157
+ export declare class PublicStorage extends S3StorageBase implements IPublicStorage {
158
+ readonly storageType: "publicRead";
159
+ constructor(scope: Construct, id: string, props: PublicReadS3Props);
47
160
  }
48
- export {};
@@ -1,83 +1,173 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.S3Storage = exports.StorageFactory = void 0;
3
+ exports.PublicStorage = exports.WebsiteStorage = exports.PrivateStorage = exports.StorageFactory = exports.STORAGE_TYPE_CONFIG = exports.isPublicStorage = exports.isWebsiteStorage = exports.isPrivateStorage = void 0;
4
+ exports.getStorageTypeConfig = getStorageTypeConfig;
4
5
  const constructs_1 = require("constructs");
6
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
8
+ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
5
9
  const aws_cdk_lib_1 = require("aws-cdk-lib");
6
10
  const storage_1 = require("../../resources/aws/storage");
11
+ const validationLogger_js_1 = require("../../utils/validationLogger.js");
12
+ // Re-export interfaces and type guards
13
+ var storage_js_1 = require("./interfaces/storage.js");
14
+ Object.defineProperty(exports, "isPrivateStorage", { enumerable: true, get: function () { return storage_js_1.isPrivateStorage; } });
15
+ Object.defineProperty(exports, "isWebsiteStorage", { enumerable: true, get: function () { return storage_js_1.isWebsiteStorage; } });
16
+ Object.defineProperty(exports, "isPublicStorage", { enumerable: true, get: function () { return storage_js_1.isPublicStorage; } });
17
+ function toBucketEncryption(encryption) {
18
+ if (!encryption)
19
+ return undefined;
20
+ return encryption === "AES256"
21
+ ? aws_s3_1.BucketEncryption.S3_MANAGED
22
+ : aws_s3_1.BucketEncryption.KMS;
23
+ }
24
+ function toHttpMethod(method) {
25
+ const methodMap = {
26
+ GET: aws_s3_1.HttpMethods.GET,
27
+ PUT: aws_s3_1.HttpMethods.PUT,
28
+ POST: aws_s3_1.HttpMethods.POST,
29
+ DELETE: aws_s3_1.HttpMethods.DELETE,
30
+ HEAD: aws_s3_1.HttpMethods.HEAD
31
+ };
32
+ return methodMap[method] ?? aws_s3_1.HttpMethods.GET;
33
+ }
34
+ function toCorsRules(cors) {
35
+ if (!cors)
36
+ return undefined;
37
+ return cors.map((rule) => ({
38
+ allowedOrigins: rule.allowedOrigins,
39
+ allowedMethods: rule.allowedMethods.map(toHttpMethod)
40
+ }));
41
+ }
42
+ exports.STORAGE_TYPE_CONFIG = {
43
+ private: {
44
+ supportsPublicRead: true,
45
+ supportsWebsiteHosting: false,
46
+ defaultPublicAccess: false
47
+ },
48
+ website: {
49
+ supportsPublicRead: true,
50
+ supportsWebsiteHosting: true,
51
+ defaultPublicAccess: true
52
+ },
53
+ publicRead: {
54
+ supportsPublicRead: true,
55
+ supportsWebsiteHosting: false,
56
+ defaultPublicAccess: true
57
+ }
58
+ };
59
+ function getStorageTypeConfig(type) {
60
+ return exports.STORAGE_TYPE_CONFIG[type];
61
+ }
62
+ /**
63
+ * Validates storage props and logs warnings for ignored or misconfigured options.
64
+ * These checks help catch issues when props come from dynamic sources where
65
+ * TypeScript's compile-time checks may not apply.
66
+ */
67
+ function validateStorageProps(props) {
68
+ // Validate encryption: KMS requires kmsKeyArn
69
+ if (props.encryption === "KMS" && !props.kmsKeyArn) {
70
+ validationLogger_js_1.FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
71
+ "The bucket will use the default AWS managed key.");
72
+ }
73
+ // Warn about kmsKeyArn when encryption is not KMS
74
+ if (props.kmsKeyArn && props.encryption !== "KMS") {
75
+ validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
76
+ "The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
77
+ }
78
+ // Website-only options on non-website buckets
79
+ // Note: Using bucketType as discriminator with "type" alias for the helper
80
+ const propsWithType = { ...props, type: props.bucketType };
81
+ (0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["websiteIndexDocument", "websiteErrorDocument", "cors"], "website", "website bucket");
82
+ // Private-only options on non-private buckets
83
+ (0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["publicReadAccess"], "private", "private bucket");
84
+ }
85
+ /**
86
+ * Factory for creating S3 storage resources with type-safe return types.
87
+ *
88
+ * @example
89
+ * // Private bucket
90
+ * const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
91
+ * assets.grantPublicAccess(); // ✓ Available on PrivateStorage
92
+ *
93
+ * // Website bucket
94
+ * const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
95
+ * site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
96
+ */
7
97
  class StorageFactory {
98
+ /** Implementation - returns appropriate storage type based on props */
8
99
  static build(id, props) {
9
- return (app, scope) => {
10
- return new S3Storage(scope, id, props);
100
+ return (_app, scope) => {
101
+ validateStorageProps(props);
102
+ switch (props.bucketType) {
103
+ case "private":
104
+ return new PrivateStorage(scope, id, props);
105
+ case "website":
106
+ return new WebsiteStorage(scope, id, props);
107
+ case "publicRead":
108
+ return new PublicStorage(scope, id, props);
109
+ default: {
110
+ const _exhaustive = props;
111
+ throw new Error(`Unsupported bucket type: ${_exhaustive.bucketType}`);
112
+ }
113
+ }
11
114
  };
12
115
  }
13
116
  }
14
117
  exports.StorageFactory = StorageFactory;
15
- class S3Storage extends constructs_1.Construct {
118
+ /**
119
+ * Base S3 storage class.
120
+ * Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
121
+ */
122
+ class S3StorageBase extends constructs_1.Construct {
16
123
  constructor(scope, id, props) {
17
124
  super(scope, id);
125
+ /** The connector type for unified connection processing. */
126
+ this.connectorType = "storage";
18
127
  this.id = id;
19
128
  this.scope = scope;
20
- this.bucketType = props.bucketType;
21
- this.addS3Bucket(props);
22
- }
23
- addS3Bucket(props) {
24
- switch (props.bucketType) {
25
- case "private":
26
- this.addPrivateBucket(props);
27
- break;
28
- case "website":
29
- this.addWebsiteBucket(props);
30
- break;
31
- case "publicRead":
32
- this.addPublicReadBucket(props);
33
- break;
34
- default: {
35
- // Exhaustiveness check
36
- const _exhaustive = props;
37
- throw new Error(`Unsupported S3 bucket type ${props.bucketType}`);
38
- }
39
- }
129
+ this._bucketType = props.bucketType;
40
130
  }
41
- addPrivateBucket(props) {
131
+ initialisePrivateBucket(props) {
132
+ const encryptionKey = props.kmsKeyArn
133
+ ? aws_kms_1.Key.fromKeyArn(this, `${this.id}KmsKey`, props.kmsKeyArn)
134
+ : undefined;
42
135
  this.bucket = new storage_1.S3Bucket(this, `${this.id}Bucket`, {
43
136
  backupVaultTier: props.backupVaultTier,
44
137
  versioned: props.versioned,
45
- encryption: props.encryption,
46
- encryptionKey: props.kmsKeyArn ? undefined : undefined, // KMS key handling
138
+ encryption: toBucketEncryption(props.encryption),
139
+ encryptionKey,
47
140
  publicReadAccess: props.publicReadAccess
48
141
  });
49
142
  this.addOutputs();
50
143
  }
51
- addWebsiteBucket(props) {
144
+ initialiseWebsiteBucket(props) {
52
145
  this.bucket = new storage_1.S3WebsiteBucket(this, `${this.id}Bucket`, {
53
146
  backupVaultTier: props.backupVaultTier,
54
147
  versioned: props.versioned,
55
- encryption: props.encryption,
148
+ encryption: toBucketEncryption(props.encryption),
56
149
  websiteIndexDocument: props.websiteIndexDocument,
57
150
  websiteErrorDocument: props.websiteErrorDocument,
58
- cors: props.cors
151
+ cors: toCorsRules(props.cors)
59
152
  });
60
153
  this.addOutputs();
61
154
  }
62
- addPublicReadBucket(props) {
155
+ initialisePublicReadBucket(props) {
63
156
  this.bucket = new storage_1.S3PublicReadBucket(this, `${this.id}Bucket`, {
64
157
  backupVaultTier: props.backupVaultTier,
65
158
  versioned: props.versioned,
66
- encryption: props.encryption
159
+ encryption: toBucketEncryption(props.encryption)
67
160
  });
68
161
  this.addOutputs();
69
162
  }
70
163
  addOutputs() {
71
164
  const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
72
- // Export bucket ARN for monitoring
73
- // Use stack name prefix to ensure uniqueness across apps in same region
74
165
  new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketArn`, {
75
166
  key: `${stackName}${this.id}BucketArn`,
76
167
  exportName: `${stackName}${this.id}BucketArn`,
77
168
  value: this.bucket.bucketArn,
78
169
  description: `S3 Bucket ARN for ${this.id}`
79
170
  });
80
- // Export bucket name for convenience
81
171
  new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketName`, {
82
172
  key: `${stackName}${this.id}BucketName`,
83
173
  exportName: `${stackName}${this.id}BucketName`,
@@ -95,8 +185,114 @@ class S3Storage extends constructs_1.Construct {
95
185
  return this.bucket.bucketArn;
96
186
  }
97
187
  getBucketType() {
98
- return this.bucketType;
188
+ return this._bucketType;
189
+ }
190
+ getBucketDomainName() {
191
+ return this.bucket.bucketDomainName;
192
+ }
193
+ getBucketRegionalDomainName() {
194
+ return this.bucket.bucketRegionalDomainName;
195
+ }
196
+ getS3Bucket() {
197
+ return this.bucket;
198
+ }
199
+ grantRead(grantee) {
200
+ return this.bucket.grantRead(grantee);
201
+ }
202
+ grantWrite(grantee) {
203
+ return this.bucket.grantWrite(grantee);
204
+ }
205
+ grantReadWrite(grantee) {
206
+ return this.bucket.grantReadWrite(grantee);
207
+ }
208
+ grantDelete(grantee) {
209
+ return this.bucket.grantDelete(grantee);
210
+ }
211
+ grantPut(grantee) {
212
+ return this.bucket.grantPut(grantee);
213
+ }
214
+ addEventNotification(event, dest, ...filters) {
215
+ this.bucket.addEventNotification(event, dest, ...filters);
216
+ }
217
+ addObjectCreatedNotification(dest, ...filters) {
218
+ this.bucket.addObjectCreatedNotification(dest, ...filters);
219
+ }
220
+ addObjectRemovedNotification(dest, ...filters) {
221
+ this.bucket.addObjectRemovedNotification(dest, ...filters);
222
+ }
223
+ }
224
+ /**
225
+ * Private S3 storage.
226
+ * Standard bucket with optional encryption and versioning.
227
+ */
228
+ class PrivateStorage extends S3StorageBase {
229
+ constructor(scope, id, props) {
230
+ super(scope, id, props);
231
+ this.storageType = "private";
232
+ this.initialisePrivateBucket(props);
233
+ if (props.deployment) {
234
+ this._deployment = this.createDeployment(id, props.deployment);
235
+ }
236
+ }
237
+ createDeployment(id, config) {
238
+ const cacheControlHeaders = [];
239
+ if (config.cacheControl?.maxAge !== undefined) {
240
+ cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
241
+ }
242
+ if (config.cacheControl?.immutable) {
243
+ cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
244
+ }
245
+ return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
246
+ sources: [aws_s3_deployment_1.Source.asset(config.source)],
247
+ destinationBucket: this.bucket,
248
+ prune: config.prune ?? true,
249
+ ...(cacheControlHeaders.length > 0 && {
250
+ cacheControl: cacheControlHeaders
251
+ })
252
+ });
253
+ }
254
+ /**
255
+ * Grant public access to objects under a prefix.
256
+ * Use with caution - makes objects publicly readable.
257
+ */
258
+ grantPublicAccess(...keyPrefix) {
259
+ return this.bucket.grantPublicAccess(...keyPrefix);
260
+ }
261
+ /**
262
+ * Get the BucketDeployment construct if one was created.
263
+ * Returns undefined if no deployment was configured.
264
+ */
265
+ getDeployment() {
266
+ return this._deployment;
267
+ }
268
+ }
269
+ exports.PrivateStorage = PrivateStorage;
270
+ /**
271
+ * Website S3 storage.
272
+ * Bucket configured for static website hosting.
273
+ */
274
+ class WebsiteStorage extends S3StorageBase {
275
+ constructor(scope, id, props) {
276
+ super(scope, id, props);
277
+ this.storageType = "website";
278
+ this.initialiseWebsiteBucket(props);
279
+ }
280
+ /** Get the website URL. */
281
+ getWebsiteUrl() {
282
+ return this.bucket.bucketWebsiteUrl ?? "";
283
+ }
284
+ }
285
+ exports.WebsiteStorage = WebsiteStorage;
286
+ /**
287
+ * Public read S3 storage.
288
+ * Bucket with public read access enabled.
289
+ */
290
+ class PublicStorage extends S3StorageBase {
291
+ constructor(scope, id, props) {
292
+ super(scope, id, props);
293
+ this.storageType = "publicRead";
294
+ this.initialisePublicReadBucket(props);
99
295
  }
100
296
  }
101
- exports.S3Storage = S3Storage;
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsNkNBQStDO0FBRy9DLHlEQUtxQztBQWdDckMsTUFBYSxjQUFjO0lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQXFCLEVBQVUsRUFBRSxLQUFRO1FBQ25ELE9BQU8sQ0FBQyxHQUFRLEVBQUUsS0FBZ0IsRUFBRSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFORCx3Q0FNQztBQUVELE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBT3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBRW5DLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFlO1FBQ3pCLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztn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QyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUF6R0QsOEJBeUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHR5cGUgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIFMzQnVja2V0LFxuICBTM1dlYnNpdGVCdWNrZXQsXG4gIFMzUHVibGljUmVhZEJ1Y2tldCxcbiAgdHlwZSBCYWNrdXBWYXVsdFRpZXJcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuXG50eXBlIFMzQnVja2V0VHlwZSA9IFwicHJpdmF0ZVwiIHwgXCJ3ZWJzaXRlXCIgfCBcInB1YmxpY1JlYWRcIjtcblxudHlwZSBCYXNlUzNQcm9wcyA9IHtcbiAgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVmF1bHRUaWVyO1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIGttc0tleUFybj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZVMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwicHJpdmF0ZVwiO1xuICBwdWJsaWNSZWFkQWNjZXNzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJzaXRlUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJ3ZWJzaXRlXCI7XG4gIHdlYnNpdGVJbmRleERvY3VtZW50Pzogc3RyaW5nO1xuICB3ZWJzaXRlRXJyb3JEb2N1bWVudD86IHN0cmluZztcbiAgY29ycz86IEFycmF5PHtcbiAgICBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107XG4gICAgYWxsb3dlZE1ldGhvZHM6IHN0cmluZ1tdO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNSZWFkUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJwdWJsaWNSZWFkXCI7XG59XG5cbmV4cG9ydCB0eXBlIElTM1Byb3BzID0gUHJpdmF0ZVMzUHJvcHMgfCBXZWJzaXRlUzNQcm9wcyB8IFB1YmxpY1JlYWRTM1Byb3BzO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIElTM1Byb3BzPihpZDogc3RyaW5nLCBwcm9wczogVCkge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUzNTdG9yYWdlKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFMzU3RvcmFnZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgc2NvcGU6IENvbnN0cnVjdDtcblxuICBwcml2YXRlIGJ1Y2tldDogUzNCdWNrZXQgfCBTM1dlYnNpdGVCdWNrZXQgfCBTM1B1YmxpY1JlYWRCdWNrZXQ7XG4gIHByaXZhdGUgYnVja2V0VHlwZTogUzNCdWNrZXRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmJ1Y2tldFR5cGUgPSBwcm9wcy5idWNrZXRUeXBlO1xuXG4gICAgdGhpcy5hZGRTM0J1Y2tldChwcm9wcyk7XG4gIH1cblxuICBhZGRTM0J1Y2tldChwcm9wczogSVMzUHJvcHMpIHtcbiAgICBzd2l0Y2ggKHByb3BzLmJ1Y2tldFR5cGUpIHtcbiAgICAgIGNhc2UgXCJwcml2YXRlXCI6XG4gICAgICAgIHRoaXMuYWRkUHJpdmF0ZUJ1Y2tldChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIndlYnNpdGVcIjpcbiAgICAgICAgdGhpcy5hZGRXZWJzaXRlQnVja2V0KHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHVibGljUmVhZFwiOlxuICAgICAgICB0aGlzLmFkZFB1YmxpY1JlYWRCdWNrZXQocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgY2hlY2tcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gcHJvcHM7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgUzMgYnVja2V0IHR5cGUgJHsocHJvcHMgYXMgYW55KS5idWNrZXRUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFByaXZhdGVCdWNrZXQocHJvcHM6IFByaXZhdGVTM1Byb3BzKSB7XG4gICAgdGhpcy5idWNrZXQgPSBuZXcgUzNCdWNrZXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRgLCB7XG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHZlcnNpb25lZDogcHJvcHMudmVyc2lvbmVkLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbiBhcyBhbnksXG4gICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5rbXNLZXlBcm4gPyB1bmRlZmluZWQgOiB1bmRlZmluZWQsIC8vIEtNUyBrZXkgaGFuZGxpbmdcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHByb3BzLnB1YmxpY1JlYWRBY2Nlc3NcbiAgICB9KTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkV2Vic2l0ZUJ1Y2tldChwcm9wczogV2Vic2l0ZVMzUHJvcHMpIHtcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM1dlYnNpdGVCdWNrZXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRgLCB7XG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHZlcnNpb25lZDogcHJvcHMudmVyc2lvbmVkLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbiBhcyBhbnksXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMud2Vic2l0ZUluZGV4RG9jdW1lbnQsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMud2Vic2l0ZUVycm9yRG9jdW1lbnQsXG4gICAgICBjb3JzOiBwcm9wcy5jb3JzIGFzIGFueVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQdWJsaWNSZWFkQnVja2V0KHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzUHVibGljUmVhZEJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uIGFzIGFueVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIC8vIEV4cG9ydCBidWNrZXQgQVJOIGZvciBtb25pdG9yaW5nXG4gICAgLy8gVXNlIHN0YWNrIG5hbWUgcHJlZml4IHRvIGVuc3VyZSB1bmlxdWVuZXNzIGFjcm9zcyBhcHBzIGluIHNhbWUgcmVnaW9uXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldEFybmAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXRBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXRBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuYnVja2V0LmJ1Y2tldEFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IEFSTiBmb3IgJHt0aGlzLmlkfWBcbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBidWNrZXQgbmFtZSBmb3IgY29udmVuaWVuY2VcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMuaWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IE5hbWUgZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldFR5cGUoKTogUzNCdWNrZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXRUeXBlO1xuICB9XG59XG4iXX0=
297
+ exports.PublicStorage = PublicStorage;
298
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4R0Esb0RBRUM7QUFoSEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFLcUM7QUFDckMseUVBR3lDO0FBVXpDLHVDQUF1QztBQUN2QyxzREFVaUM7QUFIL0IsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNkdBQUEsZUFBZSxPQUFBO0FBS2pCLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTJCO0lBRTNCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBb0U7SUFFcEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJ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YTtJQUcvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxTQUFrQixDQUFDO1FBSS9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQVpELHdDQVlDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsYUFBYTtJQUc5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdCO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxZQUFxQixDQUFDO1FBSWxELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFQRCxzQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIFMzV2Vic2l0ZUJ1Y2tldCxcbiAgUzNQdWJsaWNSZWFkQnVja2V0LFxuICB0eXBlIEJhY2t1cFZhdWx0VGllclxufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZVR5cGUsXG4gIHR5cGUgSVByaXZhdGVTdG9yYWdlLFxuICB0eXBlIElXZWJzaXRlU3RvcmFnZSxcbiAgdHlwZSBJUHVibGljU3RvcmFnZSxcbiAgdHlwZSBBbnlTdG9yYWdlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvc3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBJU3RvcmFnZUNvbm5lY3RvciB9IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2VzIGFuZCB0eXBlIGd1YXJkc1xuZXhwb3J0IHtcbiAgdHlwZSBTdG9yYWdlVHlwZSxcbiAgdHlwZSBJU3RvcmFnZSxcbiAgdHlwZSBJUHJpdmF0ZVN0b3JhZ2UsXG4gIHR5cGUgSVdlYnNpdGVTdG9yYWdlLFxuICB0eXBlIElQdWJsaWNTdG9yYWdlLFxuICB0eXBlIEFueVN0b3JhZ2UsXG4gIGlzUHJpdmF0ZVN0b3JhZ2UsXG4gIGlzV2Vic2l0ZVN0b3JhZ2UsXG4gIGlzUHVibGljU3RvcmFnZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcblxudHlwZSBFbmNyeXB0aW9uVHlwZSA9IFwiQUVTMjU2XCIgfCBcIktNU1wiO1xuXG5mdW5jdGlvbiB0b0J1Y2tldEVuY3J5cHRpb24oXG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uVHlwZVxuKTogQnVja2V0RW5jcnlwdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghZW5jcnlwdGlvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGVuY3J5cHRpb24gPT09IFwiQUVTMjU2XCJcbiAgICA/IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRFxuICAgIDogQnVja2V0RW5jcnlwdGlvbi5LTVM7XG59XG5cbmZ1bmN0aW9uIHRvSHR0cE1ldGhvZChtZXRob2Q6IHN0cmluZyk6IEh0dHBNZXRob2RzIHtcbiAgY29uc3QgbWV0aG9kTWFwOiBSZWNvcmQ8c3RyaW5nLCBIdHRwTWV0aG9kcz4gPSB7XG4gICAgR0VUOiBIdHRwTWV0aG9kcy5HRVQsXG4gICAgUFVUOiBIdHRwTWV0aG9kcy5QVVQsXG4gICAgUE9TVDogSHR0cE1ldGhvZHMuUE9TVCxcbiAgICBERUxFVEU6IEh0dHBNZXRob2RzLkRFTEVURSxcbiAgICBIRUFEOiBIdHRwTWV0aG9kcy5IRUFEXG4gIH07XG4gIHJldHVybiBtZXRob2RNYXBbbWV0aG9kXSA/PyBIdHRwTWV0aG9kcy5HRVQ7XG59XG5cbmZ1bmN0aW9uIHRvQ29yc1J1bGVzKFxuICBjb3JzPzogQXJyYXk8eyBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107IGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXSB9PlxuKTogQ29yc1J1bGVbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29ycykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNvcnMubWFwKChydWxlKSA9PiAoe1xuICAgIGFsbG93ZWRPcmlnaW5zOiBydWxlLmFsbG93ZWRPcmlnaW5zLFxuICAgIGFsbG93ZWRNZXRob2RzOiBydWxlLmFsbG93ZWRNZXRob2RzLm1hcCh0b0h0dHBNZXRob2QpXG4gIH0pKTtcbn1cblxuZXhwb3J0IHR5cGUgUzNCdWNrZXRUeXBlID0gXCJwcml2YXRlXCIgfCBcIndlYnNpdGVcIiB8IFwicHVibGljUmVhZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VUeXBlQ29uZmlnIHtcbiAgc3VwcG9ydHNQdWJsaWNSZWFkOiBib29sZWFuO1xuICBzdXBwb3J0c1dlYnNpdGVIb3N0aW5nOiBib29sZWFuO1xuICBkZWZhdWx0UHVibGljQWNjZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9UWVBFX0NPTkZJRzogUmVjb3JkPFMzQnVja2V0VHlwZSwgU3RvcmFnZVR5cGVDb25maWc+ID0ge1xuICBwcml2YXRlOiB7XG4gICAgc3VwcG9ydHNQdWJsaWNSZWFkOiB0cnVlLFxuICAgIHN1cHBvcnRzV2Vic2l0ZUhvc3Rpbmc6IGZhbHNlLFxuICAgIGRlZmF1bHRQdWJsaWNBY2Nlc3M6IGZhbHNlXG4gIH0sXG4gIHdlYnNpdGU6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogdHJ1ZSxcbiAgICBkZWZhdWx0UHVibGljQWNjZXNzOiB0cnVlXG4gIH0sXG4gIHB1YmxpY1JlYWQ6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogZmFsc2UsXG4gICAgZGVmYXVsdFB1YmxpY0FjY2VzczogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVR5cGVDb25maWcodHlwZTogUzNCdWNrZXRUeXBlKTogU3RvcmFnZVR5cGVDb25maWcge1xuICByZXR1cm4gU1RPUkFHRV9UWVBFX0NPTkZJR1t0eXBlXTtcbn1cblxudHlwZSBCYXNlUzNQcm9wcyA9IHtcbiAgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVmF1bHRUaWVyO1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIGttc0tleUFybj86IHN0cmluZztcbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYXV0b21hdGljIGFzc2V0IGRlcGxveW1lbnQgdG8gUzMuXG4gKiBXaGVuIHByb3ZpZGVkLCBjcmVhdGVzIGEgQnVja2V0RGVwbG95bWVudCB0aGF0IHVwbG9hZHMgZmlsZXMgZHVyaW5nIENESyBkZXBsb3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gdGhlIGFzc2V0IGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gQ0RLIGFwcCByb290KSAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIGZpbGVzIGZyb20gYnVja2V0IHRoYXQgYXJlbid0IGluIHRoZSBzb3VyY2UuXG4gICAqIERlZmF1bHQ6IHRydWUgZm9yIHN0YXRpYyBhc3NldHMsIGZhbHNlIGZvciBjYWNoZXMgdGhhdCBncm93IGF0IHJ1bnRpbWUuXG4gICAqL1xuICBwcnVuZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWNoZSBjb250cm9sIHNldHRpbmdzIGZvciB1cGxvYWRlZCBmaWxlcy5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBubyBjYWNoZSBoZWFkZXJzIGFyZSBzZXQuXG4gICAqL1xuICBjYWNoZUNvbnRyb2w/OiB7XG4gICAgLyoqIE1heCBhZ2UgaW4gc2Vjb25kcyAoZS5nLiwgMzE1MzYwMDAgZm9yIDEgeWVhcikgKi9cbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gICAgLyoqIE1hcmsgYXMgaW1tdXRhYmxlIChicm93c2VyIHdvbid0IHJldmFsaWRhdGUpICovXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJwcml2YXRlXCI7XG4gIHB1YmxpY1JlYWRBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhdXRvbWF0aWNhbGx5IHVwbG9hZHMgZmlsZXMgdG8gdGhlIGJ1Y2tldCBkdXJpbmcgQ0RLIGRlcGxveS5cbiAgICovXG4gIGRlcGxveW1lbnQ/OiBTM0RlcGxveW1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vic2l0ZVMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiO1xuICB3ZWJzaXRlSW5kZXhEb2N1bWVudD86IHN0cmluZztcbiAgd2Vic2l0ZUVycm9yRG9jdW1lbnQ/OiBzdHJpbmc7XG4gIGNvcnM/OiBBcnJheTx7XG4gICAgYWxsb3dlZE9yaWdpbnM6IHN0cmluZ1tdO1xuICAgIGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXTtcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljUmVhZFMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwicHVibGljUmVhZFwiO1xufVxuXG5leHBvcnQgdHlwZSBJUzNQcm9wcyA9IFByaXZhdGVTM1Byb3BzIHwgV2Vic2l0ZVMzUHJvcHMgfCBQdWJsaWNSZWFkUzNQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgc3RvcmFnZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wczogSVMzUHJvcHMpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgZW5jcnlwdGlvbjogS01TIHJlcXVpcmVzIGttc0tleUFyblxuICBpZiAocHJvcHMuZW5jcnlwdGlvbiA9PT0gXCJLTVNcIiAmJiAhcHJvcHMua21zS2V5QXJuKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2VuY3J5cHRpb24nIGlzIHNldCB0byAnS01TJyBidXQgJ2ttc0tleUFybicgaXMgbm90IHByb3ZpZGVkLiBcIiArXG4gICAgICAgIFwiVGhlIGJ1Y2tldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBBV1MgbWFuYWdlZCBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2FybiBhYm91dCBrbXNLZXlBcm4gd2hlbiBlbmNyeXB0aW9uIGlzIG5vdCBLTVNcbiAgaWYgKHByb3BzLmttc0tleUFybiAmJiBwcm9wcy5lbmNyeXB0aW9uICE9PSBcIktNU1wiKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2ttc0tleUFybicgaXMgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3Qgc2V0IHRvICdLTVMnLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLiBTZXQgZW5jcnlwdGlvbjogJ0tNUycgdG8gdXNlIHRoZSBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2Vic2l0ZS1vbmx5IG9wdGlvbnMgb24gbm9uLXdlYnNpdGUgYnVja2V0c1xuICAvLyBOb3RlOiBVc2luZyBidWNrZXRUeXBlIGFzIGRpc2NyaW1pbmF0b3Igd2l0aCBcInR5cGVcIiBhbGlhcyBmb3IgdGhlIGhlbHBlclxuICBjb25zdCBwcm9wc1dpdGhUeXBlID0geyAuLi5wcm9wcywgdHlwZTogcHJvcHMuYnVja2V0VHlwZSB9O1xuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wc1dpdGhUeXBlLFxuICAgIFtcIndlYnNpdGVJbmRleERvY3VtZW50XCIsIFwid2Vic2l0ZUVycm9yRG9jdW1lbnRcIiwgXCJjb3JzXCJdLFxuICAgIFwid2Vic2l0ZVwiLFxuICAgIFwid2Vic2l0ZSBidWNrZXRcIlxuICApO1xuXG4gIC8vIFByaXZhdGUtb25seSBvcHRpb25zIG9uIG5vbi1wcml2YXRlIGJ1Y2tldHNcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHNXaXRoVHlwZSxcbiAgICBbXCJwdWJsaWNSZWFkQWNjZXNzXCJdLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJpdmF0ZSBidWNrZXRcIlxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIFMzIHN0b3JhZ2UgcmVzb3VyY2VzIHdpdGggdHlwZS1zYWZlIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJpdmF0ZSBidWNrZXRcbiAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHsgYnVja2V0VHlwZTogXCJwcml2YXRlXCIgfSkpO1xuICogYXNzZXRzLmdyYW50UHVibGljQWNjZXNzKCk7IC8vIOKckyBBdmFpbGFibGUgb24gUHJpdmF0ZVN0b3JhZ2VcbiAqXG4gKiAvLyBXZWJzaXRlIGJ1Y2tldFxuICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7IGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiIH0pKTtcbiAqIHNpdGUuZ2V0V2Vic2l0ZVVybCgpOyAvLyDinJMgQXZhaWxhYmxlIG9uIFdlYnNpdGVTdG9yYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmFjdG9yeSB7XG4gIC8qKiBCdWlsZCBhIHByaXZhdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFByaXZhdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gUHJpdmF0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHdlYnNpdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFdlYnNpdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gV2Vic2l0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHB1YmxpYyByZWFkIHN0b3JhZ2UgYnVja2V0ICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFB1YmxpY1N0b3JhZ2U7XG4gIC8qKiBJbXBsZW1lbnRhdGlvbiAtIHJldHVybnMgYXBwcm9wcmlhdGUgc3RvcmFnZSB0eXBlIGJhc2VkIG9uIHByb3BzICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueVN0b3JhZ2Uge1xuICAgIHJldHVybiAoX2FwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIHN3aXRjaCAocHJvcHMuYnVja2V0VHlwZSkge1xuICAgICAgICBjYXNlIFwicHJpdmF0ZVwiOlxuICAgICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVN0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGNhc2UgXCJ3ZWJzaXRlXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBXZWJzaXRlU3RvcmFnZShzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgY2FzZSBcInB1YmxpY1JlYWRcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IFB1YmxpY1N0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgYnVja2V0IHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIElTM1Byb3BzKS5idWNrZXRUeXBlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgUzMgc3RvcmFnZSBjbGFzcy5cbiAqIFNwZWNpZmljIHN0b3JhZ2UgdHlwZXMgKFByaXZhdGVTdG9yYWdlLCBXZWJzaXRlU3RvcmFnZSwgUHVibGljU3RvcmFnZSkgZXh0ZW5kIHRoaXMuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFMzU3RvcmFnZUJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJU3RvcmFnZUNvbm5lY3RvciB7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKiogVGhlIHR5cGUgb2Ygc3RvcmFnZSByZXNvdXJjZS4gVXNlZCBmb3IgcnVudGltZSB0eXBlIG5hcnJvd2luZy4gKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN0b3JhZ2VUeXBlOiBTdG9yYWdlVHlwZTtcblxuICAvKiogVGhlIGNvbm5lY3RvciB0eXBlIGZvciB1bmlmaWVkIGNvbm5lY3Rpb24gcHJvY2Vzc2luZy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcInN0b3JhZ2VcIiBhcyBjb25zdDtcblxuICBwcm90ZWN0ZWQgYnVja2V0ITogUzNCdWNrZXQgfCBTM1dlYnNpdGVCdWNrZXQgfCBTM1B1YmxpY1JlYWRCdWNrZXQ7XG4gIHByb3RlY3RlZCBfYnVja2V0VHlwZTogUzNCdWNrZXRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLl9idWNrZXRUeXBlID0gcHJvcHMuYnVja2V0VHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXNlUHJpdmF0ZUJ1Y2tldChwcm9wczogUHJpdmF0ZVMzUHJvcHMpIHtcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcHJvcHMua21zS2V5QXJuXG4gICAgICA/IEtleS5mcm9tS2V5QXJuKHRoaXMsIGAke3RoaXMuaWR9S21zS2V5YCwgcHJvcHMua21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgcHVibGljUmVhZEFjY2VzczogcHJvcHMucHVibGljUmVhZEFjY2Vzc1xuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VXZWJzaXRlQnVja2V0KHByb3BzOiBXZWJzaXRlUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzV2Vic2l0ZUJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMud2Vic2l0ZUluZGV4RG9jdW1lbnQsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMud2Vic2l0ZUVycm9yRG9jdW1lbnQsXG4gICAgICBjb3JzOiB0b0NvcnNSdWxlcyhwcm9wcy5jb3JzKVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VQdWJsaWNSZWFkQnVja2V0KHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzUHVibGljUmVhZEJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbilcbiAgICB9KTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRBcm5gLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBBUk4gZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMuaWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IE5hbWUgZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldFR5cGUoKTogUzNCdWNrZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0VHlwZTtcbiAgfVxuXG4gIGdldEJ1Y2tldERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0RG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cblxuICBnZXRTM0J1Y2tldCgpOiBTM0J1Y2tldCB8IFMzV2Vic2l0ZUJ1Y2tldCB8IFMzUHVibGljUmVhZEJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZChncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50V3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnREZWxldGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1dChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1dChncmFudGVlKTtcbiAgfVxuXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cblxuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5hZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBTMyBzdG9yYWdlLlxuICogU3RhbmRhcmQgYnVja2V0IHdpdGggb3B0aW9uYWwgZW5jcnlwdGlvbiBhbmQgdmVyc2lvbmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQcml2YXRlU3RvcmFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzdG9yYWdlVHlwZSA9IFwicHJpdmF0ZVwiIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgX2RlcGxveW1lbnQ/OiBCdWNrZXREZXBsb3ltZW50O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcml2YXRlUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMuaW5pdGlhbGlzZVByaXZhdGVCdWNrZXQocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQpIHtcbiAgICAgIHRoaXMuX2RlcGxveW1lbnQgPSB0aGlzLmNyZWF0ZURlcGxveW1lbnQoaWQsIHByb3BzLmRlcGxveW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUzNEZXBsb3ltZW50Q29uZmlnXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbEhlYWRlcnM6IENhY2hlQ29udHJvbFtdID0gW107XG5cbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbD8ubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChcbiAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy5jYWNoZUNvbnRyb2wubWF4QWdlKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChDYWNoZUNvbnRyb2wuaW1tdXRhYmxlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHtpZH1EZXBsb3ltZW50YCwge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChjb25maWcuc291cmNlKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBwcnVuZTogY29uZmlnLnBydW5lID8/IHRydWUsXG4gICAgICAuLi4oY2FjaGVDb250cm9sSGVhZGVycy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiBjYWNoZUNvbnRyb2xIZWFkZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHB1YmxpYyBhY2Nlc3MgdG8gb2JqZWN0cyB1bmRlciBhIHByZWZpeC5cbiAgICogVXNlIHdpdGggY2F1dGlvbiAtIG1ha2VzIG9iamVjdHMgcHVibGljbHkgcmVhZGFibGUuXG4gICAqL1xuICBncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXg6IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQnVja2V0RGVwbG95bWVudCBjb25zdHJ1Y3QgaWYgb25lIHdhcyBjcmVhdGVkLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBkZXBsb3ltZW50IHdhcyBjb25maWd1cmVkLlxuICAgKi9cbiAgZ2V0RGVwbG95bWVudCgpOiBCdWNrZXREZXBsb3ltZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95bWVudDtcbiAgfVxufVxuXG4vKipcbiAqIFdlYnNpdGUgUzMgc3RvcmFnZS5cbiAqIEJ1Y2tldCBjb25maWd1cmVkIGZvciBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgV2Vic2l0ZVN0b3JhZ2UgZXh0ZW5kcyBTM1N0b3JhZ2VCYXNlIGltcGxlbWVudHMgSVdlYnNpdGVTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJ3ZWJzaXRlXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYnNpdGVTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlV2Vic2l0ZUJ1Y2tldChwcm9wcyk7XG4gIH1cblxuICAvKiogR2V0IHRoZSB3ZWJzaXRlIFVSTC4gKi9cbiAgZ2V0V2Vic2l0ZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRXZWJzaXRlVXJsID8/IFwiXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaWMgcmVhZCBTMyBzdG9yYWdlLlxuICogQnVja2V0IHdpdGggcHVibGljIHJlYWQgYWNjZXNzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdWJsaWNTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQdWJsaWNTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJwdWJsaWNSZWFkXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB1YmxpY1JlYWRTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlUHVibGljUmVhZEJ1Y2tldChwcm9wcyk7XG4gIH1cbn1cbiJdfQ==
@@ -9,19 +9,16 @@ class BackupPlan extends constructs_1.Construct {
9
9
  constructor(scope, id, props) {
10
10
  super(scope, id);
11
11
  const tagKey = props.tagKey || "fjall:disasterRecovery:tier";
12
- // Create backup plan with provided rules
13
12
  this.plan = new aws_backup_1.BackupPlan(this, `${props.planName}Plan`, {
14
13
  backupPlanName: props.planName,
15
14
  backupVault: props.backupVault.vault,
16
15
  backupPlanRules: props.rules
17
16
  });
18
- // Create tag-based selection
19
17
  this.selection = new aws_backup_1.BackupSelection(this, `${props.planName}Selection`, {
20
18
  backupPlan: this.plan,
21
19
  resources: [aws_backup_1.BackupResource.fromTag(tagKey, props.tagValue)],
22
20
  role: this.createBackupRole(props)
23
21
  });
24
- // Export plan ARN (wrapper handles sanitisation)
25
22
  this.planArn = new aws_cdk_lib_1.CfnOutput(this, `${props.planName}PlanArn`, {
26
23
  key: `${props.planName}PlanArn`,
27
24
  value: this.plan.backupPlanArn,
@@ -33,10 +30,8 @@ class BackupPlan extends constructs_1.Construct {
33
30
  assumedBy: new iam.ServicePrincipal("backup.amazonaws.com"),
34
31
  description: `Backup role for ${props.planName}`,
35
32
  managedPolicies: [
36
- // Core backup policies
37
33
  iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForBackup"),
38
34
  iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForRestores"),
39
- // S3 backup support
40
35
  iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Backup"),
41
36
  iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Restore")
42
37
  ]
@@ -62,4 +57,4 @@ class BackupPlan extends constructs_1.Construct {
62
57
  }
63
58
  }
64
59
  exports.BackupPlan = BackupPlan;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwUGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2JhY2t1cC9iYWNrdXBQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBd0M7QUFDeEMsdURBS2dDO0FBQ2hDLDJDQUEyQztBQVczQyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQUt2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztRQUU3RCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLHVCQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsTUFBTSxFQUFFO1lBQ2xELGNBQWMsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLO1lBQ3BDLGVBQWUsRUFBRSxLQUFLLENBQUMsS0FBSztTQUM3QixDQUFDLENBQUM7UUFFSCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDRCQUFlLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsV0FBVyxFQUFFO1lBQ3ZFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNyQixTQUFTLEVBQUUsQ0FBQywyQkFBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNELElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO1NBQ25DLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxTQUFTLEVBQUU7WUFDN0QsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsU0FBUztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQzlCLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLGVBQWU7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXNCO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxZQUFZLEVBQUU7WUFDN0QsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQzNELFdBQVcsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNoRCxlQUFlLEVBQUU7Z0JBQ2YsdUJBQXVCO2dCQUN2QixHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUN4QyxrREFBa0QsQ0FDbkQ7Z0JBQ0QsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsb0RBQW9ELENBQ3JEO2dCQUNELG9CQUFvQjtnQkFDcEIsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsdUNBQXVDLENBQ3hDO2dCQUNELEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQ3hDLHdDQUF3QyxDQUN6QzthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FDZCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSztZQUN4QixPQUFPLEVBQUU7Z0JBQ1Asc0JBQXNCO2dCQUN0Qix3Q0FBd0M7Z0JBQ3hDLG9DQUFvQztnQkFDcEMseUJBQXlCO2dCQUN6Qix3QkFBd0I7Z0JBQ3hCLG1DQUFtQzthQUNwQztZQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNqQixDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQXNCO1FBQzdDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDMUIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVFRCxnQ0E0RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBCYWNrdXBQbGFuIGFzIFBsYW4sXG4gIEJhY2t1cFNlbGVjdGlvbixcbiAgQmFja3VwUmVzb3VyY2UsXG4gIHR5cGUgQmFja3VwUGxhblJ1bGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1iYWNrdXBcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgdHlwZSBCYWNrdXBWYXVsdCB9IGZyb20gXCIuL2JhY2t1cFZhdWx0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFja3VwUGxhblByb3BzIHtcbiAgcGxhbk5hbWU6IHN0cmluZztcbiAgcnVsZXM6IEJhY2t1cFBsYW5SdWxlW107XG4gIGJhY2t1cFZhdWx0OiBCYWNrdXBWYXVsdDtcbiAgdGFnVmFsdWU6IHN0cmluZztcbiAgdGFnS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQmFja3VwUGxhbiBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBwbGFuOiBQbGFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uOiBCYWNrdXBTZWxlY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBwbGFuQXJuOiBDZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFBsYW5Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB0YWdLZXkgPSBwcm9wcy50YWdLZXkgfHwgXCJmamFsbDpkaXNhc3RlclJlY292ZXJ5OnRpZXJcIjtcblxuICAgIC8vIENyZWF0ZSBiYWNrdXAgcGxhbiB3aXRoIHByb3ZpZGVkIHJ1bGVzXG4gICAgdGhpcy5wbGFuID0gbmV3IFBsYW4odGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbmAsIHtcbiAgICAgIGJhY2t1cFBsYW5OYW1lOiBwcm9wcy5wbGFuTmFtZSxcbiAgICAgIGJhY2t1cFZhdWx0OiBwcm9wcy5iYWNrdXBWYXVsdC52YXVsdCxcbiAgICAgIGJhY2t1cFBsYW5SdWxlczogcHJvcHMucnVsZXNcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSB0YWctYmFzZWQgc2VsZWN0aW9uXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgQmFja3VwU2VsZWN0aW9uKHRoaXMsIGAke3Byb3BzLnBsYW5OYW1lfVNlbGVjdGlvbmAsIHtcbiAgICAgIGJhY2t1cFBsYW46IHRoaXMucGxhbixcbiAgICAgIHJlc291cmNlczogW0JhY2t1cFJlc291cmNlLmZyb21UYWcodGFnS2V5LCBwcm9wcy50YWdWYWx1ZSldLFxuICAgICAgcm9sZTogdGhpcy5jcmVhdGVCYWNrdXBSb2xlKHByb3BzKVxuICAgIH0pO1xuXG4gICAgLy8gRXhwb3J0IHBsYW4gQVJOICh3cmFwcGVyIGhhbmRsZXMgc2FuaXRpc2F0aW9uKVxuICAgIHRoaXMucGxhbkFybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5wbGFuLmJhY2t1cFBsYW5Bcm4sXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBQbGFuQXJuYFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYWNrdXBSb2xlKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJiYWNrdXAuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQmFja3VwIHJvbGUgZm9yICR7cHJvcHMucGxhbk5hbWV9YCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICAvLyBDb3JlIGJhY2t1cCBwb2xpY2llc1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JSZXN0b3Jlc1wiXG4gICAgICAgICksXG4gICAgICAgIC8vIFMzIGJhY2t1cCBzdXBwb3J0XG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICBcIkFXU0JhY2t1cFNlcnZpY2VSb2xlUG9saWN5Rm9yUzNCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzUmVzdG9yZVwiXG4gICAgICAgIClcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwicmRzOk1vZGlmeURCSW5zdGFuY2VcIixcbiAgICAgICAgICBcInJkczpEZXNjcmliZURCSW5zdGFuY2VBdXRvbWF0ZWRCYWNrdXBzXCIsXG4gICAgICAgICAgXCJyZHM6UmVzdG9yZURCSW5zdGFuY2VUb1BvaW50SW5UaW1lXCIsXG4gICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgIFwicmRzOkRlc2NyaWJlREJDbHVzdGVyc1wiLFxuICAgICAgICAgIFwicmRzOlJlc3RvcmVEQkNsdXN0ZXJUb1BvaW50SW5UaW1lXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFBsYW5Qcm9wcykge1xuICAgIHJldHVybiAoc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBCYWNrdXBQbGFuKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwUGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2JhY2t1cC9iYWNrdXBQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBd0M7QUFDeEMsdURBS2dDO0FBQ2hDLDJDQUEyQztBQVczQyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQUt2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztRQUU3RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxNQUFNLEVBQUU7WUFDbEQsY0FBYyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDcEMsZUFBZSxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQzdCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSw0QkFBZSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLFdBQVcsRUFBRTtZQUN2RSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFLENBQUMsMkJBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxTQUFTLEVBQUU7WUFDN0QsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsU0FBUztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQzlCLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLGVBQWU7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXNCO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxZQUFZLEVBQUU7WUFDN0QsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQzNELFdBQVcsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNoRCxlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsa0RBQWtELENBQ25EO2dCQUNELEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQ3hDLG9EQUFvRCxDQUNyRDtnQkFDRCxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUN4Qyx1Q0FBdUMsQ0FDeEM7Z0JBQ0QsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsd0NBQXdDLENBQ3pDO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUNkLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRTtnQkFDUCxzQkFBc0I7Z0JBQ3RCLHdDQUF3QztnQkFDeEMsb0NBQW9DO2dCQUNwQyx5QkFBeUI7Z0JBQ3pCLHdCQUF3QjtnQkFDeEIsbUNBQW1DO2FBQ3BDO1lBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBc0I7UUFDN0MsT0FBTyxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkVELGdDQXVFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIEJhY2t1cFBsYW4gYXMgUGxhbixcbiAgQmFja3VwU2VsZWN0aW9uLFxuICBCYWNrdXBSZXNvdXJjZSxcbiAgdHlwZSBCYWNrdXBQbGFuUnVsZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWJhY2t1cFwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIEJhY2t1cFZhdWx0IH0gZnJvbSBcIi4vYmFja3VwVmF1bHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYWNrdXBQbGFuUHJvcHMge1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBydWxlczogQmFja3VwUGxhblJ1bGVbXTtcbiAgYmFja3VwVmF1bHQ6IEJhY2t1cFZhdWx0O1xuICB0YWdWYWx1ZTogc3RyaW5nO1xuICB0YWdLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBCYWNrdXBQbGFuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW46IFBsYW47XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb246IEJhY2t1cFNlbGVjdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW5Bcm46IENmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFja3VwUGxhblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHRhZ0tleSA9IHByb3BzLnRhZ0tleSB8fCBcImZqYWxsOmRpc2FzdGVyUmVjb3Zlcnk6dGllclwiO1xuXG4gICAgdGhpcy5wbGFuID0gbmV3IFBsYW4odGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbmAsIHtcbiAgICAgIGJhY2t1cFBsYW5OYW1lOiBwcm9wcy5wbGFuTmFtZSxcbiAgICAgIGJhY2t1cFZhdWx0OiBwcm9wcy5iYWNrdXBWYXVsdC52YXVsdCxcbiAgICAgIGJhY2t1cFBsYW5SdWxlczogcHJvcHMucnVsZXNcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEJhY2t1cFNlbGVjdGlvbih0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1TZWxlY3Rpb25gLCB7XG4gICAgICBiYWNrdXBQbGFuOiB0aGlzLnBsYW4sXG4gICAgICByZXNvdXJjZXM6IFtCYWNrdXBSZXNvdXJjZS5mcm9tVGFnKHRhZ0tleSwgcHJvcHMudGFnVmFsdWUpXSxcbiAgICAgIHJvbGU6IHRoaXMuY3JlYXRlQmFja3VwUm9sZShwcm9wcylcbiAgICB9KTtcblxuICAgIHRoaXMucGxhbkFybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5wbGFuLmJhY2t1cFBsYW5Bcm4sXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBQbGFuQXJuYFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYWNrdXBSb2xlKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJiYWNrdXAuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQmFja3VwIHJvbGUgZm9yICR7cHJvcHMucGxhbk5hbWV9YCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JSZXN0b3Jlc1wiXG4gICAgICAgICksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICBcIkFXU0JhY2t1cFNlcnZpY2VSb2xlUG9saWN5Rm9yUzNCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzUmVzdG9yZVwiXG4gICAgICAgIClcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwicmRzOk1vZGlmeURCSW5zdGFuY2VcIixcbiAgICAgICAgICBcInJkczpEZXNjcmliZURCSW5zdGFuY2VBdXRvbWF0ZWRCYWNrdXBzXCIsXG4gICAgICAgICAgXCJyZHM6UmVzdG9yZURCSW5zdGFuY2VUb1BvaW50SW5UaW1lXCIsXG4gICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgIFwicmRzOkRlc2NyaWJlREJDbHVzdGVyc1wiLFxuICAgICAgICAgIFwicmRzOlJlc3RvcmVEQkNsdXN0ZXJUb1BvaW50SW5UaW1lXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFBsYW5Qcm9wcykge1xuICAgIHJldHVybiAoc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBCYWNrdXBQbGFuKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==