@fjall/components-infrastructure 0.75.3 → 0.77.1

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 (184) hide show
  1. package/dist/lib/app.d.ts +125 -20
  2. package/dist/lib/app.js +171 -56
  3. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  4. package/dist/lib/aspects/resourceInventory.js +56 -0
  5. package/dist/lib/config/audit.d.ts +18 -0
  6. package/dist/lib/config/audit.js +22 -0
  7. package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
  8. package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
  9. package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
  10. package/dist/lib/config/aws/cloudTrail.js +2 -2
  11. package/dist/lib/config/aws/disasterRecovery.js +1 -1
  12. package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
  13. package/dist/lib/config/aws/ecrDefaultImage.js +4 -4
  14. package/dist/lib/config/aws/identityCenter.d.ts +3 -3
  15. package/dist/lib/config/aws/identityCenter.js +1 -1
  16. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
  17. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
  18. package/dist/lib/config/aws/ipam.js +2 -4
  19. package/dist/lib/config/aws/organisation.d.ts +3 -3
  20. package/dist/lib/config/aws/organisation.js +1 -1
  21. package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
  22. package/dist/lib/config/aws/organisationsAccess.js +1 -1
  23. package/dist/lib/config/monitoring.d.ts +18 -0
  24. package/dist/lib/config/monitoring.js +22 -0
  25. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  26. package/dist/lib/patterns/aws/auditRole.js +58 -0
  27. package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
  28. package/dist/lib/patterns/aws/buildkite.js +1 -1
  29. package/dist/lib/patterns/aws/compute.d.ts +17 -11
  30. package/dist/lib/patterns/aws/compute.js +7 -7
  31. package/dist/lib/patterns/aws/database.d.ts +185 -24
  32. package/dist/lib/patterns/aws/database.js +280 -42
  33. package/dist/lib/patterns/aws/ec2.d.ts +43 -0
  34. package/dist/lib/patterns/aws/ec2.js +123 -0
  35. package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
  36. package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
  37. package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
  38. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  39. package/dist/lib/patterns/aws/index.d.ts +1 -0
  40. package/dist/lib/patterns/aws/index.js +2 -1
  41. package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
  42. package/dist/lib/patterns/aws/managedAccount.js +1 -1
  43. package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
  44. package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
  45. package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
  46. package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
  47. package/dist/lib/patterns/aws/managedPlatform.js +2 -4
  48. package/dist/lib/patterns/aws/network.d.ts +75 -0
  49. package/dist/lib/patterns/aws/network.js +99 -0
  50. package/dist/lib/patterns/aws/storage.d.ts +4 -55
  51. package/dist/lib/patterns/aws/storage.js +3 -103
  52. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  53. package/dist/lib/resources/aws/audit/auditRole.js +46 -0
  54. package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
  55. package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
  56. package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
  57. package/dist/lib/resources/aws/backup/backupVault.js +1 -1
  58. package/dist/lib/resources/aws/base/awsStack.js +1 -4
  59. package/dist/lib/resources/aws/compute/ec2.d.ts +4 -3
  60. package/dist/lib/resources/aws/compute/ec2.js +5 -3
  61. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
  62. package/dist/lib/resources/aws/compute/ecs.js +68 -20
  63. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
  64. package/dist/lib/resources/aws/compute/ecsFreeTier.js +17 -10
  65. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
  66. package/dist/lib/resources/aws/compute/ecsSpot.js +19 -14
  67. package/dist/lib/resources/aws/compute/lambda.d.ts +15 -10
  68. package/dist/lib/resources/aws/compute/lambda.js +27 -19
  69. package/dist/lib/resources/aws/database/database.d.ts +2 -2
  70. package/dist/lib/resources/aws/database/database.js +1 -1
  71. package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
  72. package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
  73. package/dist/lib/resources/aws/database/index.d.ts +0 -1
  74. package/dist/lib/resources/aws/database/index.js +1 -2
  75. package/dist/lib/resources/aws/database/rdsAurora.d.ts +24 -6
  76. package/dist/lib/resources/aws/database/rdsAurora.js +212 -85
  77. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +41 -6
  78. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +38 -8
  79. package/dist/lib/resources/aws/database/rdsInstance.d.ts +19 -10
  80. package/dist/lib/resources/aws/database/rdsInstance.js +220 -73
  81. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
  82. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
  83. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
  84. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  85. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
  86. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  87. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
  88. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  89. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
  90. package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
  91. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
  92. package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
  93. package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
  94. package/dist/lib/resources/aws/iam/policy.js +1 -1
  95. package/dist/lib/resources/aws/iam/role.d.ts +1 -1
  96. package/dist/lib/resources/aws/iam/role.js +1 -1
  97. package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
  98. package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
  99. package/dist/lib/resources/aws/index.d.ts +1 -0
  100. package/dist/lib/resources/aws/index.js +2 -1
  101. package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
  102. package/dist/lib/resources/aws/logging/logGroup.js +1 -1
  103. package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
  104. package/dist/lib/resources/aws/monitoring/index.js +18 -0
  105. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  106. package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
  107. package/dist/lib/resources/aws/networking/index.d.ts +0 -1
  108. package/dist/lib/resources/aws/networking/index.js +1 -2
  109. package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
  110. package/dist/lib/resources/aws/networking/ipam.js +1 -1
  111. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  112. package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
  113. package/dist/lib/resources/aws/networking/vpc.d.ts +42 -23
  114. package/dist/lib/resources/aws/networking/vpc.js +185 -36
  115. package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
  116. package/dist/lib/resources/aws/secrets/alias.js +1 -1
  117. package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
  118. package/dist/lib/resources/aws/secrets/parameter.js +1 -1
  119. package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
  120. package/dist/lib/resources/aws/secrets/secret.js +19 -2
  121. package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
  122. package/dist/lib/resources/aws/storage/ecr.js +1 -1
  123. package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
  124. package/dist/lib/resources/aws/storage/s3.js +1 -1
  125. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
  126. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  127. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
  128. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
  129. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
  130. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  131. package/dist/lib/resources/aws/utilities/customResource.d.ts +9 -7
  132. package/dist/lib/resources/aws/utilities/customResource.js +35 -11
  133. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
  134. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
  135. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
  136. package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
  137. package/dist/lib/utils/getAsync.d.ts +1 -1
  138. package/dist/lib/utils/getAsync.js +1 -1
  139. package/dist/lib/utils/getCidr.d.ts +8 -0
  140. package/dist/lib/utils/getCidr.js +40 -0
  141. package/dist/lib/utils/getConfig.d.ts +2 -2
  142. package/dist/lib/utils/getConfig.js +3 -3
  143. package/dist/lib/utils/index.d.ts +1 -0
  144. package/dist/lib/utils/index.js +2 -1
  145. package/dist/lib/utils/resourceNaming.d.ts +41 -0
  146. package/dist/lib/utils/resourceNaming.js +77 -0
  147. package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
  148. package/dist/lib/utils/standardTagsAspect.js +6 -5
  149. package/dist/lib/utils/tagResource.d.ts +1 -1
  150. package/dist/lib/utils/tagResource.js +1 -1
  151. package/package.json +3 -3
  152. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  153. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  154. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  155. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  156. package/dist/lib/__tests__/simple.test.js +0 -12
  157. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  158. package/dist/lib/resources/aws/organisations/account.js +0 -220
  159. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  160. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  161. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  162. package/dist/lib/resources/aws/organisations/index.js +0 -22
  163. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  164. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  165. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  166. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  167. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  168. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  169. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  170. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  171. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  172. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  173. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  174. package/dist/lib/resources/aws/organisations/types.js +0 -36
  175. package/dist/lib/utils/directTagging.d.ts +0 -31
  176. package/dist/lib/utils/directTagging.js +0 -86
  177. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  178. package/dist/lib/utils/fjallConstruct.js +0 -18
  179. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  180. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  181. package/dist/lib/utils/tagContext.d.ts +0 -28
  182. package/dist/lib/utils/tagContext.js +0 -53
  183. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  184. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -5,119 +5,180 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
6
  const aws_rds_1 = require("aws-cdk-lib/aws-rds");
7
7
  const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
8
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
9
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
8
10
  const constructs_1 = require("constructs");
9
11
  const iam_1 = require("../iam");
10
12
  const secrets_1 = require("../secrets");
11
- const vpc_1 = require("../networking/vpc");
13
+ const customResource_1 = require("../utilities/customResource");
14
+ const database_1 = require("../../../patterns/aws/database");
15
+ const resourceNaming_1 = require("../../../utils/resourceNaming");
12
16
  class RdsInstance extends constructs_1.Construct {
13
17
  constructor(scope, id, props) {
14
18
  super(scope, id);
15
- this.port = props.port || 5432;
16
- this.addVpc(props);
19
+ this.port = props.port || 35255;
20
+ this.vpc = props.vpc;
21
+ // PostgreSQL fallback for direct usage - ensure engine and engineConfig match
22
+ this.engineConfig = props.engineConfig ?? {
23
+ defaultUsername: "postgres",
24
+ sslParameters: { "rds.force_ssl": "1" },
25
+ rotationAppName: "SecretsManagerRDSPostgreSQLRotationMultiUser"
26
+ };
17
27
  this.addDatabase(props);
18
- this.rotateSecret(props);
19
- if (props.databaseProxy) {
28
+ // Secret rotation enabled by default (opt-out with secretRotation: false)
29
+ const secretRotationDisabled = props.credentials?.secretRotation === false;
30
+ if (!secretRotationDisabled) {
31
+ this.rotateSecret(props);
32
+ }
33
+ if (props.proxy !== undefined && props.proxy !== false) {
20
34
  this.addProxy(props);
21
35
  }
22
- if (props.readReplica) {
36
+ if (props.readReplica !== undefined && props.readReplica !== false) {
23
37
  this.addReadReplica(props);
24
38
  }
25
39
  }
26
- addVpc(props) {
27
- this.vpc = props.vpc
28
- ? props.vpc
29
- : new vpc_1.Vpc(this, `${props.databaseName}Vpc`, {});
30
- }
31
40
  addDatabase(props) {
32
- // Database Credentials
41
+ const username = props.credentials?.username ?? this.engineConfig.defaultUsername;
33
42
  this.databaseCredentials = new secrets_1.Secret(this, `${props.databaseName}Credentials`, {
34
43
  secretName: `${props.databaseName}Credentials`,
35
44
  generateSecretString: {
36
45
  secretStringTemplate: JSON.stringify({
37
- username: "postgres"
46
+ username
38
47
  }),
39
48
  excludePunctuation: true,
40
49
  includeSpace: false,
41
50
  generateStringKey: "password"
42
51
  }
43
52
  });
44
- // Customer Managed Keys
45
- this.encryptionKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, {
46
- aliasName: `cmk/rds/${props.databaseName}/encryptionKey`
47
- });
48
- if (props.enablePerformanceInsights) {
49
- this.databasePerformanceInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}PerformanceInsightsKey`, {
50
- aliasName: `cmk/rds/${props.databaseName}/InsightsKey`
51
- });
52
- }
53
53
  this.databaseSecurityGroup = new iam_1.SecurityGroup(this, `${props.databaseName}SecurityGroup`, {
54
54
  vpc: this.vpc,
55
- description: `Security group that allows inbound access to the postgres cluster for ${props.databaseName}`
55
+ description: `Security group for RDS database instance ${props.databaseName}`
56
+ });
57
+ // Self-referencing rule for multi-AZ communication
58
+ this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup, aws_ec2_1.Port.tcp(this.port));
59
+ this.connections = new aws_ec2_1.Connections({
60
+ securityGroups: [this.databaseSecurityGroup],
61
+ defaultPort: aws_ec2_1.Port.tcp(this.port)
62
+ });
63
+ const storageEncryptionKey = (0, database_1.isCMKRequested)(props.encryption?.storageKey)
64
+ ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}ClusterEncryptionKey`, { aliasName: `cmk/rds/${props.databaseName}/encryptionKey` }).key
65
+ : (0, database_1.isAwsManagedKey)(props.encryption?.storageKey) ||
66
+ props.encryption?.storageKey === undefined
67
+ ? undefined
68
+ : props.encryption?.storageKey;
69
+ const piEnabled = props.performanceInsights !== false;
70
+ const piConfig = piEnabled && typeof props.performanceInsights === "object"
71
+ ? props.performanceInsights
72
+ : undefined;
73
+ const performanceInsightsEncryptionKey = piEnabled && (0, database_1.isCMKRequested)(piConfig?.encryptionKey)
74
+ ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}PerformanceInsightsKey`, { aliasName: `cmk/rds/${props.databaseName}/InsightsKey` }).key
75
+ : undefined;
76
+ const performanceInsightsRetention = piEnabled
77
+ ? this.getPerformanceInsightRetention(piConfig?.retentionPeriod ?? 7)
78
+ : undefined;
79
+ const engine = props.engine ||
80
+ aws_rds_1.DatabaseInstanceEngine.postgres({
81
+ version: aws_rds_1.PostgresEngineVersion.VER_17_5
82
+ });
83
+ const parameterGroup = new aws_rds_1.ParameterGroup(this, `${props.databaseName}ParameterGroup`, {
84
+ engine,
85
+ description: `Parameter group for ${props.databaseName} with security defaults`,
86
+ parameters: this.engineConfig.sslParameters
56
87
  });
57
- //TODO: Remove this line, that allows the proxy to connect to the database. Replace with seperated security groups
58
- this.databaseSecurityGroup.addIngressRule(this.databaseSecurityGroup, aws_ec2_1.Port.tcp(5432));
59
- this.connections = this.databaseSecurityGroup.connections;
60
- // Database Cluster
61
- this.database = new aws_rds_1.DatabaseInstance(this, `${props.databaseName}Database`, {
88
+ // Use PUBLIC subnet for publiclyAccessible databases (e.g., tinkerer tier without NAT)
89
+ const subnetType = props.publiclyAccessible
90
+ ? aws_ec2_1.SubnetType.PUBLIC
91
+ : aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS;
92
+ const commonInstanceProps = {
62
93
  vpc: this.vpc,
63
94
  vpcSubnets: {
64
- subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
95
+ subnetType
65
96
  },
66
97
  securityGroups: [this.databaseSecurityGroup],
67
- engine: props.engine ||
68
- aws_rds_1.DatabaseInstanceEngine.postgres({
69
- version: aws_rds_1.PostgresEngineVersion.VER_17_5
70
- }),
98
+ engine,
99
+ parameterGroup,
71
100
  allocatedStorage: props.allocatedStorage,
72
101
  backupRetention: props.backupRetention || aws_cdk_lib_1.Duration.days(14),
73
102
  storageEncrypted: true,
74
- storageEncryptionKey: this.encryptionKey.key,
103
+ storageEncryptionKey,
75
104
  storageType: aws_rds_1.StorageType.GP3,
76
105
  caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
77
106
  removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
78
107
  deleteAutomatedBackups: false,
79
- enablePerformanceInsights: props.enablePerformanceInsights,
80
- performanceInsightEncryptionKey: props.enablePerformanceInsights
81
- ? this.databasePerformanceInsightsKey.key
82
- : undefined,
83
- databaseName: props.databaseName,
84
- instanceIdentifier: props.databaseName,
108
+ enablePerformanceInsights: piEnabled,
109
+ performanceInsightEncryptionKey: performanceInsightsEncryptionKey,
110
+ performanceInsightRetention: performanceInsightsRetention,
111
+ instanceIdentifier: resourceNaming_1.ResourceNaming.dbInstanceId(props.databaseName),
85
112
  instanceType: props.instanceType
86
113
  ? new aws_ec2_1.InstanceType(props.instanceType)
87
- : new aws_ec2_1.InstanceType("r6g.large"),
114
+ : new aws_ec2_1.InstanceType("t4g.large"),
88
115
  maxAllocatedStorage: props.maxAllocatedStorage || 500,
89
116
  monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
90
- multiAz: true,
91
- port: props.port,
117
+ multiAz: props.multiAz !== false,
118
+ port: this.port,
119
+ deletionProtection: true,
92
120
  preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30",
93
- credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret)
94
- });
121
+ publiclyAccessible: props.publiclyAccessible ?? false
122
+ };
123
+ if (props.snapshotIdentifier) {
124
+ // Create from snapshot
125
+ this.database = new aws_rds_1.DatabaseInstanceFromSnapshot(this, `${props.databaseName}Database`, {
126
+ ...commonInstanceProps,
127
+ snapshotIdentifier: props.snapshotIdentifier,
128
+ // For snapshots, credentials are used to reset the password
129
+ credentials: aws_rds_1.SnapshotCredentials.fromSecret(this.databaseCredentials.secret)
130
+ });
131
+ }
132
+ else {
133
+ // Create new instance
134
+ this.database = new aws_rds_1.DatabaseInstance(this, `${props.databaseName}Database`, {
135
+ ...commonInstanceProps,
136
+ databaseName: props.databaseName,
137
+ credentials: aws_rds_1.Credentials.fromSecret(this.databaseCredentials.secret)
138
+ });
139
+ }
95
140
  }
96
141
  rotateSecret(props) {
97
- // Rotate the Secret every 30 days
142
+ const rotationConfig = props.credentials?.secretRotation;
143
+ const rotationPeriod = (typeof rotationConfig === "object" &&
144
+ rotationConfig?.automaticallyAfter) ||
145
+ aws_cdk_lib_1.Duration.days(30);
98
146
  this.masterSecret = new secrets_1.Secret(this, `${props.databaseName}MasterSecret`, {
99
147
  secretName: `${props.databaseName}MasterSecret`
100
148
  });
101
149
  new aws_secretsmanager_1.SecretRotation(this, `${props.databaseName}SecretRotation`, {
102
- application: new aws_secretsmanager_1.SecretRotationApplication("SecretsManagerRDSPostgreSQLRotationMultiUser", "1.1.367", {
103
- isMultiUser: true
104
- }),
150
+ application: new aws_secretsmanager_1.SecretRotationApplication(this.engineConfig.rotationAppName, "1.1.367", { isMultiUser: true }),
105
151
  secret: this.databaseCredentials.secret,
106
152
  masterSecret: this.masterSecret.secret,
107
153
  target: this.database,
108
- vpc: this.database.vpc
154
+ vpc: this.database.vpc,
155
+ automaticallyAfter: rotationPeriod
109
156
  });
110
157
  }
111
158
  addProxy(props) {
159
+ const proxyConfig = props.proxy;
160
+ const vpcSubnets = proxyConfig.vpcSubnets ?? {
161
+ subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
162
+ };
163
+ this.databaseProxySecurityGroup = new iam_1.SecurityGroup(this, `${props.databaseName}ProxySecurityGroup`, {
164
+ vpc: this.vpc,
165
+ description: `Security group for RDS Proxy for ${props.databaseName}`
166
+ });
167
+ // Allow proxy to connect to database
168
+ this.databaseSecurityGroup.addIngressRule(this.databaseProxySecurityGroup, aws_ec2_1.Port.tcp(this.port), "Allow RDS Proxy to connect to database");
112
169
  this.databaseProxy = new aws_rds_1.DatabaseProxy(this, `${props.databaseName}DatabaseProxy`, {
170
+ dbProxyName: resourceNaming_1.ResourceNaming.proxyName(props.databaseName),
113
171
  proxyTarget: aws_rds_1.ProxyTarget.fromInstance(this.database),
114
172
  secrets: [this.databaseCredentials.secret],
115
- // TODO: Create a new security group, and remove the line that allows the proxy to connect to the database
116
- securityGroups: [this.databaseSecurityGroup],
173
+ securityGroups: [this.databaseProxySecurityGroup],
117
174
  vpc: this.vpc,
118
- vpcSubnets: {
119
- subnetType: aws_ec2_1.SubnetType.PUBLIC
120
- }
175
+ vpcSubnets,
176
+ requireTLS: proxyConfig.requireTLS ?? true,
177
+ borrowTimeout: proxyConfig.connectionBorrowTimeout
178
+ ? aws_cdk_lib_1.Duration.seconds(proxyConfig.connectionBorrowTimeout)
179
+ : aws_cdk_lib_1.Duration.seconds(120),
180
+ maxConnectionsPercent: proxyConfig.maxConnections,
181
+ maxIdleConnectionsPercent: proxyConfig.maxIdleConnections
121
182
  });
122
183
  new aws_cdk_lib_1.CfnOutput(this, `${props.databaseName}ProxyEndpointOutput`, {
123
184
  key: `${props.databaseName}ProxyEndpoint`,
@@ -126,38 +187,124 @@ class RdsInstance extends constructs_1.Construct {
126
187
  });
127
188
  }
128
189
  addReadReplica(props) {
129
- const readReplicaPerformanceInsightsKey = new secrets_1.CustomerManagedKey(this, `${props.databaseName}ReadReplicaReaderInsightsKey`, {
130
- aliasName: `cmk/rds/${props.databaseName}/ReadReplicaInsightsKey`
190
+ const replicaConfig = props.readReplica;
191
+ const replicaInstanceType = replicaConfig.instanceType ?? props.instanceType ?? "t4g.large";
192
+ const piEnabled = props.performanceInsights !== false;
193
+ const piConfig = piEnabled && typeof props.performanceInsights === "object"
194
+ ? props.performanceInsights
195
+ : undefined;
196
+ const readReplicaPerformanceInsightsKey = piEnabled && (0, database_1.isCMKRequested)(piConfig?.encryptionKey)
197
+ ? new secrets_1.CustomerManagedKey(this, `${props.databaseName}ReadReplicaReaderInsightsKey`, {
198
+ aliasName: `cmk/rds/${props.databaseName}/ReadReplicaInsightsKey`
199
+ }).key
200
+ : undefined;
201
+ this.readReplicaSecurityGroup = new iam_1.SecurityGroup(this, `${props.databaseName}ReadReplicaSecurityGroup`, {
202
+ vpc: this.vpc,
203
+ description: `Security group for RDS read replica of ${props.databaseName}`
204
+ });
205
+ // Allow primary database to replicate to read replica
206
+ this.readReplicaSecurityGroup.addIngressRule(this.databaseSecurityGroup, aws_ec2_1.Port.tcp(this.port), "Allow primary database to replicate to read replica");
207
+ // Deletion waiter ensures primary is "available" before CloudFormation deletes it.
208
+ // When the read replica is deleted, the primary enters "modifying" state.
209
+ // Without this waiter, the final snapshot creation fails.
210
+ const instanceId = resourceNaming_1.ResourceNaming.dbInstanceId(props.databaseName);
211
+ const waiterTimeout = aws_cdk_lib_1.Duration.minutes(10);
212
+ const deletionWaiter = new customResource_1.CustomResource(this, `${props.databaseName}DeletionWaiter`, {
213
+ runtime: aws_lambda_1.Runtime.NODEJS_18_X,
214
+ timeout: waiterTimeout.plus(aws_cdk_lib_1.Duration.seconds(30)),
215
+ lambdaDescription: `${props.databaseName} deletion waiter`,
216
+ inlineCode: `
217
+ const { RDSClient } = require('@aws-sdk/client-rds');
218
+ const { waitUntilDBInstanceAvailable } = require('@aws-sdk/client-rds');
219
+
220
+ exports.handler = async (event) => {
221
+ console.log('Event:', JSON.stringify(event, null, 2));
222
+ const instanceId = event.ResourceProperties.InstanceIdentifier;
223
+ const physicalResourceId = event.PhysicalResourceId || event.LogicalResourceId || 'rds-deletion-waiter';
224
+
225
+ if (event.RequestType === 'Delete') {
226
+ console.log('Waiting for instance to be available:', instanceId);
227
+ const client = new RDSClient({});
228
+ try {
229
+ await waitUntilDBInstanceAvailable(
230
+ { client, maxWaitTime: ${waiterTimeout.toSeconds()}, minDelay: 10, maxDelay: 30 },
231
+ { DBInstanceIdentifier: instanceId }
232
+ );
233
+ console.log('Instance is available, deletion can proceed');
234
+ } catch (error) {
235
+ if (error.name === 'ResourceNotFoundError' ||
236
+ error.message?.includes('DBInstanceNotFound') ||
237
+ error.state === 'FAILURE') {
238
+ console.log('Instance not found or waiter failed, proceeding with deletion');
239
+ } else {
240
+ console.error('Error waiting for instance:', error);
241
+ throw error;
242
+ }
243
+ }
244
+ }
245
+ return { PhysicalResourceId: physicalResourceId };
246
+ };
247
+ `,
248
+ inlinePolicy: [
249
+ new aws_iam_1.PolicyStatement({
250
+ effect: aws_iam_1.Effect.ALLOW,
251
+ actions: ["rds:DescribeDBInstances"],
252
+ resources: ["*"]
253
+ })
254
+ ],
255
+ properties: {
256
+ InstanceIdentifier: instanceId,
257
+ Version: "1.0.0"
258
+ }
131
259
  });
132
- new aws_rds_1.DatabaseInstanceReadReplica(this, `${props.databaseName}ReadReplica`, {
260
+ deletionWaiter.resource.node.addDependency(this.database);
261
+ const readReplica = new aws_rds_1.DatabaseInstanceReadReplica(this, `${props.databaseName}ReadReplica`, {
133
262
  sourceDatabaseInstance: this.database,
134
263
  vpc: this.vpc,
135
264
  vpcSubnets: {
136
265
  subnetType: aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
137
266
  },
138
- securityGroups: [this.databaseSecurityGroup],
267
+ securityGroups: [this.readReplicaSecurityGroup],
139
268
  allocatedStorage: props.allocatedStorage,
140
- backupRetention: props.backupRetention || aws_cdk_lib_1.Duration.days(14),
141
269
  storageEncrypted: true,
142
- storageEncryptionKey: this.encryptionKey.key,
143
270
  storageType: aws_rds_1.StorageType.GP3,
144
271
  caCertificate: aws_rds_1.CaCertificate.RDS_CA_RSA4096_G1,
145
- removalPolicy: aws_cdk_lib_1.RemovalPolicy.SNAPSHOT,
272
+ removalPolicy: aws_cdk_lib_1.RemovalPolicy.DESTROY,
146
273
  deleteAutomatedBackups: false,
147
- enablePerformanceInsights: props.enablePerformanceInsights,
148
- performanceInsightEncryptionKey: props.enablePerformanceInsights
149
- ? readReplicaPerformanceInsightsKey.key
274
+ enablePerformanceInsights: piEnabled,
275
+ performanceInsightEncryptionKey: readReplicaPerformanceInsightsKey,
276
+ performanceInsightRetention: piEnabled
277
+ ? this.getPerformanceInsightRetention(piConfig?.retentionPeriod ?? 7)
150
278
  : undefined,
151
- instanceIdentifier: `${props.databaseName}`,
152
- instanceType: props.instanceType
153
- ? new aws_ec2_1.InstanceType(props.instanceType)
154
- : new aws_ec2_1.InstanceType("r6g.large"),
279
+ instanceIdentifier: resourceNaming_1.ResourceNaming.readReplicaId(props.databaseName),
280
+ instanceType: new aws_ec2_1.InstanceType(replicaInstanceType),
281
+ availabilityZone: replicaConfig.availabilityZone,
155
282
  maxAllocatedStorage: props.maxAllocatedStorage || 500,
156
283
  monitoringInterval: props.monitoringInterval || aws_cdk_lib_1.Duration.minutes(1),
157
- multiAz: true,
158
- port: props.port,
284
+ multiAz: props.multiAz !== false,
285
+ port: this.port,
286
+ deletionProtection: true,
159
287
  preferredMaintenanceWindow: props.preferredMaintenanceWindow || "Sat:12:30-Sat:20:30"
160
288
  });
289
+ readReplica.node.addDependency(deletionWaiter.resource);
290
+ }
291
+ getPerformanceInsightRetention(days) {
292
+ switch (days) {
293
+ case 7:
294
+ return aws_rds_1.PerformanceInsightRetention.DEFAULT;
295
+ case 31:
296
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
297
+ case 93:
298
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_3;
299
+ case 186:
300
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_6;
301
+ case 372:
302
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_12;
303
+ case 731:
304
+ return aws_rds_1.PerformanceInsightRetention.LONG_TERM;
305
+ default:
306
+ return aws_rds_1.PerformanceInsightRetention.MONTHS_1;
307
+ }
161
308
  }
162
309
  getHostEndpoint() {
163
310
  if (this.databaseProxy) {
@@ -178,7 +325,7 @@ class RdsInstance extends constructs_1.Construct {
178
325
  const newProps = {
179
326
  ...props,
180
327
  ...{
181
- vpc: sb.getNetwork() || props?.vpc,
328
+ vpc: sb.getNetwork() || props.vpc,
182
329
  securityGroupIds: props?.securityGroupIds ?? [],
183
330
  databaseName: props.databaseName || `${id.replace("Rds", "")}`
184
331
  }
@@ -188,4 +335,4 @@ class RdsInstance extends constructs_1.Construct {
188
335
  }
189
336
  }
190
337
  exports.RdsInstance = RdsInstance;
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNJbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBaUU7QUFDakUsaURBUzZCO0FBQzdCLGlEQVc2QjtBQUM3Qix1RUFHd0M7QUFDeEMsMkNBQXVDO0FBQ3ZDLGdDQUF1QztBQUN2Qyx3Q0FBd0Q7QUFHeEQsMkNBQXdDO0FBcUJ4QyxNQUFhLFdBQVksU0FBUSxzQkFBUztJQWF4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1FBRS9CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXpCLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZTtRQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHO1lBQ2xCLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNYLENBQUMsQ0FBQyxJQUFJLFNBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7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RUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQiwwQkFBMEIsRUFDeEIsS0FBSyxDQUFDLDBCQUEwQixJQUFJLHFCQUFxQjtTQUM1RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBVSxFQUFFLEtBQWU7UUFDdEMsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBRTtZQUMxQixNQUFNLFFBQVEsR0FBYTtnQkFDekIsR0FBRyxLQUFLO2dCQUNSLEdBQUc7b0JBQ0QsR0FBRyxFQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQVUsSUFBSSxLQUFLLEVBQUUsR0FBRztvQkFDM0MsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixJQUFJLEVBQUU7b0JBQy9DLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7aUJBQy9EO2FBQ0YsQ0FBQztZQUVGLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF6UEQsa0NBeVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuT3V0cHV0LCBEdXJhdGlvbiwgUmVtb3ZhbFBvbGljeSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgQ29ubmVjdGlvbnMsXG4gIElDb25uZWN0YWJsZSxcbiAgSW5zdGFuY2VDbGFzcyxcbiAgSW5zdGFuY2VTaXplLFxuICBJbnN0YW5jZVR5cGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7XG4gIENhQ2VydGlmaWNhdGUsXG4gIENyZWRlbnRpYWxzLFxuICBEYXRhYmFzZUluc3RhbmNlLFxuICBEYXRhYmFzZUluc3RhbmNlRW5naW5lLFxuICBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EsXG4gIERhdGFiYXNlUHJveHksXG4gIElJbnN0YW5jZUVuZ2luZSxcbiAgUG9zdGdyZXNFbmdpbmVWZXJzaW9uLFxuICBQcm94eVRhcmdldCxcbiAgU3RvcmFnZVR5cGVcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcbmltcG9ydCB7XG4gIFNlY3JldFJvdGF0aW9uLFxuICBTZWNyZXRSb3RhdGlvbkFwcGxpY2F0aW9uXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IFN0YWNrQnVpbGRlciB9IGZyb20gXCIuLi9iYXNlL2F3c1N0YWNrXCI7XG5pbXBvcnQgeyBWcGMgfSBmcm9tIFwiLi4vbmV0d29ya2luZy92cGNcIjtcblxuaW50ZXJmYWNlIFJkc1Byb3BzIHtcbiAgdnBjPzogSVZwYztcbiAgZGF0YWJhc2VOYW1lPzogc3RyaW5nO1xuICBlbmdpbmU/OiBJSW5zdGFuY2VFbmdpbmU7XG4gIGluc3RhbmNlVHlwZT86IHN0cmluZztcbiAgbWF4QWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYWxsb2NhdGVkU3RvcmFnZT86IG51bWJlcjtcbiAgYmFja3VwUmV0ZW50aW9uPzogRHVyYXRpb247XG4gIGNsdXN0ZXJJZGVudGlmaWVyPzogc3RyaW5nO1xuICBtb25pdG9yaW5nSW50ZXJ2YWw/OiBEdXJhdGlvbjtcbiAgcHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3c/OiBzdHJpbmc7XG4gIHBvcnQ/OiBudW1iZXI7XG4gIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM/OiBib29sZWFuO1xuICBkYXRhYmFzZVByb3h5PzogYm9vbGVhbjtcbiAgLy8gVE9ETzogVGhlIGJlbG93IGNvdWxkIGJlIGEgbnVtYmVyLCB0aGVuIGl0IHNjYWxlcyBiYXNlZCBvbiB0aGUgYW1vdW50XG4gIHJlYWRSZXBsaWNhPzogYm9vbGVhbjtcbiAgc2VjdXJpdHlHcm91cElkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzSW5zdGFuY2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuICBwdWJsaWMgZGF0YWJhc2VTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgdnBjOiBJVnBjO1xuXG4gIHByaXZhdGUgcG9ydDogbnVtYmVyO1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgcHJpdmF0ZSBlbmNyeXB0aW9uS2V5OiBDdXN0b21lck1hbmFnZWRLZXk7XG4gIHByaXZhdGUgZGF0YWJhc2VQZXJmb3JtYW5jZUluc2lnaHRzS2V5OiBDdXN0b21lck1hbmFnZWRLZXk7XG4gIHByaXZhdGUgZGF0YWJhc2U6IERhdGFiYXNlSW5zdGFuY2U7XG4gIHByaXZhdGUgbWFzdGVyU2VjcmV0OiBTZWNyZXQ7XG4gIHByaXZhdGUgZGF0YWJhc2VQcm94eTogRGF0YWJhc2VQcm94eTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCB8fCA1NDMyO1xuXG4gICAgdGhpcy5hZGRWcGMocHJvcHMpO1xuICAgIHRoaXMuYWRkRGF0YWJhc2UocHJvcHMpO1xuICAgIHRoaXMucm90YXRlU2VjcmV0KHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5kYXRhYmFzZVByb3h5KSB7XG4gICAgICB0aGlzLmFkZFByb3h5KHByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucmVhZFJlcGxpY2EpIHtcbiAgICAgIHRoaXMuYWRkUmVhZFJlcGxpY2EocHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFZwYyhwcm9wczogUmRzUHJvcHMpIHtcbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwY1xuICAgICAgPyBwcm9wcy52cGNcbiAgICAgIDogbmV3IFZwYyh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9VnBjYCwge30pO1xuICB9XG5cbiAgYWRkRGF0YWJhc2UocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgLy8gRGF0YWJhc2UgQ3JlZGVudGlhbHNcbiAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMgPSBuZXcgU2VjcmV0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICB7XG4gICAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiBcInBvc3RncmVzXCJcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBleGNsdWRlUHVuY3R1YXRpb246IHRydWUsXG4gICAgICAgICAgaW5jbHVkZVNwYWNlOiBmYWxzZSxcbiAgICAgICAgICBnZW5lcmF0ZVN0cmluZ0tleTogXCJwYXNzd29yZFwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQ3VzdG9tZXIgTWFuYWdlZCBLZXlzXG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9Q2x1c3RlckVuY3J5cHRpb25LZXlgLFxuICAgICAge1xuICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YFxuICAgICAgfVxuICAgICk7XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cykge1xuICAgICAgdGhpcy5kYXRhYmFzZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPSBuZXcgQ3VzdG9tZXJNYW5hZ2VkS2V5KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UGVyZm9ybWFuY2VJbnNpZ2h0c0tleWAsXG4gICAgICAgIHtcbiAgICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9JbnNpZ2h0c0tleWBcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1TZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCB0aGF0IGFsbG93cyBpbmJvdW5kIGFjY2VzcyB0byB0aGUgcG9zdGdyZXMgY2x1c3RlciBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvL1RPRE86IFJlbW92ZSB0aGlzIGxpbmUsIHRoYXQgYWxsb3dzIHRoZSBwcm94eSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4gUmVwbGFjZSB3aXRoIHNlcGVyYXRlZCBzZWN1cml0eSBncm91cHNcbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3AoNTQzMilcbiAgICApO1xuXG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwLmNvbm5lY3Rpb25zO1xuXG4gICAgLy8gRGF0YWJhc2UgQ2x1c3RlclxuICAgIHRoaXMuZGF0YWJhc2UgPSBuZXcgRGF0YWJhc2VJbnN0YW5jZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgIH0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXBdLFxuICAgICAgICBlbmdpbmU6XG4gICAgICAgICAgcHJvcHMuZW5naW5lIHx8XG4gICAgICAgICAgRGF0YWJhc2VJbnN0YW5jZUVuZ2luZS5wb3N0Z3Jlcyh7XG4gICAgICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE3XzVcbiAgICAgICAgICB9KSxcbiAgICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgICAgYmFja3VwUmV0ZW50aW9uOiBwcm9wcy5iYWNrdXBSZXRlbnRpb24gfHwgRHVyYXRpb24uZGF5cygxNCksXG4gICAgICAgIHN0b3JhZ2VFbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgIHN0b3JhZ2VFbmNyeXB0aW9uS2V5OiB0aGlzLmVuY3J5cHRpb25LZXkua2V5LFxuICAgICAgICBzdG9yYWdlVHlwZTogU3RvcmFnZVR5cGUuR1AzLFxuICAgICAgICBjYUNlcnRpZmljYXRlOiBDYUNlcnRpZmljYXRlLlJEU19DQV9SU0E0MDk2X0cxLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgICBkZWxldGVBdXRvbWF0ZWRCYWNrdXBzOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0czogcHJvcHMuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0cyxcbiAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogcHJvcHMuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0c1xuICAgICAgICAgID8gdGhpcy5kYXRhYmFzZVBlcmZvcm1hbmNlSW5zaWdodHNLZXkua2V5XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lLFxuICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGVcbiAgICAgICAgICA/IG5ldyBJbnN0YW5jZVR5cGUocHJvcHMuaW5zdGFuY2VUeXBlKVxuICAgICAgICAgIDogbmV3IEluc3RhbmNlVHlwZShcInI2Zy5sYXJnZVwiKSxcbiAgICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICAgIG1vbml0b3JpbmdJbnRlcnZhbDogcHJvcHMubW9uaXRvcmluZ0ludGVydmFsIHx8IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICAgIG11bHRpQXo6IHRydWUsXG4gICAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICAgIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93OlxuICAgICAgICAgIHByb3BzLnByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93IHx8IFwiU2F0OjEyOjMwLVNhdDoyMDozMFwiLFxuICAgICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KVxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICByb3RhdGVTZWNyZXQocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgLy8gUm90YXRlIHRoZSBTZWNyZXQgZXZlcnkgMzAgZGF5c1xuICAgIHRoaXMubWFzdGVyU2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCwge1xuICAgICAgc2VjcmV0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGBcbiAgICB9KTtcblxuICAgIG5ldyBTZWNyZXRSb3RhdGlvbih0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2VjcmV0Um90YXRpb25gLCB7XG4gICAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICAgIFwiU2VjcmV0c01hbmFnZXJSRFNQb3N0Z3JlU1FMUm90YXRpb25NdWx0aVVzZXJcIixcbiAgICAgICAgXCIxLjEuMzY3XCIsXG4gICAgICAgIHtcbiAgICAgICAgICBpc011bHRpVXNlcjogdHJ1ZVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgc2VjcmV0OiB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0LFxuICAgICAgbWFzdGVyU2VjcmV0OiB0aGlzLm1hc3RlclNlY3JldC5zZWNyZXQsXG4gICAgICB0YXJnZXQ6IHRoaXMuZGF0YWJhc2UsXG4gICAgICB2cGM6IHRoaXMuZGF0YWJhc2UudnBjXG4gICAgfSk7XG4gIH1cblxuICBhZGRQcm94eShwcm9wczogUmRzUHJvcHMpIHtcbiAgICB0aGlzLmRhdGFiYXNlUHJveHkgPSBuZXcgRGF0YWJhc2VQcm94eShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VQcm94eWAsXG4gICAgICB7XG4gICAgICAgIHByb3h5VGFyZ2V0OiBQcm94eVRhcmdldC5mcm9tSW5zdGFuY2UodGhpcy5kYXRhYmFzZSksXG4gICAgICAgIHNlY3JldHM6IFt0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0XSxcbiAgICAgICAgLy8gVE9ETzogQ3JlYXRlIGEgbmV3IHNlY3VyaXR5IGdyb3VwLCBhbmQgcmVtb3ZlIHRoZSBsaW5lIHRoYXQgYWxsb3dzIHRoZSBwcm94eSB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZVxuICAgICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFVCTElDXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludE91dHB1dGAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgZXhwb3J0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVByb3h5RW5kcG9pbnRgLFxuICAgICAgdmFsdWU6IHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludFxuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVhZFJlcGxpY2EocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgY29uc3QgcmVhZFJlcGxpY2FQZXJmb3JtYW5jZUluc2lnaHRzS2V5ID0gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZFJlcGxpY2FSZWFkZXJJbnNpZ2h0c0tleWAsXG4gICAgICB7XG4gICAgICAgIGFsaWFzTmFtZTogYGNtay9yZHMvJHtwcm9wcy5kYXRhYmFzZU5hbWV9L1JlYWRSZXBsaWNhSW5zaWdodHNLZXlgXG4gICAgICB9XG4gICAgKTtcblxuICAgIG5ldyBEYXRhYmFzZUluc3RhbmNlUmVhZFJlcGxpY2EodGhpcywgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRSZXBsaWNhYCwge1xuICAgICAgc291cmNlRGF0YWJhc2VJbnN0YW5jZTogdGhpcy5kYXRhYmFzZSxcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGU6IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgfSxcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXBdLFxuICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgIGJhY2t1cFJldGVudGlvbjogcHJvcHMuYmFja3VwUmV0ZW50aW9uIHx8IER1cmF0aW9uLmRheXMoMTQpLFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0aW9uS2V5OiB0aGlzLmVuY3J5cHRpb25LZXkua2V5LFxuICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgZGVsZXRlQXV0b21hdGVkQmFja3VwczogZmFsc2UsXG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBwcm9wcy5lbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzLFxuICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogcHJvcHMuZW5hYmxlUGVyZm9ybWFuY2VJbnNpZ2h0c1xuICAgICAgICA/IHJlYWRSZXBsaWNhUGVyZm9ybWFuY2VJbnNpZ2h0c0tleS5rZXlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1gLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGVcbiAgICAgICAgPyBuZXcgSW5zdGFuY2VUeXBlKHByb3BzLmluc3RhbmNlVHlwZSlcbiAgICAgICAgOiBuZXcgSW5zdGFuY2VUeXBlKFwicjZnLmxhcmdlXCIpLFxuICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgbXVsdGlBejogdHJ1ZSxcbiAgICAgIHBvcnQ6IHByb3BzLnBvcnQsXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzpcbiAgICAgICAgcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3cgfHwgXCJTYXQ6MTI6MzAtU2F0OjIwOjMwXCJcbiAgICB9KTtcbiAgfVxuXG4gIGdldEhvc3RFbmRwb2ludCgpIHtcbiAgICBpZiAodGhpcy5kYXRhYmFzZVByb3h5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhYmFzZS5kYkluc3RhbmNlRW5kcG9pbnRBZGRyZXNzO1xuICAgIH1cbiAgfVxuXG4gIGdldEhvc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLnBvcnQpO1xuICB9XG5cbiAgZ2V0Q3JlZGVudGlhbHMoKTogU2VjcmV0IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBSZHNQcm9wcyk6IChzYjogU3RhY2tCdWlsZGVyKSA9PiBDb25zdHJ1Y3Qge1xuICAgIHJldHVybiAoc2I6IFN0YWNrQnVpbGRlcikgPT4ge1xuICAgICAgY29uc3QgbmV3UHJvcHM6IFJkc1Byb3BzID0ge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogKHNiLmdldE5ldHdvcmsoKSBhcyBWcGMpIHx8IHByb3BzPy52cGMsXG4gICAgICAgICAgc2VjdXJpdHlHcm91cElkczogcHJvcHM/LnNlY3VyaXR5R3JvdXBJZHMgPz8gW10sXG4gICAgICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZU5hbWUgfHwgYCR7aWQucmVwbGFjZShcIlJkc1wiLCBcIlwiKX1gXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBuZXcgdGhpcyhzYi5nZXRTdGFjaygpLCBpZCwgbmV3UHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
338
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmRzSW5zdGFuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWIvcmVzb3VyY2VzL2F3cy9kYXRhYmFzZS9yZHNJbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBaUU7QUFDakUsaURBUTZCO0FBQzdCLGlEQWU2QjtBQUM3Qix1RUFHd0M7QUFDeEMsdURBQWlEO0FBQ2pELGlEQUE4RDtBQUM5RCwyQ0FBdUM7QUFDdkMsZ0NBQXVDO0FBQ3ZDLHdDQUF3RDtBQUN4RCxnRUFBNkQ7QUFFN0QsNkRBU3dDO0FBQ3hDLGtFQUErRDtBQTJCL0QsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFjeEMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFlO1FBQ3ZELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQztRQUNoQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFFckIsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSTtZQUN4QyxlQUFlLEVBQUUsVUFBVTtZQUMzQixhQUFhLEVBQUUsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLGVBQWUsRUFBRSw4Q0FBOEM7U0FDaEUsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIsMEVBQTBFO1FBQzFFLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxjQUFjLEtBQUssS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxT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QUFRLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGNBQWM7UUFDWixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBZTtRQUN0QyxPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sUUFBUSxHQUFhO2dCQUN6QixHQUFHLEtBQUs7Z0JBQ1IsR0FBRztvQkFDRCxHQUFHLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBVyxJQUFJLEtBQUssQ0FBQyxHQUFHO29CQUMzQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLElBQUksRUFBRTtvQkFDL0MsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRTtpQkFDL0Q7YUFDRixDQUFDO1lBRUYsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXRjRCxrQ0FzY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBSZW1vdmFsUG9saWN5IH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIEluc3RhbmNlVHlwZSxcbiAgdHlwZSBJVnBjLFxuICBQb3J0LFxuICB0eXBlIFN1Ym5ldFNlbGVjdGlvbixcbiAgU3VibmV0VHlwZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtcbiAgQ2FDZXJ0aWZpY2F0ZSxcbiAgQ3JlZGVudGlhbHMsXG4gIERhdGFiYXNlSW5zdGFuY2UsXG4gIERhdGFiYXNlSW5zdGFuY2VGcm9tU25hcHNob3QsXG4gIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUsXG4gIERhdGFiYXNlSW5zdGFuY2VSZWFkUmVwbGljYSxcbiAgRGF0YWJhc2VQcm94eSxcbiAgdHlwZSBJSW5zdGFuY2VFbmdpbmUsXG4gIFBhcmFtZXRlckdyb3VwLFxuICBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24sXG4gIFBvc3RncmVzRW5naW5lVmVyc2lvbixcbiAgUHJveHlUYXJnZXQsXG4gIFNuYXBzaG90Q3JlZGVudGlhbHMsXG4gIFN0b3JhZ2VUeXBlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtcmRzXCI7XG5pbXBvcnQge1xuICBTZWNyZXRSb3RhdGlvbixcbiAgU2VjcmV0Um90YXRpb25BcHBsaWNhdGlvblxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgRWZmZWN0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBTZWN1cml0eUdyb3VwIH0gZnJvbSBcIi4uL2lhbVwiO1xuaW1wb3J0IHsgQ3VzdG9tZXJNYW5hZ2VkS2V5LCBTZWNyZXQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgQ3VzdG9tUmVzb3VyY2UgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyB0eXBlIFN0YWNrQnVpbGRlciB9IGZyb20gXCIuLi9iYXNlL2F3c1N0YWNrXCI7XG5pbXBvcnQge1xuICB0eXBlIEVuZ2luZUNvbmZpZyxcbiAgdHlwZSBQcm94eUNvbmZpZyxcbiAgdHlwZSBSZWFkUmVwbGljYUNvbmZpZyxcbiAgdHlwZSBDcmVkZW50aWFsc0NvbmZpZyxcbiAgdHlwZSBFbmNyeXB0aW9uQ29uZmlnLFxuICB0eXBlIFBlcmZvcm1hbmNlSW5zaWdodHNDb25maWcsXG4gIGlzQXdzTWFuYWdlZEtleSxcbiAgaXNDTUtSZXF1ZXN0ZWRcbn0gZnJvbSBcIi4uLy4uLy4uL3BhdHRlcm5zL2F3cy9kYXRhYmFzZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VOYW1pbmcgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVzb3VyY2VOYW1pbmdcIjtcblxuaW50ZXJmYWNlIFJkc1Byb3BzIHtcbiAgdnBjOiBJVnBjO1xuICBkYXRhYmFzZU5hbWU/OiBzdHJpbmc7XG4gIGVuZ2luZT86IElJbnN0YW5jZUVuZ2luZTtcbiAgZW5naW5lQ29uZmlnPzogRW5naW5lQ29uZmlnO1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIG1heEFsbG9jYXRlZFN0b3JhZ2U/OiBudW1iZXI7XG4gIGFsbG9jYXRlZFN0b3JhZ2U/OiBudW1iZXI7XG4gIGJhY2t1cFJldGVudGlvbj86IER1cmF0aW9uO1xuICBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgbW9uaXRvcmluZ0ludGVydmFsPzogRHVyYXRpb247XG4gIHByZWZlcnJlZE1haW50ZW5hbmNlV2luZG93Pzogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBwZXJmb3JtYW5jZUluc2lnaHRzPzogUGVyZm9ybWFuY2VJbnNpZ2h0c0NvbmZpZyB8IGZhbHNlO1xuICBzZWN1cml0eUdyb3VwSWRzPzogc3RyaW5nW107XG4gIG11bHRpQXo/OiBib29sZWFuO1xuICBwcm94eT86IFByb3h5Q29uZmlnIHwgZmFsc2U7XG4gIHJlYWRSZXBsaWNhPzogUmVhZFJlcGxpY2FDb25maWcgfCBmYWxzZTtcbiAgY3JlZGVudGlhbHM/OiBDcmVkZW50aWFsc0NvbmZpZztcbiAgZW5jcnlwdGlvbj86IEVuY3J5cHRpb25Db25maWc7XG4gIHB1YmxpY2x5QWNjZXNzaWJsZT86IGJvb2xlYW47XG4gIC8qKiBBUk4gb3IgaWRlbnRpZmllciBvZiBEQiBpbnN0YW5jZSBzbmFwc2hvdCB0byByZXN0b3JlIGZyb20gKi9cbiAgc25hcHNob3RJZGVudGlmaWVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzSW5zdGFuY2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQ29ubmVjdGFibGUge1xuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuICBwdWJsaWMgZGF0YWJhc2VTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwdWJsaWMgdnBjOiBJVnBjO1xuXG4gIHByaXZhdGUgcG9ydDogbnVtYmVyO1xuICBwcml2YXRlIGVuZ2luZUNvbmZpZzogRW5naW5lQ29uZmlnO1xuICBwcml2YXRlIGRhdGFiYXNlQ3JlZGVudGlhbHM6IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZTogRGF0YWJhc2VJbnN0YW5jZTtcbiAgcHJpdmF0ZSBtYXN0ZXJTZWNyZXQ6IFNlY3JldDtcbiAgcHJpdmF0ZSBkYXRhYmFzZVByb3h5OiBEYXRhYmFzZVByb3h5O1xuICBwcml2YXRlIGRhdGFiYXNlUHJveHlTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIHJlYWRSZXBsaWNhU2VjdXJpdHlHcm91cDogU2VjdXJpdHlHcm91cDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wb3J0ID0gcHJvcHMucG9ydCB8fCAzNTI1NTtcbiAgICB0aGlzLnZwYyA9IHByb3BzLnZwYztcblxuICAgIC8vIFBvc3RncmVTUUwgZmFsbGJhY2sgZm9yIGRpcmVjdCB1c2FnZSAtIGVuc3VyZSBlbmdpbmUgYW5kIGVuZ2luZUNvbmZpZyBtYXRjaFxuICAgIHRoaXMuZW5naW5lQ29uZmlnID0gcHJvcHMuZW5naW5lQ29uZmlnID8/IHtcbiAgICAgIGRlZmF1bHRVc2VybmFtZTogXCJwb3N0Z3Jlc1wiLFxuICAgICAgc3NsUGFyYW1ldGVyczogeyBcInJkcy5mb3JjZV9zc2xcIjogXCIxXCIgfSxcbiAgICAgIHJvdGF0aW9uQXBwTmFtZTogXCJTZWNyZXRzTWFuYWdlclJEU1Bvc3RncmVTUUxSb3RhdGlvbk11bHRpVXNlclwiXG4gICAgfTtcblxuICAgIHRoaXMuYWRkRGF0YWJhc2UocHJvcHMpO1xuXG4gICAgLy8gU2VjcmV0IHJvdGF0aW9uIGVuYWJsZWQgYnkgZGVmYXVsdCAob3B0LW91dCB3aXRoIHNlY3JldFJvdGF0aW9uOiBmYWxzZSlcbiAgICBjb25zdCBzZWNyZXRSb3RhdGlvbkRpc2FibGVkID0gcHJvcHMuY3JlZGVudGlhbHM/LnNlY3JldFJvdGF0aW9uID09PSBmYWxzZTtcbiAgICBpZiAoIXNlY3JldFJvdGF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucm90YXRlU2VjcmV0KHByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMucHJveHkgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5wcm94eSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuYWRkUHJveHkocHJvcHMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5yZWFkUmVwbGljYSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLnJlYWRSZXBsaWNhICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5hZGRSZWFkUmVwbGljYShwcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgYWRkRGF0YWJhc2UocHJvcHM6IFJkc1Byb3BzKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPVxuICAgICAgcHJvcHMuY3JlZGVudGlhbHM/LnVzZXJuYW1lID8/IHRoaXMuZW5naW5lQ29uZmlnLmRlZmF1bHRVc2VybmFtZTtcbiAgICB0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMgPSBuZXcgU2VjcmV0KFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICB7XG4gICAgICAgIHNlY3JldE5hbWU6IGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DcmVkZW50aWFsc2AsXG4gICAgICAgIGdlbmVyYXRlU2VjcmV0U3RyaW5nOiB7XG4gICAgICAgICAgc2VjcmV0U3RyaW5nVGVtcGxhdGU6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXhjbHVkZVB1bmN0dWF0aW9uOiB0cnVlLFxuICAgICAgICAgIGluY2x1ZGVTcGFjZTogZmFsc2UsXG4gICAgICAgICAgZ2VuZXJhdGVTdHJpbmdLZXk6IFwicGFzc3dvcmRcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwID0gbmV3IFNlY3VyaXR5R3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVNlY3VyaXR5R3JvdXBgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBSRFMgZGF0YWJhc2UgaW5zdGFuY2UgJHtwcm9wcy5kYXRhYmFzZU5hbWV9YFxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyBTZWxmLXJlZmVyZW5jaW5nIHJ1bGUgZm9yIG11bHRpLUFaIGNvbW11bmljYXRpb25cbiAgICB0aGlzLmRhdGFiYXNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShcbiAgICAgIHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwLFxuICAgICAgUG9ydC50Y3AodGhpcy5wb3J0KVxuICAgICk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gbmV3IENvbm5lY3Rpb25zKHtcbiAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXBdLFxuICAgICAgZGVmYXVsdFBvcnQ6IFBvcnQudGNwKHRoaXMucG9ydClcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0b3JhZ2VFbmNyeXB0aW9uS2V5ID0gaXNDTUtSZXF1ZXN0ZWQocHJvcHMuZW5jcnlwdGlvbj8uc3RvcmFnZUtleSlcbiAgICAgID8gbmV3IEN1c3RvbWVyTWFuYWdlZEtleShcbiAgICAgICAgICB0aGlzLFxuICAgICAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1DbHVzdGVyRW5jcnlwdGlvbktleWAsXG4gICAgICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9lbmNyeXB0aW9uS2V5YCB9XG4gICAgICAgICkua2V5XG4gICAgICA6IGlzQXdzTWFuYWdlZEtleShwcm9wcy5lbmNyeXB0aW9uPy5zdG9yYWdlS2V5KSB8fFxuICAgICAgICAgIHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXkgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHByb3BzLmVuY3J5cHRpb24/LnN0b3JhZ2VLZXk7XG5cbiAgICBjb25zdCBwaUVuYWJsZWQgPSBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzICE9PSBmYWxzZTtcbiAgICBjb25zdCBwaUNvbmZpZyA9XG4gICAgICBwaUVuYWJsZWQgJiYgdHlwZW9mIHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgPyBwcm9wcy5wZXJmb3JtYW5jZUluc2lnaHRzXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c0VuY3J5cHRpb25LZXkgPVxuICAgICAgcGlFbmFibGVkICYmIGlzQ01LUmVxdWVzdGVkKHBpQ29uZmlnPy5lbmNyeXB0aW9uS2V5KVxuICAgICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBlcmZvcm1hbmNlSW5zaWdodHNLZXlgLFxuICAgICAgICAgICAgeyBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9JbnNpZ2h0c0tleWAgfVxuICAgICAgICAgICkua2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbiA9IHBpRW5hYmxlZFxuICAgICAgPyB0aGlzLmdldFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbihwaUNvbmZpZz8ucmV0ZW50aW9uUGVyaW9kID8/IDcpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuZ2luZSA9XG4gICAgICBwcm9wcy5lbmdpbmUgfHxcbiAgICAgIERhdGFiYXNlSW5zdGFuY2VFbmdpbmUucG9zdGdyZXMoe1xuICAgICAgICB2ZXJzaW9uOiBQb3N0Z3Jlc0VuZ2luZVZlcnNpb24uVkVSXzE3XzVcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyR3JvdXAgPSBuZXcgUGFyYW1ldGVyR3JvdXAoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVBhcmFtZXRlckdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgZW5naW5lLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFBhcmFtZXRlciBncm91cCBmb3IgJHtwcm9wcy5kYXRhYmFzZU5hbWV9IHdpdGggc2VjdXJpdHkgZGVmYXVsdHNgLFxuICAgICAgICBwYXJhbWV0ZXJzOiB0aGlzLmVuZ2luZUNvbmZpZy5zc2xQYXJhbWV0ZXJzXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIFVzZSBQVUJMSUMgc3VibmV0IGZvciBwdWJsaWNseUFjY2Vzc2libGUgZGF0YWJhc2VzIChlLmcuLCB0aW5rZXJlciB0aWVyIHdpdGhvdXQgTkFUKVxuICAgIGNvbnN0IHN1Ym5ldFR5cGUgPSBwcm9wcy5wdWJsaWNseUFjY2Vzc2libGVcbiAgICAgID8gU3VibmV0VHlwZS5QVUJMSUNcbiAgICAgIDogU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTO1xuXG4gICAgY29uc3QgY29tbW9uSW5zdGFuY2VQcm9wcyA9IHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgIHN1Ym5ldFR5cGVcbiAgICAgIH0sXG4gICAgICBzZWN1cml0eUdyb3VwczogW3RoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwXSxcbiAgICAgIGVuZ2luZSxcbiAgICAgIHBhcmFtZXRlckdyb3VwLFxuICAgICAgYWxsb2NhdGVkU3RvcmFnZTogcHJvcHMuYWxsb2NhdGVkU3RvcmFnZSxcbiAgICAgIGJhY2t1cFJldGVudGlvbjogcHJvcHMuYmFja3VwUmV0ZW50aW9uIHx8IER1cmF0aW9uLmRheXMoMTQpLFxuICAgICAgc3RvcmFnZUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2VFbmNyeXB0aW9uS2V5LFxuICAgICAgc3RvcmFnZVR5cGU6IFN0b3JhZ2VUeXBlLkdQMyxcbiAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICByZW1vdmFsUG9saWN5OiBSZW1vdmFsUG9saWN5LlNOQVBTSE9ULFxuICAgICAgZGVsZXRlQXV0b21hdGVkQmFja3VwczogZmFsc2UsXG4gICAgICBlbmFibGVQZXJmb3JtYW5jZUluc2lnaHRzOiBwaUVuYWJsZWQsXG4gICAgICBwZXJmb3JtYW5jZUluc2lnaHRFbmNyeXB0aW9uS2V5OiBwZXJmb3JtYW5jZUluc2lnaHRzRW5jcnlwdGlvbktleSxcbiAgICAgIHBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbjogcGVyZm9ybWFuY2VJbnNpZ2h0c1JldGVudGlvbixcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogUmVzb3VyY2VOYW1pbmcuZGJJbnN0YW5jZUlkKHByb3BzLmRhdGFiYXNlTmFtZSEpLFxuICAgICAgaW5zdGFuY2VUeXBlOiBwcm9wcy5pbnN0YW5jZVR5cGVcbiAgICAgICAgPyBuZXcgSW5zdGFuY2VUeXBlKHByb3BzLmluc3RhbmNlVHlwZSlcbiAgICAgICAgOiBuZXcgSW5zdGFuY2VUeXBlKFwidDRnLmxhcmdlXCIpLFxuICAgICAgbWF4QWxsb2NhdGVkU3RvcmFnZTogcHJvcHMubWF4QWxsb2NhdGVkU3RvcmFnZSB8fCA1MDAsXG4gICAgICBtb25pdG9yaW5nSW50ZXJ2YWw6IHByb3BzLm1vbml0b3JpbmdJbnRlcnZhbCB8fCBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgbXVsdGlBejogcHJvcHMubXVsdGlBeiAhPT0gZmFsc2UsXG4gICAgICBwb3J0OiB0aGlzLnBvcnQsXG4gICAgICBkZWxldGlvblByb3RlY3Rpb246IHRydWUsXG4gICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzpcbiAgICAgICAgcHJvcHMucHJlZmVycmVkTWFpbnRlbmFuY2VXaW5kb3cgfHwgXCJTYXQ6MTI6MzAtU2F0OjIwOjMwXCIsXG4gICAgICBwdWJsaWNseUFjY2Vzc2libGU6IHByb3BzLnB1YmxpY2x5QWNjZXNzaWJsZSA/PyBmYWxzZVxuICAgIH07XG5cbiAgICBpZiAocHJvcHMuc25hcHNob3RJZGVudGlmaWVyKSB7XG4gICAgICAvLyBDcmVhdGUgZnJvbSBzbmFwc2hvdFxuICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBEYXRhYmFzZUluc3RhbmNlRnJvbVNuYXBzaG90KFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VgLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uY29tbW9uSW5zdGFuY2VQcm9wcyxcbiAgICAgICAgICBzbmFwc2hvdElkZW50aWZpZXI6IHByb3BzLnNuYXBzaG90SWRlbnRpZmllcixcbiAgICAgICAgICAvLyBGb3Igc25hcHNob3RzLCBjcmVkZW50aWFscyBhcmUgdXNlZCB0byByZXNldCB0aGUgcGFzc3dvcmRcbiAgICAgICAgICBjcmVkZW50aWFsczogU25hcHNob3RDcmVkZW50aWFscy5mcm9tU2VjcmV0KFxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZVxuICAgICAgdGhpcy5kYXRhYmFzZSA9IG5ldyBEYXRhYmFzZUluc3RhbmNlKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGF0YWJhc2VgLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uY29tbW9uSW5zdGFuY2VQcm9wcyxcbiAgICAgICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMuZnJvbVNlY3JldCh0aGlzLmRhdGFiYXNlQ3JlZGVudGlhbHMuc2VjcmV0KVxuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJvdGF0ZVNlY3JldChwcm9wczogUmRzUHJvcHMpIHtcbiAgICBjb25zdCByb3RhdGlvbkNvbmZpZyA9IHByb3BzLmNyZWRlbnRpYWxzPy5zZWNyZXRSb3RhdGlvbjtcbiAgICBjb25zdCByb3RhdGlvblBlcmlvZCA9XG4gICAgICAodHlwZW9mIHJvdGF0aW9uQ29uZmlnID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIHJvdGF0aW9uQ29uZmlnPy5hdXRvbWF0aWNhbGx5QWZ0ZXIpIHx8XG4gICAgICBEdXJhdGlvbi5kYXlzKDMwKTtcblxuICAgIHRoaXMubWFzdGVyU2VjcmV0ID0gbmV3IFNlY3JldCh0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9TWFzdGVyU2VjcmV0YCwge1xuICAgICAgc2VjcmV0TmFtZTogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfU1hc3RlclNlY3JldGBcbiAgICB9KTtcblxuICAgIG5ldyBTZWNyZXRSb3RhdGlvbih0aGlzLCBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9U2VjcmV0Um90YXRpb25gLCB7XG4gICAgICBhcHBsaWNhdGlvbjogbmV3IFNlY3JldFJvdGF0aW9uQXBwbGljYXRpb24oXG4gICAgICAgIHRoaXMuZW5naW5lQ29uZmlnLnJvdGF0aW9uQXBwTmFtZSxcbiAgICAgICAgXCIxLjEuMzY3XCIsXG4gICAgICAgIHsgaXNNdWx0aVVzZXI6IHRydWUgfVxuICAgICAgKSxcbiAgICAgIHNlY3JldDogdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldCxcbiAgICAgIG1hc3RlclNlY3JldDogdGhpcy5tYXN0ZXJTZWNyZXQuc2VjcmV0LFxuICAgICAgdGFyZ2V0OiB0aGlzLmRhdGFiYXNlLFxuICAgICAgdnBjOiB0aGlzLmRhdGFiYXNlLnZwYyxcbiAgICAgIGF1dG9tYXRpY2FsbHlBZnRlcjogcm90YXRpb25QZXJpb2RcbiAgICB9KTtcbiAgfVxuXG4gIGFkZFByb3h5KHByb3BzOiBSZHNQcm9wcykge1xuICAgIGNvbnN0IHByb3h5Q29uZmlnID0gcHJvcHMucHJveHkgYXMgUHJveHlDb25maWc7XG4gICAgY29uc3QgdnBjU3VibmV0czogU3VibmV0U2VsZWN0aW9uID0gcHJveHlDb25maWcudnBjU3VibmV0cyA/PyB7XG4gICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICB9O1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5U2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eVNlY3VyaXR5R3JvdXBgLFxuICAgICAge1xuICAgICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciBSRFMgUHJveHkgZm9yICR7cHJvcHMuZGF0YWJhc2VOYW1lfWBcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8gQWxsb3cgcHJveHkgdG8gY29ubmVjdCB0byBkYXRhYmFzZVxuICAgIHRoaXMuZGF0YWJhc2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgdGhpcy5kYXRhYmFzZVByb3h5U2VjdXJpdHlHcm91cCxcbiAgICAgIFBvcnQudGNwKHRoaXMucG9ydCksXG4gICAgICBcIkFsbG93IFJEUyBQcm94eSB0byBjb25uZWN0IHRvIGRhdGFiYXNlXCJcbiAgICApO1xuXG4gICAgdGhpcy5kYXRhYmFzZVByb3h5ID0gbmV3IERhdGFiYXNlUHJveHkoXG4gICAgICB0aGlzLFxuICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfURhdGFiYXNlUHJveHlgLFxuICAgICAge1xuICAgICAgICBkYlByb3h5TmFtZTogUmVzb3VyY2VOYW1pbmcucHJveHlOYW1lKHByb3BzLmRhdGFiYXNlTmFtZSEpLFxuICAgICAgICBwcm94eVRhcmdldDogUHJveHlUYXJnZXQuZnJvbUluc3RhbmNlKHRoaXMuZGF0YWJhc2UpLFxuICAgICAgICBzZWNyZXRzOiBbdGhpcy5kYXRhYmFzZUNyZWRlbnRpYWxzLnNlY3JldF0sXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzOiBbdGhpcy5kYXRhYmFzZVByb3h5U2VjdXJpdHlHcm91cF0sXG4gICAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICAgIHJlcXVpcmVUTFM6IHByb3h5Q29uZmlnLnJlcXVpcmVUTFMgPz8gdHJ1ZSxcbiAgICAgICAgYm9ycm93VGltZW91dDogcHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXRcbiAgICAgICAgICA/IER1cmF0aW9uLnNlY29uZHMocHJveHlDb25maWcuY29ubmVjdGlvbkJvcnJvd1RpbWVvdXQpXG4gICAgICAgICAgOiBEdXJhdGlvbi5zZWNvbmRzKDEyMCksXG4gICAgICAgIG1heENvbm5lY3Rpb25zUGVyY2VudDogcHJveHlDb25maWcubWF4Q29ubmVjdGlvbnMsXG4gICAgICAgIG1heElkbGVDb25uZWN0aW9uc1BlcmNlbnQ6IHByb3h5Q29uZmlnLm1heElkbGVDb25uZWN0aW9uc1xuICAgICAgfVxuICAgICk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1Qcm94eUVuZHBvaW50T3V0cHV0YCwge1xuICAgICAga2V5OiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludGAsXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UHJveHlFbmRwb2ludGAsXG4gICAgICB2YWx1ZTogdGhpcy5kYXRhYmFzZVByb3h5LmVuZHBvaW50XG4gICAgfSk7XG4gIH1cblxuICBhZGRSZWFkUmVwbGljYShwcm9wczogUmRzUHJvcHMpIHtcbiAgICBjb25zdCByZXBsaWNhQ29uZmlnID0gcHJvcHMucmVhZFJlcGxpY2EgYXMgUmVhZFJlcGxpY2FDb25maWc7XG4gICAgY29uc3QgcmVwbGljYUluc3RhbmNlVHlwZSA9XG4gICAgICByZXBsaWNhQ29uZmlnLmluc3RhbmNlVHlwZSA/PyBwcm9wcy5pbnN0YW5jZVR5cGUgPz8gXCJ0NGcubGFyZ2VcIjtcblxuICAgIGNvbnN0IHBpRW5hYmxlZCA9IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHMgIT09IGZhbHNlO1xuICAgIGNvbnN0IHBpQ29uZmlnID1cbiAgICAgIHBpRW5hYmxlZCAmJiB0eXBlb2YgcHJvcHMucGVyZm9ybWFuY2VJbnNpZ2h0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgICA/IHByb3BzLnBlcmZvcm1hbmNlSW5zaWdodHNcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCByZWFkUmVwbGljYVBlcmZvcm1hbmNlSW5zaWdodHNLZXkgPVxuICAgICAgcGlFbmFibGVkICYmIGlzQ01LUmVxdWVzdGVkKHBpQ29uZmlnPy5lbmNyeXB0aW9uS2V5KVxuICAgICAgICA/IG5ldyBDdXN0b21lck1hbmFnZWRLZXkoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgYCR7cHJvcHMuZGF0YWJhc2VOYW1lfVJlYWRSZXBsaWNhUmVhZGVySW5zaWdodHNLZXlgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhbGlhc05hbWU6IGBjbWsvcmRzLyR7cHJvcHMuZGF0YWJhc2VOYW1lfS9SZWFkUmVwbGljYUluc2lnaHRzS2V5YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICkua2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5yZWFkUmVwbGljYVNlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cChcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9UmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwYCxcbiAgICAgIHtcbiAgICAgICAgdnBjOiB0aGlzLnZwYyxcbiAgICAgICAgZGVzY3JpcHRpb246IGBTZWN1cml0eSBncm91cCBmb3IgUkRTIHJlYWQgcmVwbGljYSBvZiAke3Byb3BzLmRhdGFiYXNlTmFtZX1gXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEFsbG93IHByaW1hcnkgZGF0YWJhc2UgdG8gcmVwbGljYXRlIHRvIHJlYWQgcmVwbGljYVxuICAgIHRoaXMucmVhZFJlcGxpY2FTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgdGhpcy5kYXRhYmFzZVNlY3VyaXR5R3JvdXAsXG4gICAgICBQb3J0LnRjcCh0aGlzLnBvcnQpLFxuICAgICAgXCJBbGxvdyBwcmltYXJ5IGRhdGFiYXNlIHRvIHJlcGxpY2F0ZSB0byByZWFkIHJlcGxpY2FcIlxuICAgICk7XG5cbiAgICAvLyBEZWxldGlvbiB3YWl0ZXIgZW5zdXJlcyBwcmltYXJ5IGlzIFwiYXZhaWxhYmxlXCIgYmVmb3JlIENsb3VkRm9ybWF0aW9uIGRlbGV0ZXMgaXQuXG4gICAgLy8gV2hlbiB0aGUgcmVhZCByZXBsaWNhIGlzIGRlbGV0ZWQsIHRoZSBwcmltYXJ5IGVudGVycyBcIm1vZGlmeWluZ1wiIHN0YXRlLlxuICAgIC8vIFdpdGhvdXQgdGhpcyB3YWl0ZXIsIHRoZSBmaW5hbCBzbmFwc2hvdCBjcmVhdGlvbiBmYWlscy5cbiAgICBjb25zdCBpbnN0YW5jZUlkID0gUmVzb3VyY2VOYW1pbmcuZGJJbnN0YW5jZUlkKHByb3BzLmRhdGFiYXNlTmFtZSEpO1xuICAgIGNvbnN0IHdhaXRlclRpbWVvdXQgPSBEdXJhdGlvbi5taW51dGVzKDEwKTtcbiAgICBjb25zdCBkZWxldGlvbldhaXRlciA9IG5ldyBDdXN0b21SZXNvdXJjZShcbiAgICAgIHRoaXMsXG4gICAgICBgJHtwcm9wcy5kYXRhYmFzZU5hbWV9RGVsZXRpb25XYWl0ZXJgLFxuICAgICAge1xuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgICB0aW1lb3V0OiB3YWl0ZXJUaW1lb3V0LnBsdXMoRHVyYXRpb24uc2Vjb25kcygzMCkpLFxuICAgICAgICBsYW1iZGFEZXNjcmlwdGlvbjogYCR7cHJvcHMuZGF0YWJhc2VOYW1lfSBkZWxldGlvbiB3YWl0ZXJgLFxuICAgICAgICBpbmxpbmVDb2RlOiBgXG5jb25zdCB7IFJEU0NsaWVudCB9ID0gcmVxdWlyZSgnQGF3cy1zZGsvY2xpZW50LXJkcycpO1xuY29uc3QgeyB3YWl0VW50aWxEQkluc3RhbmNlQXZhaWxhYmxlIH0gPSByZXF1aXJlKCdAYXdzLXNkay9jbGllbnQtcmRzJyk7XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIChldmVudCkgPT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6JywgSlNPTi5zdHJpbmdpZnkoZXZlbnQsIG51bGwsIDIpKTtcbiAgY29uc3QgaW5zdGFuY2VJZCA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5JbnN0YW5jZUlkZW50aWZpZXI7XG4gIGNvbnN0IHBoeXNpY2FsUmVzb3VyY2VJZCA9IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCB8fCBldmVudC5Mb2dpY2FsUmVzb3VyY2VJZCB8fCAncmRzLWRlbGV0aW9uLXdhaXRlcic7XG5cbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSAnRGVsZXRlJykge1xuICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBpbnN0YW5jZSB0byBiZSBhdmFpbGFibGU6JywgaW5zdGFuY2VJZCk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJEU0NsaWVudCh7fSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbERCSW5zdGFuY2VBdmFpbGFibGUoXG4gICAgICAgIHsgY2xpZW50LCBtYXhXYWl0VGltZTogJHt3YWl0ZXJUaW1lb3V0LnRvU2Vjb25kcygpfSwgbWluRGVsYXk6IDEwLCBtYXhEZWxheTogMzAgfSxcbiAgICAgICAgeyBEQkluc3RhbmNlSWRlbnRpZmllcjogaW5zdGFuY2VJZCB9XG4gICAgICApO1xuICAgICAgY29uc29sZS5sb2coJ0luc3RhbmNlIGlzIGF2YWlsYWJsZSwgZGVsZXRpb24gY2FuIHByb2NlZWQnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yLm5hbWUgPT09ICdSZXNvdXJjZU5vdEZvdW5kRXJyb3InIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ0RCSW5zdGFuY2VOb3RGb3VuZCcpIHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdGUgPT09ICdGQUlMVVJFJykge1xuICAgICAgICBjb25zb2xlLmxvZygnSW5zdGFuY2Ugbm90IGZvdW5kIG9yIHdhaXRlciBmYWlsZWQsIHByb2NlZWRpbmcgd2l0aCBkZWxldGlvbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igd2FpdGluZyBmb3IgaW5zdGFuY2U6JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgUGh5c2ljYWxSZXNvdXJjZUlkOiBwaHlzaWNhbFJlc291cmNlSWQgfTtcbn07XG4gICAgICAgIGAsXG4gICAgICAgIGlubGluZVBvbGljeTogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgICAgIH0pXG4gICAgICAgIF0sXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICBJbnN0YW5jZUlkZW50aWZpZXI6IGluc3RhbmNlSWQsXG4gICAgICAgICAgVmVyc2lvbjogXCIxLjAuMFwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuXG4gICAgZGVsZXRpb25XYWl0ZXIucmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMuZGF0YWJhc2UpO1xuXG4gICAgY29uc3QgcmVhZFJlcGxpY2EgPSBuZXcgRGF0YWJhc2VJbnN0YW5jZVJlYWRSZXBsaWNhKFxuICAgICAgdGhpcyxcbiAgICAgIGAke3Byb3BzLmRhdGFiYXNlTmFtZX1SZWFkUmVwbGljYWAsXG4gICAgICB7XG4gICAgICAgIHNvdXJjZURhdGFiYXNlSW5zdGFuY2U6IHRoaXMuZGF0YWJhc2UsXG4gICAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICAgIHZwY1N1Ym5ldHM6IHtcbiAgICAgICAgICBzdWJuZXRUeXBlOiBTdWJuZXRUeXBlLlBSSVZBVEVfV0lUSF9FR1JFU1NcbiAgICAgICAgfSxcbiAgICAgICAgc2VjdXJpdHlHcm91cHM6IFt0aGlzLnJlYWRSZXBsaWNhU2VjdXJpdHlHcm91cF0sXG4gICAgICAgIGFsbG9jYXRlZFN0b3JhZ2U6IHByb3BzLmFsbG9jYXRlZFN0b3JhZ2UsXG4gICAgICAgIHN0b3JhZ2VFbmNyeXB0ZWQ6IHRydWUsXG4gICAgICAgIHN0b3JhZ2VUeXBlOiBTdG9yYWdlVHlwZS5HUDMsXG4gICAgICAgIGNhQ2VydGlmaWNhdGU6IENhQ2VydGlmaWNhdGUuUkRTX0NBX1JTQTQwOTZfRzEsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgICAgZGVsZXRlQXV0b21hdGVkQmFja3VwczogZmFsc2UsXG4gICAgICAgIGVuYWJsZVBlcmZvcm1hbmNlSW5zaWdodHM6IHBpRW5hYmxlZCxcbiAgICAgICAgcGVyZm9ybWFuY2VJbnNpZ2h0RW5jcnlwdGlvbktleTogcmVhZFJlcGxpY2FQZXJmb3JtYW5jZUluc2lnaHRzS2V5LFxuICAgICAgICBwZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb246IHBpRW5hYmxlZFxuICAgICAgICAgID8gdGhpcy5nZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24ocGlDb25maWc/LnJldGVudGlvblBlcmlvZCA/PyA3KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXI6IFJlc291cmNlTmFtaW5nLnJlYWRSZXBsaWNhSWQocHJvcHMuZGF0YWJhc2VOYW1lISksXG4gICAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShyZXBsaWNhSW5zdGFuY2VUeXBlKSxcbiAgICAgICAgYXZhaWxhYmlsaXR5Wm9uZTogcmVwbGljYUNvbmZpZy5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgICBtYXhBbGxvY2F0ZWRTdG9yYWdlOiBwcm9wcy5tYXhBbGxvY2F0ZWRTdG9yYWdlIHx8IDUwMCxcbiAgICAgICAgbW9uaXRvcmluZ0ludGVydmFsOiBwcm9wcy5tb25pdG9yaW5nSW50ZXJ2YWwgfHwgRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgbXVsdGlBejogcHJvcHMubXVsdGlBeiAhPT0gZmFsc2UsXG4gICAgICAgIHBvcnQ6IHRoaXMucG9ydCxcbiAgICAgICAgZGVsZXRpb25Qcm90ZWN0aW9uOiB0cnVlLFxuICAgICAgICBwcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdzpcbiAgICAgICAgICBwcm9wcy5wcmVmZXJyZWRNYWludGVuYW5jZVdpbmRvdyB8fCBcIlNhdDoxMjozMC1TYXQ6MjA6MzBcIlxuICAgICAgfVxuICAgICk7XG5cbiAgICByZWFkUmVwbGljYS5ub2RlLmFkZERlcGVuZGVuY3koZGVsZXRpb25XYWl0ZXIucmVzb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24oXG4gICAgZGF5cz86IG51bWJlclxuICApOiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24ge1xuICAgIHN3aXRjaCAoZGF5cykge1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLkRFRkFVTFQ7XG4gICAgICBjYXNlIDMxOlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU18xO1xuICAgICAgY2FzZSA5MzpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMztcbiAgICAgIGNhc2UgMTg2OlxuICAgICAgICByZXR1cm4gUGVyZm9ybWFuY2VJbnNpZ2h0UmV0ZW50aW9uLk1PTlRIU182O1xuICAgICAgY2FzZSAzNzI6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTU9OVEhTXzEyO1xuICAgICAgY2FzZSA3MzE6XG4gICAgICAgIHJldHVybiBQZXJmb3JtYW5jZUluc2lnaHRSZXRlbnRpb24uTE9OR19URVJNO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFBlcmZvcm1hbmNlSW5zaWdodFJldGVudGlvbi5NT05USFNfMTtcbiAgICB9XG4gIH1cblxuICBnZXRIb3N0RW5kcG9pbnQoKSB7XG4gICAgaWYgKHRoaXMuZGF0YWJhc2VQcm94eSkge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VQcm94eS5lbmRwb2ludDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YWJhc2UuZGJJbnN0YW5jZUVuZHBvaW50QWRkcmVzcztcbiAgICB9XG4gIH1cblxuICBnZXRIb3N0UG9ydCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodGhpcy5wb3J0KTtcbiAgfVxuXG4gIGdldENyZWRlbnRpYWxzKCk6IFNlY3JldCB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YWJhc2VDcmVkZW50aWFscztcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogUmRzUHJvcHMpOiAoc2I6IFN0YWNrQnVpbGRlcikgPT4gQ29uc3RydWN0IHtcbiAgICByZXR1cm4gKHNiOiBTdGFja0J1aWxkZXIpID0+IHtcbiAgICAgIGNvbnN0IG5ld1Byb3BzOiBSZHNQcm9wcyA9IHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIC4uLntcbiAgICAgICAgICB2cGM6IChzYi5nZXROZXR3b3JrKCkgYXMgSVZwYykgfHwgcHJvcHMudnBjLFxuICAgICAgICAgIHNlY3VyaXR5R3JvdXBJZHM6IHByb3BzPy5zZWN1cml0eUdyb3VwSWRzID8/IFtdLFxuICAgICAgICAgIGRhdGFiYXNlTmFtZTogcHJvcHMuZGF0YWJhc2VOYW1lIHx8IGAke2lkLnJlcGxhY2UoXCJSZHNcIiwgXCJcIil9YFxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gbmV3IHRoaXMoc2IuZ2V0U3RhY2soKSwgaWQsIG5ld1Byb3BzKTtcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { Construct } from "constructs";
2
- import { Role } from "..";
2
+ import { type Role } from "..";
3
3
  export declare class Assignment extends Construct {
4
4
  constructor(scope: Construct, id: string, props: {
5
5
  instanceArn: string;
@@ -54,4 +54,4 @@ class Assignment extends constructs_1.Construct {
54
54
  }
55
55
  }
56
56
  exports.Assignment = Assignment;
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWdubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hc3NpZ25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQUN2QyxnRUFBZ0U7QUFDaEUseUVBQXNFO0FBR3RFLE1BQWEsVUFBVyxTQUFRLHNCQUFTO0lBQ3ZDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBUUM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sVUFBVSxHQUFHLGFBQWEsS0FBSyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDM0QsWUFBWSxFQUFFLFVBQVU7WUFDeEIsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixNQUFNLEVBQUUseUJBQXlCLEVBQUUsaUhBQWlIO2dCQUNwSixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDNUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO29CQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7aUJBQy9CO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3RFO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixNQUFNLEVBQUUseUJBQXlCLEVBQUUsaUhBQWlIO2dCQUNwSixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDNUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO29CQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7aUJBQy9CO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDM0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2pCLENBQUM7WUFDRiwyRkFBMkY7WUFDM0Ysb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLHVDQUF1QztZQUN2QyxzQ0FBc0M7WUFDdEMsU0FBUztZQUNULHVCQUF1QjtZQUN2QixPQUFPO1lBQ1AsTUFBTTtZQUNOLFlBQVksRUFBRSw4QkFBOEI7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBOURELGdDQThEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi5cIjtcblxuZXhwb3J0IGNsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IHtcbiAgICAgIGluc3RhbmNlQXJuOiBzdHJpbmc7XG4gICAgICBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmc7XG4gICAgICBwcmluY2lwYWxUeXBlOiBzdHJpbmc7XG4gICAgICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICAgICAgdGFyZ2V0VHlwZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0SWQ6IHN0cmluZztcbiAgICAgIHJvbGU6IFJvbGU7XG4gICAgfVxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgcGh5c2ljYWxJZCA9IGBhc3NpZ25tZW50JHtwcm9wcy5wZXJtaXNzaW9uU2V0QXJufXRvJHtwcm9wcy5wcmluY2lwYWxJZH1gO1xuXG4gICAgY29uc3QgYXNzaWdubWVudCA9IG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBgYXNzaWdubWVudGAsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcGh5c2ljYWxJZCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwic3NvLWFkbWluXCIsXG4gICAgICAgIGFjdGlvbjogXCJDcmVhdGVBY2NvdW50QXNzaWdubWVudFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3Nzby1hZG1pbi9jb21tYW5kL0NyZWF0ZUFjY291bnRBc3NpZ25tZW50Q29tbWFuZFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgSW5zdGFuY2VBcm46IHByb3BzLmluc3RhbmNlQXJuLFxuICAgICAgICAgIFRhcmdldElkOiBwcm9wcy50YXJnZXRJZCxcbiAgICAgICAgICBUYXJnZXRUeXBlOiBwcm9wcy50YXJnZXRUeXBlLFxuICAgICAgICAgIFBlcm1pc3Npb25TZXRBcm46IHByb3BzLnBlcm1pc3Npb25TZXRBcm4sXG4gICAgICAgICAgUHJpbmNpcGFsVHlwZTogcHJvcHMucHJpbmNpcGFsVHlwZSxcbiAgICAgICAgICBQcmluY2lwYWxJZDogcHJvcHMucHJpbmNpcGFsSWRcbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKHBoeXNpY2FsSWQpXG4gICAgICB9LFxuICAgICAgb25EZWxldGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgYWN0aW9uOiBcIkRlbGV0ZUFjY291bnRBc3NpZ25tZW50XCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3NvLWFkbWluL2NvbW1hbmQvRGVsZXRlQWNjb3VudEFzc2lnbm1lbnRDb21tYW5kXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBJbnN0YW5jZUFybjogcHJvcHMuaW5zdGFuY2VBcm4sXG4gICAgICAgICAgVGFyZ2V0SWQ6IHByb3BzLnRhcmdldElkLFxuICAgICAgICAgIFRhcmdldFR5cGU6IHByb3BzLnRhcmdldFR5cGUsXG4gICAgICAgICAgUGVybWlzc2lvblNldEFybjogcHJvcHMucGVybWlzc2lvblNldEFybixcbiAgICAgICAgICBQcmluY2lwYWxUeXBlOiBwcm9wcy5wcmluY2lwYWxUeXBlLFxuICAgICAgICAgIFByaW5jaXBhbElkOiBwcm9wcy5wcmluY2lwYWxJZFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KSxcbiAgICAgIC8vIFRPRE86IExvY2sgZG93biBwZXJtaXNzaW9ucywgd2hlbiB3ZSdyZSByZWFkeSB0byB0cm91Ymxlc2hvb3QgaW50ZXJtaXR0ZW50IHBvbGljeSBlcnJvcnNcbiAgICAgIC8vIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICAvLyBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAvLyAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgLy8gICAgIGFjdGlvbnM6IFtcbiAgICAgIC8vICAgICAgIFwic3NvOkNyZWF0ZUFjY291bnRBc3NpZ25tZW50XCIsXG4gICAgICAvLyAgICAgICBcInNzbzpEZWxldGVBY2NvdW50QXNzaWdubWVudFwiXG4gICAgICAvLyAgICAgXSxcbiAgICAgIC8vICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIC8vICAgfSlcbiAgICAgIC8vIF0pLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6U1NPQWNjb3VudEFzc2lnbm1lbnRcIlxuICAgIH0pO1xuICB9XG59XG4iXX0=
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzaWdubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hc3NpZ25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQUN2QyxnRUFBZ0U7QUFDaEUseUVBQXNFO0FBR3RFLE1BQWEsVUFBVyxTQUFRLHNCQUFTO0lBQ3ZDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBUUM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sVUFBVSxHQUFHLGFBQWEsS0FBSyxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDM0QsWUFBWSxFQUFFLFVBQVU7WUFDeEIsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixNQUFNLEVBQUUseUJBQXlCLEVBQUUsaUhBQWlIO2dCQUNwSixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDNUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO29CQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7aUJBQy9CO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3RFO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixNQUFNLEVBQUUseUJBQXlCLEVBQUUsaUhBQWlIO2dCQUNwSixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO29CQUM5QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7b0JBQ3hCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVTtvQkFDNUIsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtvQkFDeEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO29CQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7aUJBQy9CO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDM0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2pCLENBQUM7WUFDRiwyRkFBMkY7WUFDM0Ysb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLHVDQUF1QztZQUN2QyxzQ0FBc0M7WUFDdEMsU0FBUztZQUNULHVCQUF1QjtZQUN2QixPQUFPO1lBQ1AsTUFBTTtZQUNOLFlBQVksRUFBRSw4QkFBOEI7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBOURELGdDQThEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgY3VzdG9tUmVzb3VyY2VzIGZyb20gXCJhd3MtY2RrLWxpYi9jdXN0b20tcmVzb3VyY2VzXCI7XG5pbXBvcnQgeyBBd3NDdXN0b21SZXNvdXJjZSB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvYXdzQ3VzdG9tUmVzb3VyY2VcIjtcbmltcG9ydCB7IHR5cGUgUm9sZSB9IGZyb20gXCIuLlwiO1xuXG5leHBvcnQgY2xhc3MgQXNzaWdubWVudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczoge1xuICAgICAgaW5zdGFuY2VBcm46IHN0cmluZztcbiAgICAgIHBlcm1pc3Npb25TZXRBcm46IHN0cmluZztcbiAgICAgIHByaW5jaXBhbFR5cGU6IHN0cmluZztcbiAgICAgIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gICAgICB0YXJnZXRUeXBlOiBzdHJpbmc7XG4gICAgICB0YXJnZXRJZDogc3RyaW5nO1xuICAgICAgcm9sZTogUm9sZTtcbiAgICB9XG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBwaHlzaWNhbElkID0gYGFzc2lnbm1lbnQke3Byb3BzLnBlcm1pc3Npb25TZXRBcm59dG8ke3Byb3BzLnByaW5jaXBhbElkfWA7XG5cbiAgICBjb25zdCBhc3NpZ25tZW50ID0gbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIGBhc3NpZ25tZW50YCwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwaHlzaWNhbElkLFxuICAgICAgb25DcmVhdGU6IHtcbiAgICAgICAgc2VydmljZTogXCJzc28tYWRtaW5cIixcbiAgICAgICAgYWN0aW9uOiBcIkNyZWF0ZUFjY291bnRBc3NpZ25tZW50XCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3NvLWFkbWluL2NvbW1hbmQvQ3JlYXRlQWNjb3VudEFzc2lnbm1lbnRDb21tYW5kXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBJbnN0YW5jZUFybjogcHJvcHMuaW5zdGFuY2VBcm4sXG4gICAgICAgICAgVGFyZ2V0SWQ6IHByb3BzLnRhcmdldElkLFxuICAgICAgICAgIFRhcmdldFR5cGU6IHByb3BzLnRhcmdldFR5cGUsXG4gICAgICAgICAgUGVybWlzc2lvblNldEFybjogcHJvcHMucGVybWlzc2lvblNldEFybixcbiAgICAgICAgICBQcmluY2lwYWxUeXBlOiBwcm9wcy5wcmluY2lwYWxUeXBlLFxuICAgICAgICAgIFByaW5jaXBhbElkOiBwcm9wcy5wcmluY2lwYWxJZFxuICAgICAgICB9LFxuICAgICAgICBwaHlzaWNhbFJlc291cmNlSWQ6IGN1c3RvbVJlc291cmNlcy5QaHlzaWNhbFJlc291cmNlSWQub2YocGh5c2ljYWxJZClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInNzby1hZG1pblwiLFxuICAgICAgICBhY3Rpb246IFwiRGVsZXRlQWNjb3VudEFzc2lnbm1lbnRcIiwgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9zc28tYWRtaW4vY29tbWFuZC9EZWxldGVBY2NvdW50QXNzaWdubWVudENvbW1hbmRcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEluc3RhbmNlQXJuOiBwcm9wcy5pbnN0YW5jZUFybixcbiAgICAgICAgICBUYXJnZXRJZDogcHJvcHMudGFyZ2V0SWQsXG4gICAgICAgICAgVGFyZ2V0VHlwZTogcHJvcHMudGFyZ2V0VHlwZSxcbiAgICAgICAgICBQZXJtaXNzaW9uU2V0QXJuOiBwcm9wcy5wZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgIFByaW5jaXBhbFR5cGU6IHByb3BzLnByaW5jaXBhbFR5cGUsXG4gICAgICAgICAgUHJpbmNpcGFsSWQ6IHByb3BzLnByaW5jaXBhbElkXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU2RrQ2FsbHMoe1xuICAgICAgICByZXNvdXJjZXM6IFtcIipcIl1cbiAgICAgIH0pLFxuICAgICAgLy8gVE9ETzogTG9jayBkb3duIHBlcm1pc3Npb25zLCB3aGVuIHdlJ3JlIHJlYWR5IHRvIHRyb3VibGVzaG9vdCBpbnRlcm1pdHRlbnQgcG9saWN5IGVycm9yc1xuICAgICAgLy8gcm9sZTogcHJvcHMucm9sZSxcbiAgICAgIC8vIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TdGF0ZW1lbnRzKFtcbiAgICAgIC8vICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAvLyAgICAgYWN0aW9uczogW1xuICAgICAgLy8gICAgICAgXCJzc286Q3JlYXRlQWNjb3VudEFzc2lnbm1lbnRcIixcbiAgICAgIC8vICAgICAgIFwic3NvOkRlbGV0ZUFjY291bnRBc3NpZ25tZW50XCJcbiAgICAgIC8vICAgICBdLFxuICAgICAgLy8gICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgLy8gICB9KVxuICAgICAgLy8gXSksXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpTU09BY2NvdW50QXNzaWdubWVudFwiXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,5 +1,5 @@
1
1
  import { Construct } from "constructs";
2
- import { Role } from "..";
2
+ import { type Role } from "..";
3
3
  interface AttachManagedPolicyProps {
4
4
  instanceArn: string;
5
5
  permissionSet: string;
@@ -49,4 +49,4 @@ class AttachManagedPolicy extends constructs_1.Construct {
49
49
  }
50
50
  }
51
51
  exports.AttachManagedPolicy = AttachManagedPolicy;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoTWFuYWdlZFBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hdHRhY2hNYW5hZ2VkUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQUN2QyxnRUFBZ0U7QUFDaEUseUVBQXNFO0FBV3RFLE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ2pELFlBQVksRUFBRSw4QkFBOEIsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNqRSxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSw0SEFBNEg7Z0JBQzFLLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELHFDQUFxQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQzNEO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxzQ0FBc0MsRUFBRSwrSEFBK0g7Z0JBQy9LLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDM0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2pCLENBQUM7WUFDRiwyRkFBMkY7WUFDM0Ysb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLHNDQUFzQztZQUN0QyxrREFBa0Q7WUFDbEQsb0RBQW9EO1lBQ3BELDBCQUEwQjtZQUMxQixTQUFTO1lBQ1QsdUJBQXVCO1lBQ3ZCLE9BQU87WUFDUCxNQUFNO1lBQ04sWUFBWSxFQUFFLHVCQUF1QjtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE5Q0Qsa0RBOENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuLlwiO1xuXG5pbnRlcmZhY2UgQXR0YWNoTWFuYWdlZFBvbGljeVByb3BzIHtcbiAgaW5zdGFuY2VBcm46IHN0cmluZztcbiAgcGVybWlzc2lvblNldDogc3RyaW5nO1xuICBwZXJtaXNzaW9uU2V0QXJuOiBzdHJpbmc7XG4gIG1hbmFnZWRQb2xpY3lBcm46IHN0cmluZztcbiAgcm9sZTogUm9sZTtcbn1cblxuZXhwb3J0IGNsYXNzIEF0dGFjaE1hbmFnZWRQb2xpY3kgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXR0YWNoTWFuYWdlZFBvbGljeVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBBd3NDdXN0b21SZXNvdXJjZSh0aGlzLCBcImF0dGFjaE1hbmFnZWRQb2xpY3lcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBgYXR0YWNoUG9saWN5VG9QZXJtaXNzaW9uU2V0JHtwcm9wcy5wZXJtaXNzaW9uU2V0fWAsXG4gICAgICBvbkNyZWF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInNzby1hZG1pblwiLFxuICAgICAgICBhY3Rpb246IFwiQXR0YWNoTWFuYWdlZFBvbGljeVRvUGVybWlzc2lvblNldFwiLCAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy92My9sYXRlc3QvY2xpZW50L3Nzby1hZG1pbi9jb21tYW5kL0F0dGFjaE1hbmFnZWRQb2xpY3lUb1Blcm1pc3Npb25TZXRDb21tYW5kXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBJbnN0YW5jZUFybjogcHJvcHMuaW5zdGFuY2VBcm4sXG4gICAgICAgICAgUGVybWlzc2lvblNldEFybjogcHJvcHMucGVybWlzc2lvblNldEFybixcbiAgICAgICAgICBNYW5hZ2VkUG9saWN5QXJuOiBwcm9wcy5tYW5hZ2VkUG9saWN5QXJuXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogY3VzdG9tUmVzb3VyY2VzLlBoeXNpY2FsUmVzb3VyY2VJZC5vZihcbiAgICAgICAgICBgYXR0YWNoTWFuYWdlZFBvbGljeVRvUGVybWlzc2lvblNldCR7cHJvcHMucGVybWlzc2lvblNldH1gXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBvbkRlbGV0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcInNzby1hZG1pblwiLFxuICAgICAgICBhY3Rpb246IFwiRGV0YWNoTWFuYWdlZFBvbGljeUZyb21QZXJtaXNzaW9uU2V0XCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3NvLWFkbWluL2NvbW1hbmQvRGV0YWNoTWFuYWdlZFBvbGljeUZyb21QZXJtaXNzaW9uU2V0Q29tbWFuZC9cbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEluc3RhbmNlQXJuOiBwcm9wcy5pbnN0YW5jZUFybixcbiAgICAgICAgICBQZXJtaXNzaW9uU2V0QXJuOiBwcm9wcy5wZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgIE1hbmFnZWRQb2xpY3lBcm46IHByb3BzLm1hbmFnZWRQb2xpY3lBcm5cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBvbGljeTogY3VzdG9tUmVzb3VyY2VzLkF3c0N1c3RvbVJlc291cmNlUG9saWN5LmZyb21TZGtDYWxscyh7XG4gICAgICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgfSksXG4gICAgICAvLyBUT0RPOiBMb2NrIGRvd24gcGVybWlzc2lvbnMsIHdoZW4gd2UncmUgcmVhZHkgdG8gdHJvdWJsZXNob290IGludGVybWl0dGVudCBwb2xpY3kgZXJyb3JzXG4gICAgICAvLyByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgLy8gcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVN0YXRlbWVudHMoW1xuICAgICAgLy8gICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgIC8vICAgICBhY3Rpb25zOiBbXG4gICAgICAvLyAgICAgICBcInNzbzpQcm92aXNpb25QZXJtaXNzaW9uU2V0XCIsXG4gICAgICAvLyAgICAgICBcInNzbzpBdHRhY2hNYW5hZ2VkUG9saWN5VG9QZXJtaXNzaW9uU2V0XCIsXG4gICAgICAvLyAgICAgICBcInNzbzpEZXRhY2hNYW5hZ2VkUG9saWN5RnJvbVBlcm1pc3Npb25TZXRcIixcbiAgICAgIC8vICAgICAgIFwic3NvOlRhZ1Jlc291cmNlXCJcbiAgICAgIC8vICAgICBdLFxuICAgICAgLy8gICAgIHJlc291cmNlczogW1wiKlwiXVxuICAgICAgLy8gICB9KVxuICAgICAgLy8gXSksXG4gICAgICByZXNvdXJjZVR5cGU6IFwiQ3VzdG9tOjpQZXJtaXNzaW9uU2V0XCJcbiAgICB9KTtcbiAgfVxufVxuIl19
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNoTWFuYWdlZFBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2lhbS9pZGVudGl0eUNlbnRlci9hdHRhY2hNYW5hZ2VkUG9saWN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQUN2QyxnRUFBZ0U7QUFDaEUseUVBQXNFO0FBV3RFLE1BQWEsbUJBQW9CLFNBQVEsc0JBQVM7SUFDaEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUkscUNBQWlCLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ2pELFlBQVksRUFBRSw4QkFBOEIsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUNqRSxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSw0SEFBNEg7Z0JBQzFLLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2dCQUNELGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQ3ZELHFDQUFxQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQzNEO2FBQ0Y7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLE1BQU0sRUFBRSxzQ0FBc0MsRUFBRSwrSEFBK0g7Z0JBQy9LLFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7aUJBQ3pDO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsZUFBZSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQztnQkFDM0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2FBQ2pCLENBQUM7WUFDRiwyRkFBMkY7WUFDM0Ysb0JBQW9CO1lBQ3BCLG1FQUFtRTtZQUNuRSwwQkFBMEI7WUFDMUIsaUJBQWlCO1lBQ2pCLHNDQUFzQztZQUN0QyxrREFBa0Q7WUFDbEQsb0RBQW9EO1lBQ3BELDBCQUEwQjtZQUMxQixTQUFTO1lBQ1QsdUJBQXVCO1lBQ3ZCLE9BQU87WUFDUCxNQUFNO1lBQ04sWUFBWSxFQUFFLHVCQUF1QjtTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUE5Q0Qsa0RBOENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBjdXN0b21SZXNvdXJjZXMgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9hd3NDdXN0b21SZXNvdXJjZVwiO1xuaW1wb3J0IHsgdHlwZSBSb2xlIH0gZnJvbSBcIi4uXCI7XG5cbmludGVyZmFjZSBBdHRhY2hNYW5hZ2VkUG9saWN5UHJvcHMge1xuICBpbnN0YW5jZUFybjogc3RyaW5nO1xuICBwZXJtaXNzaW9uU2V0OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25TZXRBcm46IHN0cmluZztcbiAgbWFuYWdlZFBvbGljeUFybjogc3RyaW5nO1xuICByb2xlOiBSb2xlO1xufVxuXG5leHBvcnQgY2xhc3MgQXR0YWNoTWFuYWdlZFBvbGljeSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBdHRhY2hNYW5hZ2VkUG9saWN5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiYXR0YWNoTWFuYWdlZFBvbGljeVwiLCB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGBhdHRhY2hQb2xpY3lUb1Blcm1pc3Npb25TZXQke3Byb3BzLnBlcm1pc3Npb25TZXR9YCxcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwic3NvLWFkbWluXCIsXG4gICAgICAgIGFjdGlvbjogXCJBdHRhY2hNYW5hZ2VkUG9saWN5VG9QZXJtaXNzaW9uU2V0XCIsIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL3YzL2xhdGVzdC9jbGllbnQvc3NvLWFkbWluL2NvbW1hbmQvQXR0YWNoTWFuYWdlZFBvbGljeVRvUGVybWlzc2lvblNldENvbW1hbmRcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEluc3RhbmNlQXJuOiBwcm9wcy5pbnN0YW5jZUFybixcbiAgICAgICAgICBQZXJtaXNzaW9uU2V0QXJuOiBwcm9wcy5wZXJtaXNzaW9uU2V0QXJuLFxuICAgICAgICAgIE1hbmFnZWRQb2xpY3lBcm46IHByb3BzLm1hbmFnZWRQb2xpY3lBcm5cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBjdXN0b21SZXNvdXJjZXMuUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFxuICAgICAgICAgIGBhdHRhY2hNYW5hZ2VkUG9saWN5VG9QZXJtaXNzaW9uU2V0JHtwcm9wcy5wZXJtaXNzaW9uU2V0fWBcbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIG9uRGVsZXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwic3NvLWFkbWluXCIsXG4gICAgICAgIGFjdGlvbjogXCJEZXRhY2hNYW5hZ2VkUG9saWN5RnJvbVBlcm1pc3Npb25TZXRcIiwgLy8gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvdjMvbGF0ZXN0L2NsaWVudC9zc28tYWRtaW4vY29tbWFuZC9EZXRhY2hNYW5hZ2VkUG9saWN5RnJvbVBlcm1pc3Npb25TZXRDb21tYW5kL1xuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgSW5zdGFuY2VBcm46IHByb3BzLmluc3RhbmNlQXJuLFxuICAgICAgICAgIFBlcm1pc3Npb25TZXRBcm46IHByb3BzLnBlcm1pc3Npb25TZXRBcm4sXG4gICAgICAgICAgTWFuYWdlZFBvbGljeUFybjogcHJvcHMubWFuYWdlZFBvbGljeUFyblxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcG9saWN5OiBjdXN0b21SZXNvdXJjZXMuQXdzQ3VzdG9tUmVzb3VyY2VQb2xpY3kuZnJvbVNka0NhbGxzKHtcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KSxcbiAgICAgIC8vIFRPRE86IExvY2sgZG93biBwZXJtaXNzaW9ucywgd2hlbiB3ZSdyZSByZWFkeSB0byB0cm91Ymxlc2hvb3QgaW50ZXJtaXR0ZW50IHBvbGljeSBlcnJvcnNcbiAgICAgIC8vIHJvbGU6IHByb3BzLnJvbGUsXG4gICAgICAvLyBwb2xpY3k6IGN1c3RvbVJlc291cmNlcy5Bd3NDdXN0b21SZXNvdXJjZVBvbGljeS5mcm9tU3RhdGVtZW50cyhbXG4gICAgICAvLyAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgLy8gICAgIGFjdGlvbnM6IFtcbiAgICAgIC8vICAgICAgIFwic3NvOlByb3Zpc2lvblBlcm1pc3Npb25TZXRcIixcbiAgICAgIC8vICAgICAgIFwic3NvOkF0dGFjaE1hbmFnZWRQb2xpY3lUb1Blcm1pc3Npb25TZXRcIixcbiAgICAgIC8vICAgICAgIFwic3NvOkRldGFjaE1hbmFnZWRQb2xpY3lGcm9tUGVybWlzc2lvblNldFwiLFxuICAgICAgLy8gICAgICAgXCJzc286VGFnUmVzb3VyY2VcIlxuICAgICAgLy8gICAgIF0sXG4gICAgICAvLyAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICAvLyAgIH0pXG4gICAgICAvLyBdKSxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlBlcm1pc3Npb25TZXRcIlxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,5 +1,5 @@
1
1
  import { Construct } from "constructs";
2
- import { Role } from "..";
2
+ import { type Role } from "..";
3
3
  interface GroupProps {
4
4
  displayName: string;
5
5
  identityStoreId: string;