@aligent/cdk-aspects 0.6.2 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @aligent/cdk-aspects
2
2
 
3
+ ## 0.6.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1698](https://github.com/aligent/cdk-constructs/pull/1698) [`c9f490f`](https://github.com/aligent/cdk-constructs/commit/c9f490f17f42aed92646543f7978ac8e4fc9ebb6) Thanks [@toddhainsworth](https://github.com/toddhainsworth)! - Move `aws-cdk-lib` and `constructs` from `dependencies` to `peerDependencies`, matching the convention used by every `@aligent/cdk-*` construct package.
8
+
9
+ As regular dependencies, a consumer whose own `aws-cdk-lib` resolved to a different version ended up with two copies in the tree. The aspects' `instanceof CfnResource` checks compared against the nested copy's class, so `visit()` returned early for every node — aspects silently became a no-op (no prefixes, no defaults, no checks) with a valid-but-untouched synth. Declaring them as peers guarantees a single shared instance with the consumer.
10
+
11
+ - [#1702](https://github.com/aligent/cdk-constructs/pull/1702) [`49f7a78`](https://github.com/aligent/cdk-constructs/commit/49f7a78418a566b4c868293c293ccab9528fc647) Thanks [@toddhainsworth](https://github.com/toddhainsworth)! - Fix `ResourcePrefixAspect` to skip CDK-managed singleton/framework resources (`BucketDeployment` handler, `LogRetention`, `S3AutoDeleteObjects`, and `cr.Provider` framework lambdas) and their nested children (IAM service roles, log groups) instead of pinning deterministic physical names onto them.
12
+
13
+ These singletons share a fixed logical id across every stack, so a deterministic prefixed name collapses to one value per prefix scope. That removed CloudFormation's per-stack and per-creation uniqueness and caused two deploy failures:
14
+ - **Cross-stack IAM role collision** — two `BucketDeployment`-using stacks in the same stage received the same account-global `RoleName`, so the second stack failed with `... already exists`.
15
+ - **Orphaned `/aws/lambda` log group collision on retry** — a failed deploy orphaned the service-created log group, and the deterministic function name regenerated the identical name, wedging every subsequent deploy on `AWS::Logs::LogGroup ... already exists`.
16
+
17
+ The aspect now leaves these resources CloudFormation-named, matching the singleton-skip behaviour `MicroserviceChecks` already applies.
18
+
19
+ ## 0.6.3
20
+
21
+ ### Patch Changes
22
+
23
+ - [#1696](https://github.com/aligent/cdk-constructs/pull/1696) [`d05f4f8`](https://github.com/aligent/cdk-constructs/commit/d05f4f895fb10ec388a981c36c532f428869c98c) Thanks [@kai-nguyen-aligent](https://github.com/kai-nguyen-aligent)! - Fix ResourcePrefixAspect to gracefully handle CDK tokens (e.g. `Fn.ref`, `Lazy.string`) in resource name properties by falling back to the sanitised logical ID.
24
+
3
25
  ## 0.6.2
4
26
 
5
27
  ### Patch Changes
package/README.md CHANGED
@@ -115,6 +115,8 @@ Automatically prefixes physical resource names across supported AWS resource typ
115
115
  - Handles resource-specific naming rules: S3 names are lowercased, FIFO queues/topics preserve the `.fifo` suffix, SSM parameters use path-style prefixes (`/prefix/name`)
116
116
  - **Automatic truncation**: if a prefixed name would exceed AWS's maximum length for that resource type, the aspect truncates the name and appends an 8-character SHA-256 hash to maintain uniqueness. A CDK warning is emitted for each truncated resource. This prevents L3 constructs (e.g. `BucketDeployment`) from generating child resources that cause synthesis failures.
117
117
  - Idempotent: already-prefixed resources are skipped
118
+ - Skips AWS-reserved log group names (e.g. `/aws/lambda/...`)
119
+ - Skips CDK-managed singleton/framework resources (`BucketDeployment` handler, `LogRetention`, `S3AutoDeleteObjects`, and `cr.Provider` framework lambdas) and their nested children (IAM service roles, log groups). These singletons share a fixed logical id across every stack, so a deterministic prefixed name collapses to one value per prefix scope. Leaving them CloudFormation-generated preserves the per-stack and per-creation uniqueness that prevents account-global IAM role collisions across stacks and orphaned `/aws/lambda` log group collisions on retry.
118
120
  - Supports an exclusion list to skip specific resource types
119
121
 
120
122
  ### Usage
@@ -0,0 +1,16 @@
1
+ import type { IConstruct } from "constructs";
2
+ /**
3
+ * Path fragments identifying CDK-managed singleton/framework resources that
4
+ * consumers cannot configure or own.
5
+ *
6
+ * Aspects should leave these resources untouched: their runtime config is
7
+ * framework-owned (so cdk-nag rules are noise), and their physical names must
8
+ * stay CloudFormation-generated (so a failed deploy's orphaned `/aws/lambda`
9
+ * LogGroup never collides with a deterministic name on the next attempt).
10
+ */
11
+ export declare const CDK_MANAGED_PATH_FRAGMENTS: string[];
12
+ /**
13
+ * Returns true when the construct lives under a CDK-managed singleton/framework
14
+ * path and should therefore be skipped by aspects.
15
+ */
16
+ export declare function isCdkManagedSingleton(node: IConstruct): boolean;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CDK_MANAGED_PATH_FRAGMENTS = void 0;
4
+ exports.isCdkManagedSingleton = isCdkManagedSingleton;
5
+ /**
6
+ * Path fragments identifying CDK-managed singleton/framework resources that
7
+ * consumers cannot configure or own.
8
+ *
9
+ * Aspects should leave these resources untouched: their runtime config is
10
+ * framework-owned (so cdk-nag rules are noise), and their physical names must
11
+ * stay CloudFormation-generated (so a failed deploy's orphaned `/aws/lambda`
12
+ * LogGroup never collides with a deterministic name on the next attempt).
13
+ */
14
+ exports.CDK_MANAGED_PATH_FRAGMENTS = [
15
+ // aws-s3-deployment.BucketDeployment custom resource handler
16
+ "Custom::CDKBucketDeployment",
17
+ // Deprecated CDK log retention custom resource
18
+ "LogRetention",
19
+ // Bucket(autoDeleteObjects: true)
20
+ "Custom::S3AutoDeleteObjects",
21
+ // cr.Provider framework on-event / is-complete handler
22
+ "AWS679f53fac002430cb0da5b7982bd2287",
23
+ ];
24
+ /**
25
+ * Returns true when the construct lives under a CDK-managed singleton/framework
26
+ * path and should therefore be skipped by aspects.
27
+ */
28
+ function isCdkManagedSingleton(node) {
29
+ const path = node.node.path;
30
+ return exports.CDK_MANAGED_PATH_FRAGMENTS.some(fragment => path.includes(fragment));
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW1hbmFnZWQtc2luZ2xldG9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNkay1tYW5hZ2VkLXNpbmdsZXRvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEJBLHNEQUdDO0FBM0JEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRztJQUN4Qyw2REFBNkQ7SUFDN0QsNkJBQTZCO0lBQzdCLCtDQUErQztJQUMvQyxjQUFjO0lBQ2Qsa0NBQWtDO0lBQ2xDLDZCQUE2QjtJQUM3Qix1REFBdUQ7SUFDdkQscUNBQXFDO0NBQ3RDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixxQkFBcUIsQ0FBQyxJQUFnQjtJQUNwRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM1QixPQUFPLGtDQUEwQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBQYXRoIGZyYWdtZW50cyBpZGVudGlmeWluZyBDREstbWFuYWdlZCBzaW5nbGV0b24vZnJhbWV3b3JrIHJlc291cmNlcyB0aGF0XG4gKiBjb25zdW1lcnMgY2Fubm90IGNvbmZpZ3VyZSBvciBvd24uXG4gKlxuICogQXNwZWN0cyBzaG91bGQgbGVhdmUgdGhlc2UgcmVzb3VyY2VzIHVudG91Y2hlZDogdGhlaXIgcnVudGltZSBjb25maWcgaXNcbiAqIGZyYW1ld29yay1vd25lZCAoc28gY2RrLW5hZyBydWxlcyBhcmUgbm9pc2UpLCBhbmQgdGhlaXIgcGh5c2ljYWwgbmFtZXMgbXVzdFxuICogc3RheSBDbG91ZEZvcm1hdGlvbi1nZW5lcmF0ZWQgKHNvIGEgZmFpbGVkIGRlcGxveSdzIG9ycGhhbmVkIGAvYXdzL2xhbWJkYWBcbiAqIExvZ0dyb3VwIG5ldmVyIGNvbGxpZGVzIHdpdGggYSBkZXRlcm1pbmlzdGljIG5hbWUgb24gdGhlIG5leHQgYXR0ZW1wdCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDREtfTUFOQUdFRF9QQVRIX0ZSQUdNRU5UUyA9IFtcbiAgLy8gYXdzLXMzLWRlcGxveW1lbnQuQnVja2V0RGVwbG95bWVudCBjdXN0b20gcmVzb3VyY2UgaGFuZGxlclxuICBcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiLFxuICAvLyBEZXByZWNhdGVkIENESyBsb2cgcmV0ZW50aW9uIGN1c3RvbSByZXNvdXJjZVxuICBcIkxvZ1JldGVudGlvblwiLFxuICAvLyBCdWNrZXQoYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUpXG4gIFwiQ3VzdG9tOjpTM0F1dG9EZWxldGVPYmplY3RzXCIsXG4gIC8vIGNyLlByb3ZpZGVyIGZyYW1ld29yayBvbi1ldmVudCAvIGlzLWNvbXBsZXRlIGhhbmRsZXJcbiAgXCJBV1M2NzlmNTNmYWMwMDI0MzBjYjBkYTViNzk4MmJkMjI4N1wiLFxuXTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgY29uc3RydWN0IGxpdmVzIHVuZGVyIGEgQ0RLLW1hbmFnZWQgc2luZ2xldG9uL2ZyYW1ld29ya1xuICogcGF0aCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBza2lwcGVkIGJ5IGFzcGVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Nka01hbmFnZWRTaW5nbGV0b24obm9kZTogSUNvbnN0cnVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRoID0gbm9kZS5ub2RlLnBhdGg7XG4gIHJldHVybiBDREtfTUFOQUdFRF9QQVRIX0ZSQUdNRU5UUy5zb21lKGZyYWdtZW50ID0+IHBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKTtcbn1cbiJdfQ==
@@ -14,5 +14,4 @@ import type { IConstruct } from "constructs";
14
14
  export declare class MicroserviceChecks extends NagPack {
15
15
  constructor(props?: NagPackProps);
16
16
  visit(node: IConstruct): void;
17
- private isCdkManagedSingleton;
18
17
  }
@@ -3,22 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MicroserviceChecks = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const cdk_nag_1 = require("cdk-nag");
6
- /**
7
- * Path fragments identifying CDK-managed singleton resources that consumers
8
- * cannot configure. These nodes are skipped during rule evaluation because
9
- * surfacing nags on memory size, timeout, tracing, or log retention for
10
- * resources owned by the CDK framework is noise.
11
- */
12
- const CDK_MANAGED_PATH_FRAGMENTS = [
13
- // aws-s3-deployment.BucketDeployment custom resource handler
14
- "Custom::CDKBucketDeployment",
15
- // Deprecated CDK log retention custom resource
16
- "LogRetention",
17
- // Bucket(autoDeleteObjects: true)
18
- "Custom::S3AutoDeleteObjects",
19
- // cr.Provider framework on-event / is-complete handler
20
- "AWS679f53fac002430cb0da5b7982bd2287",
21
- ];
6
+ const cdk_managed_singletons_1 = require("./cdk-managed-singletons");
22
7
  /**
23
8
  * Microservice Checks are a compilation of rules to validate infrastructure-as-code template
24
9
  * against recommended practices using the cdk-nag library.
@@ -36,7 +21,7 @@ class MicroserviceChecks extends cdk_nag_1.NagPack {
36
21
  this.packName = "Microservices";
37
22
  }
38
23
  visit(node) {
39
- if (this.isCdkManagedSingleton(node))
24
+ if ((0, cdk_managed_singletons_1.isCdkManagedSingleton)(node))
40
25
  return;
41
26
  if (node instanceof aws_cdk_lib_1.CfnResource) {
42
27
  this.applyRule({
@@ -69,10 +54,6 @@ class MicroserviceChecks extends cdk_nag_1.NagPack {
69
54
  });
70
55
  }
71
56
  }
72
- isCdkManagedSingleton(node) {
73
- const path = node.node.path;
74
- return CDK_MANAGED_PATH_FRAGMENTS.some(fragment => path.includes(fragment));
75
- }
76
57
  }
77
58
  exports.MicroserviceChecks = MicroserviceChecks;
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWNoZWNrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1pY3Jvc2VydmljZS1jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBDO0FBQzFDLHFDQUE2RTtBQUc3RTs7Ozs7R0FLRztBQUNILE1BQU0sMEJBQTBCLEdBQUc7SUFDakMsNkRBQTZEO0lBQzdELDZCQUE2QjtJQUM3QiwrQ0FBK0M7SUFDL0MsY0FBYztJQUNkLGtDQUFrQztJQUNsQyw2QkFBNkI7SUFDN0IsdURBQXVEO0lBQ3ZELHFDQUFxQztDQUN0QyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsaUJBQU87SUFDN0MsWUFBWSxLQUFvQjtRQUM5QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQztZQUFFLE9BQU87UUFFN0MsSUFBSSxJQUFJLFlBQVkseUJBQVcsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLHdFQUF3RTtnQkFDOUUsV0FBVyxFQUNULGdiQUFnYjtnQkFDbGIsS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsdUJBQXVCO2dCQUMxQyxJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLHdFQUF3RTtnQkFDOUUsV0FBVyxFQUNULHFqQkFBcWpCO2dCQUN2akIsS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsb0JBQW9CO2dCQUN2QyxJQUFJLEVBQUUsSUFBSTthQUNYLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2IsSUFBSSxFQUFFLGtFQUFrRTtnQkFDeEUsV0FBVyxFQUNULGtKQUFrSjtnQkFDcEosS0FBSyxFQUFFLHlCQUFlLENBQUMsS0FBSztnQkFDNUIsSUFBSSxFQUFFLGVBQUssQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDaEMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSw4RUFBOEU7Z0JBQ3BGLFdBQVcsRUFDVCwwU0FBMFM7Z0JBQzVTLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsVUFBVSxDQUFDLGlDQUFpQztnQkFDeEQsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWdCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzVCLE9BQU8sMEJBQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7Q0FDRjtBQWpERCxnREFpREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTmFnTWVzc2FnZUxldmVsLCBOYWdQYWNrLCBydWxlcywgdHlwZSBOYWdQYWNrUHJvcHMgfSBmcm9tIFwiY2RrLW5hZ1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBQYXRoIGZyYWdtZW50cyBpZGVudGlmeWluZyBDREstbWFuYWdlZCBzaW5nbGV0b24gcmVzb3VyY2VzIHRoYXQgY29uc3VtZXJzXG4gKiBjYW5ub3QgY29uZmlndXJlLiBUaGVzZSBub2RlcyBhcmUgc2tpcHBlZCBkdXJpbmcgcnVsZSBldmFsdWF0aW9uIGJlY2F1c2VcbiAqIHN1cmZhY2luZyBuYWdzIG9uIG1lbW9yeSBzaXplLCB0aW1lb3V0LCB0cmFjaW5nLCBvciBsb2cgcmV0ZW50aW9uIGZvclxuICogcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBDREsgZnJhbWV3b3JrIGlzIG5vaXNlLlxuICovXG5jb25zdCBDREtfTUFOQUdFRF9QQVRIX0ZSQUdNRU5UUyA9IFtcbiAgLy8gYXdzLXMzLWRlcGxveW1lbnQuQnVja2V0RGVwbG95bWVudCBjdXN0b20gcmVzb3VyY2UgaGFuZGxlclxuICBcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiLFxuICAvLyBEZXByZWNhdGVkIENESyBsb2cgcmV0ZW50aW9uIGN1c3RvbSByZXNvdXJjZVxuICBcIkxvZ1JldGVudGlvblwiLFxuICAvLyBCdWNrZXQoYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUpXG4gIFwiQ3VzdG9tOjpTM0F1dG9EZWxldGVPYmplY3RzXCIsXG4gIC8vIGNyLlByb3ZpZGVyIGZyYW1ld29yayBvbi1ldmVudCAvIGlzLWNvbXBsZXRlIGhhbmRsZXJcbiAgXCJBV1M2NzlmNTNmYWMwMDI0MzBjYjBkYTViNzk4MmJkMjI4N1wiLFxuXTtcblxuLyoqXG4gKiBNaWNyb3NlcnZpY2UgQ2hlY2tzIGFyZSBhIGNvbXBpbGF0aW9uIG9mIHJ1bGVzIHRvIHZhbGlkYXRlIGluZnJhc3RydWN0dXJlLWFzLWNvZGUgdGVtcGxhdGVcbiAqIGFnYWluc3QgcmVjb21tZW5kZWQgcHJhY3RpY2VzIHVzaW5nIHRoZSBjZGstbmFnIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2RrLXBhdHRlcm5zL2Nkay1uYWcvXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAqIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ015U3RhY2snKTtcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgTWljcm9zZXJ2aWNlc0NoZWNrcygpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3Jvc2VydmljZUNoZWNrcyBleHRlbmRzIE5hZ1BhY2sge1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IE5hZ1BhY2tQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnBhY2tOYW1lID0gXCJNaWNyb3NlcnZpY2VzXCI7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgIGlmICh0aGlzLmlzQ2RrTWFuYWdlZFNpbmdsZXRvbihub2RlKSkgcmV0dXJuO1xuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSkge1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBMYW1iZGEgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBtZW1vcnkgdmFsdWUgY29uZmlndXJlZC5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJMYW1iZGEgYWxsb2NhdGVzIENQVSBwb3dlciBpbiBwcm9wb3J0aW9uIHRvIHRoZSBhbW91bnQgb2YgbWVtb3J5IGNvbmZpZ3VyZWQuIEJ5IGRlZmF1bHQsIHlvdXIgZnVuY3Rpb25zIGhhdmUgMTI4IE1CIG9mIG1lbW9yeSBhbGxvY2F0ZWQuIFlvdSBjYW4gaW5jcmVhc2UgdGhhdCB2YWx1ZSB1cCB0byAxMCBHQi4gV2l0aCBtb3JlIENQVSByZXNvdXJjZXMsIHlvdXIgTGFtYmRhIGZ1bmN0aW9uJ3MgZHVyYXRpb24gbWlnaHQgZGVjcmVhc2UuICBZb3UgY2FuIHVzZSB0b29scyBzdWNoIGFzIEFXUyBMYW1iZGEgUG93ZXIgVHVuaW5nIHRvIHRlc3QgeW91ciBmdW5jdGlvbiBhdCBkaWZmZXJlbnQgbWVtb3J5IHNldHRpbmdzIHRvIGZpbmQgdGhlIG9uZSB0aGF0IG1hdGNoZXMgeW91ciBjb3N0IGFuZCBwZXJmb3JtYW5jZSByZXF1aXJlbWVudHMgdGhlIGJlc3QuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmxhbWJkYS5MYW1iZGFEZWZhdWx0TWVtb3J5U2l6ZSxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBMYW1iZGEgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdGx5IGRlZmluZWQgdGltZW91dCB2YWx1ZS5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJMYW1iZGEgZnVuY3Rpb25zIGhhdmUgYSBkZWZhdWx0IHRpbWVvdXQgb2YgMyBzZWNvbmRzLiBJZiB5b3VyIHRpbWVvdXQgdmFsdWUgaXMgdG9vIHNob3J0LCBMYW1iZGEgbWlnaHQgdGVybWluYXRlIGludm9jYXRpb25zIHByZW1hdHVyZWx5LiBPbiB0aGUgb3RoZXIgc2lkZSwgc2V0dGluZyB0aGUgdGltZW91dCBtdWNoIGhpZ2hlciB0aGFuIHRoZSBhdmVyYWdlIGV4ZWN1dGlvbiBtYXkgY2F1c2UgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgZm9yIGxvbmdlciB1cG9uIGNvZGUgbWFsZnVuY3Rpb24sIHJlc3VsdGluZyBpbiBoaWdoZXIgY29zdHMgYW5kIHBvc3NpYmx5IHJlYWNoaW5nIGNvbmN1cnJlbmN5IGxpbWl0cyBkZXBlbmRpbmcgb24gaG93IHN1Y2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkLiBZb3UgY2FuIGFsc28gdXNlIEFXUyBMYW1iZGEgUG93ZXIgVHVuaW5nIHRvIHRlc3QgeW91ciBmdW5jdGlvbiBhdCBkaWZmZXJlbnQgdGltZW91dCBzZXR0aW5ncyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHlvdXIgY29zdCBhbmQgcGVyZm9ybWFuY2UgcmVxdWlyZW1lbnRzIHRoZSBiZXN0LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhRGVmYXVsdFRpbWVvdXQsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdHJhY2luZyBzZXQgdG8gVHJhY2luZy5BQ1RJVkUuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiV2hlbiBhIExhbWJkYSBmdW5jdGlvbiBoYXMgQUNUSVZFIHRyYWNpbmcsIExhbWJkYSBhdXRvbWF0aWNhbGx5IHNhbXBsZXMgaW52b2NhdGlvbiByZXF1ZXN0cywgYmFzZWQgb24gdGhlIHNhbXBsaW5nIGFsZ29yaXRobSBzcGVjaWZpZWQgYnkgWC1SYXkuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmxhbWJkYS5MYW1iZGFUcmFjaW5nLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5UnVsZSh7XG4gICAgICAgIGluZm86IFwiVGhlIENsb3VkV2F0Y2ggTG9nIEdyb3VwIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgcmV0ZW50aW9uIHBvbGljeSBkZWZpbmVkLlwiLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBcIkJ5IGRlZmF1bHQsIGxvZ3MgYXJlIGtlcHQgaW5kZWZpbml0ZWx5IGFuZCBuZXZlciBleHBpcmUuIFlvdSBjYW4gYWRqdXN0IHRoZSByZXRlbnRpb24gcG9saWN5IGZvciBlYWNoIGxvZyBncm91cCwga2VlcGluZyB0aGUgaW5kZWZpbml0ZSByZXRlbnRpb24sIG9yIGNob29zaW5nIGEgcmV0ZW50aW9uIHBlcmlvZCBiZXR3ZWVuIG9uZSBkYXkgYW5kIDEwIHllYXJzLiBGb3IgTGFtYmRhIGZ1bmN0aW9ucywgdGhpcyBhcHBsaWVzIHRvIHRoZWlyIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBDbG91ZFdhdGNoIExvZyBHcm91cHMuXCIsXG4gICAgICAgIGxldmVsOiBOYWdNZXNzYWdlTGV2ZWwuRVJST1IsXG4gICAgICAgIHJ1bGU6IHJ1bGVzLmNsb3Vkd2F0Y2guQ2xvdWRXYXRjaExvZ0dyb3VwUmV0ZW50aW9uUGVyaW9kLFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0Nka01hbmFnZWRTaW5nbGV0b24obm9kZTogSUNvbnN0cnVjdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHBhdGggPSBub2RlLm5vZGUucGF0aDtcbiAgICByZXR1cm4gQ0RLX01BTkFHRURfUEFUSF9GUkFHTUVOVFMuc29tZShmcmFnbWVudCA9PiBwYXRoLmluY2x1ZGVzKGZyYWdtZW50KSk7XG4gIH1cbn1cbiJdfQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zZXJ2aWNlLWNoZWNrcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1pY3Jvc2VydmljZS1jaGVja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBDO0FBQzFDLHFDQUE2RTtBQUU3RSxxRUFBaUU7QUFFakU7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsaUJBQU87SUFDN0MsWUFBWSxLQUFvQjtRQUM5QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQWdCO1FBQzNCLElBQUksSUFBQSw4Q0FBcUIsRUFBQyxJQUFJLENBQUM7WUFBRSxPQUFPO1FBRXhDLElBQUksSUFBSSxZQUFZLHlCQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSx3RUFBd0U7Z0JBQzlFLFdBQVcsRUFDVCxnYkFBZ2I7Z0JBQ2xiLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QjtnQkFDMUMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSx3RUFBd0U7Z0JBQzlFLFdBQVcsRUFDVCxxakJBQXFqQjtnQkFDdmpCLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFvQjtnQkFDdkMsSUFBSSxFQUFFLElBQUk7YUFDWCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNiLElBQUksRUFBRSxrRUFBa0U7Z0JBQ3hFLFdBQVcsRUFDVCxrSkFBa0o7Z0JBQ3BKLEtBQUssRUFBRSx5QkFBZSxDQUFDLEtBQUs7Z0JBQzVCLElBQUksRUFBRSxlQUFLLENBQUMsTUFBTSxDQUFDLGFBQWE7Z0JBQ2hDLElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDYixJQUFJLEVBQUUsOEVBQThFO2dCQUNwRixXQUFXLEVBQ1QsMFNBQTBTO2dCQUM1UyxLQUFLLEVBQUUseUJBQWUsQ0FBQyxLQUFLO2dCQUM1QixJQUFJLEVBQUUsZUFBSyxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUM7Z0JBQ3hELElBQUksRUFBRSxJQUFJO2FBQ1gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7Q0FDRjtBQTVDRCxnREE0Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgTmFnTWVzc2FnZUxldmVsLCBOYWdQYWNrLCBydWxlcywgdHlwZSBOYWdQYWNrUHJvcHMgfSBmcm9tIFwiY2RrLW5hZ1wiO1xuaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGlzQ2RrTWFuYWdlZFNpbmdsZXRvbiB9IGZyb20gXCIuL2Nkay1tYW5hZ2VkLXNpbmdsZXRvbnNcIjtcblxuLyoqXG4gKiBNaWNyb3NlcnZpY2UgQ2hlY2tzIGFyZSBhIGNvbXBpbGF0aW9uIG9mIHJ1bGVzIHRvIHZhbGlkYXRlIGluZnJhc3RydWN0dXJlLWFzLWNvZGUgdGVtcGxhdGVcbiAqIGFnYWluc3QgcmVjb21tZW5kZWQgcHJhY3RpY2VzIHVzaW5nIHRoZSBjZGstbmFnIGxpYnJhcnkuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2RrLXBhdHRlcm5zL2Nkay1uYWcvXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwcCA9IG5ldyBBcHAoKTtcbiAqIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ015U3RhY2snKTtcbiAqIEFzcGVjdHMub2Yoc3RhY2spLmFkZChuZXcgTWljcm9zZXJ2aWNlc0NoZWNrcygpKTtcbiAqL1xuZXhwb3J0IGNsYXNzIE1pY3Jvc2VydmljZUNoZWNrcyBleHRlbmRzIE5hZ1BhY2sge1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IE5hZ1BhY2tQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnBhY2tOYW1lID0gXCJNaWNyb3NlcnZpY2VzXCI7XG4gIH1cblxuICBwdWJsaWMgdmlzaXQobm9kZTogSUNvbnN0cnVjdCkge1xuICAgIGlmIChpc0Nka01hbmFnZWRTaW5nbGV0b24obm9kZSkpIHJldHVybjtcblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXQgbWVtb3J5IHZhbHVlIGNvbmZpZ3VyZWQuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiTGFtYmRhIGFsbG9jYXRlcyBDUFUgcG93ZXIgaW4gcHJvcG9ydGlvbiB0byB0aGUgYW1vdW50IG9mIG1lbW9yeSBjb25maWd1cmVkLiBCeSBkZWZhdWx0LCB5b3VyIGZ1bmN0aW9ucyBoYXZlIDEyOCBNQiBvZiBtZW1vcnkgYWxsb2NhdGVkLiBZb3UgY2FuIGluY3JlYXNlIHRoYXQgdmFsdWUgdXAgdG8gMTAgR0IuIFdpdGggbW9yZSBDUFUgcmVzb3VyY2VzLCB5b3VyIExhbWJkYSBmdW5jdGlvbidzIGR1cmF0aW9uIG1pZ2h0IGRlY3JlYXNlLiAgWW91IGNhbiB1c2UgdG9vbHMgc3VjaCBhcyBBV1MgTGFtYmRhIFBvd2VyIFR1bmluZyB0byB0ZXN0IHlvdXIgZnVuY3Rpb24gYXQgZGlmZmVyZW50IG1lbW9yeSBzZXR0aW5ncyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHlvdXIgY29zdCBhbmQgcGVyZm9ybWFuY2UgcmVxdWlyZW1lbnRzIHRoZSBiZXN0LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhRGVmYXVsdE1lbW9yeVNpemUsXG4gICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuYXBwbHlSdWxlKHtcbiAgICAgICAgaW5mbzogXCJUaGUgTGFtYmRhIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW4gZXhwbGljaXRseSBkZWZpbmVkIHRpbWVvdXQgdmFsdWUuXCIsXG4gICAgICAgIGV4cGxhbmF0aW9uOlxuICAgICAgICAgIFwiTGFtYmRhIGZ1bmN0aW9ucyBoYXZlIGEgZGVmYXVsdCB0aW1lb3V0IG9mIDMgc2Vjb25kcy4gSWYgeW91ciB0aW1lb3V0IHZhbHVlIGlzIHRvbyBzaG9ydCwgTGFtYmRhIG1pZ2h0IHRlcm1pbmF0ZSBpbnZvY2F0aW9ucyBwcmVtYXR1cmVseS4gT24gdGhlIG90aGVyIHNpZGUsIHNldHRpbmcgdGhlIHRpbWVvdXQgbXVjaCBoaWdoZXIgdGhhbiB0aGUgYXZlcmFnZSBleGVjdXRpb24gbWF5IGNhdXNlIGZ1bmN0aW9ucyB0byBleGVjdXRlIGZvciBsb25nZXIgdXBvbiBjb2RlIG1hbGZ1bmN0aW9uLCByZXN1bHRpbmcgaW4gaGlnaGVyIGNvc3RzIGFuZCBwb3NzaWJseSByZWFjaGluZyBjb25jdXJyZW5jeSBsaW1pdHMgZGVwZW5kaW5nIG9uIGhvdyBzdWNoIGZ1bmN0aW9ucyBhcmUgaW52b2tlZC4gWW91IGNhbiBhbHNvIHVzZSBBV1MgTGFtYmRhIFBvd2VyIFR1bmluZyB0byB0ZXN0IHlvdXIgZnVuY3Rpb24gYXQgZGlmZmVyZW50IHRpbWVvdXQgc2V0dGluZ3MgdG8gZmluZCB0aGUgb25lIHRoYXQgbWF0Y2hlcyB5b3VyIGNvc3QgYW5kIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cyB0aGUgYmVzdC5cIixcbiAgICAgICAgbGV2ZWw6IE5hZ01lc3NhZ2VMZXZlbC5FUlJPUixcbiAgICAgICAgcnVsZTogcnVsZXMubGFtYmRhLkxhbWJkYURlZmF1bHRUaW1lb3V0LFxuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmFwcGx5UnVsZSh7XG4gICAgICAgIGluZm86IFwiVGhlIExhbWJkYSBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRyYWNpbmcgc2V0IHRvIFRyYWNpbmcuQUNUSVZFLlwiLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBcIldoZW4gYSBMYW1iZGEgZnVuY3Rpb24gaGFzIEFDVElWRSB0cmFjaW5nLCBMYW1iZGEgYXV0b21hdGljYWxseSBzYW1wbGVzIGludm9jYXRpb24gcmVxdWVzdHMsIGJhc2VkIG9uIHRoZSBzYW1wbGluZyBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IFgtUmF5LlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5sYW1iZGEuTGFtYmRhVHJhY2luZyxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hcHBseVJ1bGUoe1xuICAgICAgICBpbmZvOiBcIlRoZSBDbG91ZFdhdGNoIExvZyBHcm91cCBkb2VzIG5vdCBoYXZlIGFuIGV4cGxpY2l0IHJldGVudGlvbiBwb2xpY3kgZGVmaW5lZC5cIixcbiAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgXCJCeSBkZWZhdWx0LCBsb2dzIGFyZSBrZXB0IGluZGVmaW5pdGVseSBhbmQgbmV2ZXIgZXhwaXJlLiBZb3UgY2FuIGFkanVzdCB0aGUgcmV0ZW50aW9uIHBvbGljeSBmb3IgZWFjaCBsb2cgZ3JvdXAsIGtlZXBpbmcgdGhlIGluZGVmaW5pdGUgcmV0ZW50aW9uLCBvciBjaG9vc2luZyBhIHJldGVudGlvbiBwZXJpb2QgYmV0d2VlbiBvbmUgZGF5IGFuZCAxMCB5ZWFycy4gRm9yIExhbWJkYSBmdW5jdGlvbnMsIHRoaXMgYXBwbGllcyB0byB0aGVpciBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgQ2xvdWRXYXRjaCBMb2cgR3JvdXBzLlwiLFxuICAgICAgICBsZXZlbDogTmFnTWVzc2FnZUxldmVsLkVSUk9SLFxuICAgICAgICBydWxlOiBydWxlcy5jbG91ZHdhdGNoLkNsb3VkV2F0Y2hMb2dHcm91cFJldGVudGlvblBlcmlvZCxcbiAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -56,18 +56,19 @@ export declare class ResourcePrefixAspect implements IAspect {
56
56
  private shouldSkipResource;
57
57
  private isAlreadyPrefixed;
58
58
  /**
59
- * Resolves the base name for a resource by checking explicitly set CFN properties
60
- * first, then falling back to deriving a name from the logical ID.
61
- * CDK stores L1 properties in camelCase internally, so both casings are checked.
59
+ * Resolves the name components for a resource: the explicitly set raw name (if any)
60
+ * and a sanitised logical ID derived from the construct tree.
61
+ *
62
+ * The raw name is looked up from the CFN properties in both PascalCase and camelCase
63
+ * (CDK stores L1 properties in camelCase internally). When no explicit name is set,
64
+ * `rawName` is `undefined`.
62
65
  */
63
- private resolveBaseName;
66
+ private resolveResourceNames;
64
67
  /**
65
68
  * Builds the prefixed name, handling special cases for specific resource types.
66
69
  *
67
- * @param baseName - The base resource name (without prefix)
68
- * @param cfnResourceType - The CloudFormation resource type
69
- * @param cfnProperties - The CloudFormation resource properties
70
- * @returns The final prefixed name with any special case handling applied
70
+ * Uses the raw name when it is a concrete string, falling back to the logical
71
+ * name when the raw name is an unresolved CDK token.
71
72
  */
72
73
  private buildPrefixedName;
73
74
  /**
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ResourcePrefixAspect = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const crypto_1 = require("crypto");
6
+ const cdk_managed_singletons_1 = require("./cdk-managed-singletons");
6
7
  /**
7
8
  * Maps CloudFormation resource types to their name property and AWS length limits.
8
9
  * Sources: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
@@ -94,6 +95,13 @@ class ResourcePrefixAspect {
94
95
  var _a, _b;
95
96
  if (!(node instanceof aws_cdk_lib_1.CfnResource))
96
97
  return;
98
+ // CDK-managed singleton/framework resources must keep their
99
+ // CloudFormation-generated physical names. Pinning a deterministic name onto
100
+ // them (e.g. the BucketDeployment handler) removes the random-suffix
101
+ // orphan-avoidance and wedges deploys on `/aws/lambda/<fn>` LogGroup
102
+ // "already exists" after any failed attempt.
103
+ if ((0, cdk_managed_singletons_1.isCdkManagedSingleton)(node))
104
+ return;
97
105
  const resourceType = node.cfnResourceType;
98
106
  const config = RESOURCE_CONFIG[resourceType];
99
107
  if (!config || this.exclude.has(resourceType)) {
@@ -101,14 +109,14 @@ class ResourcePrefixAspect {
101
109
  }
102
110
  const { cfnName, maxLength } = config;
103
111
  const cfnProperties = (_b = (_a = node._cfnProperties) !== null && _a !== void 0 ? _a : node.cfnProperties) !== null && _b !== void 0 ? _b : {};
104
- const baseName = this.resolveBaseName(node, cfnName, cfnProperties);
105
- if (this.shouldSkipResource(resourceType, baseName)) {
112
+ const names = this.resolveResourceNames(node, cfnName, cfnProperties);
113
+ if (this.shouldSkipResource(resourceType, names)) {
106
114
  return;
107
115
  }
108
- if (this.isAlreadyPrefixed(baseName)) {
116
+ if (this.isAlreadyPrefixed(names)) {
109
117
  return;
110
118
  }
111
- const prefixedName = this.buildPrefixedName(baseName, resourceType, cfnProperties);
119
+ const prefixedName = this.buildPrefixedName(names, resourceType, cfnProperties);
112
120
  // Truncation applies to all overflows — including user-set names — because L3
113
121
  // constructs can generate names the user has no direct control over.
114
122
  const finalName = this.truncateToFit(prefixedName, maxLength, node);
@@ -121,60 +129,68 @@ class ResourcePrefixAspect {
121
129
  * Determines whether a resource should be skipped from prefixing based on
122
130
  * resource-type-specific rules (e.g., AWS-reserved naming conventions).
123
131
  */
124
- shouldSkipResource(cfnResourceType, baseName) {
125
- return (cfnResourceType === "AWS::Logs::LogGroup" && baseName.startsWith("/aws/"));
132
+ shouldSkipResource(cfnResourceType, names) {
133
+ var _a;
134
+ const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
135
+ return (cfnResourceType === "AWS::Logs::LogGroup" && name.startsWith("/aws/"));
126
136
  }
127
- isAlreadyPrefixed(name) {
137
+ isAlreadyPrefixed(names) {
138
+ var _a;
139
+ const name = (_a = names.rawName) !== null && _a !== void 0 ? _a : names.logicalName;
128
140
  return (name.startsWith(`${this.prefix}-`) || name.startsWith(`/${this.prefix}/`));
129
141
  }
130
142
  /**
131
- * Resolves the base name for a resource by checking explicitly set CFN properties
132
- * first, then falling back to deriving a name from the logical ID.
133
- * CDK stores L1 properties in camelCase internally, so both casings are checked.
143
+ * Resolves the name components for a resource: the explicitly set raw name (if any)
144
+ * and a sanitised logical ID derived from the construct tree.
145
+ *
146
+ * The raw name is looked up from the CFN properties in both PascalCase and camelCase
147
+ * (CDK stores L1 properties in camelCase internally). When no explicit name is set,
148
+ * `rawName` is `undefined`.
134
149
  */
135
- resolveBaseName(node, cfnName, cfnProperties) {
150
+ resolveResourceNames(node, cfnName, cfnProperties) {
136
151
  var _a;
137
152
  const camelCfnName = cfnName.charAt(0).toLowerCase() + cfnName.slice(1);
138
153
  const rawName = (_a = cfnProperties[cfnName]) !== null && _a !== void 0 ? _a : cfnProperties[camelCfnName];
139
- if (typeof rawName === "string") {
140
- return rawName;
141
- }
142
- const logicalId = aws_cdk_lib_1.Stack.of(node).getLogicalId(node);
143
- return logicalId
154
+ const logicalName = aws_cdk_lib_1.Stack.of(node)
155
+ .getLogicalId(node)
144
156
  .replace(/[^a-zA-Z0-9]+/g, "-") // non-alphanumeric → dash
145
157
  .replace(/^-+|-+$/g, ""); // trim leading/trailing dashes
158
+ return typeof rawName === "string"
159
+ ? { logicalName, rawName }
160
+ : { logicalName, rawName: undefined };
146
161
  }
147
162
  /**
148
163
  * Builds the prefixed name, handling special cases for specific resource types.
149
164
  *
150
- * @param baseName - The base resource name (without prefix)
151
- * @param cfnResourceType - The CloudFormation resource type
152
- * @param cfnProperties - The CloudFormation resource properties
153
- * @returns The final prefixed name with any special case handling applied
165
+ * Uses the raw name when it is a concrete string, falling back to the logical
166
+ * name when the raw name is an unresolved CDK token.
154
167
  */
155
- buildPrefixedName(baseName, cfnResourceType, cfnProperties) {
168
+ buildPrefixedName(names, cfnResourceType, cfnProperties) {
169
+ const name = !names.rawName || aws_cdk_lib_1.Token.isUnresolved(names.rawName)
170
+ ? names.logicalName
171
+ : names.rawName;
156
172
  // Special case: FIFO queues must end with .fifo suffix
157
173
  if (cfnResourceType === "AWS::SQS::Queue" &&
158
174
  cfnProperties.fifoQueue === true &&
159
- !baseName.endsWith(".fifo")) {
160
- return `${this.prefix}-${baseName}.fifo`;
175
+ !name.endsWith(".fifo")) {
176
+ return `${this.prefix}-${name}.fifo`;
161
177
  }
162
178
  // Special case: FIFO topics must end with .fifo suffix
163
179
  if (cfnResourceType === "AWS::SNS::Topic" &&
164
180
  cfnProperties.fifoTopic === true &&
165
- !baseName.endsWith(".fifo")) {
166
- return `${this.prefix}-${baseName}.fifo`;
181
+ !name.endsWith(".fifo")) {
182
+ return `${this.prefix}-${name}.fifo`;
167
183
  }
168
184
  // Special case: SSM parameter names use path-style prefix
169
185
  if (cfnResourceType === "AWS::SSM::Parameter") {
170
- return `/${this.prefix}/${baseName}`;
186
+ return `/${this.prefix}/${name}`;
171
187
  }
172
188
  // Special case: S3 bucket name be lowercase only
173
189
  if (cfnResourceType === "AWS::S3::Bucket") {
174
- return `${this.prefix}-${baseName}`.toLowerCase();
190
+ return `${this.prefix}-${name}`.toLowerCase();
175
191
  }
176
192
  // Default: simple prefix
177
- return `${this.prefix}-${baseName}`;
193
+ return `${this.prefix}-${name}`;
178
194
  }
179
195
  /**
180
196
  * Truncates a prefixed name to fit within maxLength by hashing the original
@@ -216,4 +232,4 @@ class ResourcePrefixAspect {
216
232
  }
217
233
  }
218
234
  exports.ResourcePrefixAspect = ResourcePrefixAspect;
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQUV2RSxtQ0FBb0M7QUErQnBDOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUF1QztJQUMxRCxVQUFVO0lBQ1YsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFFbkUsVUFBVTtJQUNWLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzNELHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ2hFLDRCQUE0QixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRXRFLFlBQVk7SUFDWixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMxRCxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUUzRCwyQkFBMkI7SUFDM0IsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDNUQsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdkQseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDN0Qsa0JBQWtCLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDdEQsa0NBQWtDLEVBQUU7UUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixTQUFT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QUNGO0FBeE1ELG9EQXdNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIjtcblxuaW50ZXJmYWNlIFJlc291cmNlTmFtZUNvbmZpZyB7XG4gIC8qKiBUaGUgQ2xvdWRGb3JtYXRpb24gcHJvcGVydHkgdGhhdCBob2xkcyB0aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBuYW1lICovXG4gIGNmbk5hbWU6IHN0cmluZztcbiAgLyoqIE1heGltdW0gYWxsb3dlZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciB0aGlzIHJlc291cmNlIHR5cGUgKi9cbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG59XG5cbi8qKlxuICogRXh0ZW5zaW9uIHR5cGUgdG8gYWNjZXNzIGludGVybmFsIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgb24gQ2ZuUmVzb3VyY2UuXG4gKlxuICogQ0RLIGRvZXMgbm90IHByb3ZpZGUgYSBwdWJsaWMgQVBJIHRvIHJlYWQgcmF3IENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdGhhdCBoYXZlXG4gKiBiZWVuIHNldCBvbiBhIENmblJlc291cmNlLiBUaGUgcHJvcGVydGllcyBgX2NmblByb3BlcnRpZXNgIGFuZCBgY2ZuUHJvcGVydGllc2AgYXJlXG4gKiBwcm90ZWN0ZWQgYW5kIG9ubHkgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIENmblJlc291cmNlIGNsYXNzIGhpZXJhcmNoeS5cbiAqXG4gKiBXZSBpbnZlc3RpZ2F0ZWQgdXNpbmcgQ0RLJ3MgcHVibGljIEFQSXMsIGJ1dCB0aGVyZSBpcyBubyBwdWJsaWMgbWV0aG9kIHRvIHJldHJpZXZlXG4gKiB0aGUgcmF3IHByb3BlcnR5IHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBzZXQgKGUuZy4sIHZpYSBjb25zdHJ1Y3RvciBwcm9wcyBvciBhZGRQcm9wZXJ0eU92ZXJyaWRlKS5cbiAqIFRoZSBvbmx5IHB1YmxpYyBBUElzIGFyZSBmb3Igd3JpdGluZyAoYWRkUHJvcGVydHlPdmVycmlkZSwgYWRkUHJvcGVydHlEZWxldGlvbk92ZXJyaWRlKSBvclxuICogZ2V0dGluZyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyAoZ2V0QXR0KSwgbm90IGZvciByZWFkaW5nIGxpdGVyYWwgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIFRoaXMgdHlwZSBhc3NlcnRpb24gaXMgc2FmZSBiZWNhdXNlOlxuICogLSBXZSBvbmx5IHJlYWQgdGhlc2UgcHJvcGVydGllcywgbmV2ZXIgbW9kaWZ5IHRoZW1cbiAqIC0gV2UgbmVlZCB0byBjaGVjayBpZiBhIHVzZXIgZXhwbGljaXRseSBzZXQgYSBuYW1lIHByb3BlcnR5IGJlZm9yZSBhcHBseWluZyBvdXIgcHJlZml4XG4gKiAtIFRoZSBwcm9wZXJ0aWVzIGV4aXN0IGF0IHJ1bnRpbWUgYW5kIGFyZSBwYXJ0IG9mIENESydzIGludGVybmFsIGltcGxlbWVudGF0aW9uXG4gKi9cbnR5cGUgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMgPSBDZm5SZXNvdXJjZSAmIHtcbiAgcmVhZG9ubHkgX2NmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgY2ZuUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuLyoqXG4gKiBNYXBzIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRvIHRoZWlyIG5hbWUgcHJvcGVydHkgYW5kIEFXUyBsZW5ndGggbGltaXRzLlxuICogU291cmNlczogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXRlbXBsYXRlLXJlc291cmNlLXR5cGUtcmVmLmh0bWxcbiAqL1xuY29uc3QgUkVTT1VSQ0VfQ09ORklHOiBSZWNvcmQ8c3RyaW5nLCBSZXNvdXJjZU5hbWVDb25maWc+ID0ge1xuICAvLyBDb21wdXRlXG4gIFwiQVdTOjpMYW1iZGE6OkZ1bmN0aW9uXCI6IHsgY2ZuTmFtZTogXCJGdW5jdGlvbk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIFN0b3JhZ2VcbiAgXCJBV1M6OlMzOjpCdWNrZXRcIjogeyBjZm5OYW1lOiBcIkJ1Y2tldE5hbWVcIiwgbWF4TGVuZ3RoOiA2MyB9LFxuICBcIkFXUzo6RHluYW1vREI6OlRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcbiAgXCJBV1M6OkR5bmFtb0RCOjpHbG9iYWxUYWJsZVwiOiB7IGNmbk5hbWU6IFwiVGFibGVOYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gTWVzc2FnaW5nXG4gIFwiQVdTOjpTUVM6OlF1ZXVlXCI6IHsgY2ZuTmFtZTogXCJRdWV1ZU5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U05TOjpUb3BpY1wiOiB7IGNmbk5hbWU6IFwiVG9waWNOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG5cbiAgLy8gRXZlbnRpbmcgJiBPcmNoZXN0cmF0aW9uXG4gIFwiQVdTOjpFdmVudHM6OkV2ZW50QnVzXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMjU2IH0sXG4gIFwiQVdTOjpFdmVudHM6OlJ1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6RXZlbnRzOjpDb25uZWN0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlBpcGVzOjpQaXBlXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZVwiOiB7XG4gICAgY2ZuTmFtZTogXCJTdGF0ZU1hY2hpbmVOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA4MCxcbiAgfSxcbiAgXCJBV1M6OlN0ZXBGdW5jdGlvbnM6OkFjdGl2aXR5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogODAgfSxcbiAgXCJBV1M6OlNjaGVkdWxlcjo6U2NoZWR1bGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZUdyb3VwXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcblxuICAvLyBBUElcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlc3RBcGlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXk6OlVzYWdlUGxhblwiOiB7IGNmbk5hbWU6IFwiVXNhZ2VQbGFuTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6QXBpS2V5XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpBdXRob3JpemVyXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG5cbiAgLy8gU2VjcmV0cyAmIENvbmZpZ1xuICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlNlY3JldFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6U1NNOjpQYXJhbWV0ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyMDQ4IH0sXG4gIFwiQVdTOjpBcHBDb25maWc6OkFwcGxpY2F0aW9uXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6RW52aXJvbm1lbnRcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIE5vdGlmaWNhdGlvbnNcbiAgXCJBV1M6Ok5vdGlmaWNhdGlvbnM6Ok5vdGlmaWNhdGlvbkNvbmZpZ3VyYXRpb25cIjoge1xuICAgIGNmbk5hbWU6IFwiTmFtZVwiLFxuICAgIG1heExlbmd0aDogNjQsXG4gIH0sXG5cbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICBcIkFXUzo6TG9nczo6TG9nR3JvdXBcIjogeyBjZm5OYW1lOiBcIkxvZ0dyb3VwTmFtZVwiLCBtYXhMZW5ndGg6IDUxMiB9LFxuICBcIkFXUzo6Q2xvdWRXYXRjaDo6QWxhcm1cIjogeyBjZm5OYW1lOiBcIkFsYXJtTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuXG4gIC8vIElBTVxuICBcIkFXUzo6SUFNOjpSb2xlXCI6IHsgY2ZuTmFtZTogXCJSb2xlTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMge1xuICAvKipcbiAgICogVGhlIHByZWZpeCB0byBhcHBseSB0byBhbGwgcmVzb3VyY2UgbmFtZXMuXG4gICAqIGUuZy4gJ215YXBwLXByb2QnIOKGkiAnbXlhcHAtcHJvZC1vcmRlcnMnXG4gICAqL1xuICBwcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgdHlwZXMgdG8gc2tpcCBlbnRpcmVseS5cbiAgICogZS5nLiBbJ0FXUzo6SUFNOjpSb2xlJ10gdG8gbGVhdmUgSUFNIHJvbGUgbmFtZXMgdW50b3VjaGVkLlxuICAgKiBAZGVmYXVsdCBbXVxuICAgKi9cbiAgZXhjbHVkZT86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENESyBBc3BlY3QgdGhhdCBhdXRvbWF0aWNhbGx5IHByZWZpeGVzIHBoeXNpY2FsIHJlc291cmNlIG5hbWVzIGFjcm9zcyBBV1MgcmVzb3VyY2VzLlxuICpcbiAqIEByZW1hcmtzXG4gKiAqKkNyaXRpY2FsIEltcGxlbWVudGF0aW9uIE5vdGVzOioqXG4gKlxuICogMS4gKipTdGFnZSBTeW50aGVzaXMgQm91bmRhcmllcyoqOlxuICogICAgLSBDREsgYFN0YWdlYCBjb25zdHJ1Y3RzIGNyZWF0ZSBzeW50aGVzaXMgYm91bmRhcmllcyB0aGF0IHByZXZlbnQgQXBwLWxldmVsIGFzcGVjdHNcbiAqICAgICAgZnJvbSB0cmF2ZXJzaW5nIGludG8gdGhlbVxuICogICAgLSBUaGlzIGFzcGVjdCBNVVNUIGJlIGFwcGxpZWQgdG8gZWFjaCBTdGFnZSBpbmRpdmlkdWFsbHksIG5vdCB0byB0aGUgQXBwXG4gKiAgICAtIEV4YW1wbGU6IGBBc3BlY3RzLm9mKHN0YWdlKS5hZGQobmV3IFJlc291cmNlUHJlZml4QXNwZWN0KHsuLi59KSlgXG4gKlxuICogMi4gKipQcm9wZXJ0eSBOYW1lIENhc2luZyoqOlxuICogICAgLSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHVzZSBQYXNjYWxDYXNlIChlLmcuLCBgRnVuY3Rpb25OYW1lYCwgYEJ1Y2tldE5hbWVgKVxuICogICAgLSBVc2luZyBjYW1lbENhc2UgKGUuZy4sIGBmdW5jdGlvbk5hbWVgKSB3aWxsIGNhdXNlIGVycm9ycyB3aXRoIHZlcnNpb25pbmcgYXNwZWN0c1xuICogICAgLSBXaGVuIHVzaW5nIGBhZGRQcm9wZXJ0eU92ZXJyaWRlKClgLCBhbHdheXMgdXNlIHRoZSBleGFjdCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSBuYW1lXG4gKlxuICogMy4gKipBc3BlY3QgUHJpb3JpdHkgd2l0aCBWZXJzaW9uaW5nKio6XG4gKiAgICAtIFdoZW4gY29tYmluaW5nIHdpdGggTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCwgYXBwbHkgdGhpcyBhc3BlY3QgQkVGT1JFIHZlcnNpb25pbmdcbiAqICAgIC0gVXNlIENESydzIHByaW9yaXR5IHN5c3RlbTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChwcmVmaXhBc3BlY3QsIHsgcHJpb3JpdHk6IDEwMCB9KWBcbiAqICAgIC0gVGhlbjogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZCh2ZXJzaW9uaW5nQXNwZWN0LCB7IHByaW9yaXR5OiAyMDAgfSlgXG4gKiAgICAtIExvd2VyIHByaW9yaXR5IG51bWJlcnMgcnVuIGZpcnN0XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENvcnJlY3QgdXNhZ2Ugd2l0aCBzdGFnaW5nXG4gKiBjb25zdCBzdGFnZSA9IG5ldyBBcHBsaWNhdGlvblN0YWdlKGFwcCwgJ3Byb2QnKTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3QoeyBwcmVmaXg6ICdteWFwcCcgfSksIHsgcHJpb3JpdHk6IDEwMCB9KTtcbiAqIEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgTGFtYmRhQW5kU3RlcEZ1bmN0aW9uVmVyc2lvbmluZ0FzcGVjdCgpLCB7IHByaW9yaXR5OiAyMDAgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlUHJlZml4QXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhjbHVkZTogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IFJlc291cmNlUHJlZml4QXNwZWN0UHJvcHMpIHtcbiAgICBpZiAoIXByb3BzLnByZWZpeCB8fCAhL15bYS16MC05LV0rJC8udGVzdChwcm9wcy5wcmVmaXgpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUmVzb3VyY2VQcmVmaXhBc3BlY3Q6IHByZWZpeCBtdXN0IGNvbnRhaW4gb25seSBsb3dlcmNhc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kIGh5cGhlbnMsIGdvdCBcIiR7cHJvcHMucHJlZml4fVwiYFxuICAgICAgKTtcblxuICAgIHRoaXMucHJlZml4ID0gcHJvcHMucHJlZml4O1xuICAgIHRoaXMuZXhjbHVkZSA9IG5ldyBTZXQocHJvcHMuZXhjbHVkZSA/PyBbXSk7XG4gIH1cblxuICB2aXNpdChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIENmblJlc291cmNlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbm9kZS5jZm5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3QgY29uZmlnID0gUkVTT1VSQ0VfQ09ORklHW3Jlc291cmNlVHlwZV07XG5cbiAgICBpZiAoIWNvbmZpZyB8fCB0aGlzLmV4Y2x1ZGUuaGFzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNmbk5hbWUsIG1heExlbmd0aCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgIChub2RlIGFzIENmblJlc291cmNlV2l0aFByb3BzKS5fY2ZuUHJvcGVydGllcyA/P1xuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLmNmblByb3BlcnRpZXMgPz9cbiAgICAgIHt9O1xuXG4gICAgY29uc3QgYmFzZU5hbWUgPSB0aGlzLnJlc29sdmVCYXNlTmFtZShub2RlLCBjZm5OYW1lLCBjZm5Qcm9wZXJ0aWVzKTtcblxuICAgIGlmICh0aGlzLnNob3VsZFNraXBSZXNvdXJjZShyZXNvdXJjZVR5cGUsIGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQWxyZWFkeVByZWZpeGVkKGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkTmFtZSA9IHRoaXMuYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIGNmblByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgLy8gVHJ1bmNhdGlvbiBhcHBsaWVzIHRvIGFsbCBvdmVyZmxvd3Mg4oCUIGluY2x1ZGluZyB1c2VyLXNldCBuYW1lcyDigJQgYmVjYXVzZSBMM1xuICAgIC8vIGNvbnN0cnVjdHMgY2FuIGdlbmVyYXRlIG5hbWVzIHRoZSB1c2VyIGhhcyBubyBkaXJlY3QgY29udHJvbCBvdmVyLlxuICAgIGNvbnN0IGZpbmFsTmFtZSA9IHRoaXMudHJ1bmNhdGVUb0ZpdChwcmVmaXhlZE5hbWUsIG1heExlbmd0aCwgbm9kZSk7XG5cbiAgICBjb25zdCBoYXNFcnJvciA9IHRoaXMudmFsaWRhdGVSZXNvdXJjZU5hbWUoZmluYWxOYW1lLCByZXNvdXJjZVR5cGUsIG5vZGUpO1xuXG4gICAgaWYgKGhhc0Vycm9yKSByZXR1cm47XG5cbiAgICBub2RlLmFkZFByb3BlcnR5T3ZlcnJpZGUoY2ZuTmFtZSwgZmluYWxOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByZXNvdXJjZSBzaG91bGQgYmUgc2tpcHBlZCBmcm9tIHByZWZpeGluZyBiYXNlZCBvblxuICAgKiByZXNvdXJjZS10eXBlLXNwZWNpZmljIHJ1bGVzIChlLmcuLCBBV1MtcmVzZXJ2ZWQgbmFtaW5nIGNvbnZlbnRpb25zKS5cbiAgICovXG4gIHByaXZhdGUgc2hvdWxkU2tpcFJlc291cmNlKGNmblJlc291cmNlVHlwZTogc3RyaW5nLCBiYXNlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIgJiYgYmFzZU5hbWUuc3RhcnRzV2l0aChcIi9hd3MvXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbHJlYWR5UHJlZml4ZWQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIG5hbWUuc3RhcnRzV2l0aChgJHt0aGlzLnByZWZpeH0tYCkgfHwgbmFtZS5zdGFydHNXaXRoKGAvJHt0aGlzLnByZWZpeH0vYClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBiYXNlIG5hbWUgZm9yIGEgcmVzb3VyY2UgYnkgY2hlY2tpbmcgZXhwbGljaXRseSBzZXQgQ0ZOIHByb3BlcnRpZXNcbiAgICogZmlyc3QsIHRoZW4gZmFsbGluZyBiYWNrIHRvIGRlcml2aW5nIGEgbmFtZSBmcm9tIHRoZSBsb2dpY2FsIElELlxuICAgKiBDREsgc3RvcmVzIEwxIHByb3BlcnRpZXMgaW4gY2FtZWxDYXNlIGludGVybmFsbHksIHNvIGJvdGggY2FzaW5ncyBhcmUgY2hlY2tlZC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUJhc2VOYW1lKFxuICAgIG5vZGU6IENmblJlc291cmNlLFxuICAgIGNmbk5hbWU6IHN0cmluZyxcbiAgICBjZm5Qcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBjb25zdCBjYW1lbENmbk5hbWUgPSBjZm5OYW1lLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgY2ZuTmFtZS5zbGljZSgxKTtcbiAgICBjb25zdCByYXdOYW1lID0gY2ZuUHJvcGVydGllc1tjZm5OYW1lXSA/PyBjZm5Qcm9wZXJ0aWVzW2NhbWVsQ2ZuTmFtZV07XG4gICAgaWYgKHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmF3TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpY2FsSWQgPSBTdGFjay5vZihub2RlKS5nZXRMb2dpY2FsSWQobm9kZSk7XG4gICAgcmV0dXJuIGxvZ2ljYWxJZFxuICAgICAgLnJlcGxhY2UoL1teYS16QS1aMC05XSsvZywgXCItXCIpIC8vIG5vbi1hbHBoYW51bWVyaWMg4oaSIGRhc2hcbiAgICAgIC5yZXBsYWNlKC9eLSt8LSskL2csIFwiXCIpOyAvLyB0cmltIGxlYWRpbmcvdHJhaWxpbmcgZGFzaGVzXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwcmVmaXhlZCBuYW1lLCBoYW5kbGluZyBzcGVjaWFsIGNhc2VzIGZvciBzcGVjaWZpYyByZXNvdXJjZSB0eXBlcy5cbiAgICpcbiAgICogQHBhcmFtIGJhc2VOYW1lIC0gVGhlIGJhc2UgcmVzb3VyY2UgbmFtZSAod2l0aG91dCBwcmVmaXgpXG4gICAqIEBwYXJhbSBjZm5SZXNvdXJjZVR5cGUgLSBUaGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZVxuICAgKiBAcGFyYW0gY2ZuUHJvcGVydGllcyAtIFRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBwcmVmaXhlZCBuYW1lIHdpdGggYW55IHNwZWNpYWwgY2FzZSBoYW5kbGluZyBhcHBsaWVkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWROYW1lKFxuICAgIGJhc2VOYW1lOiBzdHJpbmcsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBGSUZPIHF1ZXVlcyBtdXN0IGVuZCB3aXRoIC5maWZvIHN1ZmZpeFxuICAgIGlmIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNRUzo6UXVldWVcIiAmJlxuICAgICAgY2ZuUHJvcGVydGllcy5maWZvUXVldWUgPT09IHRydWUgJiZcbiAgICAgICFiYXNlTmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7YmFzZU5hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhYmFzZU5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfS5maWZvYDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFNTTSBwYXJhbWV0ZXIgbmFtZXMgdXNlIHBhdGgtc3R5bGUgcHJlZml4XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgLyR7dGhpcy5wcmVmaXh9LyR7YmFzZU5hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWAudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBzaW1wbGUgcHJlZml4XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGEgcHJlZml4ZWQgbmFtZSB0byBmaXQgd2l0aGluIG1heExlbmd0aCBieSBoYXNoaW5nIHRoZSBvcmlnaW5hbFxuICAgKiBmb3IgdW5pcXVlbmVzcy4gRW1pdHMgYSBDREsgd2FybmluZyB3aGVuIHRydW5jYXRpb24gb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0cnVuY2F0ZVRvRml0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKG5hbWUubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIG5hbWU7XG5cbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUobmFtZSkuZGlnZXN0KFwiaGV4XCIpLnNsaWNlKDAsIDgpO1xuXG4gICAgLy8gUHJlc2VydmUgLmZpZm8gc3VmZml4IOKAlCBBV1MgcmVxdWlyZXMgaXQgYXQgdGhlIGVuZCBvZiBGSUZPIHJlc291cmNlIG5hbWVzXG4gICAgY29uc3Qgc3VmZml4ID0gbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpID8gXCIuZmlmb1wiIDogXCJcIjtcbiAgICBjb25zdCBuYW1lV2l0aG91dFN1ZmZpeCA9IHN1ZmZpeCA/IG5hbWUuc2xpY2UoMCwgLXN1ZmZpeC5sZW5ndGgpIDogbmFtZTtcblxuICAgIC8vIDEgYWNjb3VudHMgZm9yIHRoZSBkYXNoIHNlcGFyYXRvciBiZWZvcmUgdGhlIGhhc2hcbiAgICBjb25zdCBidWRnZXQgPSBtYXhMZW5ndGggLSBoYXNoLmxlbmd0aCAtIDEgLSBzdWZmaXgubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZCA9IG5hbWVXaXRob3V0U3VmZml4LnNsaWNlKDAsIGJ1ZGdldCkgKyBcIi1cIiArIGhhc2ggKyBzdWZmaXg7XG5cbiAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRXYXJuaW5nKFxuICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gXCIke25hbWV9XCIgKCR7bmFtZS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofS4gYCArXG4gICAgICAgIGBOYW1lIGhhcyBiZWVuIHRydW5jYXRlZCB0byBcIiR7dHJ1bmNhdGVkfVwiLiBTaG9ydGVuIHRoZSByZXNvdXJjZSBiYXNlIG5hbWUgb3IgeW91ciBwcmVmaXggKFwiJHt0aGlzLnByZWZpeH1cIikgdG8gYXZvaWQgdHJ1bmNhdGlvbi5gXG4gICAgKTtcblxuICAgIHJldHVybiB0cnVuY2F0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHJlc291cmNlLXNwZWNpZmljIHN0cnVjdHVyYWwgbmFtaW5nIHJlcXVpcmVtZW50cyB0aGF0IEFXUyBlbmZvcmNlcy5cbiAgICogTGVuZ3RoIHZpb2xhdGlvbnMgYXJlIGhhbmRsZWQgdXBzdHJlYW0gYnkgdHJ1bmNhdGVUb0ZpdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZXNvdXJjZU5hbWUoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNmblJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIG5vZGU6IElDb25zdHJ1Y3RcbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XG5cbiAgICBpZiAoY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6UzM6OkJ1Y2tldFwiKSB7XG4gICAgICBpZiAobmFtZSAhPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVwcGVyY2FzZSBsZXR0ZXJzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugb25seS5gXG4gICAgICAgICk7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5hbWUuaW5jbHVkZXMoXCJfXCIpKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFMzIGJ1Y2tldCBuYW1lIFwiJHtuYW1lfVwiIGNvbnRhaW5zIHVuZGVyc2NvcmVzLiBgICtcbiAgICAgICAgICAgIGBCdWNrZXQgbmFtZXMgY2Fubm90IGNvbnRhaW4gdW5kZXJzY29yZXMuIFVzZSBoeXBoZW5zIGluc3RlYWQuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG59XG4iXX0=
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4RTtBQUU5RSxtQ0FBb0M7QUFDcEMscUVBQWlFO0FBb0NqRTs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBdUM7SUFDMUQsVUFBVTtJQUNWLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBRW5FLFVBQVU7SUFDVixpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUMzRCxzQkFBc0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUNoRSw0QkFBNEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUV0RSxZQUFZO0lBQ1osaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDMUQsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFFM0QsMkJBQTJCO0lBQzNCLHVCQUF1QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQzVELG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3ZELHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzdELGtCQUFrQixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQ3RELGtDQUFrQyxFQUFFO1FBQ2xDLE9BQU8sRUFBRSxrQkFB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QUssQ0FBQztRQUVyQixJQUFJLGVBQWUsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQzNCLDBDQUEwQyxJQUFJLGdDQUFnQztvQkFDNUUsc0NBQXNDLENBQ3pDLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMENBQTBDLElBQUksMEJBQTBCO29CQUN0RSwrREFBK0QsQ0FDbEUsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBdk5ELG9EQXVOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2ssIFRva2VuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBpc0Nka01hbmFnZWRTaW5nbGV0b24gfSBmcm9tIFwiLi9jZGstbWFuYWdlZC1zaW5nbGV0b25zXCI7XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVDb25maWcge1xuICAvKiogVGhlIENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IHRoYXQgaG9sZHMgdGhlIHJlc291cmNlJ3MgcGh5c2ljYWwgbmFtZSAqL1xuICBjZm5OYW1lOiBzdHJpbmc7XG4gIC8qKiBNYXhpbXVtIGFsbG93ZWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgdGhpcyByZXNvdXJjZSB0eXBlICovXG4gIG1heExlbmd0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuc2lvbiB0eXBlIHRvIGFjY2VzcyBpbnRlcm5hbCBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIG9uIENmblJlc291cmNlLlxuICpcbiAqIENESyBkb2VzIG5vdCBwcm92aWRlIGEgcHVibGljIEFQSSB0byByZWFkIHJhdyBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZVxuICogYmVlbiBzZXQgb24gYSBDZm5SZXNvdXJjZS4gVGhlIHByb3BlcnRpZXMgYF9jZm5Qcm9wZXJ0aWVzYCBhbmQgYGNmblByb3BlcnRpZXNgIGFyZVxuICogcHJvdGVjdGVkIGFuZCBvbmx5IGFjY2Vzc2libGUgd2l0aGluIHRoZSBDZm5SZXNvdXJjZSBjbGFzcyBoaWVyYXJjaHkuXG4gKlxuICogV2UgaW52ZXN0aWdhdGVkIHVzaW5nIENESydzIHB1YmxpYyBBUElzLCBidXQgdGhlcmUgaXMgbm8gcHVibGljIG1ldGhvZCB0byByZXRyaWV2ZVxuICogdGhlIHJhdyBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBoYXZlIGJlZW4gc2V0IChlLmcuLCB2aWEgY29uc3RydWN0b3IgcHJvcHMgb3IgYWRkUHJvcGVydHlPdmVycmlkZSkuXG4gKiBUaGUgb25seSBwdWJsaWMgQVBJcyBhcmUgZm9yIHdyaXRpbmcgKGFkZFByb3BlcnR5T3ZlcnJpZGUsIGFkZFByb3BlcnR5RGVsZXRpb25PdmVycmlkZSkgb3JcbiAqIGdldHRpbmcgYXR0cmlidXRlIHJlZmVyZW5jZXMgKGdldEF0dCksIG5vdCBmb3IgcmVhZGluZyBsaXRlcmFsIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBUaGlzIHR5cGUgYXNzZXJ0aW9uIGlzIHNhZmUgYmVjYXVzZTpcbiAqIC0gV2Ugb25seSByZWFkIHRoZXNlIHByb3BlcnRpZXMsIG5ldmVyIG1vZGlmeSB0aGVtXG4gKiAtIFdlIG5lZWQgdG8gY2hlY2sgaWYgYSB1c2VyIGV4cGxpY2l0bHkgc2V0IGEgbmFtZSBwcm9wZXJ0eSBiZWZvcmUgYXBwbHlpbmcgb3VyIHByZWZpeFxuICogLSBUaGUgcHJvcGVydGllcyBleGlzdCBhdCBydW50aW1lIGFuZCBhcmUgcGFydCBvZiBDREsncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvblxuICovXG50eXBlIENmblJlc291cmNlV2l0aFByb3BzID0gQ2ZuUmVzb3VyY2UgJiB7XG4gIHJlYWRvbmx5IF9jZm5Qcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IGNmblByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn07XG5cbmludGVyZmFjZSBSZXNvdXJjZU5hbWVzIHtcbiAgbG9naWNhbE5hbWU6IHN0cmluZztcbiAgcmF3TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE1hcHMgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZXMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSBhbmQgQVdTIGxlbmd0aCBsaW1pdHMuXG4gKiBTb3VyY2VzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtdGVtcGxhdGUtcmVzb3VyY2UtdHlwZS1yZWYuaHRtbFxuICovXG5jb25zdCBSRVNPVVJDRV9DT05GSUc6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTmFtZUNvbmZpZz4gPSB7XG4gIC8vIENvbXB1dGVcbiAgXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cIjogeyBjZm5OYW1lOiBcIkZ1bmN0aW9uTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gU3RvcmFnZVxuICBcIkFXUzo6UzM6OkJ1Y2tldFwiOiB7IGNmbk5hbWU6IFwiQnVja2V0TmFtZVwiLCBtYXhMZW5ndGg6IDYzIH0sXG4gIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIjogeyBjZm5OYW1lOiBcIlRhYmxlTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcblxuICAvLyBNZXNzYWdpbmdcbiAgXCJBV1M6OlNRUzo6UXVldWVcIjogeyBjZm5OYW1lOiBcIlF1ZXVlTmFtZVwiLCBtYXhMZW5ndGg6IDgwIH0sXG4gIFwiQVdTOjpTTlM6OlRvcGljXCI6IHsgY2ZuTmFtZTogXCJUb3BpY05hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcblxuICAvLyBFdmVudGluZyAmIE9yY2hlc3RyYXRpb25cbiAgXCJBV1M6OkV2ZW50czo6RXZlbnRCdXNcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcbiAgXCJBV1M6OkV2ZW50czo6UnVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpFdmVudHM6OkNvbm5lY3Rpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6UGlwZXM6OlBpcGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXCI6IHtcbiAgICBjZm5OYW1lOiBcIlN0YXRlTWFjaGluZU5hbWVcIixcbiAgICBtYXhMZW5ndGg6IDgwLFxuICB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6QWN0aXZpdHlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpTY2hlZHVsZXI6OlNjaGVkdWxlR3JvdXBcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIEFQSVxuICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6VXNhZ2VQbGFuXCI6IHsgY2ZuTmFtZTogXCJVc2FnZVBsYW5OYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5OjpBcGlLZXlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkF1dGhvcml6ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcblxuICAvLyBTZWNyZXRzICYgQ29uZmlnXG4gIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpTU006OlBhcmFtZXRlclwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDIwNDggfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gTm90aWZpY2F0aW9uc1xuICBcIkFXUzo6Tm90aWZpY2F0aW9uczo6Tm90aWZpY2F0aW9uQ29uZmlndXJhdGlvblwiOiB7XG4gICAgY2ZuTmFtZTogXCJOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA2NCxcbiAgfSxcblxuICAvLyBPYnNlcnZhYmlsaXR5XG4gIFwiQVdTOjpMb2dzOjpMb2dHcm91cFwiOiB7IGNmbk5hbWU6IFwiTG9nR3JvdXBOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiOiB7IGNmbk5hbWU6IFwiQWxhcm1OYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gSUFNXG4gIFwiQVdTOjpJQU06OlJvbGVcIjogeyBjZm5OYW1lOiBcIlJvbGVOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZSBuYW1lcy5cbiAgICogZS5nLiAnbXlhcHAtcHJvZCcg4oaSICdteWFwcC1wcm9kLW9yZGVycydcbiAgICovXG4gIHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSB0eXBlcyB0byBza2lwIGVudGlyZWx5LlxuICAgKiBlLmcuIFsnQVdTOjpJQU06OlJvbGUnXSB0byBsZWF2ZSBJQU0gcm9sZSBuYW1lcyB1bnRvdWNoZWQuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBleGNsdWRlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ0RLIEFzcGVjdCB0aGF0IGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgcGh5c2ljYWwgcmVzb3VyY2UgbmFtZXMgYWNyb3NzIEFXUyByZXNvdXJjZXMuXG4gKlxuICogQHJlbWFya3NcbiAqICoqQ3JpdGljYWwgSW1wbGVtZW50YXRpb24gTm90ZXM6KipcbiAqXG4gKiAxLiAqKlN0YWdlIFN5bnRoZXNpcyBCb3VuZGFyaWVzKio6XG4gKiAgICAtIENESyBgU3RhZ2VgIGNvbnN0cnVjdHMgY3JlYXRlIHN5bnRoZXNpcyBib3VuZGFyaWVzIHRoYXQgcHJldmVudCBBcHAtbGV2ZWwgYXNwZWN0c1xuICogICAgICBmcm9tIHRyYXZlcnNpbmcgaW50byB0aGVtXG4gKiAgICAtIFRoaXMgYXNwZWN0IE1VU1QgYmUgYXBwbGllZCB0byBlYWNoIFN0YWdlIGluZGl2aWR1YWxseSwgbm90IHRvIHRoZSBBcHBcbiAqICAgIC0gRXhhbXBsZTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3Qoey4uLn0pKWBcbiAqXG4gKiAyLiAqKlByb3BlcnR5IE5hbWUgQ2FzaW5nKio6XG4gKiAgICAtIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdXNlIFBhc2NhbENhc2UgKGUuZy4sIGBGdW5jdGlvbk5hbWVgLCBgQnVja2V0TmFtZWApXG4gKiAgICAtIFVzaW5nIGNhbWVsQ2FzZSAoZS5nLiwgYGZ1bmN0aW9uTmFtZWApIHdpbGwgY2F1c2UgZXJyb3JzIHdpdGggdmVyc2lvbmluZyBhc3BlY3RzXG4gKiAgICAtIFdoZW4gdXNpbmcgYGFkZFByb3BlcnR5T3ZlcnJpZGUoKWAsIGFsd2F5cyB1c2UgdGhlIGV4YWN0IENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IG5hbWVcbiAqXG4gKiAzLiAqKkFzcGVjdCBQcmlvcml0eSB3aXRoIFZlcnNpb25pbmcqKjpcbiAqICAgIC0gV2hlbiBjb21iaW5pbmcgd2l0aCBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0LCBhcHBseSB0aGlzIGFzcGVjdCBCRUZPUkUgdmVyc2lvbmluZ1xuICogICAgLSBVc2UgQ0RLJ3MgcHJpb3JpdHkgc3lzdGVtOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHByZWZpeEFzcGVjdCwgeyBwcmlvcml0eTogMTAwIH0pYFxuICogICAgLSBUaGVuOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHZlcnNpb25pbmdBc3BlY3QsIHsgcHJpb3JpdHk6IDIwMCB9KWBcbiAqICAgIC0gTG93ZXIgcHJpb3JpdHkgbnVtYmVycyBydW4gZmlyc3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ycmVjdCB1c2FnZSB3aXRoIHN0YWdpbmdcbiAqIGNvbnN0IHN0YWdlID0gbmV3IEFwcGxpY2F0aW9uU3RhZ2UoYXBwLCAncHJvZCcpO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBSZXNvdXJjZVByZWZpeEFzcGVjdCh7IHByZWZpeDogJ215YXBwJyB9KSwgeyBwcmlvcml0eTogMTAwIH0pO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0KCksIHsgcHJpb3JpdHk6IDIwMCB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQcmVmaXhBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJlZml4IHx8ICEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLnByZWZpeCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZXNvdXJjZVByZWZpeEFzcGVjdDogcHJlZml4IG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290IFwiJHtwcm9wcy5wcmVmaXh9XCJgXG4gICAgICApO1xuXG4gICAgdGhpcy5wcmVmaXggPSBwcm9wcy5wcmVmaXg7XG4gICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChwcm9wcy5leGNsdWRlID8/IFtdKTtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpKSByZXR1cm47XG5cbiAgICAvLyBDREstbWFuYWdlZCBzaW5nbGV0b24vZnJhbWV3b3JrIHJlc291cmNlcyBtdXN0IGtlZXAgdGhlaXJcbiAgICAvLyBDbG91ZEZvcm1hdGlvbi1nZW5lcmF0ZWQgcGh5c2ljYWwgbmFtZXMuIFBpbm5pbmcgYSBkZXRlcm1pbmlzdGljIG5hbWUgb250b1xuICAgIC8vIHRoZW0gKGUuZy4gdGhlIEJ1Y2tldERlcGxveW1lbnQgaGFuZGxlcikgcmVtb3ZlcyB0aGUgcmFuZG9tLXN1ZmZpeFxuICAgIC8vIG9ycGhhbi1hdm9pZGFuY2UgYW5kIHdlZGdlcyBkZXBsb3lzIG9uIGAvYXdzL2xhbWJkYS88Zm4+YCBMb2dHcm91cFxuICAgIC8vIFwiYWxyZWFkeSBleGlzdHNcIiBhZnRlciBhbnkgZmFpbGVkIGF0dGVtcHQuXG4gICAgaWYgKGlzQ2RrTWFuYWdlZFNpbmdsZXRvbihub2RlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gbm9kZS5jZm5SZXNvdXJjZVR5cGU7XG4gICAgY29uc3QgY29uZmlnID0gUkVTT1VSQ0VfQ09ORklHW3Jlc291cmNlVHlwZV07XG5cbiAgICBpZiAoIWNvbmZpZyB8fCB0aGlzLmV4Y2x1ZGUuaGFzKHJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNmbk5hbWUsIG1heExlbmd0aCB9ID0gY29uZmlnO1xuICAgIGNvbnN0IGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID1cbiAgICAgIChub2RlIGFzIENmblJlc291cmNlV2l0aFByb3BzKS5fY2ZuUHJvcGVydGllcyA/P1xuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLmNmblByb3BlcnRpZXMgPz9cbiAgICAgIHt9O1xuXG4gICAgY29uc3QgbmFtZXMgPSB0aGlzLnJlc29sdmVSZXNvdXJjZU5hbWVzKG5vZGUsIGNmbk5hbWUsIGNmblByb3BlcnRpZXMpO1xuXG4gICAgaWYgKHRoaXMuc2hvdWxkU2tpcFJlc291cmNlKHJlc291cmNlVHlwZSwgbmFtZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBbHJlYWR5UHJlZml4ZWQobmFtZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJlZml4ZWROYW1lID0gdGhpcy5idWlsZFByZWZpeGVkTmFtZShcbiAgICAgIG5hbWVzLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgY2ZuUHJvcGVydGllc1xuICAgICk7XG5cbiAgICAvLyBUcnVuY2F0aW9uIGFwcGxpZXMgdG8gYWxsIG92ZXJmbG93cyDigJQgaW5jbHVkaW5nIHVzZXItc2V0IG5hbWVzIOKAlCBiZWNhdXNlIEwzXG4gICAgLy8gY29uc3RydWN0cyBjYW4gZ2VuZXJhdGUgbmFtZXMgdGhlIHVzZXIgaGFzIG5vIGRpcmVjdCBjb250cm9sIG92ZXIuXG4gICAgY29uc3QgZmluYWxOYW1lID0gdGhpcy50cnVuY2F0ZVRvRml0KHByZWZpeGVkTmFtZSwgbWF4TGVuZ3RoLCBub2RlKTtcblxuICAgIGNvbnN0IGhhc0Vycm9yID0gdGhpcy52YWxpZGF0ZVJlc291cmNlTmFtZShmaW5hbE5hbWUsIHJlc291cmNlVHlwZSwgbm9kZSk7XG5cbiAgICBpZiAoaGFzRXJyb3IpIHJldHVybjtcblxuICAgIG5vZGUuYWRkUHJvcGVydHlPdmVycmlkZShjZm5OYW1lLCBmaW5hbE5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hldGhlciBhIHJlc291cmNlIHNob3VsZCBiZSBza2lwcGVkIGZyb20gcHJlZml4aW5nIGJhc2VkIG9uXG4gICAqIHJlc291cmNlLXR5cGUtc3BlY2lmaWMgcnVsZXMgKGUuZy4sIEFXUy1yZXNlcnZlZCBuYW1pbmcgY29udmVudGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRTa2lwUmVzb3VyY2UoY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsIG5hbWVzOiBSZXNvdXJjZU5hbWVzKSB7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVzLnJhd05hbWUgPz8gbmFtZXMubG9naWNhbE5hbWU7XG4gICAgcmV0dXJuIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIgJiYgbmFtZS5zdGFydHNXaXRoKFwiL2F3cy9cIilcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FscmVhZHlQcmVmaXhlZChuYW1lczogUmVzb3VyY2VOYW1lcykge1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lcy5yYXdOYW1lID8/IG5hbWVzLmxvZ2ljYWxOYW1lO1xuICAgIHJldHVybiAoXG4gICAgICBuYW1lLnN0YXJ0c1dpdGgoYCR7dGhpcy5wcmVmaXh9LWApIHx8IG5hbWUuc3RhcnRzV2l0aChgLyR7dGhpcy5wcmVmaXh9L2ApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbmFtZSBjb21wb25lbnRzIGZvciBhIHJlc291cmNlOiB0aGUgZXhwbGljaXRseSBzZXQgcmF3IG5hbWUgKGlmIGFueSlcbiAgICogYW5kIGEgc2FuaXRpc2VkIGxvZ2ljYWwgSUQgZGVyaXZlZCBmcm9tIHRoZSBjb25zdHJ1Y3QgdHJlZS5cbiAgICpcbiAgICogVGhlIHJhdyBuYW1lIGlzIGxvb2tlZCB1cCBmcm9tIHRoZSBDRk4gcHJvcGVydGllcyBpbiBib3RoIFBhc2NhbENhc2UgYW5kIGNhbWVsQ2FzZVxuICAgKiAoQ0RLIHN0b3JlcyBMMSBwcm9wZXJ0aWVzIGluIGNhbWVsQ2FzZSBpbnRlcm5hbGx5KS4gV2hlbiBubyBleHBsaWNpdCBuYW1lIGlzIHNldCxcbiAgICogYHJhd05hbWVgIGlzIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUmVzb3VyY2VOYW1lcyhcbiAgICBub2RlOiBDZm5SZXNvdXJjZSxcbiAgICBjZm5OYW1lOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUmVzb3VyY2VOYW1lcyB7XG4gICAgY29uc3QgY2FtZWxDZm5OYW1lID0gY2ZuTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGNmbk5hbWUuc2xpY2UoMSk7XG4gICAgY29uc3QgcmF3TmFtZSA9IGNmblByb3BlcnRpZXNbY2ZuTmFtZV0gPz8gY2ZuUHJvcGVydGllc1tjYW1lbENmbk5hbWVdO1xuICAgIGNvbnN0IGxvZ2ljYWxOYW1lID0gU3RhY2sub2Yobm9kZSlcbiAgICAgIC5nZXRMb2dpY2FsSWQobm9kZSlcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csIFwiLVwiKSAvLyBub24tYWxwaGFudW1lcmljIOKGkiBkYXNoXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKTsgLy8gdHJpbSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuXG4gICAgcmV0dXJuIHR5cGVvZiByYXdOYW1lID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgbG9naWNhbE5hbWUsIHJhd05hbWUgfVxuICAgICAgOiB7IGxvZ2ljYWxOYW1lLCByYXdOYW1lOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHByZWZpeGVkIG5hbWUsIGhhbmRsaW5nIHNwZWNpYWwgY2FzZXMgZm9yIHNwZWNpZmljIHJlc291cmNlIHR5cGVzLlxuICAgKlxuICAgKiBVc2VzIHRoZSByYXcgbmFtZSB3aGVuIGl0IGlzIGEgY29uY3JldGUgc3RyaW5nLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGxvZ2ljYWxcbiAgICogbmFtZSB3aGVuIHRoZSByYXcgbmFtZSBpcyBhbiB1bnJlc29sdmVkIENESyB0b2tlbi5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgbmFtZXM6IFJlc291cmNlTmFtZXMsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKSB7XG4gICAgY29uc3QgbmFtZSA9XG4gICAgICAhbmFtZXMucmF3TmFtZSB8fCBUb2tlbi5pc1VucmVzb2x2ZWQobmFtZXMucmF3TmFtZSlcbiAgICAgICAgPyBuYW1lcy5sb2dpY2FsTmFtZVxuICAgICAgICA6IG5hbWVzLnJhd05hbWU7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IEZJRk8gcXVldWVzIG11c3QgZW5kIHdpdGggLmZpZm8gc3VmZml4XG4gICAgaWYgKFxuICAgICAgY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6U1FTOjpRdWV1ZVwiICYmXG4gICAgICBjZm5Qcm9wZXJ0aWVzLmZpZm9RdWV1ZSA9PT0gdHJ1ZSAmJlxuICAgICAgIW5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke25hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhbmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX0uZmlmb2A7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlOiBTU00gcGFyYW1ldGVyIG5hbWVzIHVzZSBwYXRoLXN0eWxlIHByZWZpeFxuICAgIGlmIChjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTU006OlBhcmFtZXRlclwiKSB7XG4gICAgICByZXR1cm4gYC8ke3RoaXMucHJlZml4fS8ke25hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke25hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQ6IHNpbXBsZSBwcmVmaXhcbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7bmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBhIHByZWZpeGVkIG5hbWUgdG8gZml0IHdpdGhpbiBtYXhMZW5ndGggYnkgaGFzaGluZyB0aGUgb3JpZ2luYWxcbiAgICogZm9yIHVuaXF1ZW5lc3MuIEVtaXRzIGEgQ0RLIHdhcm5pbmcgd2hlbiB0cnVuY2F0aW9uIG9jY3Vycy5cbiAgICovXG4gIHByaXZhdGUgdHJ1bmNhdGVUb0ZpdChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIsXG4gICAgbm9kZTogSUNvbnN0cnVjdFxuICApOiBzdHJpbmcge1xuICAgIGlmIChuYW1lLmxlbmd0aCA8PSBtYXhMZW5ndGgpIHJldHVybiBuYW1lO1xuXG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG5hbWUpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcblxuICAgIC8vIFByZXNlcnZlIC5maWZvIHN1ZmZpeCDigJQgQVdTIHJlcXVpcmVzIGl0IGF0IHRoZSBlbmQgb2YgRklGTyByZXNvdXJjZSBuYW1lc1xuICAgIGNvbnN0IHN1ZmZpeCA9IG5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKSA/IFwiLmZpZm9cIiA6IFwiXCI7XG4gICAgY29uc3QgbmFtZVdpdGhvdXRTdWZmaXggPSBzdWZmaXggPyBuYW1lLnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSA6IG5hbWU7XG5cbiAgICAvLyAxIGFjY291bnRzIGZvciB0aGUgZGFzaCBzZXBhcmF0b3IgYmVmb3JlIHRoZSBoYXNoXG4gICAgY29uc3QgYnVkZ2V0ID0gbWF4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxIC0gc3VmZml4Lmxlbmd0aDtcbiAgICBjb25zdCB0cnVuY2F0ZWQgPSBuYW1lV2l0aG91dFN1ZmZpeC5zbGljZSgwLCBidWRnZXQpICsgXCItXCIgKyBoYXNoICsgc3VmZml4O1xuXG4gICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkV2FybmluZyhcbiAgICAgIGBbUmVzb3VyY2VQcmVmaXhBc3BlY3RdIFwiJHtuYW1lfVwiICgke25hbWUubGVuZ3RofSBjaGFycykgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiAke21heExlbmd0aH0uIGAgK1xuICAgICAgICBgTmFtZSBoYXMgYmVlbiB0cnVuY2F0ZWQgdG8gXCIke3RydW5jYXRlZH1cIi4gU2hvcnRlbiB0aGUgcmVzb3VyY2UgYmFzZSBuYW1lIG9yIHlvdXIgcHJlZml4IChcIiR7dGhpcy5wcmVmaXh9XCIpIHRvIGF2b2lkIHRydW5jYXRpb24uYFxuICAgICk7XG5cbiAgICByZXR1cm4gdHJ1bmNhdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyByZXNvdXJjZS1zcGVjaWZpYyBzdHJ1Y3R1cmFsIG5hbWluZyByZXF1aXJlbWVudHMgdGhhdCBBV1MgZW5mb3JjZXMuXG4gICAqIExlbmd0aCB2aW9sYXRpb25zIGFyZSBoYW5kbGVkIHVwc3RyZWFtIGJ5IHRydW5jYXRlVG9GaXQuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUmVzb3VyY2VOYW1lKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjZm5SZXNvdXJjZVR5cGU6IHN0cmluZyxcbiAgICBub2RlOiBJQ29uc3RydWN0XG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuXG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgaWYgKG5hbWUgIT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihcbiAgICAgICAgICBgW1Jlc291cmNlUHJlZml4QXNwZWN0XSBTMyBidWNrZXQgbmFtZSBcIiR7bmFtZX1cIiBjb250YWlucyB1cHBlcmNhc2UgbGV0dGVycy4gYCArXG4gICAgICAgICAgICBgQnVja2V0IG5hbWVzIG11c3QgYmUgbG93ZXJjYXNlIG9ubHkuYFxuICAgICAgICApO1xuICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYW1lLmluY2x1ZGVzKFwiX1wiKSkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihcbiAgICAgICAgICBgW1Jlc291cmNlUHJlZml4QXNwZWN0XSBTMyBidWNrZXQgbmFtZSBcIiR7bmFtZX1cIiBjb250YWlucyB1bmRlcnNjb3Jlcy4gYCArXG4gICAgICAgICAgICBgQnVja2V0IG5hbWVzIGNhbm5vdCBjb250YWluIHVuZGVyc2NvcmVzLiBVc2UgaHlwaGVucyBpbnN0ZWFkLmBcbiAgICAgICAgKTtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXNFcnJvcjtcbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligent/cdk-aspects",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "Collection of CDK Asppects",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -28,9 +28,11 @@
28
28
  "typescript": "^5.3.2"
29
29
  },
30
30
  "dependencies": {
31
- "aws-cdk-lib": "^2.257.0",
32
- "constructs": "^10.5.0",
33
31
  "esbuild": "^0.28.0",
34
32
  "source-map-support": "^0.5.21"
33
+ },
34
+ "peerDependencies": {
35
+ "aws-cdk-lib": "^2.113.0",
36
+ "constructs": "^10.5.0"
35
37
  }
36
38
  }