@fjall/components-infrastructure 0.88.1 → 0.88.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 (146) hide show
  1. package/dist/lib/app.d.ts +34 -11
  2. package/dist/lib/app.js +83 -39
  3. package/dist/lib/aspects/index.d.ts +1 -0
  4. package/dist/lib/aspects/index.js +6 -0
  5. package/dist/lib/config/aws/accountAuditRole.d.ts +20 -0
  6. package/dist/lib/config/aws/accountAuditRole.js +38 -0
  7. package/dist/lib/config/aws/accountMonitoringRole.d.ts +22 -0
  8. package/dist/lib/config/aws/accountMonitoringRole.js +133 -0
  9. package/dist/lib/config/aws/cloudTrail.d.ts +0 -3
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +26 -14
  12. package/dist/lib/config/aws/ecrDefaultImage.js +4 -3
  13. package/dist/lib/config/aws/identityCenter.d.ts +4 -4
  14. package/dist/lib/config/aws/identityCenter.js +17 -62
  15. package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -37
  16. package/dist/lib/config/aws/index.d.ts +4 -7
  17. package/dist/lib/config/aws/index.js +5 -8
  18. package/dist/lib/config/aws/oidcConnector.d.ts +8 -0
  19. package/dist/lib/config/aws/oidcConnector.js +46 -0
  20. package/dist/lib/config/aws/platform.d.ts +2 -0
  21. package/dist/lib/config/aws/platform.js +6 -0
  22. package/dist/lib/config/index.d.ts +2 -0
  23. package/dist/lib/config/index.js +21 -0
  24. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
  25. package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  26. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
  27. package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
  28. package/dist/lib/patterns/aws/account.js +45 -19
  29. package/dist/lib/patterns/aws/cdn.d.ts +19 -40
  30. package/dist/lib/patterns/aws/cdn.js +21 -17
  31. package/dist/lib/patterns/aws/compute.d.ts +6 -7
  32. package/dist/lib/patterns/aws/compute.js +7 -9
  33. package/dist/lib/patterns/aws/database.d.ts +9 -89
  34. package/dist/lib/patterns/aws/database.js +17 -40
  35. package/dist/lib/patterns/aws/index.d.ts +1 -1
  36. package/dist/lib/patterns/aws/index.js +2 -2
  37. package/dist/lib/patterns/aws/interfaces/cdn.d.ts +26 -0
  38. package/dist/lib/patterns/aws/interfaces/cdn.js +14 -0
  39. package/dist/lib/patterns/aws/interfaces/connector.d.ts +4 -181
  40. package/dist/lib/patterns/aws/interfaces/connector.js +16 -113
  41. package/dist/lib/patterns/aws/interfaces/index.d.ts +1 -0
  42. package/dist/lib/patterns/aws/interfaces/index.js +5 -2
  43. package/dist/lib/patterns/aws/interfaces/pattern.d.ts +6 -6
  44. package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
  45. package/dist/lib/patterns/aws/network.js +6 -9
  46. package/dist/lib/patterns/aws/organisation.d.ts +6 -17
  47. package/dist/lib/patterns/aws/organisation.js +22 -67
  48. package/dist/lib/patterns/aws/payload.js +11 -12
  49. package/dist/lib/patterns/aws/storage.d.ts +3 -2
  50. package/dist/lib/patterns/aws/storage.js +1 -1
  51. package/dist/lib/resources/aws/audit/auditRole.js +4 -4
  52. package/dist/lib/resources/aws/audit/index.d.ts +1 -0
  53. package/dist/lib/resources/aws/audit/index.js +6 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.js +3 -2
  55. package/dist/lib/resources/aws/backup/backupVault.js +5 -3
  56. package/dist/lib/resources/aws/base/awsStack.d.ts +4 -2
  57. package/dist/lib/resources/aws/base/awsStack.js +8 -2
  58. package/dist/lib/resources/aws/cdn/cloudFront.d.ts +14 -0
  59. package/dist/lib/resources/aws/cdn/cloudFront.js +52 -18
  60. package/dist/lib/resources/aws/compute/ec2.js +18 -22
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -8
  62. package/dist/lib/resources/aws/compute/ecs.js +53 -41
  63. package/dist/lib/resources/aws/compute/index.d.ts +1 -0
  64. package/dist/lib/resources/aws/compute/index.js +2 -1
  65. package/dist/lib/resources/aws/compute/lambda.d.ts +12 -3
  66. package/dist/lib/resources/aws/compute/lambda.js +48 -36
  67. package/dist/lib/resources/aws/database/dynamodb.js +3 -13
  68. package/dist/lib/resources/aws/database/index.d.ts +8 -2
  69. package/dist/lib/resources/aws/database/index.js +19 -3
  70. package/dist/lib/resources/aws/database/rdsAurora.d.ts +2 -3
  71. package/dist/lib/resources/aws/database/rdsAurora.js +33 -69
  72. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +6 -6
  73. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +25 -29
  74. package/dist/lib/resources/aws/database/rdsDefaults.d.ts +11 -0
  75. package/dist/lib/resources/aws/database/rdsDefaults.js +15 -0
  76. package/dist/lib/resources/aws/database/rdsHelpers.d.ts +39 -0
  77. package/dist/lib/resources/aws/database/rdsHelpers.js +75 -0
  78. package/dist/lib/resources/aws/database/rdsInstance.d.ts +7 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.js +40 -84
  80. package/dist/lib/resources/aws/database/rdsProxyOutput.d.ts +7 -0
  81. package/dist/lib/resources/aws/database/rdsProxyOutput.js +18 -0
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
  83. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -45
  84. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
  85. package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -82
  86. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -93
  88. package/dist/lib/resources/aws/iam/index.d.ts +0 -1
  89. package/dist/lib/resources/aws/iam/index.js +1 -2
  90. package/dist/lib/resources/aws/index.d.ts +0 -1
  91. package/dist/lib/resources/aws/index.js +1 -2
  92. package/dist/lib/resources/aws/logging/cloudTrail.js +13 -3
  93. package/dist/lib/resources/aws/logging/index.d.ts +2 -0
  94. package/dist/lib/resources/aws/logging/index.js +19 -0
  95. package/dist/lib/resources/aws/messaging/index.d.ts +3 -2
  96. package/dist/lib/resources/aws/messaging/index.js +4 -3
  97. package/dist/lib/resources/aws/messaging/sqs.js +14 -11
  98. package/dist/lib/resources/aws/messaging/utils.d.ts +1 -2
  99. package/dist/lib/resources/aws/messaging/utils.js +3 -4
  100. package/dist/lib/resources/aws/monitoring/index.d.ts +0 -1
  101. package/dist/lib/resources/aws/monitoring/index.js +4 -17
  102. package/dist/lib/resources/aws/networking/hostedZone.d.ts +28 -0
  103. package/dist/lib/resources/aws/networking/hostedZone.js +153 -0
  104. package/dist/lib/resources/aws/networking/index.d.ts +2 -0
  105. package/dist/lib/resources/aws/networking/index.js +3 -1
  106. package/dist/lib/resources/aws/networking/ipamPool.js +110 -31
  107. package/dist/lib/resources/aws/networking/securityGroup.d.ts +5 -0
  108. package/dist/lib/resources/aws/networking/securityGroup.js +14 -0
  109. package/dist/lib/resources/aws/networking/vpc.js +9 -4
  110. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.d.ts +17 -0
  111. package/dist/lib/resources/aws/organisation/costAllocationTagActivator.js +66 -0
  112. package/dist/lib/resources/aws/organisation/index.d.ts +1 -0
  113. package/dist/lib/resources/aws/organisation/index.js +4 -2
  114. package/dist/lib/resources/aws/secrets/index.d.ts +0 -1
  115. package/dist/lib/resources/aws/secrets/index.js +1 -2
  116. package/dist/lib/resources/aws/secrets/parameter.js +5 -3
  117. package/dist/lib/resources/aws/storage/ecr.d.ts +0 -1
  118. package/dist/lib/resources/aws/storage/ecr.js +5 -7
  119. package/dist/lib/resources/aws/storage/s3.d.ts +3 -3
  120. package/dist/lib/resources/aws/storage/s3.js +1 -1
  121. package/dist/lib/resources/aws/utilities/index.d.ts +5 -0
  122. package/dist/lib/resources/aws/utilities/index.js +22 -0
  123. package/dist/lib/utils/backupTierMapping.d.ts +11 -0
  124. package/dist/lib/utils/backupTierMapping.js +17 -0
  125. package/dist/lib/utils/capitaliseString.d.ts +6 -0
  126. package/dist/lib/utils/capitaliseString.js +10 -1
  127. package/dist/lib/utils/connections.d.ts +46 -0
  128. package/dist/lib/utils/connections.js +159 -0
  129. package/dist/lib/utils/connector.d.ts +183 -0
  130. package/dist/lib/utils/connector.js +117 -0
  131. package/dist/lib/utils/databaseTypes.d.ts +85 -0
  132. package/dist/lib/utils/databaseTypes.js +34 -0
  133. package/dist/lib/utils/env.d.ts +42 -0
  134. package/dist/lib/utils/env.js +128 -0
  135. package/dist/lib/utils/getConfig.d.ts +0 -2
  136. package/dist/lib/utils/getConfig.js +1 -4
  137. package/dist/lib/utils/index.d.ts +6 -0
  138. package/dist/lib/utils/index.js +7 -1
  139. package/dist/lib/utils/removalPolicy.d.ts +2 -0
  140. package/dist/lib/utils/removalPolicy.js +16 -0
  141. package/dist/lib/utils/resourceNaming.js +4 -7
  142. package/dist/lib/utils/standardTagsAspect.d.ts +4 -0
  143. package/dist/lib/utils/standardTagsAspect.js +8 -8
  144. package/dist/lib/utils/vpcUtils.d.ts +14 -0
  145. package/dist/lib/utils/vpcUtils.js +28 -0
  146. package/package.json +8 -8
@@ -4,80 +4,58 @@ import { type IApplicationLoadBalancer } from "aws-cdk-lib/aws-elasticloadbalanc
4
4
  import { type ICertificate } from "aws-cdk-lib/aws-certificatemanager";
5
5
  import { type ICachePolicy } from "aws-cdk-lib/aws-cloudfront";
6
6
  import type App from "../../app";
7
- import { CloudFrontDistribution, type CachePolicyPreset } from "../../resources/aws/cdn";
7
+ import { CloudFrontDistribution, type CachePolicyPreset, type AccessGateConfig } from "../../resources/aws/cdn";
8
+ import { type ICdn } from "./interfaces/cdn";
8
9
  import { type Storage } from "./storage";
9
10
  import { type AnyCompute } from "./compute";
10
11
  /**
11
- * S3 origin CDN props - use with S3 bucket
12
+ * Common CDN props shared across all origin types.
12
13
  */
13
- export interface S3CdnProps {
14
- originType: "s3";
15
- bucket: IBucket | Storage;
16
- originPath?: string;
14
+ interface BaseCdnProps {
17
15
  cachePolicy?: CachePolicyPreset | ICachePolicy;
18
16
  defaultAllowedMethods?: "GET_HEAD" | "GET_HEAD_OPTIONS" | "ALL";
19
17
  behaviours?: SmartCdnBehaviour[];
20
18
  domainNames?: string[];
21
19
  certificate?: ICertificate;
20
+ certificateArn?: string;
22
21
  comment?: string;
23
22
  enableLogging?: boolean;
24
23
  logBucket?: IBucket;
25
24
  priceClass?: "PriceClass_100" | "PriceClass_200" | "PriceClass_All";
26
25
  forwardHostHeader?: boolean;
26
+ accessGate?: false | AccessGateConfig;
27
+ }
28
+ /**
29
+ * S3 origin CDN props - use with S3 bucket
30
+ */
31
+ export interface S3CdnProps extends BaseCdnProps {
32
+ originType: "s3";
33
+ bucket: IBucket | Storage;
34
+ originPath?: string;
27
35
  }
28
36
  /**
29
37
  * ALB origin CDN props - use with Application Load Balancer
30
38
  */
31
- export interface AlbCdnProps {
39
+ export interface AlbCdnProps extends BaseCdnProps {
32
40
  originType: "alb";
33
41
  loadBalancer: IApplicationLoadBalancer | AnyCompute;
34
42
  protocolPolicy?: "HTTP_ONLY" | "HTTPS_ONLY" | "MATCH_VIEWER";
35
- cachePolicy?: CachePolicyPreset | ICachePolicy;
36
- defaultAllowedMethods?: "GET_HEAD" | "GET_HEAD_OPTIONS" | "ALL";
37
- behaviours?: SmartCdnBehaviour[];
38
- domainNames?: string[];
39
- certificate?: ICertificate;
40
- comment?: string;
41
- enableLogging?: boolean;
42
- logBucket?: IBucket;
43
- priceClass?: "PriceClass_100" | "PriceClass_200" | "PriceClass_All";
44
- forwardHostHeader?: boolean;
45
43
  }
46
44
  /**
47
45
  * HTTP origin CDN props - use with custom HTTP endpoint
48
46
  */
49
- export interface HttpCdnProps {
47
+ export interface HttpCdnProps extends BaseCdnProps {
50
48
  originType: "http";
51
49
  domainName: string;
52
50
  originPath?: string;
53
51
  protocolPolicy?: "HTTP_ONLY" | "HTTPS_ONLY" | "MATCH_VIEWER";
54
- cachePolicy?: CachePolicyPreset | ICachePolicy;
55
- defaultAllowedMethods?: "GET_HEAD" | "GET_HEAD_OPTIONS" | "ALL";
56
- behaviours?: SmartCdnBehaviour[];
57
- domainNames?: string[];
58
- certificate?: ICertificate;
59
- comment?: string;
60
- enableLogging?: boolean;
61
- logBucket?: IBucket;
62
- priceClass?: "PriceClass_100" | "PriceClass_200" | "PriceClass_All";
63
- forwardHostHeader?: boolean;
64
52
  }
65
53
  /**
66
54
  * Smart origin CDN props - auto-detect origin type from Fjall resource
67
55
  */
68
- export interface SmartCdnProps {
56
+ export interface SmartCdnProps extends BaseCdnProps {
69
57
  originType: "auto";
70
58
  origin: Storage | AnyCompute | string;
71
- cachePolicy?: CachePolicyPreset | ICachePolicy;
72
- defaultAllowedMethods?: "GET_HEAD" | "GET_HEAD_OPTIONS" | "ALL";
73
- behaviours?: SmartCdnBehaviour[];
74
- domainNames?: string[];
75
- certificate?: ICertificate;
76
- comment?: string;
77
- enableLogging?: boolean;
78
- logBucket?: IBucket;
79
- priceClass?: "PriceClass_100" | "PriceClass_200" | "PriceClass_All";
80
- forwardHostHeader?: boolean;
81
59
  }
82
60
  export type ICdnProps = S3CdnProps | AlbCdnProps | HttpCdnProps | SmartCdnProps;
83
61
  /**
@@ -93,7 +71,7 @@ export interface SmartCdnBehaviour {
93
71
  /**
94
72
  * CDN wrapper class that extends CloudFrontDistribution with Fjall patterns.
95
73
  */
96
- export declare class Cdn extends CloudFrontDistribution {
74
+ export declare class Cdn extends CloudFrontDistribution implements ICdn {
97
75
  constructor(scope: Construct, id: string, props: ICdnProps);
98
76
  /**
99
77
  * Resolve ICdnProps to CloudFrontDistributionProps.
@@ -157,3 +135,4 @@ export declare class CdnFactory {
157
135
  */
158
136
  static build(id: string, props: ICdnProps): (_app: App, scope: Construct) => Cdn;
159
137
  }
138
+ export {};
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CdnFactory = exports.Cdn = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_certificatemanager_1 = require("aws-cdk-lib/aws-certificatemanager");
5
6
  const cdn_1 = require("../../resources/aws/cdn");
6
7
  const storage_1 = require("./storage");
7
8
  const compute_1 = require("./compute");
@@ -10,22 +11,21 @@ const validationLogger_js_1 = require("../../utils/validationLogger.js");
10
11
  * Validates CDN props and logs warnings for misconfigured options.
11
12
  */
12
13
  function validateCdnProps(props) {
14
+ const hasCertificate = !!(props.certificate || props.certificateArn);
13
15
  // Validate certificate region warning
14
- if (props.certificate && props.domainNames && props.domainNames.length > 0) {
16
+ if (hasCertificate && props.domainNames && props.domainNames.length > 0) {
15
17
  validationLogger_js_1.FjallLogger.info("CloudFront certificates must be in us-east-1 region. " +
16
18
  "Ensure your certificate was created in us-east-1.");
17
19
  }
18
20
  // Validate domain names require certificate
19
- if (props.domainNames && props.domainNames.length > 0 && !props.certificate) {
21
+ if (props.domainNames && props.domainNames.length > 0 && !hasCertificate) {
20
22
  validationLogger_js_1.FjallLogger.warn("'domainNames' provided but no 'certificate' specified. " +
21
23
  "Custom domain names require an ACM certificate in us-east-1.");
22
24
  }
23
25
  // Validate ALB origin
24
26
  if (props.originType === "alb") {
25
- const albProps = props;
26
- if ((0, compute_1.isCompute)(albProps.loadBalancer) &&
27
- (0, compute_1.isEcsCompute)(albProps.loadBalancer)) {
28
- const lb = albProps.loadBalancer.getLoadBalancer();
27
+ if ((0, compute_1.isCompute)(props.loadBalancer) && (0, compute_1.isEcsCompute)(props.loadBalancer)) {
28
+ const lb = props.loadBalancer.getLoadBalancer();
29
29
  if (!lb) {
30
30
  throw new Error("Compute resource does not have a load balancer. " +
31
31
  "Ensure ECS compute has loadBalancer enabled for CDN origin.");
@@ -34,16 +34,15 @@ function validateCdnProps(props) {
34
34
  }
35
35
  // Validate smart origin
36
36
  if (props.originType === "auto") {
37
- const smartProps = props;
38
- if ((0, compute_1.isCompute)(smartProps.origin)) {
39
- if ((0, compute_1.isEcsCompute)(smartProps.origin)) {
40
- if (!smartProps.origin.getLoadBalancer()) {
37
+ if ((0, compute_1.isCompute)(props.origin)) {
38
+ if ((0, compute_1.isEcsCompute)(props.origin)) {
39
+ if (!props.origin.getLoadBalancer()) {
41
40
  throw new Error("ECS compute must have a load balancer for CDN origin. " +
42
41
  "Enable loadBalancer in your ECS compute configuration.");
43
42
  }
44
43
  }
45
- else if ((0, compute_1.isLambdaCompute)(smartProps.origin)) {
46
- if (!smartProps.origin.getFunctionUrl()) {
44
+ else if ((0, compute_1.isLambdaCompute)(props.origin)) {
45
+ if (!props.origin.getFunctionUrl()) {
47
46
  throw new Error("Lambda compute must have a function URL for CDN origin. " +
48
47
  "Enable functionUrl in your Lambda compute configuration.");
49
48
  }
@@ -61,27 +60,32 @@ function validateCdnProps(props) {
61
60
  */
62
61
  class Cdn extends cdn_1.CloudFrontDistribution {
63
62
  constructor(scope, id, props) {
64
- const resolvedProps = Cdn.resolveProps(props);
63
+ const resolvedProps = Cdn.resolveProps(scope, id, props);
65
64
  super(scope, id, resolvedProps);
66
65
  }
67
66
  /**
68
67
  * Resolve ICdnProps to CloudFrontDistributionProps.
69
68
  */
70
- static resolveProps(props) {
69
+ static resolveProps(scope, id, props) {
71
70
  const defaultOrigin = Cdn.resolveDefaultOrigin(props);
72
71
  const behaviours = Cdn.resolveBehaviours(props.behaviours);
72
+ const certificate = props.certificate ??
73
+ (props.certificateArn
74
+ ? aws_certificatemanager_1.Certificate.fromCertificateArn(scope, `${id}Certificate`, props.certificateArn)
75
+ : undefined);
73
76
  return {
74
77
  defaultOrigin,
75
78
  defaultCachePolicy: props.cachePolicy,
76
79
  defaultAllowedMethods: props.defaultAllowedMethods,
77
80
  behaviours,
78
81
  domainNames: props.domainNames,
79
- certificate: props.certificate,
82
+ certificate,
80
83
  comment: props.comment,
81
84
  enableLogging: props.enableLogging,
82
85
  logBucket: props.logBucket,
83
86
  priceClass: props.priceClass,
84
- forwardHostHeader: props.forwardHostHeader
87
+ forwardHostHeader: props.forwardHostHeader,
88
+ accessGate: props.accessGate
85
89
  };
86
90
  }
87
91
  /**
@@ -253,4 +257,4 @@ class CdnFactory {
253
257
  }
254
258
  }
255
259
  exports.CdnFactory = CdnFactory;
256
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9jZG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWlDO0FBT2pDLGlEQU1pQztBQUNqQyx1Q0FBb0Q7QUFDcEQsdUNBS21CO0FBQ25CLHlFQUE4RDtBQTJGOUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQWdCO0lBQ3hDLHNDQUFzQztJQUN0QyxJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxpQ0FBVyxDQUFDLElBQUksQ0FDZCx1REFBdUQ7WUFDckQsbURBQW1ELENBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQsNENBQTRDO0lBQzVDLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUUsaUNBQVcsQ0FBQyxJQUFJLENBQ2QseURBQXlEO1lBQ3ZELDhEQUE4RCxDQUNqRSxDQUFDO0lBQ0osQ0FBQztJQUVELHNCQUFzQjtJQUN0QixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsS0FBb0IsQ0FBQztRQUN0QyxJQUNFLElBQUEsbUJBQVMsRUFBQyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQ2hDLElBQUEsc0JBQVksRUFBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQ25DLENBQUM7WUFDRCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDUixNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRDtvQkFDaEQs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QUFFLEtBQUs7b0JBQ1gsWUFBWTtpQkFDYixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxJQUFBLHlCQUFlLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM5QixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDOUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsd0NBQXdDO2dCQUN4QyxnRUFBZ0U7Z0JBQ2hFLGdDQUFnQztnQkFDaEMsb0RBQW9EO2dCQUNwRCxtQ0FBbUM7Z0JBQ25DLE1BQU0sVUFBVSxHQUFHLGdCQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxnQkFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTTtvQkFDWixVQUFVO2lCQUNYLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IsOENBQThDLE9BQU8sUUFBUSxJQUFJO1lBQy9ELHlEQUF5RCxDQUM1RCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcktELGtCQXFLQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBQ0gsTUFBYSxVQUFVO0lBQ3JCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQWdCO1FBQ3ZDLE9BQU8sQ0FBQyxJQUFTLEVBQUUsS0FBZ0IsRUFBTyxFQUFFO1lBQzFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFkRCxnQ0FjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEZuIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyB0eXBlIElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyB0eXBlIElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgdHlwZSBJQ2VydGlmaWNhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBJQ2FjaGVQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIENsb3VkRnJvbnREaXN0cmlidXRpb24sXG4gIHR5cGUgQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzLFxuICB0eXBlIENkbk9yaWdpbkNvbmZpZyxcbiAgdHlwZSBDZG5CZWhhdmlvdXIsXG4gIHR5cGUgQ2FjaGVQb2xpY3lQcmVzZXRcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY2RuXCI7XG5pbXBvcnQgeyB0eXBlIFN0b3JhZ2UsIGlzU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgQW55Q29tcHV0ZSxcbiAgaXNDb21wdXRlLFxuICBpc0Vjc0NvbXB1dGUsXG4gIGlzTGFtYmRhQ29tcHV0ZVxufSBmcm9tIFwiLi9jb21wdXRlXCI7XG5pbXBvcnQgeyBGamFsbExvZ2dlciB9IGZyb20gXCIuLi8uLi91dGlscy92YWxpZGF0aW9uTG9nZ2VyLmpzXCI7XG5cbi8qKlxuICogUzMgb3JpZ2luIENETiBwcm9wcyAtIHVzZSB3aXRoIFMzIGJ1Y2tldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFMzQ2RuUHJvcHMge1xuICBvcmlnaW5UeXBlOiBcInMzXCI7XG4gIGJ1Y2tldDogSUJ1Y2tldCB8IFN0b3JhZ2U7XG4gIG9yaWdpblBhdGg/OiBzdHJpbmc7XG4gIGNhY2hlUG9saWN5PzogQ2FjaGVQb2xpY3lQcmVzZXQgfCBJQ2FjaGVQb2xpY3k7XG4gIGRlZmF1bHRBbGxvd2VkTWV0aG9kcz86IFwiR0VUX0hFQURcIiB8IFwiR0VUX0hFQURfT1BUSU9OU1wiIHwgXCJBTExcIjtcbiAgYmVoYXZpb3Vycz86IFNtYXJ0Q2RuQmVoYXZpb3VyW107XG4gIGRvbWFpbk5hbWVzPzogc3RyaW5nW107XG4gIGNlcnRpZmljYXRlPzogSUNlcnRpZmljYXRlO1xuICBjb21tZW50Pzogc3RyaW5nO1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcbiAgbG9nQnVja2V0PzogSUJ1Y2tldDtcbiAgcHJpY2VDbGFzcz86IFwiUHJpY2VDbGFzc18xMDBcIiB8IFwiUHJpY2VDbGFzc18yMDBcIiB8IFwiUHJpY2VDbGFzc19BbGxcIjtcbiAgZm9yd2FyZEhvc3RIZWFkZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFMQiBvcmlnaW4gQ0ROIHByb3BzIC0gdXNlIHdpdGggQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYkNkblByb3BzIHtcbiAgb3JpZ2luVHlwZTogXCJhbGJcIjtcbiAgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfCBBbnlDb21wdXRlO1xuICBwcm90b2NvbFBvbGljeT86IFwiSFRUUF9PTkxZXCIgfCBcIkhUVFBTX09OTFlcIiB8IFwiTUFUQ0hfVklFV0VSXCI7XG4gIGNhY2hlUG9saWN5PzogQ2FjaGVQb2xpY3lQcmVzZXQgfCBJQ2FjaGVQb2xpY3k7XG4gIGRlZmF1bHRBbGxvd2VkTWV0aG9kcz86IFwiR0VUX0hFQURcIiB8IFwiR0VUX0hFQURfT1BUSU9OU1wiIHwgXCJBTExcIjtcbiAgYmVoYXZpb3Vycz86IFNtYXJ0Q2RuQmVoYXZpb3VyW107XG4gIGRvbWFpbk5hbWVzPzogc3RyaW5nW107XG4gIGNlcnRpZmljYXRlPzogSUNlcnRpZmljYXRlO1xuICBjb21tZW50Pzogc3RyaW5nO1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcbiAgbG9nQnVja2V0PzogSUJ1Y2tldDtcbiAgcHJpY2VDbGFzcz86IFwiUHJpY2VDbGFzc18xMDBcIiB8IFwiUHJpY2VDbGFzc18yMDBcIiB8IFwiUHJpY2VDbGFzc19BbGxcIjtcbiAgZm9yd2FyZEhvc3RIZWFkZXI/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEhUVFAgb3JpZ2luIENETiBwcm9wcyAtIHVzZSB3aXRoIGN1c3RvbSBIVFRQIGVuZHBvaW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHR0cENkblByb3BzIHtcbiAgb3JpZ2luVHlwZTogXCJodHRwXCI7XG4gIGRvbWFpbk5hbWU6IHN0cmluZztcbiAgb3JpZ2luUGF0aD86IHN0cmluZztcbiAgcHJvdG9jb2xQb2xpY3k/OiBcIkhUVFBfT05MWVwiIHwgXCJIVFRQU19PTkxZXCIgfCBcIk1BVENIX1ZJRVdFUlwiO1xuICBjYWNoZVBvbGljeT86IENhY2hlUG9saWN5UHJlc2V0IHwgSUNhY2hlUG9saWN5O1xuICBkZWZhdWx0QWxsb3dlZE1ldGhvZHM/OiBcIkdFVF9IRUFEXCIgfCBcIkdFVF9IRUFEX09QVElPTlNcIiB8IFwiQUxMXCI7XG4gIGJlaGF2aW91cnM/OiBTbWFydENkbkJlaGF2aW91cltdO1xuICBkb21haW5OYW1lcz86IHN0cmluZ1tdO1xuICBjZXJ0aWZpY2F0ZT86IElDZXJ0aWZpY2F0ZTtcbiAgY29tbWVudD86IHN0cmluZztcbiAgZW5hYmxlTG9nZ2luZz86IGJvb2xlYW47XG4gIGxvZ0J1Y2tldD86IElCdWNrZXQ7XG4gIHByaWNlQ2xhc3M/OiBcIlByaWNlQ2xhc3NfMTAwXCIgfCBcIlByaWNlQ2xhc3NfMjAwXCIgfCBcIlByaWNlQ2xhc3NfQWxsXCI7XG4gIGZvcndhcmRIb3N0SGVhZGVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTbWFydCBvcmlnaW4gQ0ROIHByb3BzIC0gYXV0by1kZXRlY3Qgb3JpZ2luIHR5cGUgZnJvbSBGamFsbCByZXNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q2RuUHJvcHMge1xuICBvcmlnaW5UeXBlOiBcImF1dG9cIjtcbiAgb3JpZ2luOiBTdG9yYWdlIHwgQW55Q29tcHV0ZSB8IHN0cmluZztcbiAgY2FjaGVQb2xpY3k/OiBDYWNoZVBvbGljeVByZXNldCB8IElDYWNoZVBvbGljeTtcbiAgZGVmYXVsdEFsbG93ZWRNZXRob2RzPzogXCJHRVRfSEVBRFwiIHwgXCJHRVRfSEVBRF9PUFRJT05TXCIgfCBcIkFMTFwiO1xuICBiZWhhdmlvdXJzPzogU21hcnRDZG5CZWhhdmlvdXJbXTtcbiAgZG9tYWluTmFtZXM/OiBzdHJpbmdbXTtcbiAgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIGNvbW1lbnQ/OiBzdHJpbmc7XG4gIGVuYWJsZUxvZ2dpbmc/OiBib29sZWFuO1xuICBsb2dCdWNrZXQ/OiBJQnVja2V0O1xuICBwcmljZUNsYXNzPzogXCJQcmljZUNsYXNzXzEwMFwiIHwgXCJQcmljZUNsYXNzXzIwMFwiIHwgXCJQcmljZUNsYXNzX0FsbFwiO1xuICBmb3J3YXJkSG9zdEhlYWRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIElDZG5Qcm9wcyA9IFMzQ2RuUHJvcHMgfCBBbGJDZG5Qcm9wcyB8IEh0dHBDZG5Qcm9wcyB8IFNtYXJ0Q2RuUHJvcHM7XG5cbi8qKlxuICogU21hcnQgYmVoYXZpb3VyIHR5cGUgdGhhdCBhY2NlcHRzIEZqYWxsIHJlc291cmNlcyBhcyBvcmlnaW5zLlxuICogVGhlIGZhY3Rvcnkgd2lsbCB0cmFuc2Zvcm0gdGhlc2UgdG8gcHJvcGVyIENkbkJlaGF2aW91ciBvYmplY3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q2RuQmVoYXZpb3VyIHtcbiAgcGF0aFBhdHRlcm46IHN0cmluZztcbiAgb3JpZ2luOiBTdG9yYWdlIHwgQW55Q29tcHV0ZSB8IHN0cmluZztcbiAgY2FjaGVQb2xpY3k/OiBDYWNoZVBvbGljeVByZXNldCB8IElDYWNoZVBvbGljeTtcbiAgYWxsb3dlZE1ldGhvZHM/OiBcIkdFVF9IRUFEXCIgfCBcIkdFVF9IRUFEX09QVElPTlNcIiB8IFwiQUxMXCI7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIENETiBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNkblByb3BzKHByb3BzOiBJQ2RuUHJvcHMpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgY2VydGlmaWNhdGUgcmVnaW9uIHdhcm5pbmdcbiAgaWYgKHByb3BzLmNlcnRpZmljYXRlICYmIHByb3BzLmRvbWFpbk5hbWVzICYmIHByb3BzLmRvbWFpbk5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBGamFsbExvZ2dlci5pbmZvKFxuICAgICAgXCJDbG91ZEZyb250IGNlcnRpZmljYXRlcyBtdXN0IGJlIGluIHVzLWVhc3QtMSByZWdpb24uIFwiICtcbiAgICAgICAgXCJFbnN1cmUgeW91ciBjZXJ0aWZpY2F0ZSB3YXMgY3JlYXRlZCBpbiB1cy1lYXN0LTEuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgZG9tYWluIG5hbWVzIHJlcXVpcmUgY2VydGlmaWNhdGVcbiAgaWYgKHByb3BzLmRvbWFpbk5hbWVzICYmIHByb3BzLmRvbWFpbk5hbWVzLmxlbmd0aCA+IDAgJiYgIXByb3BzLmNlcnRpZmljYXRlKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2RvbWFpbk5hbWVzJyBwcm92aWRlZCBidXQgbm8gJ2NlcnRpZmljYXRlJyBzcGVjaWZpZWQuIFwiICtcbiAgICAgICAgXCJDdXN0b20gZG9tYWluIG5hbWVzIHJlcXVpcmUgYW4gQUNNIGNlcnRpZmljYXRlIGluIHVzLWVhc3QtMS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBBTEIgb3JpZ2luXG4gIGlmIChwcm9wcy5vcmlnaW5UeXBlID09PSBcImFsYlwiKSB7XG4gICAgY29uc3QgYWxiUHJvcHMgPSBwcm9wcyBhcyBBbGJDZG5Qcm9wcztcbiAgICBpZiAoXG4gICAgICBpc0NvbXB1dGUoYWxiUHJvcHMubG9hZEJhbGFuY2VyKSAmJlxuICAgICAgaXNFY3NDb21wdXRlKGFsYlByb3BzLmxvYWRCYWxhbmNlcilcbiAgICApIHtcbiAgICAgIGNvbnN0IGxiID0gYWxiUHJvcHMubG9hZEJhbGFuY2VyLmdldExvYWRCYWxhbmNlcigpO1xuICAgICAgaWYgKCFsYikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJDb21wdXRlIHJlc291cmNlIGRvZXMgbm90IGhhdmUgYSBsb2FkIGJhbGFuY2VyLiBcIiArXG4gICAgICAgICAgICBcIkVuc3VyZSBFQ1MgY29tcHV0ZSBoYXMgbG9hZEJhbGFuY2VyIGVuYWJsZWQgZm9yIENETiBvcmlnaW4uXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBzbWFydCBvcmlnaW5cbiAgaWYgKHByb3BzLm9yaWdpblR5cGUgPT09IFwiYXV0b1wiKSB7XG4gICAgY29uc3Qgc21hcnRQcm9wcyA9IHByb3BzIGFzIFNtYXJ0Q2RuUHJvcHM7XG4gICAgaWYgKGlzQ29tcHV0ZShzbWFydFByb3BzLm9yaWdpbikpIHtcbiAgICAgIGlmIChpc0Vjc0NvbXB1dGUoc21hcnRQcm9wcy5vcmlnaW4pKSB7XG4gICAgICAgIGlmICghc21hcnRQcm9wcy5vcmlnaW4uZ2V0TG9hZEJhbGFuY2VyKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkVDUyBjb21wdXRlIG11c3QgaGF2ZSBhIGxvYWQgYmFsYW5jZXIgZm9yIENETiBvcmlnaW4uIFwiICtcbiAgICAgICAgICAgICAgXCJFbmFibGUgbG9hZEJhbGFuY2VyIGluIHlvdXIgRUNTIGNvbXB1dGUgY29uZmlndXJhdGlvbi5cIlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNMYW1iZGFDb21wdXRlKHNtYXJ0UHJvcHMub3JpZ2luKSkge1xuICAgICAgICBpZiAoIXNtYXJ0UHJvcHMub3JpZ2luLmdldEZ1bmN0aW9uVXJsKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkxhbWJkYSBjb21wdXRlIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIFVSTCBmb3IgQ0ROIG9yaWdpbi4gXCIgK1xuICAgICAgICAgICAgICBcIkVuYWJsZSBmdW5jdGlvblVybCBpbiB5b3VyIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdXN0IGJlIEVDMlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJFQzIgY29tcHV0ZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENETiBvcmlnaW4uIFwiICtcbiAgICAgICAgICAgIFwiVXNlIEVDUyB3aXRoIGxvYWQgYmFsYW5jZXIgb3IgTGFtYmRhIHdpdGggZnVuY3Rpb24gVVJMLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ0ROIHdyYXBwZXIgY2xhc3MgdGhhdCBleHRlbmRzIENsb3VkRnJvbnREaXN0cmlidXRpb24gd2l0aCBGamFsbCBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENkbiBleHRlbmRzIENsb3VkRnJvbnREaXN0cmlidXRpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSUNkblByb3BzKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQcm9wcyA9IENkbi5yZXNvbHZlUHJvcHMocHJvcHMpO1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcmVzb2x2ZWRQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBJQ2RuUHJvcHMgdG8gQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZVByb3BzKHByb3BzOiBJQ2RuUHJvcHMpOiBDbG91ZEZyb250RGlzdHJpYnV0aW9uUHJvcHMge1xuICAgIGNvbnN0IGRlZmF1bHRPcmlnaW4gPSBDZG4ucmVzb2x2ZURlZmF1bHRPcmlnaW4ocHJvcHMpO1xuICAgIGNvbnN0IGJlaGF2aW91cnMgPSBDZG4ucmVzb2x2ZUJlaGF2aW91cnMocHJvcHMuYmVoYXZpb3Vycyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdE9yaWdpbixcbiAgICAgIGRlZmF1bHRDYWNoZVBvbGljeTogcHJvcHMuY2FjaGVQb2xpY3ksXG4gICAgICBkZWZhdWx0QWxsb3dlZE1ldGhvZHM6IHByb3BzLmRlZmF1bHRBbGxvd2VkTWV0aG9kcyxcbiAgICAgIGJlaGF2aW91cnMsXG4gICAgICBkb21haW5OYW1lczogcHJvcHMuZG9tYWluTmFtZXMsXG4gICAgICBjZXJ0aWZpY2F0ZTogcHJvcHMuY2VydGlmaWNhdGUsXG4gICAgICBjb21tZW50OiBwcm9wcy5jb21tZW50LFxuICAgICAgZW5hYmxlTG9nZ2luZzogcHJvcHMuZW5hYmxlTG9nZ2luZyxcbiAgICAgIGxvZ0J1Y2tldDogcHJvcHMubG9nQnVja2V0LFxuICAgICAgcHJpY2VDbGFzczogcHJvcHMucHJpY2VDbGFzcyxcbiAgICAgIGZvcndhcmRIb3N0SGVhZGVyOiBwcm9wcy5mb3J3YXJkSG9zdEhlYWRlclxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHNtYXJ0IGJlaGF2aW91cnMgdG8gQ2RuQmVoYXZpb3VyIG9iamVjdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlQmVoYXZpb3VycyhcbiAgICBiZWhhdmlvdXJzPzogU21hcnRDZG5CZWhhdmlvdXJbXVxuICApOiBDZG5CZWhhdmlvdXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFiZWhhdmlvdXJzIHx8IGJlaGF2aW91cnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBiZWhhdmlvdXJzLm1hcCgoYmVoYXZpb3VyKSA9PiAoe1xuICAgICAgcGF0aFBhdHRlcm46IGJlaGF2aW91ci5wYXRoUGF0dGVybixcbiAgICAgIG9yaWdpbjogQ2RuLmRldGVjdE9yaWdpbkZyb21SZXNvdXJjZShiZWhhdmlvdXIub3JpZ2luKSxcbiAgICAgIGNhY2hlUG9saWN5OiBiZWhhdmlvdXIuY2FjaGVQb2xpY3ksXG4gICAgICBhbGxvd2VkTWV0aG9kczogYmVoYXZpb3VyLmFsbG93ZWRNZXRob2RzXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGRlZmF1bHQgb3JpZ2luIGZyb20gSUNkblByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZURlZmF1bHRPcmlnaW4ocHJvcHM6IElDZG5Qcm9wcyk6IENkbk9yaWdpbkNvbmZpZyB7XG4gICAgc3dpdGNoIChwcm9wcy5vcmlnaW5UeXBlKSB7XG4gICAgICBjYXNlIFwiczNcIjoge1xuICAgICAgICBjb25zdCBidWNrZXQgPSBpc1N0b3JhZ2UocHJvcHMuYnVja2V0KVxuICAgICAgICAgID8gcHJvcHMuYnVja2V0LmdldEJ1Y2tldCgpXG4gICAgICAgICAgOiBwcm9wcy5idWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJzM1wiLFxuICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICBvcmlnaW5QYXRoOiBwcm9wcy5vcmlnaW5QYXRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJhbGJcIjoge1xuICAgICAgICBsZXQgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gICAgICAgIGlmIChpc0NvbXB1dGUocHJvcHMubG9hZEJhbGFuY2VyKSkge1xuICAgICAgICAgIGlmIChpc0Vjc0NvbXB1dGUocHJvcHMubG9hZEJhbGFuY2VyKSkge1xuICAgICAgICAgICAgY29uc3QgbGIgPSBwcm9wcy5sb2FkQmFsYW5jZXIuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gICAgICAgICAgICBpZiAoIWxiKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvbXB1dGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhIGxvYWQgYmFsYW5jZXIuIFwiICtcbiAgICAgICAgICAgICAgICAgIFwiRW5zdXJlIEVDUyBjb21wdXRlIGhhcyBsb2FkQmFsYW5jZXIgZW5hYmxlZCBmb3IgQ0ROIG9yaWdpbi5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9hZEJhbGFuY2VyID0gbGI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJPbmx5IEVDUyBjb21wdXRlIHdpdGggbG9hZCBiYWxhbmNlciBpcyBzdXBwb3J0ZWQgZm9yIEFMQiBvcmlnaW4uIFwiICtcbiAgICAgICAgICAgICAgICBcIkxhbWJkYSBhbmQgRUMyIGNvbXB1dGUgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvYWRCYWxhbmNlciA9IHByb3BzLmxvYWRCYWxhbmNlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiYWxiXCIsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyLFxuICAgICAgICAgIHByb3RvY29sUG9saWN5OiBwcm9wcy5wcm90b2NvbFBvbGljeVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaHR0cFwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICAgICAgb3JpZ2luUGF0aDogcHJvcHMub3JpZ2luUGF0aCxcbiAgICAgICAgICBwcm90b2NvbFBvbGljeTogcHJvcHMucHJvdG9jb2xQb2xpY3lcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBcImF1dG9cIjpcbiAgICAgICAgcmV0dXJuIENkbi5kZXRlY3RPcmlnaW5Gcm9tUmVzb3VyY2UocHJvcHMub3JpZ2luKTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBDRE4gb3JpZ2luIHR5cGU6ICR7KHByb3BzIGFzIElDZG5Qcm9wcykub3JpZ2luVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dG8tZGV0ZWN0IG9yaWdpbiBjb25maWd1cmF0aW9uIGZyb20gYSBGamFsbCByZXNvdXJjZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE9yaWdpbkZyb21SZXNvdXJjZShcbiAgICByZXNvdXJjZTogU3RvcmFnZSB8IEFueUNvbXB1dGUgfCBzdHJpbmdcbiAgKTogQ2RuT3JpZ2luQ29uZmlnIHtcbiAgICAvLyBTdHJpbmcg4oaSIEhUVFAgb3JpZ2luXG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJodHRwXCIsXG4gICAgICAgIGRvbWFpbk5hbWU6IHJlc291cmNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0b3JhZ2Ug4oaSIFMzIG9yaWdpblxuICAgIGlmIChpc1N0b3JhZ2UocmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInMzXCIsXG4gICAgICAgIGJ1Y2tldDogcmVzb3VyY2UuZ2V0QnVja2V0KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRUNTIENvbXB1dGUg4oaSIEFMQiBvcmlnaW5cbiAgICBpZiAoaXNFY3NDb21wdXRlKHJlc291cmNlKSkge1xuICAgICAgY29uc3QgbG9hZEJhbGFuY2VyID0gcmVzb3VyY2UuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gICAgICBpZiAobG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJhbGJcIixcbiAgICAgICAgICBsb2FkQmFsYW5jZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYW1iZGEgQ29tcHV0ZSDihpIgSFRUUCBvcmlnaW4gKGZ1bmN0aW9uIFVSTClcbiAgICBpZiAoaXNMYW1iZGFDb21wdXRlKHJlc291cmNlKSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25VcmwgPSByZXNvdXJjZS5nZXRGdW5jdGlvblVybCgpO1xuICAgICAgaWYgKGZ1bmN0aW9uVXJsKSB7XG4gICAgICAgIC8vIExhbWJkYSBmdW5jdGlvbiBVUkwgaXMgYW4gSFRUUCBvcmlnaW5cbiAgICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBVUkwgdG9rZW4gdXNpbmcgQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljc1xuICAgICAgICAvLyBVUkwgZm9ybWF0OiBodHRwczovLzxkb21haW4+L1xuICAgICAgICAvLyBTcGxpdCBieSBcIi9cIiBnaXZlcyBbXCJodHRwczpcIiwgXCJcIiwgXCI8ZG9tYWluPlwiLCBcIlwiXVxuICAgICAgICAvLyBTZWxlY3QgaW5kZXggMiB0byBnZXQgdGhlIGRvbWFpblxuICAgICAgICBjb25zdCBkb21haW5OYW1lID0gRm4uc2VsZWN0KDIsIEZuLnNwbGl0KFwiL1wiLCBmdW5jdGlvblVybCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgICAgICAgIGRvbWFpbk5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5hYmxlIHRvIGRldGVjdCBDRE4gb3JpZ2luIGZyb20gcmVzb3VyY2U6ICR7dHlwZW9mIHJlc291cmNlfS4gYCArXG4gICAgICAgIFwiUHJvdmlkZSBleHBsaWNpdCBvcmlnaW4gY29uZmlndXJhdGlvbiB1c2luZyBvcmlnaW5UeXBlLlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIENETiAoQ2xvdWRGcm9udCkgZGlzdHJpYnV0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUzMgb3JpZ2luXG4gKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7fSkpO1xuICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXNzZXRzQ2RuXCIsIHtcbiAqICAgb3JpZ2luVHlwZTogXCJzM1wiLFxuICogICBidWNrZXQ6IGFzc2V0c1xuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBTEIgb3JpZ2luIChFQ1MpXG4gKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7IHR5cGU6IFwiZWNzXCIsIC4uLiB9KSk7XG4gKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBcGlDZG5cIiwge1xuICogICBvcmlnaW5UeXBlOiBcImFsYlwiLFxuICogICBsb2FkQmFsYW5jZXI6IGFwaVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTbWFydCBkZXRlY3Rpb25cbiAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFwcENkblwiLCB7XG4gKiAgIG9yaWdpblR5cGU6IFwiYXV0b1wiLFxuICogICBvcmlnaW46IGFzc2V0c1xuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gZG9tYWluXG4gKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBcHBDZG5cIiwge1xuICogICBvcmlnaW5UeXBlOiBcInMzXCIsXG4gKiAgIGJ1Y2tldDogYXNzZXRzLFxuICogICBkb21haW5OYW1lczogW1wiYXBwLmV4YW1wbGUuY29tXCJdLFxuICogICBjZXJ0aWZpY2F0ZTogbXlDZXJ0XG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDZG5GYWN0b3J5IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgQ0ROIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQ0ROXG4gICAqIEBwYXJhbSBwcm9wcyAtIENETiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIENETiB3aGVuIGludm9rZWRcbiAgICovXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSUNkblByb3BzKSB7XG4gICAgcmV0dXJuIChfYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpOiBDZG4gPT4ge1xuICAgICAgdmFsaWRhdGVDZG5Qcm9wcyhwcm9wcyk7XG4gICAgICByZXR1cm4gbmV3IENkbihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9jZG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQWlDO0FBR2pDLCtFQUc0QztBQUk1QyxpREFPaUM7QUFFakMsdUNBQW9EO0FBQ3BELHVDQUttQjtBQUNuQix5RUFBOEQ7QUFxRTlEOztHQUVHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFnQjtJQUN4QyxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVyRSxzQ0FBc0M7SUFDdEMsSUFBSSxjQUFjLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4RSxpQ0FBVyxDQUFDLElBQUksQ0FDZCx1REFBdUQ7WUFDckQsbURBQW1ELENBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQsNENBQTRDO0lBQzVDLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6RSxpQ0FBVyxDQUFDLElBQUksQ0FDZCx5REFBeUQ7WUFDdkQsOERBQThELENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMvQixJQUFJLElBQUEsbUJBQVMsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksSUFBQSxzQkFBWSxFQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNSLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtEO29CQUNoRCw2REFBNkQsQ0FDaEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLEtBQUssQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFBLG1CQUFTLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxJQUFBLHNCQUFZLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7b0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0RBQXdEO3dCQUN0RCx3REFBd0QsQ0FDM0QsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLElBQUEseUJBQWUsRUFBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztvQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDYiwwREFBMEQ7d0JBQ3hELDBEQUEwRCxDQUM3RCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sY0FBYztnQkFDZCxNQUFNLElBQUksS0FBSyxDQUNiLG9EQUFvRDtvQkFDbEQseURBQXlELENBQzVELENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFhLEdBQUksU0FBUSw0QkFBc0I7SUFDN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLFlBQVksQ0FDekIsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQWdCO1FBRWhCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNELE1BQU0sV0FBVyxHQUNmLEtBQUssQ0FBQyxXQUFXO1lBQ2pCLENBQUMsS0FBSyxDQUFDLGNBQWM7Z0JBQ25CLENBQUMsQ0FBQyxvQ0FBVyxDQUFDLGtCQUFrQixDQUM1QixLQUFLLEVBQ0wsR0FBRyxFQUFFLGFBQWEsRUFDbEIsS0FBSyxDQUFDLGNBQWMsQ0FDckI7Z0JBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpCLE9BQU87WUFDTCxhQUFhO1lBQ2Isa0JBQWtCLEVBQUUsS0FBSyxDQUFDLFdBQVc7WUFDckMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLHFCQUFxQjtZQUNsRCxVQUFVO1lBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFdBQVc7WUFDWCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUMxQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDOUIsVUFBZ0M7UUFFaEMsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDcEMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztZQUN0RCxXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQVc7WUFDbEMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxjQUFjO1NBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLG9CQUFvQixDQUFDLEtBQWdCO1FBQ2xELFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDVixNQUFNLE1BQU0sR0FBRyxJQUFBLG1CQUFTLEVBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDcEMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO29CQUMxQixDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDakIsT0FBTztvQkFDTCxJQUFJLEVBQUUsSUFBSTtvQkFDVixNQUFNO29CQUNOLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtpQkFDN0IsQ0FBQztZQUNKLENBQUM7WUFFRCxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsSUFBSSxZQUFzQyxDQUFDO2dCQUMzQyxJQUFJLElBQUEsbUJBQVMsRUFBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxJQUFBLHNCQUFZLEVBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7d0JBQ3JDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7d0JBQ2hELElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQzs0QkFDUixNQUFNLElBQUksS0FBSyxDQUNiLGtEQUFrRDtnQ0FDaEQsNkRBQTZELENBQ2hFLENBQUM7d0JBQ0osQ0FBQzt3QkFDRCxZQUFZLEdBQUcsRUFBRSxDQUFDO29CQUNwQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixtRUFBbUU7NEJBQ2pFLGlEQUFpRCxDQUNwRCxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO2dCQUNwQyxDQUFDO2dCQUNELE9BQU87b0JBQ0wsSUFBSSxFQUFFLEtBQUs7b0JBQ1gsWUFBWTtvQkFDWixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7aUJBQ3JDLENBQUM7WUFDSixDQUFDO1lBRUQsS0FBSyxNQUFNO2dCQUNULE9BQU87b0JBQ0wsSUFBSSxFQUFFLE1BQU07b0JBQ1osVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO29CQUM1QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7b0JBQzVCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztpQkFDckMsQ0FBQztZQUVKLEtBQUssTUFBTTtnQkFDVCxPQUFPLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFcEQsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDUixNQUFNLFdBQVcsR0FBVSxLQUFLLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWlDLEtBQW1CLENBQUMsVUFBVSxFQUFFLENBQ2xFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyx3QkFBd0IsQ0FDckMsUUFBdUM7UUFFdkMsdUJBQXVCO1FBQ3ZCLElBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDakMsT0FBTztnQkFDTCxJQUFJLEVBQUUsTUFBTTtnQkFDWixVQUFVLEVBQUUsUUFBUTthQUNyQixDQUFDO1FBQ0osQ0FBQztRQUVELHNCQUFzQjtRQUN0QixJQUFJLElBQUEsbUJBQVMsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUU7YUFDN0IsQ0FBQztRQUNKLENBQUM7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxJQUFBLHNCQUFZLEVBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDaEQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsT0FBTztvQkFDTCxJQUFJLEVBQUUsS0FBSztvQkFDWCxZQUFZO2lCQUNiLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELDhDQUE4QztRQUM5QyxJQUFJLElBQUEseUJBQWUsRUFBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQix3Q0FBd0M7Z0JBQ3hDLGdFQUFnRTtnQkFDaEUsZ0NBQWdDO2dCQUNoQyxvREFBb0Q7Z0JBQ3BELG1DQUFtQztnQkFDbkMsTUFBTSxVQUFVLEdBQUcsZ0JBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLGdCQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNO29CQUNaLFVBQVU7aUJBQ1gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYiw4Q0FBOEMsT0FBTyxRQUFRLElBQUk7WUFDL0QseURBQXlELENBQzVELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFwTEQsa0JBb0xDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxNQUFhLFVBQVU7SUFDckI7Ozs7OztPQU1HO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBZ0I7UUFDdkMsT0FBTyxDQUFDLElBQVMsRUFBRSxLQUFnQixFQUFPLEVBQUU7WUFDMUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQWRELGdDQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgRm4gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IHR5cGUgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IHR5cGUgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQge1xuICB0eXBlIElDZXJ0aWZpY2F0ZSxcbiAgQ2VydGlmaWNhdGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgSUNhY2hlUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZGZyb250XCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5pbXBvcnQge1xuICBDbG91ZEZyb250RGlzdHJpYnV0aW9uLFxuICB0eXBlIENsb3VkRnJvbnREaXN0cmlidXRpb25Qcm9wcyxcbiAgdHlwZSBDZG5PcmlnaW5Db25maWcsXG4gIHR5cGUgQ2RuQmVoYXZpb3VyLFxuICB0eXBlIENhY2hlUG9saWN5UHJlc2V0LFxuICB0eXBlIEFjY2Vzc0dhdGVDb25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY2RuXCI7XG5pbXBvcnQgeyB0eXBlIElDZG4gfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2NkblwiO1xuaW1wb3J0IHsgdHlwZSBTdG9yYWdlLCBpc1N0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQge1xuICB0eXBlIEFueUNvbXB1dGUsXG4gIGlzQ29tcHV0ZSxcbiAgaXNFY3NDb21wdXRlLFxuICBpc0xhbWJkYUNvbXB1dGVcbn0gZnJvbSBcIi4vY29tcHV0ZVwiO1xuaW1wb3J0IHsgRmphbGxMb2dnZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdmFsaWRhdGlvbkxvZ2dlci5qc1wiO1xuXG4vKipcbiAqIENvbW1vbiBDRE4gcHJvcHMgc2hhcmVkIGFjcm9zcyBhbGwgb3JpZ2luIHR5cGVzLlxuICovXG5pbnRlcmZhY2UgQmFzZUNkblByb3BzIHtcbiAgY2FjaGVQb2xpY3k/OiBDYWNoZVBvbGljeVByZXNldCB8IElDYWNoZVBvbGljeTtcbiAgZGVmYXVsdEFsbG93ZWRNZXRob2RzPzogXCJHRVRfSEVBRFwiIHwgXCJHRVRfSEVBRF9PUFRJT05TXCIgfCBcIkFMTFwiO1xuICBiZWhhdmlvdXJzPzogU21hcnRDZG5CZWhhdmlvdXJbXTtcbiAgZG9tYWluTmFtZXM/OiBzdHJpbmdbXTtcbiAgY2VydGlmaWNhdGU/OiBJQ2VydGlmaWNhdGU7XG4gIGNlcnRpZmljYXRlQXJuPzogc3RyaW5nO1xuICBjb21tZW50Pzogc3RyaW5nO1xuICBlbmFibGVMb2dnaW5nPzogYm9vbGVhbjtcbiAgbG9nQnVja2V0PzogSUJ1Y2tldDtcbiAgcHJpY2VDbGFzcz86IFwiUHJpY2VDbGFzc18xMDBcIiB8IFwiUHJpY2VDbGFzc18yMDBcIiB8IFwiUHJpY2VDbGFzc19BbGxcIjtcbiAgZm9yd2FyZEhvc3RIZWFkZXI/OiBib29sZWFuO1xuICBhY2Nlc3NHYXRlPzogZmFsc2UgfCBBY2Nlc3NHYXRlQ29uZmlnO1xufVxuXG4vKipcbiAqIFMzIG9yaWdpbiBDRE4gcHJvcHMgLSB1c2Ugd2l0aCBTMyBidWNrZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTM0NkblByb3BzIGV4dGVuZHMgQmFzZUNkblByb3BzIHtcbiAgb3JpZ2luVHlwZTogXCJzM1wiO1xuICBidWNrZXQ6IElCdWNrZXQgfCBTdG9yYWdlO1xuICBvcmlnaW5QYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFMQiBvcmlnaW4gQ0ROIHByb3BzIC0gdXNlIHdpdGggQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFsYkNkblByb3BzIGV4dGVuZHMgQmFzZUNkblByb3BzIHtcbiAgb3JpZ2luVHlwZTogXCJhbGJcIjtcbiAgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfCBBbnlDb21wdXRlO1xuICBwcm90b2NvbFBvbGljeT86IFwiSFRUUF9PTkxZXCIgfCBcIkhUVFBTX09OTFlcIiB8IFwiTUFUQ0hfVklFV0VSXCI7XG59XG5cbi8qKlxuICogSFRUUCBvcmlnaW4gQ0ROIHByb3BzIC0gdXNlIHdpdGggY3VzdG9tIEhUVFAgZW5kcG9pbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIdHRwQ2RuUHJvcHMgZXh0ZW5kcyBCYXNlQ2RuUHJvcHMge1xuICBvcmlnaW5UeXBlOiBcImh0dHBcIjtcbiAgZG9tYWluTmFtZTogc3RyaW5nO1xuICBvcmlnaW5QYXRoPzogc3RyaW5nO1xuICBwcm90b2NvbFBvbGljeT86IFwiSFRUUF9PTkxZXCIgfCBcIkhUVFBTX09OTFlcIiB8IFwiTUFUQ0hfVklFV0VSXCI7XG59XG5cbi8qKlxuICogU21hcnQgb3JpZ2luIENETiBwcm9wcyAtIGF1dG8tZGV0ZWN0IG9yaWdpbiB0eXBlIGZyb20gRmphbGwgcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydENkblByb3BzIGV4dGVuZHMgQmFzZUNkblByb3BzIHtcbiAgb3JpZ2luVHlwZTogXCJhdXRvXCI7XG4gIG9yaWdpbjogU3RvcmFnZSB8IEFueUNvbXB1dGUgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIElDZG5Qcm9wcyA9IFMzQ2RuUHJvcHMgfCBBbGJDZG5Qcm9wcyB8IEh0dHBDZG5Qcm9wcyB8IFNtYXJ0Q2RuUHJvcHM7XG5cbi8qKlxuICogU21hcnQgYmVoYXZpb3VyIHR5cGUgdGhhdCBhY2NlcHRzIEZqYWxsIHJlc291cmNlcyBhcyBvcmlnaW5zLlxuICogVGhlIGZhY3Rvcnkgd2lsbCB0cmFuc2Zvcm0gdGhlc2UgdG8gcHJvcGVyIENkbkJlaGF2aW91ciBvYmplY3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q2RuQmVoYXZpb3VyIHtcbiAgcGF0aFBhdHRlcm46IHN0cmluZztcbiAgb3JpZ2luOiBTdG9yYWdlIHwgQW55Q29tcHV0ZSB8IHN0cmluZztcbiAgY2FjaGVQb2xpY3k/OiBDYWNoZVBvbGljeVByZXNldCB8IElDYWNoZVBvbGljeTtcbiAgYWxsb3dlZE1ldGhvZHM/OiBcIkdFVF9IRUFEXCIgfCBcIkdFVF9IRUFEX09QVElPTlNcIiB8IFwiQUxMXCI7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIENETiBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgbWlzY29uZmlndXJlZCBvcHRpb25zLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNkblByb3BzKHByb3BzOiBJQ2RuUHJvcHMpOiB2b2lkIHtcbiAgY29uc3QgaGFzQ2VydGlmaWNhdGUgPSAhIShwcm9wcy5jZXJ0aWZpY2F0ZSB8fCBwcm9wcy5jZXJ0aWZpY2F0ZUFybik7XG5cbiAgLy8gVmFsaWRhdGUgY2VydGlmaWNhdGUgcmVnaW9uIHdhcm5pbmdcbiAgaWYgKGhhc0NlcnRpZmljYXRlICYmIHByb3BzLmRvbWFpbk5hbWVzICYmIHByb3BzLmRvbWFpbk5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICBGamFsbExvZ2dlci5pbmZvKFxuICAgICAgXCJDbG91ZEZyb250IGNlcnRpZmljYXRlcyBtdXN0IGJlIGluIHVzLWVhc3QtMSByZWdpb24uIFwiICtcbiAgICAgICAgXCJFbnN1cmUgeW91ciBjZXJ0aWZpY2F0ZSB3YXMgY3JlYXRlZCBpbiB1cy1lYXN0LTEuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgZG9tYWluIG5hbWVzIHJlcXVpcmUgY2VydGlmaWNhdGVcbiAgaWYgKHByb3BzLmRvbWFpbk5hbWVzICYmIHByb3BzLmRvbWFpbk5hbWVzLmxlbmd0aCA+IDAgJiYgIWhhc0NlcnRpZmljYXRlKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2RvbWFpbk5hbWVzJyBwcm92aWRlZCBidXQgbm8gJ2NlcnRpZmljYXRlJyBzcGVjaWZpZWQuIFwiICtcbiAgICAgICAgXCJDdXN0b20gZG9tYWluIG5hbWVzIHJlcXVpcmUgYW4gQUNNIGNlcnRpZmljYXRlIGluIHVzLWVhc3QtMS5cIlxuICAgICk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBBTEIgb3JpZ2luXG4gIGlmIChwcm9wcy5vcmlnaW5UeXBlID09PSBcImFsYlwiKSB7XG4gICAgaWYgKGlzQ29tcHV0ZShwcm9wcy5sb2FkQmFsYW5jZXIpICYmIGlzRWNzQ29tcHV0ZShwcm9wcy5sb2FkQmFsYW5jZXIpKSB7XG4gICAgICBjb25zdCBsYiA9IHByb3BzLmxvYWRCYWxhbmNlci5nZXRMb2FkQmFsYW5jZXIoKTtcbiAgICAgIGlmICghbGIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ29tcHV0ZSByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGEgbG9hZCBiYWxhbmNlci4gXCIgK1xuICAgICAgICAgICAgXCJFbnN1cmUgRUNTIGNvbXB1dGUgaGFzIGxvYWRCYWxhbmNlciBlbmFibGVkIGZvciBDRE4gb3JpZ2luLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgc21hcnQgb3JpZ2luXG4gIGlmIChwcm9wcy5vcmlnaW5UeXBlID09PSBcImF1dG9cIikge1xuICAgIGlmIChpc0NvbXB1dGUocHJvcHMub3JpZ2luKSkge1xuICAgICAgaWYgKGlzRWNzQ29tcHV0ZShwcm9wcy5vcmlnaW4pKSB7XG4gICAgICAgIGlmICghcHJvcHMub3JpZ2luLmdldExvYWRCYWxhbmNlcigpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJFQ1MgY29tcHV0ZSBtdXN0IGhhdmUgYSBsb2FkIGJhbGFuY2VyIGZvciBDRE4gb3JpZ2luLiBcIiArXG4gICAgICAgICAgICAgIFwiRW5hYmxlIGxvYWRCYWxhbmNlciBpbiB5b3VyIEVDUyBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzTGFtYmRhQ29tcHV0ZShwcm9wcy5vcmlnaW4pKSB7XG4gICAgICAgIGlmICghcHJvcHMub3JpZ2luLmdldEZ1bmN0aW9uVXJsKCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIkxhbWJkYSBjb21wdXRlIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIFVSTCBmb3IgQ0ROIG9yaWdpbi4gXCIgK1xuICAgICAgICAgICAgICBcIkVuYWJsZSBmdW5jdGlvblVybCBpbiB5b3VyIExhbWJkYSBjb21wdXRlIGNvbmZpZ3VyYXRpb24uXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBNdXN0IGJlIEVDMlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJFQzIgY29tcHV0ZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENETiBvcmlnaW4uIFwiICtcbiAgICAgICAgICAgIFwiVXNlIEVDUyB3aXRoIGxvYWQgYmFsYW5jZXIgb3IgTGFtYmRhIHdpdGggZnVuY3Rpb24gVVJMLlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ0ROIHdyYXBwZXIgY2xhc3MgdGhhdCBleHRlbmRzIENsb3VkRnJvbnREaXN0cmlidXRpb24gd2l0aCBGamFsbCBwYXR0ZXJucy5cbiAqL1xuZXhwb3J0IGNsYXNzIENkbiBleHRlbmRzIENsb3VkRnJvbnREaXN0cmlidXRpb24gaW1wbGVtZW50cyBJQ2RuIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElDZG5Qcm9wcykge1xuICAgIGNvbnN0IHJlc29sdmVkUHJvcHMgPSBDZG4ucmVzb2x2ZVByb3BzKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcmVzb2x2ZWRQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBJQ2RuUHJvcHMgdG8gQ2xvdWRGcm9udERpc3RyaWJ1dGlvblByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZVByb3BzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogSUNkblByb3BzXG4gICk6IENsb3VkRnJvbnREaXN0cmlidXRpb25Qcm9wcyB7XG4gICAgY29uc3QgZGVmYXVsdE9yaWdpbiA9IENkbi5yZXNvbHZlRGVmYXVsdE9yaWdpbihwcm9wcyk7XG4gICAgY29uc3QgYmVoYXZpb3VycyA9IENkbi5yZXNvbHZlQmVoYXZpb3Vycyhwcm9wcy5iZWhhdmlvdXJzKTtcblxuICAgIGNvbnN0IGNlcnRpZmljYXRlID1cbiAgICAgIHByb3BzLmNlcnRpZmljYXRlID8/XG4gICAgICAocHJvcHMuY2VydGlmaWNhdGVBcm5cbiAgICAgICAgPyBDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgIGAke2lkfUNlcnRpZmljYXRlYCxcbiAgICAgICAgICAgIHByb3BzLmNlcnRpZmljYXRlQXJuXG4gICAgICAgICAgKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVmYXVsdE9yaWdpbixcbiAgICAgIGRlZmF1bHRDYWNoZVBvbGljeTogcHJvcHMuY2FjaGVQb2xpY3ksXG4gICAgICBkZWZhdWx0QWxsb3dlZE1ldGhvZHM6IHByb3BzLmRlZmF1bHRBbGxvd2VkTWV0aG9kcyxcbiAgICAgIGJlaGF2aW91cnMsXG4gICAgICBkb21haW5OYW1lczogcHJvcHMuZG9tYWluTmFtZXMsXG4gICAgICBjZXJ0aWZpY2F0ZSxcbiAgICAgIGNvbW1lbnQ6IHByb3BzLmNvbW1lbnQsXG4gICAgICBlbmFibGVMb2dnaW5nOiBwcm9wcy5lbmFibGVMb2dnaW5nLFxuICAgICAgbG9nQnVja2V0OiBwcm9wcy5sb2dCdWNrZXQsXG4gICAgICBwcmljZUNsYXNzOiBwcm9wcy5wcmljZUNsYXNzLFxuICAgICAgZm9yd2FyZEhvc3RIZWFkZXI6IHByb3BzLmZvcndhcmRIb3N0SGVhZGVyLFxuICAgICAgYWNjZXNzR2F0ZTogcHJvcHMuYWNjZXNzR2F0ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNmb3JtIHNtYXJ0IGJlaGF2aW91cnMgdG8gQ2RuQmVoYXZpb3VyIG9iamVjdHMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlQmVoYXZpb3VycyhcbiAgICBiZWhhdmlvdXJzPzogU21hcnRDZG5CZWhhdmlvdXJbXVxuICApOiBDZG5CZWhhdmlvdXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFiZWhhdmlvdXJzIHx8IGJlaGF2aW91cnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBiZWhhdmlvdXJzLm1hcCgoYmVoYXZpb3VyKSA9PiAoe1xuICAgICAgcGF0aFBhdHRlcm46IGJlaGF2aW91ci5wYXRoUGF0dGVybixcbiAgICAgIG9yaWdpbjogQ2RuLmRldGVjdE9yaWdpbkZyb21SZXNvdXJjZShiZWhhdmlvdXIub3JpZ2luKSxcbiAgICAgIGNhY2hlUG9saWN5OiBiZWhhdmlvdXIuY2FjaGVQb2xpY3ksXG4gICAgICBhbGxvd2VkTWV0aG9kczogYmVoYXZpb3VyLmFsbG93ZWRNZXRob2RzXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGRlZmF1bHQgb3JpZ2luIGZyb20gSUNkblByb3BzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVzb2x2ZURlZmF1bHRPcmlnaW4ocHJvcHM6IElDZG5Qcm9wcyk6IENkbk9yaWdpbkNvbmZpZyB7XG4gICAgc3dpdGNoIChwcm9wcy5vcmlnaW5UeXBlKSB7XG4gICAgICBjYXNlIFwiczNcIjoge1xuICAgICAgICBjb25zdCBidWNrZXQgPSBpc1N0b3JhZ2UocHJvcHMuYnVja2V0KVxuICAgICAgICAgID8gcHJvcHMuYnVja2V0LmdldEJ1Y2tldCgpXG4gICAgICAgICAgOiBwcm9wcy5idWNrZXQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJzM1wiLFxuICAgICAgICAgIGJ1Y2tldCxcbiAgICAgICAgICBvcmlnaW5QYXRoOiBwcm9wcy5vcmlnaW5QYXRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgXCJhbGJcIjoge1xuICAgICAgICBsZXQgbG9hZEJhbGFuY2VyOiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gICAgICAgIGlmIChpc0NvbXB1dGUocHJvcHMubG9hZEJhbGFuY2VyKSkge1xuICAgICAgICAgIGlmIChpc0Vjc0NvbXB1dGUocHJvcHMubG9hZEJhbGFuY2VyKSkge1xuICAgICAgICAgICAgY29uc3QgbGIgPSBwcm9wcy5sb2FkQmFsYW5jZXIuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gICAgICAgICAgICBpZiAoIWxiKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvbXB1dGUgcmVzb3VyY2UgZG9lcyBub3QgaGF2ZSBhIGxvYWQgYmFsYW5jZXIuIFwiICtcbiAgICAgICAgICAgICAgICAgIFwiRW5zdXJlIEVDUyBjb21wdXRlIGhhcyBsb2FkQmFsYW5jZXIgZW5hYmxlZCBmb3IgQ0ROIG9yaWdpbi5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbG9hZEJhbGFuY2VyID0gbGI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgXCJPbmx5IEVDUyBjb21wdXRlIHdpdGggbG9hZCBiYWxhbmNlciBpcyBzdXBwb3J0ZWQgZm9yIEFMQiBvcmlnaW4uIFwiICtcbiAgICAgICAgICAgICAgICBcIkxhbWJkYSBhbmQgRUMyIGNvbXB1dGUgdHlwZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvYWRCYWxhbmNlciA9IHByb3BzLmxvYWRCYWxhbmNlcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiYWxiXCIsXG4gICAgICAgICAgbG9hZEJhbGFuY2VyLFxuICAgICAgICAgIHByb3RvY29sUG9saWN5OiBwcm9wcy5wcm90b2NvbFBvbGljeVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIFwiaHR0cFwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgICAgICAgIGRvbWFpbk5hbWU6IHByb3BzLmRvbWFpbk5hbWUsXG4gICAgICAgICAgb3JpZ2luUGF0aDogcHJvcHMub3JpZ2luUGF0aCxcbiAgICAgICAgICBwcm90b2NvbFBvbGljeTogcHJvcHMucHJvdG9jb2xQb2xpY3lcbiAgICAgICAgfTtcblxuICAgICAgY2FzZSBcImF1dG9cIjpcbiAgICAgICAgcmV0dXJuIENkbi5kZXRlY3RPcmlnaW5Gcm9tUmVzb3VyY2UocHJvcHMub3JpZ2luKTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnN1cHBvcnRlZCBDRE4gb3JpZ2luIHR5cGU6ICR7KHByb3BzIGFzIElDZG5Qcm9wcykub3JpZ2luVHlwZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dG8tZGV0ZWN0IG9yaWdpbiBjb25maWd1cmF0aW9uIGZyb20gYSBGamFsbCByZXNvdXJjZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE9yaWdpbkZyb21SZXNvdXJjZShcbiAgICByZXNvdXJjZTogU3RvcmFnZSB8IEFueUNvbXB1dGUgfCBzdHJpbmdcbiAgKTogQ2RuT3JpZ2luQ29uZmlnIHtcbiAgICAvLyBTdHJpbmcg4oaSIEhUVFAgb3JpZ2luXG4gICAgaWYgKHR5cGVvZiByZXNvdXJjZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJodHRwXCIsXG4gICAgICAgIGRvbWFpbk5hbWU6IHJlc291cmNlXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFN0b3JhZ2Ug4oaSIFMzIG9yaWdpblxuICAgIGlmIChpc1N0b3JhZ2UocmVzb3VyY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcInMzXCIsXG4gICAgICAgIGJ1Y2tldDogcmVzb3VyY2UuZ2V0QnVja2V0KClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRUNTIENvbXB1dGUg4oaSIEFMQiBvcmlnaW5cbiAgICBpZiAoaXNFY3NDb21wdXRlKHJlc291cmNlKSkge1xuICAgICAgY29uc3QgbG9hZEJhbGFuY2VyID0gcmVzb3VyY2UuZ2V0TG9hZEJhbGFuY2VyKCk7XG4gICAgICBpZiAobG9hZEJhbGFuY2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogXCJhbGJcIixcbiAgICAgICAgICBsb2FkQmFsYW5jZXJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYW1iZGEgQ29tcHV0ZSDihpIgSFRUUCBvcmlnaW4gKGZ1bmN0aW9uIFVSTClcbiAgICBpZiAoaXNMYW1iZGFDb21wdXRlKHJlc291cmNlKSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25VcmwgPSByZXNvdXJjZS5nZXRGdW5jdGlvblVybCgpO1xuICAgICAgaWYgKGZ1bmN0aW9uVXJsKSB7XG4gICAgICAgIC8vIExhbWJkYSBmdW5jdGlvbiBVUkwgaXMgYW4gSFRUUCBvcmlnaW5cbiAgICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBVUkwgdG9rZW4gdXNpbmcgQ2xvdWRGb3JtYXRpb24gaW50cmluc2ljc1xuICAgICAgICAvLyBVUkwgZm9ybWF0OiBodHRwczovLzxkb21haW4+L1xuICAgICAgICAvLyBTcGxpdCBieSBcIi9cIiBnaXZlcyBbXCJodHRwczpcIiwgXCJcIiwgXCI8ZG9tYWluPlwiLCBcIlwiXVxuICAgICAgICAvLyBTZWxlY3QgaW5kZXggMiB0byBnZXQgdGhlIGRvbWFpblxuICAgICAgICBjb25zdCBkb21haW5OYW1lID0gRm4uc2VsZWN0KDIsIEZuLnNwbGl0KFwiL1wiLCBmdW5jdGlvblVybCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgICAgICAgIGRvbWFpbk5hbWVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5hYmxlIHRvIGRldGVjdCBDRE4gb3JpZ2luIGZyb20gcmVzb3VyY2U6ICR7dHlwZW9mIHJlc291cmNlfS4gYCArXG4gICAgICAgIFwiUHJvdmlkZSBleHBsaWNpdCBvcmlnaW4gY29uZmlndXJhdGlvbiB1c2luZyBvcmlnaW5UeXBlLlwiXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIENETiAoQ2xvdWRGcm9udCkgZGlzdHJpYnV0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUzMgb3JpZ2luXG4gKiBjb25zdCBhc3NldHMgPSBhcHAuYWRkU3RvcmFnZShTdG9yYWdlRmFjdG9yeS5idWlsZChcIkFzc2V0c1wiLCB7fSkpO1xuICogYXBwLmFkZENkbihDZG5GYWN0b3J5LmJ1aWxkKFwiQXNzZXRzQ2RuXCIsIHtcbiAqICAgb3JpZ2luVHlwZTogXCJzM1wiLFxuICogICBidWNrZXQ6IGFzc2V0c1xuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBBTEIgb3JpZ2luIChFQ1MpXG4gKiBjb25zdCBhcGkgPSBhcHAuYWRkQ29tcHV0ZShDb21wdXRlRmFjdG9yeS5idWlsZChcIkFwaVwiLCB7IHR5cGU6IFwiZWNzXCIsIC4uLiB9KSk7XG4gKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBcGlDZG5cIiwge1xuICogICBvcmlnaW5UeXBlOiBcImFsYlwiLFxuICogICBsb2FkQmFsYW5jZXI6IGFwaVxuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTbWFydCBkZXRlY3Rpb25cbiAqIGFwcC5hZGRDZG4oQ2RuRmFjdG9yeS5idWlsZChcIkFwcENkblwiLCB7XG4gKiAgIG9yaWdpblR5cGU6IFwiYXV0b1wiLFxuICogICBvcmlnaW46IGFzc2V0c1xuICogfSkpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDdXN0b20gZG9tYWluXG4gKiBhcHAuYWRkQ2RuKENkbkZhY3RvcnkuYnVpbGQoXCJBcHBDZG5cIiwge1xuICogICBvcmlnaW5UeXBlOiBcInMzXCIsXG4gKiAgIGJ1Y2tldDogYXNzZXRzLFxuICogICBkb21haW5OYW1lczogW1wiYXBwLmV4YW1wbGUuY29tXCJdLFxuICogICBjZXJ0aWZpY2F0ZTogbXlDZXJ0XG4gKiB9KSk7XG4gKi9cbmV4cG9ydCBjbGFzcyBDZG5GYWN0b3J5IHtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgQ0ROIGZhY3RvcnkgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgQ0ROXG4gICAqIEBwYXJhbSBwcm9wcyAtIENETiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMgRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgdGhlIENETiB3aGVuIGludm9rZWRcbiAgICovXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSUNkblByb3BzKSB7XG4gICAgcmV0dXJuIChfYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpOiBDZG4gPT4ge1xuICAgICAgdmFsaWRhdGVDZG5Qcm9wcyhwcm9wcyk7XG4gICAgICByZXR1cm4gbmV3IENkbihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,7 +1,7 @@
1
1
  import { type RepositoryImage, type ICluster, type IBaseService } from "aws-cdk-lib/aws-ecs";
2
2
  import { Repository } from "aws-cdk-lib/aws-ecr";
3
3
  import { Connections, type IVpc, type UserData, type IMachineImage, type ISecurityGroup } from "aws-cdk-lib/aws-ec2";
4
- import { Code, Runtime, type Architecture, type FunctionUrlAuthType, type FunctionUrlCorsOptions, type IFunction, type InvokeMode } from "aws-cdk-lib/aws-lambda";
4
+ import { Code, Runtime, Architecture, type FunctionUrlAuthType, type FunctionUrlCorsOptions, type IFunction, type InvokeMode } from "aws-cdk-lib/aws-lambda";
5
5
  import { type PolicyStatement, type PolicyDocument, type IManagedPolicy, type IGrantable, Grant } from "aws-cdk-lib/aws-iam";
6
6
  import { type IApplicationLoadBalancer, type ApplicationListener } from "aws-cdk-lib/aws-elasticloadbalancingv2";
7
7
  import { type IAutoScalingGroup } from "aws-cdk-lib/aws-autoscaling";
@@ -27,8 +27,6 @@ export interface ComputeTypeConfig {
27
27
  minCapacity: number;
28
28
  maxCapacity: number;
29
29
  };
30
- /** Whether this compute type supports security group connections */
31
- supportsConnections: boolean;
32
30
  /** Whether this compute type requires a VPC */
33
31
  requiresVpc: boolean;
34
32
  }
@@ -49,7 +47,7 @@ export declare const ECS_CAPACITY_PROVIDER_CONFIG: Record<EcsCapacityProvider, E
49
47
  */
50
48
  export declare const COMPUTE_DEFAULTS: {
51
49
  readonly EC2: {
52
- readonly INSTANCE_TYPE: "t3.micro";
50
+ readonly INSTANCE_TYPE: "t4g.micro";
53
51
  readonly MIN_CAPACITY: 1;
54
52
  readonly MAX_CAPACITY: 1;
55
53
  };
@@ -62,6 +60,7 @@ export declare const COMPUTE_DEFAULTS: {
62
60
  readonly LAMBDA: {
63
61
  readonly HANDLER: "index.handler";
64
62
  readonly RUNTIME: Runtime;
63
+ readonly ARCHITECTURE: Architecture;
65
64
  };
66
65
  };
67
66
  export declare function getComputeTypeConfig(type: ComputeType): ComputeTypeConfig;
@@ -341,7 +340,7 @@ export interface EcsServiceConfig {
341
340
  * {
342
341
  * services: [
343
342
  * { name: "api", capacityProvider: "FARGATE" },
344
- * { name: "worker", capacityProvider: "EC2", ec2Config: { instanceType: "t3.micro" } }
343
+ * { name: "worker", capacityProvider: "EC2", ec2Config: { instanceType: "t4g.micro" } }
345
344
  * ]
346
345
  * }
347
346
  */
@@ -462,7 +461,7 @@ export interface EcsComputeProps extends BaseComputeProps {
462
461
  }
463
462
  export interface Ec2ComputeProps extends BaseComputeProps {
464
463
  type: "ec2";
465
- /** EC2 instance type. Default: "t3.micro" */
464
+ /** EC2 instance type. Default: "t4g.micro" */
466
465
  instanceType?: string;
467
466
  /**
468
467
  * SSH access configuration.
@@ -702,7 +701,7 @@ export declare function resolveLambdaDeployment(props: ILambdaComputeProps): Res
702
701
  * // EC2 compute - returns Ec2Compute with EC2-specific methods
703
702
  * const ec2 = app.addCompute(ComputeFactory.build("Instance", {
704
703
  * type: "ec2",
705
- * instanceType: "t3.micro"
704
+ * instanceType: "t4g.micro"
706
705
  * }));
707
706
  * ec2.getAutoScalingGroup(); // Available on Ec2Compute
708
707
  */