@fjall/components-infrastructure 0.75.2 → 0.76.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/lib/app.d.ts +32 -8
  2. package/dist/lib/app.js +58 -11
  3. package/dist/lib/config/aws/backupGlobalSettings.d.ts +1 -1
  4. package/dist/lib/config/aws/backupGlobalSettings.js +1 -1
  5. package/dist/lib/config/aws/cloudTrail.d.ts +1 -1
  6. package/dist/lib/config/aws/cloudTrail.js +2 -2
  7. package/dist/lib/config/aws/disasterRecovery.js +1 -1
  8. package/dist/lib/config/aws/ecrDefaultImage.d.ts +1 -1
  9. package/dist/lib/config/aws/ecrDefaultImage.js +2 -2
  10. package/dist/lib/config/aws/identityCenter.d.ts +3 -3
  11. package/dist/lib/config/aws/identityCenter.js +1 -1
  12. package/dist/lib/config/aws/identityCenterGroupMembership.d.ts +2 -2
  13. package/dist/lib/config/aws/identityCenterGroupMembership.js +1 -1
  14. package/dist/lib/config/aws/ipam.js +2 -4
  15. package/dist/lib/config/aws/organisation.d.ts +3 -3
  16. package/dist/lib/config/aws/organisation.js +1 -1
  17. package/dist/lib/config/aws/organisationsAccess.d.ts +1 -1
  18. package/dist/lib/config/aws/organisationsAccess.js +1 -1
  19. package/dist/lib/config/monitoring.d.ts +18 -0
  20. package/dist/lib/config/monitoring.js +22 -0
  21. package/dist/lib/patterns/aws/buildkite.d.ts +3 -3
  22. package/dist/lib/patterns/aws/buildkite.js +1 -1
  23. package/dist/lib/patterns/aws/compute.d.ts +8 -8
  24. package/dist/lib/patterns/aws/compute.js +5 -5
  25. package/dist/lib/patterns/aws/database.d.ts +191 -24
  26. package/dist/lib/patterns/aws/database.js +201 -42
  27. package/dist/lib/patterns/aws/fivetranProxy.d.ts +5 -5
  28. package/dist/lib/patterns/aws/fivetranProxy.js +1 -1
  29. package/dist/lib/patterns/aws/hostedZone.d.ts +2 -2
  30. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  31. package/dist/lib/patterns/aws/managedAccount.d.ts +2 -2
  32. package/dist/lib/patterns/aws/managedAccount.js +1 -1
  33. package/dist/lib/patterns/aws/managedIdentityCenter.js +1 -1
  34. package/dist/lib/patterns/aws/managedOrganisation.d.ts +3 -3
  35. package/dist/lib/patterns/aws/managedOrganisation.js +1 -1
  36. package/dist/lib/patterns/aws/managedPlatform.d.ts +2 -2
  37. package/dist/lib/patterns/aws/managedPlatform.js +2 -4
  38. package/dist/lib/patterns/aws/storage.d.ts +4 -55
  39. package/dist/lib/patterns/aws/storage.js +3 -103
  40. package/dist/lib/resources/aws/backup/backupPlan.d.ts +2 -2
  41. package/dist/lib/resources/aws/backup/backupPlan.js +1 -1
  42. package/dist/lib/resources/aws/backup/backupVault.d.ts +2 -2
  43. package/dist/lib/resources/aws/backup/backupVault.js +1 -1
  44. package/dist/lib/resources/aws/base/awsStack.js +1 -1
  45. package/dist/lib/resources/aws/compute/ec2.d.ts +3 -3
  46. package/dist/lib/resources/aws/compute/ec2.js +1 -1
  47. package/dist/lib/resources/aws/compute/ecs.d.ts +9 -9
  48. package/dist/lib/resources/aws/compute/ecs.js +63 -19
  49. package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +6 -7
  50. package/dist/lib/resources/aws/compute/ecsFreeTier.js +3 -7
  51. package/dist/lib/resources/aws/compute/ecsSpot.d.ts +6 -7
  52. package/dist/lib/resources/aws/compute/ecsSpot.js +3 -11
  53. package/dist/lib/resources/aws/compute/lambda.d.ts +4 -4
  54. package/dist/lib/resources/aws/compute/lambda.js +1 -1
  55. package/dist/lib/resources/aws/database/database.d.ts +2 -2
  56. package/dist/lib/resources/aws/database/database.js +1 -1
  57. package/dist/lib/resources/aws/database/databaseInstance.d.ts +2 -2
  58. package/dist/lib/resources/aws/database/databaseInstance.js +2 -2
  59. package/dist/lib/resources/aws/database/index.d.ts +0 -1
  60. package/dist/lib/resources/aws/database/index.js +1 -2
  61. package/dist/lib/resources/aws/database/rdsAurora.d.ts +22 -6
  62. package/dist/lib/resources/aws/database/rdsAurora.js +212 -84
  63. package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +39 -6
  64. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +34 -5
  65. package/dist/lib/resources/aws/database/rdsInstance.d.ts +16 -10
  66. package/dist/lib/resources/aws/database/rdsInstance.js +126 -63
  67. package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +1 -1
  68. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +1 -1
  69. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.d.ts +1 -1
  70. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  71. package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -1
  72. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  73. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +2 -2
  74. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  75. package/dist/lib/resources/aws/iam/instanceProfile.d.ts +1 -1
  76. package/dist/lib/resources/aws/iam/instanceProfile.js +1 -1
  77. package/dist/lib/resources/aws/iam/managedPolicy.d.ts +1 -1
  78. package/dist/lib/resources/aws/iam/managedPolicy.js +1 -1
  79. package/dist/lib/resources/aws/iam/policy.d.ts +1 -1
  80. package/dist/lib/resources/aws/iam/policy.js +1 -1
  81. package/dist/lib/resources/aws/iam/role.d.ts +1 -1
  82. package/dist/lib/resources/aws/iam/role.js +1 -1
  83. package/dist/lib/resources/aws/iam/securityGroup.d.ts +1 -1
  84. package/dist/lib/resources/aws/iam/securityGroup.js +1 -1
  85. package/dist/lib/resources/aws/index.d.ts +1 -0
  86. package/dist/lib/resources/aws/index.js +2 -1
  87. package/dist/lib/resources/aws/logging/logGroup.d.ts +2 -2
  88. package/dist/lib/resources/aws/logging/logGroup.js +1 -1
  89. package/dist/lib/resources/aws/monitoring/index.d.ts +1 -0
  90. package/dist/lib/resources/aws/monitoring/index.js +18 -0
  91. package/dist/lib/resources/aws/monitoring/monitoringRole.d.ts +28 -0
  92. package/dist/lib/resources/aws/monitoring/monitoringRole.js +69 -0
  93. package/dist/lib/resources/aws/networking/ipam.d.ts +1 -1
  94. package/dist/lib/resources/aws/networking/ipam.js +1 -1
  95. package/dist/lib/resources/aws/networking/ipamPool.d.ts +1 -1
  96. package/dist/lib/resources/aws/networking/ipamPool.js +1 -2
  97. package/dist/lib/resources/aws/networking/vpc.d.ts +3 -3
  98. package/dist/lib/resources/aws/networking/vpc.js +1 -1
  99. package/dist/lib/resources/aws/networking/vpcEndpoint.d.ts +2 -2
  100. package/dist/lib/resources/aws/networking/vpcEndpoint.js +1 -1
  101. package/dist/lib/resources/aws/secrets/alias.d.ts +1 -1
  102. package/dist/lib/resources/aws/secrets/alias.js +1 -1
  103. package/dist/lib/resources/aws/secrets/parameter.d.ts +1 -1
  104. package/dist/lib/resources/aws/secrets/parameter.js +1 -1
  105. package/dist/lib/resources/aws/secrets/secret.d.ts +8 -4
  106. package/dist/lib/resources/aws/secrets/secret.js +19 -2
  107. package/dist/lib/resources/aws/storage/ecr.d.ts +4 -4
  108. package/dist/lib/resources/aws/storage/ecr.js +1 -1
  109. package/dist/lib/resources/aws/storage/s3.d.ts +2 -2
  110. package/dist/lib/resources/aws/storage/s3.js +1 -1
  111. package/dist/lib/resources/aws/utilities/awsCustomResource.d.ts +1 -1
  112. package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
  113. package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +1 -1
  114. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -1
  115. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -1
  116. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  117. package/dist/lib/resources/aws/utilities/customResource.d.ts +3 -3
  118. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  119. package/dist/lib/resources/aws/utilities/customResourceProvider.d.ts +2 -2
  120. package/dist/lib/resources/aws/utilities/customResourceProvider.js +1 -1
  121. package/dist/lib/resources/aws/utilities/resourceShare.d.ts +2 -2
  122. package/dist/lib/resources/aws/utilities/resourceShare.js +1 -1
  123. package/dist/lib/utils/getAsync.d.ts +1 -1
  124. package/dist/lib/utils/getAsync.js +1 -1
  125. package/dist/lib/utils/getConfig.d.ts +2 -2
  126. package/dist/lib/utils/getConfig.js +3 -3
  127. package/dist/lib/utils/standardTagsAspect.d.ts +2 -2
  128. package/dist/lib/utils/standardTagsAspect.js +6 -5
  129. package/dist/lib/utils/tagResource.d.ts +1 -1
  130. package/dist/lib/utils/tagResource.js +1 -1
  131. package/package.json +3 -3
  132. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +0 -433
  133. package/dist/lib/__tests__/patterns/compute.test.d.ts +0 -1
  134. package/dist/lib/__tests__/patterns/compute.test.js +0 -137
  135. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  136. package/dist/lib/__tests__/simple.test.js +0 -12
  137. package/dist/lib/patterns/aws/basicApp.d.ts +0 -0
  138. package/dist/lib/patterns/aws/basicApp.js +0 -150
  139. package/dist/lib/patterns/aws/freeTierApp.d.ts +0 -44
  140. package/dist/lib/patterns/aws/freeTierApp.js +0 -83
  141. package/dist/lib/patterns/aws/spotInstanceApp.d.ts +0 -45
  142. package/dist/lib/patterns/aws/spotInstanceApp.js +0 -85
  143. package/dist/lib/resources/aws/database/databaseFreeTier.d.ts +0 -15
  144. package/dist/lib/resources/aws/database/databaseFreeTier.js +0 -29
  145. package/dist/lib/resources/aws/database/rdsFreeTier.d.ts +0 -37
  146. package/dist/lib/resources/aws/database/rdsFreeTier.js +0 -84
  147. package/dist/lib/resources/aws/organisations/account.d.ts +0 -37
  148. package/dist/lib/resources/aws/organisations/account.js +0 -220
  149. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +0 -14
  150. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +0 -61
  151. package/dist/lib/resources/aws/organisations/index.d.ts +0 -8
  152. package/dist/lib/resources/aws/organisations/index.js +0 -22
  153. package/dist/lib/resources/aws/organisations/interfaces.d.ts +0 -105
  154. package/dist/lib/resources/aws/organisations/interfaces.js +0 -3
  155. package/dist/lib/resources/aws/organisations/organisation.d.ts +0 -47
  156. package/dist/lib/resources/aws/organisations/organisation.js +0 -263
  157. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +0 -28
  158. package/dist/lib/resources/aws/organisations/organisationalUnit.js +0 -170
  159. package/dist/lib/resources/aws/organisations/policy.d.ts +0 -17
  160. package/dist/lib/resources/aws/organisations/policy.js +0 -93
  161. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +0 -13
  162. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +0 -58
  163. package/dist/lib/resources/aws/organisations/types.d.ts +0 -165
  164. package/dist/lib/resources/aws/organisations/types.js +0 -36
  165. package/dist/lib/utils/directTagging.d.ts +0 -31
  166. package/dist/lib/utils/directTagging.js +0 -86
  167. package/dist/lib/utils/fjallConstruct.d.ts +0 -8
  168. package/dist/lib/utils/fjallConstruct.js +0 -18
  169. package/dist/lib/utils/fjallStackSynthesizer.d.ts +0 -9
  170. package/dist/lib/utils/fjallStackSynthesizer.js +0 -22
  171. package/dist/lib/utils/tagContext.d.ts +0 -28
  172. package/dist/lib/utils/tagContext.js +0 -53
  173. package/dist/lib/utils/tagSynthesizer.d.ts +0 -13
  174. package/dist/lib/utils/tagSynthesizer.js +0 -55
@@ -92,8 +92,8 @@ class Compute extends constructs_1.Construct {
92
92
  this.compute = new ec2_1.Ec2Instance(this.scope, `${this.id}Ec2`, ec2Props);
93
93
  this.connections = this.compute.connections;
94
94
  if (props.connections) {
95
- for (var conn of props.connections) {
96
- this.compute.connections.allowTo(conn, aws_ec2_1.Port.allTcp());
95
+ for (const conn of props.connections) {
96
+ this.compute.connections.allowDefaultPortTo(conn);
97
97
  }
98
98
  }
99
99
  }
@@ -129,8 +129,8 @@ class Compute extends constructs_1.Construct {
129
129
  this.compute = new ecs_1.default(this.scope, `${this.id}Fargate`, fargateProps);
130
130
  }
131
131
  if (props.connections) {
132
- for (var conn of props.connections) {
133
- this.compute.connections.allowTo(conn, aws_ec2_1.Port.allTcp());
132
+ for (const conn of props.connections) {
133
+ this.compute.connections.allowDefaultPortTo(conn);
134
134
  }
135
135
  }
136
136
  this.connections = this.compute.connections;
@@ -171,4 +171,4 @@ class Compute extends constructs_1.Construct {
171
171
  }
172
172
  }
173
173
  exports.Compute = Compute;
174
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpREFBaUQ7QUFDakQsaURBUTZCO0FBQzdCLHVEQU1nQztBQUloQywyQ0FBdUM7QUFJdkMseURBTXlDO0FBQ3pDLHlFQUFrRTtBQUNsRSxpRUFBMEQ7QUFDMUQseURBQThEO0FBQzlELCtEQUFvRTtBQTZGcEUsb0VBQW9FO0FBQ3BFLFNBQVMsa0JBQWtCLENBQUMsT0FBMkI7SUFDckQsTUFBTSxTQUFTLEdBQXlDO1FBQ3RELEdBQUcsRUFBRSx1QkFBVSxDQUFDLEdBQUc7UUFDbkIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixHQUFHLEVBQUUsdUJBQVUsQ0FBQyxHQUFHO1FBQ25CLE1BQU0sRUFBRSx1QkFBVSxDQUFDLE1BQU07UUFDekIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixPQUFPLEVBQUUsdUJBQVUsQ0FBQyxPQUFPO1FBQzNCLEtBQUssRUFBRSx1QkFBVSxDQUFDLEtBQUs7S0FDeEIsQ0FBQztJQUVGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzVCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsTUFBTSx3QkFBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsU0FBUyxrQkFBa0IsQ0FDekIsY0FBc0M7SUFFdEMsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxPQUFPO1FBQ0wsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjO1FBQzdDLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYztZQUMzQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztZQUNuRCxDQUFDLENBQUMsU0FBUztRQUNiLGNBQWMsRUFBRSxjQUFjLENBQUMsY0FBYztRQUM3QyxNQUFNLEVBQUUsY0FBYyxDQUFDLE1BQU07UUFDN0IsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLGdCQUFnQjtRQUNqRCxjQUFjLEVBQUUsY0FBYyxDQUFDLGFBQWE7S0FDN0MsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFhLGNBQWM7SUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBb0I7UUFDM0MsT0FBTyxDQUFDLEdBQVEsRUFBRSxLQUFnQixFQUFFLEVBQUU7WUFDcEMsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLEdBQUc7b0JBQ0QsR0FBRyxFQUFFLEdBQUcsQ0FBQyxhQUFhLEVBQUU7b0JBQ3hCLGFBQWEsRUFBRSxHQUFHLENBQUMsMkJBQTJCLEVBQUU7aUJBQ2pEO2dCQUNELEdBQUcsS0FBSzthQUNULENBQUM7WUFFRixPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBZEQsd0NBY0M7QUFFRCxNQUFhLE9BQVEsU0FBUSxzQkFBUztJQWNwQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW9CO1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxVQUFVLENBQUMsS0FBb0I7UUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFFeEMsSUFBSSxXQUFXLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVPLGFBQWEsQ0FBQyxLQUFvQjtRQUN4QyxNQUFNLFFBQVEsR0FBRztZQUNmLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLFNBQVM7WUFDaEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksVUFBVTtZQUM5QyxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLO1lBQ25DLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUN4QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLElBQUksQ0FBQztZQUNuQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDO1lBQ25DLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztTQUNmLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFFNUMsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLEtBQW9CO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDO1FBRTNDLG1CQUFtQjtRQUNuQixNQUFNLFlBQVksR0FBRztZQUNuQixHQUFHLEtBQUs7WUFDUixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSxFQUFFO1lBQ3hDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLFNBQVM7WUFDaEMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsU0FBUztZQUNoQyxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsSUFBSSwwQkFBMEI7WUFDaEUsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixJQUFJLEVBQUU7WUFDdEQsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixJQUFJLEVBQUU7WUFDMUQsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1NBQ2YsQ0FBQztRQUVGLElBQUksT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzNCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUJBQVcsQ0FDNUIsSUFBSSxDQUFDLEtBQUssRUFDVixHQUFHLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFDdkIsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDOUIsK0NBQStDO1lBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxpQkFBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixxQkFBcUI7WUFDckIsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLEdBQUcsWUFBWTtnQkFDZixXQUFXLEVBQUUsaUJBQVcsQ0FBQyxHQUFHO2dCQUM1QixRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsY0FBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBUSxDQUFDLElBQUk7Z0JBQzdELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTthQUNWLENBQUM7WUFFekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGFBQWMsQ0FDL0IsSUFBSSxDQUFDLEtBQUssRUFDVixHQUFHLElBQUksQ0FBQyxFQUFFLFNBQVMsRUFDbkIsWUFBWSxDQUNiLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsY0FBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQzlDLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUMzQyxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsdUVBQXVFLENBQ3hFLENBQUM7WUFDSixDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsYUFBYSxZQUFZLG9CQUFVLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxHQUFHLGlCQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7b0JBQzVDLFdBQVcsRUFBRSxRQUFRO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FDYixxRUFBcUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUc7WUFDbEIsSUFBSSxFQUFFLElBQUk7WUFDVixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxlQUFlO1lBQ3pDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLG9CQUFPLENBQUMsV0FBVztZQUM3QyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVO1lBQzVCLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDMUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlO1lBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUU7WUFDdEMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUMxQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsbUJBQW1CO1lBQzlDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQzFELFdBQVcsRUFBRSxLQUFLLENBQUMsb0JBQW9CO1NBQ3hDLENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksdUJBQWMsQ0FDL0IsSUFBSSxDQUFDLEtBQUssRUFDVixHQUFHLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFDbEIsV0FBVyxDQUNaLENBQUM7UUFFRixnRUFBZ0U7UUFDaEUsOERBQThEO1FBQzlELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxxQkFBVyxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBeEpELDBCQXdKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9zaXRvcnlJbWFnZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBSZXBvc2l0b3J5IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3JcIjtcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25zLFxuICBJQ29ubmVjdGFibGUsXG4gIElWcGMsXG4gIFBvcnQsXG4gIFN1Ym5ldFR5cGUsXG4gIFVzZXJEYXRhLFxuICBJTWFjaGluZUltYWdlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICBGdW5jdGlvblVybEF1dGhUeXBlLFxuICBIdHRwTWV0aG9kLFxuICBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUG9saWN5RG9jdW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcblxuaW1wb3J0IEZhcmdhdGVDbHVzdGVyLCB7XG4gIENvbnRhaW5lclNlY3JldCxcbiAgRmFyZ2F0ZUNsdXN0ZXJQcm9wcyxcbiAgUHJvdG9jb2wsXG4gIFNjYWxpbmdUeXBlLFxuICBEb21haW5Db25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NcIjtcbmltcG9ydCBFY3NGcmVlVGllciBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc0ZyZWVUaWVyXCI7XG5pbXBvcnQgRWNzU3BvdCBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1Nwb3RcIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lYzJcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGFcIjtcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zZWNyZXRzXCI7XG5cbi8vIFVzZXItZnJpZW5kbHkgSFRUUCBtZXRob2QgdHlwZVxuZXhwb3J0IHR5cGUgSHR0cE1ldGhvZFN0cmluZyA9XG4gIHwgXCJHRVRcIlxuICB8IFwiUE9TVFwiXG4gIHwgXCJQVVRcIlxuICB8IFwiREVMRVRFXCJcbiAgfCBcIkhFQURcIlxuICB8IFwiT1BUSU9OU1wiXG4gIHwgXCJQQVRDSFwiO1xuXG4vLyBVc2VyLWZyaWVuZGx5IENPUlMgb3B0aW9ucyB0aGF0IGFjY2VwdCBzdHJpbmcgbWV0aG9kc1xuZXhwb3J0IGludGVyZmFjZSBTaW1wbGlmaWVkQ29yc09wdGlvbnMge1xuICBhbGxvd2VkT3JpZ2lucz86IHN0cmluZ1tdO1xuICBhbGxvd2VkTWV0aG9kcz86IEh0dHBNZXRob2RTdHJpbmdbXTtcbiAgYWxsb3dlZEhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgbWF4QWdlPzogRHVyYXRpb247XG4gIGFsbG93Q3JlZGVudGlhbHM/OiBib29sZWFuO1xuICBleHBvc2VIZWFkZXJzPzogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBJQ29tcHV0ZVByb3BzIHtcbiAgdnBjPzogSVZwYztcbiAgZWNyUmVwb3NpdG9yeT86IFJlcG9zaXRvcnkgfCBSZXBvc2l0b3J5SW1hZ2U7XG5cbiAgLy8gQ29tcHV0ZSB0eXBlIHNlbGVjdGlvblxuICB0eXBlPzogXCJlY3NcIiB8IFwiZWMyXCIgfCBcImxhbWJkYVwiO1xuXG4gIC8vIEVDUyBzdWJ0eXBlIHNlbGVjdGlvbiAob25seSBhcHBsaWNhYmxlIHdoZW4gdHlwZSBpcyBcImVjc1wiKVxuICBlY3NUeXBlPzogXCJmYXJnYXRlXCIgfCBcImZyZWV0aWVyXCIgfCBcInNwb3RcIjtcblxuICAvLyBFQ1Mtc3BlY2lmaWMgcHJvcGVydGllc1xuICBwYXJlbnREb21haW4/OiBzdHJpbmc7XG4gIGRvbWFpbkNvbmZpZz86IERvbWFpbkNvbmZpZztcblxuICAvKipcbiAgICogUGF0aCB0byBEb2NrZXJmaWxlIGZvciBidWlsZGluZyBjdXN0b20gaW1hZ2UuXG4gICAqIE5vdGU6IFRoaXMgaXMgbWV0YWRhdGEgZm9yIHRoZSBDTEkgYnVpbGQgcHJvY2VzcyxcbiAgICogbm90IHVzZWQgZHVyaW5nIENESyBzeW50aGVzaXNcbiAgICovXG4gIGRvY2tlcmZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRoZSBjb250YWluZXIgbGlzdGVucyBvbiAoZGVmYXVsdDogODApXG4gICAqL1xuICBjb250YWluZXJQb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubW5ldCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgY29udGFpbmVyXG4gICAqL1xuICBjb250YWluZXJFbnZpcm9ubWVudD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNhZmVseSBpbXBvcnQgc2VjcmV0cyBmcm9tIGFub3RoZXIgcmVzb3VyY2UsXG4gICAqICBvYmplY3Qga2V5IGlzIHVzZWQgYXMgbmFtZSB3aGVuIHBhc3NpbmcgdG8gY29udGFpbmVyXG4gICAqL1xuICBjb250YWluZXJTZWNyZXRzSW1wb3J0Pzoge1xuICAgIFtrZXk6IHN0cmluZ106IFNlY3JldEltcG9ydDtcbiAgfTtcblxuICAvLyBFQzItc3BlY2lmaWMgcHJvcGVydGllc1xuICBpbnN0YW5jZVR5cGU/OiBzdHJpbmc7XG4gIGVuYWJsZVNTSD86IGJvb2xlYW47XG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIG1pbkNhcGFjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcblxuICAvLyBMYW1iZGEtc3BlY2lmaWMgcHJvcGVydGllc1xuICBydW50aW1lPzogUnVudGltZTtcbiAgaGFuZGxlcj86IHN0cmluZztcbiAgY29kZT86IENvZGU7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG4gIG1lbW9yeVNpemU/OiBudW1iZXI7XG4gIGxhbWJkYURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICByb2xlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlubGluZVBvbGljeT86IHtcbiAgICBbbmFtZTogc3RyaW5nXTogUG9saWN5RG9jdW1lbnQ7XG4gIH07XG5cbiAgLy8gTGFtYmRhIFVSTCBwcm9wZXJ0aWVzXG4gIGVuYWJsZUZ1bmN0aW9uVXJsPzogYm9vbGVhbjtcbiAgZnVuY3Rpb25VcmxBdXRoVHlwZT86IEZ1bmN0aW9uVXJsQXV0aFR5cGU7XG4gIGZ1bmN0aW9uVXJsQ29ycz86IFNpbXBsaWZpZWRDb3JzT3B0aW9ucztcblxuICBjb25uZWN0aW9ucz86IElDb25uZWN0YWJsZVtdO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBzdHJpbmcgSFRUUCBtZXRob2RzIHRvIEh0dHBNZXRob2QgZW51bVxuZnVuY3Rpb24gY29udmVydEh0dHBNZXRob2RzKG1ldGhvZHM6IEh0dHBNZXRob2RTdHJpbmdbXSk6IEh0dHBNZXRob2RbXSB7XG4gIGNvbnN0IG1ldGhvZE1hcDogUmVjb3JkPEh0dHBNZXRob2RTdHJpbmcsIEh0dHBNZXRob2Q+ID0ge1xuICAgIEdFVDogSHR0cE1ldGhvZC5HRVQsXG4gICAgUE9TVDogSHR0cE1ldGhvZC5QT1NULFxuICAgIFBVVDogSHR0cE1ldGhvZC5QVVQsXG4gICAgREVMRVRFOiBIdHRwTWV0aG9kLkRFTEVURSxcbiAgICBIRUFEOiBIdHRwTWV0aG9kLkhFQUQsXG4gICAgT1BUSU9OUzogSHR0cE1ldGhvZC5PUFRJT05TLFxuICAgIFBBVENIOiBIdHRwTWV0aG9kLlBBVENIXG4gIH07XG5cbiAgcmV0dXJuIG1ldGhvZHMubWFwKChtZXRob2QpID0+IHtcbiAgICBjb25zdCBodHRwTWV0aG9kID0gbWV0aG9kTWFwW21ldGhvZF07XG4gICAgaWYgKCFodHRwTWV0aG9kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIEhUVFAgbWV0aG9kOiAke21ldGhvZH0uIFZhbGlkIG1ldGhvZHMgYXJlOiAke09iamVjdC5rZXlzKG1ldGhvZE1hcCkuam9pbihcIiwgXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBodHRwTWV0aG9kO1xuICB9KTtcbn1cblxuLy8gQ29udmVydCBzaW1wbGlmaWVkIENPUlMgb3B0aW9ucyB0byBDREsgQ09SUyBvcHRpb25zXG5mdW5jdGlvbiBjb252ZXJ0Q29yc09wdGlvbnMoXG4gIHNpbXBsaWZpZWRDb3JzPzogU2ltcGxpZmllZENvcnNPcHRpb25zXG4pOiBGdW5jdGlvblVybENvcnNPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzaW1wbGlmaWVkQ29ycykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIGFsbG93ZWRPcmlnaW5zOiBzaW1wbGlmaWVkQ29ycy5hbGxvd2VkT3JpZ2lucyxcbiAgICBhbGxvd2VkTWV0aG9kczogc2ltcGxpZmllZENvcnMuYWxsb3dlZE1ldGhvZHNcbiAgICAgID8gY29udmVydEh0dHBNZXRob2RzKHNpbXBsaWZpZWRDb3JzLmFsbG93ZWRNZXRob2RzKVxuICAgICAgOiB1bmRlZmluZWQsXG4gICAgYWxsb3dlZEhlYWRlcnM6IHNpbXBsaWZpZWRDb3JzLmFsbG93ZWRIZWFkZXJzLFxuICAgIG1heEFnZTogc2ltcGxpZmllZENvcnMubWF4QWdlLFxuICAgIGFsbG93Q3JlZGVudGlhbHM6IHNpbXBsaWZpZWRDb3JzLmFsbG93Q3JlZGVudGlhbHMsXG4gICAgZXhwb3NlZEhlYWRlcnM6IHNpbXBsaWZpZWRDb3JzLmV4cG9zZUhlYWRlcnNcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENvbXB1dGVGYWN0b3J5IHtcbiAgc3RhdGljIGJ1aWxkKGlkOiBzdHJpbmcsIHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgY29uc3QgY29tcHV0ZVByb3BzID0ge1xuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjOiBhcHAuZ2V0RGVmYXVsdFZwYygpLFxuICAgICAgICAgIGVjclJlcG9zaXRvcnk6IGFwcC5nZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKVxuICAgICAgICB9LFxuICAgICAgICAuLi5wcm9wc1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5ldyBDb21wdXRlKHNjb3BlLCBpZCwgY29tcHV0ZVByb3BzKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyBzY29wZTogQ29uc3RydWN0O1xuICBwdWJsaWMgdnBjOiBJVnBjO1xuXG4gIHB1YmxpYyBjb25uZWN0aW9uczogQ29ubmVjdGlvbnM7XG5cbiAgcHJpdmF0ZSBjb21wdXRlOlxuICAgIHwgRmFyZ2F0ZUNsdXN0ZXJcbiAgICB8IEVjc0ZyZWVUaWVyXG4gICAgfCBFY3NTcG90XG4gICAgfCBFYzJJbnN0YW5jZVxuICAgIHwgTGFtYmRhRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XG5cbiAgICB0aGlzLmFkZENvbXB1dGUocHJvcHMpO1xuICB9XG5cbiAgYWRkQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIGNvbnN0IGNvbXB1dGVUeXBlID0gcHJvcHMudHlwZSB8fCBcImVjc1wiO1xuXG4gICAgaWYgKGNvbXB1dGVUeXBlID09PSBcImVjMlwiKSB7XG4gICAgICB0aGlzLmFkZEVjMkNvbXB1dGUocHJvcHMpO1xuICAgIH0gZWxzZSBpZiAoY29tcHV0ZVR5cGUgPT09IFwibGFtYmRhXCIpIHtcbiAgICAgIHRoaXMuYWRkTGFtYmRhQ29tcHV0ZShwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRWNzQ29tcHV0ZShwcm9wcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFYzJDb21wdXRlKHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgY29uc3QgZWMyUHJvcHMgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogYCR7dGhpcy5pZH1TZXJ2aWNlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlIHx8IFwidDMubWljcm9cIixcbiAgICAgIGVuYWJsZVNTSDogcHJvcHMuZW5hYmxlU1NIIHx8IGZhbHNlLFxuICAgICAgdXNlckRhdGE6IHByb3BzLnVzZXJEYXRhLFxuICAgICAgbWFjaGluZUltYWdlOiBwcm9wcy5tYWNoaW5lSW1hZ2UsXG4gICAgICBtaW5DYXBhY2l0eTogcHJvcHMubWluQ2FwYWNpdHkgfHwgMSxcbiAgICAgIG1heENhcGFjaXR5OiBwcm9wcy5tYXhDYXBhY2l0eSB8fCAxLFxuICAgICAgdnBjOiBwcm9wcy52cGNcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IEVjMkluc3RhbmNlKHRoaXMuc2NvcGUsIGAke3RoaXMuaWR9RWMyYCwgZWMyUHJvcHMpO1xuICAgIHRoaXMuY29ubmVjdGlvbnMgPSB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnM7XG5cbiAgICBpZiAocHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgIGZvciAodmFyIGNvbm4gb2YgcHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zLmFsbG93VG8oY29ubiwgUG9ydC5hbGxUY3AoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFY3NDb21wdXRlKHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgY29uc3QgZWNzVHlwZSA9IHByb3BzLmVjc1R5cGUgfHwgXCJmYXJnYXRlXCI7XG5cbiAgICAvLyBDb21tb24gRUNTIHByb3BzXG4gICAgY29uc3QgYmFzZUVjc1Byb3BzID0ge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjb250YWluZXJQb3J0OiBwcm9wcy5jb250YWluZXJQb3J0IHx8IDgwLFxuICAgICAgc2VydmljZU5hbWU6IGAke3RoaXMuaWR9U2VydmljZWAsXG4gICAgICBjbHVzdGVyTmFtZTogYCR7dGhpcy5pZH1DbHVzdGVyYCxcbiAgICAgIGVjclJlcG9zaXRvcnk6IHByb3BzLmVjclJlcG9zaXRvcnkgfHwgXCJhbWF6b24vYW1hem9uLWVjcy1zYW1wbGVcIixcbiAgICAgIGNvbnRhaW5lckVudmlyb25tZW50OiBwcm9wcy5jb250YWluZXJFbnZpcm9ubWVudCB8fCB7fSxcbiAgICAgIGNvbnRhaW5lclNlY3JldHNJbXBvcnQ6IHByb3BzLmNvbnRhaW5lclNlY3JldHNJbXBvcnQgfHwge30sXG4gICAgICB2cGM6IHByb3BzLnZwY1xuICAgIH07XG5cbiAgICBpZiAoZWNzVHlwZSA9PT0gXCJmcmVldGllclwiKSB7XG4gICAgICAvLyBVc2UgRUMyLWJhc2VkIEVDUyBmb3IgZnJlZSB0aWVyXG4gICAgICB0aGlzLmNvbXB1dGUgPSBuZXcgRWNzRnJlZVRpZXIoXG4gICAgICAgIHRoaXMuc2NvcGUsXG4gICAgICAgIGAke3RoaXMuaWR9RWNzRnJlZVRpZXJgLFxuICAgICAgICBiYXNlRWNzUHJvcHNcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChlY3NUeXBlID09PSBcInNwb3RcIikge1xuICAgICAgLy8gVXNlIEVDMiBTcG90IGluc3RhbmNlcyBmb3IgY29zdCBvcHRpbWl6YXRpb25cbiAgICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBFY3NTcG90KHRoaXMuc2NvcGUsIGAke3RoaXMuaWR9RWNzU3BvdGAsIGJhc2VFY3NQcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgdG8gRmFyZ2F0ZVxuICAgICAgY29uc3QgZmFyZ2F0ZVByb3BzID0ge1xuICAgICAgICAuLi5iYXNlRWNzUHJvcHMsXG4gICAgICAgIHNjYWxpbmdUeXBlOiBTY2FsaW5nVHlwZS5DUFUsXG4gICAgICAgIHByb3RvY29sOiBwcm9wcy5kb21haW5Db25maWcgPyBQcm90b2NvbC5IVFRQUyA6IFByb3RvY29sLkhUVFAsXG4gICAgICAgIGRvbWFpbkNvbmZpZzogcHJvcHMuZG9tYWluQ29uZmlnXG4gICAgICB9IGFzIEZhcmdhdGVDbHVzdGVyUHJvcHM7XG5cbiAgICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBGYXJnYXRlQ2x1c3RlcihcbiAgICAgICAgdGhpcy5zY29wZSxcbiAgICAgICAgYCR7dGhpcy5pZH1GYXJnYXRlYCxcbiAgICAgICAgZmFyZ2F0ZVByb3BzXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgZm9yICh2YXIgY29ubiBvZiBwcm9wcy5jb25uZWN0aW9ucykge1xuICAgICAgICB0aGlzLmNvbXB1dGUuY29ubmVjdGlvbnMuYWxsb3dUbyhjb25uLCBQb3J0LmFsbFRjcCgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMYW1iZGFDb21wdXRlKHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgbGV0IGNvZGUgPSBwcm9wcy5jb2RlO1xuXG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICBpZiAoIXByb3BzLmVjclJlcG9zaXRvcnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiRWl0aGVyIGNvZGUgb3IgZWNyUmVwb3NpdG9yeSBtdXN0IGJlIHByb3ZpZGVkIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICAgIGNvZGUgPSBDb2RlLmZyb21FY3JJbWFnZShwcm9wcy5lY3JSZXBvc2l0b3J5LCB7XG4gICAgICAgICAgdGFnT3JEaWdlc3Q6IFwibGF0ZXN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJlY3JSZXBvc2l0b3J5IG11c3QgYmUgYSBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsYW1iZGFQcm9wcyA9IHtcbiAgICAgIGNvZGU6IGNvZGUsXG4gICAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUsXG4gICAgICBsYW1iZGFEZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24sXG4gICAgICByb2xlRGVzY3JpcHRpb246IHByb3BzLnJvbGVEZXNjcmlwdGlvbixcbiAgICAgIGlubGluZVBvbGljeTogcHJvcHMuaW5saW5lUG9saWN5IHx8IHt9LFxuICAgICAgZW5hYmxlRnVuY3Rpb25Vcmw6IHByb3BzLmVuYWJsZUZ1bmN0aW9uVXJsLFxuICAgICAgZnVuY3Rpb25VcmxBdXRoVHlwZTogcHJvcHMuZnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgICAgIGZ1bmN0aW9uVXJsQ29yczogY29udmVydENvcnNPcHRpb25zKHByb3BzLmZ1bmN0aW9uVXJsQ29ycyksXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuY29udGFpbmVyRW52aXJvbm1lbnRcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IExhbWJkYUZ1bmN0aW9uKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGAke3RoaXMuaWR9TGFtYmRhYCxcbiAgICAgIGxhbWJkYVByb3BzXG4gICAgKTtcblxuICAgIC8vIExhbWJkYSBmdW5jdGlvbnMgZG9uJ3QgdXNlIHNlY3VyaXR5IGdyb3VwcyB1bmxlc3MgVlBDLWVuYWJsZWRcbiAgICAvLyBDcmVhdGUgZW1wdHkgY29ubmVjdGlvbnMgb2JqZWN0IGZvciBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoKTtcbiAgfVxufVxuIl19
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3MvY29tcHV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpREFBaUQ7QUFDakQsaURBTTZCO0FBQzdCLHVEQU1nQztBQUloQywyQ0FBdUM7QUFJdkMseURBS3lDO0FBQ3pDLHlFQUFrRTtBQUNsRSxpRUFBMEQ7QUFDMUQseURBQThEO0FBQzlELCtEQUFvRTtBQTRGcEUsb0VBQW9FO0FBQ3BFLFNBQVMsa0JBQWtCLENBQUMsT0FBMkI7SUFDckQsTUFBTSxTQUFTLEdBQXlDO1FBQ3RELEdBQUcsRUFBRSx1QkFBVSxDQUFDLEdBQUc7UUFDbkIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixHQUFHLEVBQUUsdUJBQVUsQ0FBQyxHQUFHO1FBQ25CLE1BQU0sRUFBRSx1QkFBVSxDQUFDLE1BQU07UUFDekIsSUFBSSxFQUFFLHVCQUFVLENBQUMsSUFBSTtRQUNyQixPQUFPLEVBQUUsdUJBQVUsQ0FBQyxPQUFPO1FBQzNCLEtBQUssRUFBRSx1QkFBVSxDQUFDLEtBQUs7S0FDeEIsQ0FBQztJQUVGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzVCLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3QkFBd0IsTUFBTSx3QkFBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsU0FBUyxrQkFBa0IsQ0FDekIsY0FBc0M7SUFFdEMsSUFB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LElBQUksS0FBSyxDQUNiLHFFQUFxRSxDQUN0RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRztZQUNsQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLGVBQWU7WUFDekMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1lBQzdDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQjtZQUMxQyxlQUFlLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDdEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRTtZQUN0QyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUI7WUFDOUMsZUFBZSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDMUQsV0FBVyxFQUFFLEtBQUssQ0FBQyxvQkFBb0I7U0FDeEMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx1QkFBYyxDQUMvQixJQUFJLENBQUMsS0FBSyxFQUNWLEdBQUcsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUNsQixXQUFXLENBQ1osQ0FBQztRQUVGLGdFQUFnRTtRQUNoRSw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLHFCQUFXLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUF4SkQsMEJBd0pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBSZXBvc2l0b3J5SW1hZ2UgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjc1wiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyXCI7XG5pbXBvcnQge1xuICBDb25uZWN0aW9ucyxcbiAgdHlwZSBJQ29ubmVjdGFibGUsXG4gIHR5cGUgSVZwYyxcbiAgdHlwZSBVc2VyRGF0YSxcbiAgdHlwZSBJTWFjaGluZUltYWdlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQge1xuICBDb2RlLFxuICBSdW50aW1lLFxuICB0eXBlIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIEh0dHBNZXRob2QsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgdHlwZSBQb2xpY3lEb2N1bWVudCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi4vLi4vYXBwXCI7XG5cbmltcG9ydCBGYXJnYXRlQ2x1c3Rlciwge1xuICB0eXBlIEZhcmdhdGVDbHVzdGVyUHJvcHMsXG4gIFByb3RvY29sLFxuICBTY2FsaW5nVHlwZSxcbiAgdHlwZSBEb21haW5Db25maWdcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lY3NcIjtcbmltcG9ydCBFY3NGcmVlVGllciBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc0ZyZWVUaWVyXCI7XG5pbXBvcnQgRWNzU3BvdCBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9jb21wdXRlL2Vjc1Nwb3RcIjtcbmltcG9ydCB7IEVjMkluc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9lYzJcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGFcIjtcbmltcG9ydCB7IHR5cGUgU2VjcmV0SW1wb3J0IH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc2VjcmV0c1wiO1xuXG4vLyBVc2VyLWZyaWVuZGx5IEhUVFAgbWV0aG9kIHR5cGVcbmV4cG9ydCB0eXBlIEh0dHBNZXRob2RTdHJpbmcgPVxuICB8IFwiR0VUXCJcbiAgfCBcIlBPU1RcIlxuICB8IFwiUFVUXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJIRUFEXCJcbiAgfCBcIk9QVElPTlNcIlxuICB8IFwiUEFUQ0hcIjtcblxuLy8gVXNlci1mcmllbmRseSBDT1JTIG9wdGlvbnMgdGhhdCBhY2NlcHQgc3RyaW5nIG1ldGhvZHNcbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxpZmllZENvcnNPcHRpb25zIHtcbiAgYWxsb3dlZE9yaWdpbnM/OiBzdHJpbmdbXTtcbiAgYWxsb3dlZE1ldGhvZHM/OiBIdHRwTWV0aG9kU3RyaW5nW107XG4gIGFsbG93ZWRIZWFkZXJzPzogc3RyaW5nW107XG4gIG1heEFnZT86IER1cmF0aW9uO1xuICBhbGxvd0NyZWRlbnRpYWxzPzogYm9vbGVhbjtcbiAgZXhwb3NlSGVhZGVycz86IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgSUNvbXB1dGVQcm9wcyB7XG4gIHZwYz86IElWcGM7XG4gIGVjclJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5IHwgUmVwb3NpdG9yeUltYWdlO1xuXG4gIC8vIENvbXB1dGUgdHlwZSBzZWxlY3Rpb25cbiAgdHlwZT86IFwiZWNzXCIgfCBcImVjMlwiIHwgXCJsYW1iZGFcIjtcblxuICAvLyBFQ1Mgc3VidHlwZSBzZWxlY3Rpb24gKG9ubHkgYXBwbGljYWJsZSB3aGVuIHR5cGUgaXMgXCJlY3NcIilcbiAgZWNzVHlwZT86IFwiZmFyZ2F0ZVwiIHwgXCJmcmVldGllclwiIHwgXCJzcG90XCI7XG5cbiAgLy8gRUNTLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgcGFyZW50RG9tYWluPzogc3RyaW5nO1xuICBkb21haW5Db25maWc/OiBEb21haW5Db25maWc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gRG9ja2VyZmlsZSBmb3IgYnVpbGRpbmcgY3VzdG9tIGltYWdlLlxuICAgKiBOb3RlOiBUaGlzIGlzIG1ldGFkYXRhIGZvciB0aGUgQ0xJIGJ1aWxkIHByb2Nlc3MsXG4gICAqIG5vdCB1c2VkIGR1cmluZyBDREsgc3ludGhlc2lzXG4gICAqL1xuICBkb2NrZXJmaWxlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUG9ydCB0aGUgY29udGFpbmVyIGxpc3RlbnMgb24gKGRlZmF1bHQ6IDgwKVxuICAgKi9cbiAgY29udGFpbmVyUG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogRW52aXJvbm1uZXQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIGNvbnRhaW5lclxuICAgKi9cbiAgY29udGFpbmVyRW52aXJvbm1lbnQ/OiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTYWZlbHkgaW1wb3J0IHNlY3JldHMgZnJvbSBhbm90aGVyIHJlc291cmNlLFxuICAgKiAgb2JqZWN0IGtleSBpcyB1c2VkIGFzIG5hbWUgd2hlbiBwYXNzaW5nIHRvIGNvbnRhaW5lclxuICAgKi9cbiAgY29udGFpbmVyU2VjcmV0c0ltcG9ydD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQ7XG4gIH07XG5cbiAgLy8gRUMyLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaW5zdGFuY2VUeXBlPzogc3RyaW5nO1xuICBlbmFibGVTU0g/OiBib29sZWFuO1xuICB1c2VyRGF0YT86IFVzZXJEYXRhO1xuICBtYWNoaW5lSW1hZ2U/OiBJTWFjaGluZUltYWdlO1xuICBtaW5DYXBhY2l0eT86IG51bWJlcjtcbiAgbWF4Q2FwYWNpdHk/OiBudW1iZXI7XG5cbiAgLy8gTGFtYmRhLXNwZWNpZmljIHByb3BlcnRpZXNcbiAgcnVudGltZT86IFJ1bnRpbWU7XG4gIGhhbmRsZXI/OiBzdHJpbmc7XG4gIGNvZGU/OiBDb2RlO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBtZW1vcnlTaXplPzogbnVtYmVyO1xuICBsYW1iZGFEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcm9sZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpbmxpbmVQb2xpY3k/OiB7XG4gICAgW25hbWU6IHN0cmluZ106IFBvbGljeURvY3VtZW50O1xuICB9O1xuXG4gIC8vIExhbWJkYSBVUkwgcHJvcGVydGllc1xuICBlbmFibGVGdW5jdGlvblVybD86IGJvb2xlYW47XG4gIGZ1bmN0aW9uVXJsQXV0aFR5cGU/OiBGdW5jdGlvblVybEF1dGhUeXBlO1xuICBmdW5jdGlvblVybENvcnM/OiBTaW1wbGlmaWVkQ29yc09wdGlvbnM7XG5cbiAgY29ubmVjdGlvbnM/OiBJQ29ubmVjdGFibGVbXTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgc3RyaW5nIEhUVFAgbWV0aG9kcyB0byBIdHRwTWV0aG9kIGVudW1cbmZ1bmN0aW9uIGNvbnZlcnRIdHRwTWV0aG9kcyhtZXRob2RzOiBIdHRwTWV0aG9kU3RyaW5nW10pOiBIdHRwTWV0aG9kW10ge1xuICBjb25zdCBtZXRob2RNYXA6IFJlY29yZDxIdHRwTWV0aG9kU3RyaW5nLCBIdHRwTWV0aG9kPiA9IHtcbiAgICBHRVQ6IEh0dHBNZXRob2QuR0VULFxuICAgIFBPU1Q6IEh0dHBNZXRob2QuUE9TVCxcbiAgICBQVVQ6IEh0dHBNZXRob2QuUFVULFxuICAgIERFTEVURTogSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgSEVBRDogSHR0cE1ldGhvZC5IRUFELFxuICAgIE9QVElPTlM6IEh0dHBNZXRob2QuT1BUSU9OUyxcbiAgICBQQVRDSDogSHR0cE1ldGhvZC5QQVRDSFxuICB9O1xuXG4gIHJldHVybiBtZXRob2RzLm1hcCgobWV0aG9kKSA9PiB7XG4gICAgY29uc3QgaHR0cE1ldGhvZCA9IG1ldGhvZE1hcFttZXRob2RdO1xuICAgIGlmICghaHR0cE1ldGhvZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBIVFRQIG1ldGhvZDogJHttZXRob2R9LiBWYWxpZCBtZXRob2RzIGFyZTogJHtPYmplY3Qua2V5cyhtZXRob2RNYXApLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gaHR0cE1ldGhvZDtcbiAgfSk7XG59XG5cbi8vIENvbnZlcnQgc2ltcGxpZmllZCBDT1JTIG9wdGlvbnMgdG8gQ0RLIENPUlMgb3B0aW9uc1xuZnVuY3Rpb24gY29udmVydENvcnNPcHRpb25zKFxuICBzaW1wbGlmaWVkQ29ycz86IFNpbXBsaWZpZWRDb3JzT3B0aW9uc1xuKTogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2ltcGxpZmllZENvcnMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkT3JpZ2luczogc2ltcGxpZmllZENvcnMuYWxsb3dlZE9yaWdpbnMsXG4gICAgYWxsb3dlZE1ldGhvZHM6IHNpbXBsaWZpZWRDb3JzLmFsbG93ZWRNZXRob2RzXG4gICAgICA/IGNvbnZlcnRIdHRwTWV0aG9kcyhzaW1wbGlmaWVkQ29ycy5hbGxvd2VkTWV0aG9kcylcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGFsbG93ZWRIZWFkZXJzOiBzaW1wbGlmaWVkQ29ycy5hbGxvd2VkSGVhZGVycyxcbiAgICBtYXhBZ2U6IHNpbXBsaWZpZWRDb3JzLm1heEFnZSxcbiAgICBhbGxvd0NyZWRlbnRpYWxzOiBzaW1wbGlmaWVkQ29ycy5hbGxvd0NyZWRlbnRpYWxzLFxuICAgIGV4cG9zZWRIZWFkZXJzOiBzaW1wbGlmaWVkQ29ycy5leHBvc2VIZWFkZXJzXG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wdXRlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIGNvbnN0IGNvbXB1dGVQcm9wcyA9IHtcbiAgICAgICAgLi4ue1xuICAgICAgICAgIHZwYzogYXBwLmdldERlZmF1bHRWcGMoKSxcbiAgICAgICAgICBlY3JSZXBvc2l0b3J5OiBhcHAuZ2V0RGVmYXVsdENvbnRhaW5lclJlZ2lzdHJ5KClcbiAgICAgICAgfSxcbiAgICAgICAgLi4ucHJvcHNcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBuZXcgQ29tcHV0ZShzY29wZSwgaWQsIGNvbXB1dGVQcm9wcyk7XG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcHV0ZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElDb25uZWN0YWJsZSB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgc2NvcGU6IENvbnN0cnVjdDtcbiAgcHVibGljIHZwYzogSVZwYztcblxuICBwdWJsaWMgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIHByaXZhdGUgY29tcHV0ZTpcbiAgICB8IEZhcmdhdGVDbHVzdGVyXG4gICAgfCBFY3NGcmVlVGllclxuICAgIHwgRWNzU3BvdFxuICAgIHwgRWMySW5zdGFuY2VcbiAgICB8IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuXG4gICAgdGhpcy5hZGRDb21wdXRlKHByb3BzKTtcbiAgfVxuXG4gIGFkZENvbXB1dGUocHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBjb25zdCBjb21wdXRlVHlwZSA9IHByb3BzLnR5cGUgfHwgXCJlY3NcIjtcblxuICAgIGlmIChjb21wdXRlVHlwZSA9PT0gXCJlYzJcIikge1xuICAgICAgdGhpcy5hZGRFYzJDb21wdXRlKHByb3BzKTtcbiAgICB9IGVsc2UgaWYgKGNvbXB1dGVUeXBlID09PSBcImxhbWJkYVwiKSB7XG4gICAgICB0aGlzLmFkZExhbWJkYUNvbXB1dGUocHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZEVjc0NvbXB1dGUocHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRWMyQ29tcHV0ZShwcm9wczogSUNvbXB1dGVQcm9wcykge1xuICAgIGNvbnN0IGVjMlByb3BzID0ge1xuICAgICAgc2VydmljZU5hbWU6IGAke3RoaXMuaWR9U2VydmljZWAsXG4gICAgICBpbnN0YW5jZVR5cGU6IHByb3BzLmluc3RhbmNlVHlwZSB8fCBcInQzLm1pY3JvXCIsXG4gICAgICBlbmFibGVTU0g6IHByb3BzLmVuYWJsZVNTSCB8fCBmYWxzZSxcbiAgICAgIHVzZXJEYXRhOiBwcm9wcy51c2VyRGF0YSxcbiAgICAgIG1hY2hpbmVJbWFnZTogcHJvcHMubWFjaGluZUltYWdlLFxuICAgICAgbWluQ2FwYWNpdHk6IHByb3BzLm1pbkNhcGFjaXR5IHx8IDEsXG4gICAgICBtYXhDYXBhY2l0eTogcHJvcHMubWF4Q2FwYWNpdHkgfHwgMSxcbiAgICAgIHZwYzogcHJvcHMudnBjXG4gICAgfTtcblxuICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBFYzJJbnN0YW5jZSh0aGlzLnNjb3BlLCBgJHt0aGlzLmlkfUVjMmAsIGVjMlByb3BzKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zO1xuXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbm4gb2YgcHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRUbyhjb25uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEVjc0NvbXB1dGUocHJvcHM6IElDb21wdXRlUHJvcHMpIHtcbiAgICBjb25zdCBlY3NUeXBlID0gcHJvcHMuZWNzVHlwZSB8fCBcImZhcmdhdGVcIjtcblxuICAgIC8vIENvbW1vbiBFQ1MgcHJvcHNcbiAgICBjb25zdCBiYXNlRWNzUHJvcHMgPSB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvbnRhaW5lclBvcnQ6IHByb3BzLmNvbnRhaW5lclBvcnQgfHwgODAsXG4gICAgICBzZXJ2aWNlTmFtZTogYCR7dGhpcy5pZH1TZXJ2aWNlYCxcbiAgICAgIGNsdXN0ZXJOYW1lOiBgJHt0aGlzLmlkfUNsdXN0ZXJgLFxuICAgICAgZWNyUmVwb3NpdG9yeTogcHJvcHMuZWNyUmVwb3NpdG9yeSB8fCBcImFtYXpvbi9hbWF6b24tZWNzLXNhbXBsZVwiLFxuICAgICAgY29udGFpbmVyRW52aXJvbm1lbnQ6IHByb3BzLmNvbnRhaW5lckVudmlyb25tZW50IHx8IHt9LFxuICAgICAgY29udGFpbmVyU2VjcmV0c0ltcG9ydDogcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydCB8fCB7fSxcbiAgICAgIHZwYzogcHJvcHMudnBjXG4gICAgfTtcblxuICAgIGlmIChlY3NUeXBlID09PSBcImZyZWV0aWVyXCIpIHtcbiAgICAgIC8vIFVzZSBFQzItYmFzZWQgRUNTIGZvciBmcmVlIHRpZXJcbiAgICAgIHRoaXMuY29tcHV0ZSA9IG5ldyBFY3NGcmVlVGllcihcbiAgICAgICAgdGhpcy5zY29wZSxcbiAgICAgICAgYCR7dGhpcy5pZH1FY3NGcmVlVGllcmAsXG4gICAgICAgIGJhc2VFY3NQcm9wc1xuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGVjc1R5cGUgPT09IFwic3BvdFwiKSB7XG4gICAgICAvLyBVc2UgRUMyIFNwb3QgaW5zdGFuY2VzIGZvciBjb3N0IG9wdGltaXphdGlvblxuICAgICAgdGhpcy5jb21wdXRlID0gbmV3IEVjc1Nwb3QodGhpcy5zY29wZSwgYCR7dGhpcy5pZH1FY3NTcG90YCwgYmFzZUVjc1Byb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCB0byBGYXJnYXRlXG4gICAgICBjb25zdCBmYXJnYXRlUHJvcHMgPSB7XG4gICAgICAgIC4uLmJhc2VFY3NQcm9wcyxcbiAgICAgICAgc2NhbGluZ1R5cGU6IFNjYWxpbmdUeXBlLkNQVSxcbiAgICAgICAgcHJvdG9jb2w6IHByb3BzLmRvbWFpbkNvbmZpZyA/IFByb3RvY29sLkhUVFBTIDogUHJvdG9jb2wuSFRUUCxcbiAgICAgICAgZG9tYWluQ29uZmlnOiBwcm9wcy5kb21haW5Db25maWdcbiAgICAgIH0gYXMgRmFyZ2F0ZUNsdXN0ZXJQcm9wcztcblxuICAgICAgdGhpcy5jb21wdXRlID0gbmV3IEZhcmdhdGVDbHVzdGVyKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICBgJHt0aGlzLmlkfUZhcmdhdGVgLFxuICAgICAgICBmYXJnYXRlUHJvcHNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmNvbm5lY3Rpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbm4gb2YgcHJvcHMuY29ubmVjdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zLmFsbG93RGVmYXVsdFBvcnRUbyhjb25uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25zID0gdGhpcy5jb21wdXRlLmNvbm5lY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRMYW1iZGFDb21wdXRlKHByb3BzOiBJQ29tcHV0ZVByb3BzKSB7XG4gICAgbGV0IGNvZGUgPSBwcm9wcy5jb2RlO1xuXG4gICAgaWYgKCFjb2RlKSB7XG4gICAgICBpZiAoIXByb3BzLmVjclJlcG9zaXRvcnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiRWl0aGVyIGNvZGUgb3IgZWNyUmVwb3NpdG9yeSBtdXN0IGJlIHByb3ZpZGVkIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3BzLmVjclJlcG9zaXRvcnkgaW5zdGFuY2VvZiBSZXBvc2l0b3J5KSB7XG4gICAgICAgIGNvZGUgPSBDb2RlLmZyb21FY3JJbWFnZShwcm9wcy5lY3JSZXBvc2l0b3J5LCB7XG4gICAgICAgICAgdGFnT3JEaWdlc3Q6IFwibGF0ZXN0XCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJlY3JSZXBvc2l0b3J5IG11c3QgYmUgYSBSZXBvc2l0b3J5IGluc3RhbmNlIGZvciBMYW1iZGEgY29tcHV0ZSB0eXBlXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsYW1iZGFQcm9wcyA9IHtcbiAgICAgIGNvZGU6IGNvZGUsXG4gICAgICBoYW5kbGVyOiBwcm9wcy5oYW5kbGVyIHx8IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBSdW50aW1lLk5PREVKU18xOF9YLFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dCxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUsXG4gICAgICBsYW1iZGFEZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24sXG4gICAgICByb2xlRGVzY3JpcHRpb246IHByb3BzLnJvbGVEZXNjcmlwdGlvbixcbiAgICAgIGlubGluZVBvbGljeTogcHJvcHMuaW5saW5lUG9saWN5IHx8IHt9LFxuICAgICAgZW5hYmxlRnVuY3Rpb25Vcmw6IHByb3BzLmVuYWJsZUZ1bmN0aW9uVXJsLFxuICAgICAgZnVuY3Rpb25VcmxBdXRoVHlwZTogcHJvcHMuZnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgICAgIGZ1bmN0aW9uVXJsQ29yczogY29udmVydENvcnNPcHRpb25zKHByb3BzLmZ1bmN0aW9uVXJsQ29ycyksXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuY29udGFpbmVyRW52aXJvbm1lbnRcbiAgICB9O1xuXG4gICAgdGhpcy5jb21wdXRlID0gbmV3IExhbWJkYUZ1bmN0aW9uKFxuICAgICAgdGhpcy5zY29wZSxcbiAgICAgIGAke3RoaXMuaWR9TGFtYmRhYCxcbiAgICAgIGxhbWJkYVByb3BzXG4gICAgKTtcblxuICAgIC8vIExhbWJkYSBmdW5jdGlvbnMgZG9uJ3QgdXNlIHNlY3VyaXR5IGdyb3VwcyB1bmxlc3MgVlBDLWVuYWJsZWRcbiAgICAvLyBDcmVhdGUgZW1wdHkgY29ubmVjdGlvbnMgb2JqZWN0IGZvciBpbnRlcmZhY2UgY29tcGF0aWJpbGl0eVxuICAgIHRoaXMuY29ubmVjdGlvbnMgPSBuZXcgQ29ubmVjdGlvbnMoKTtcbiAgfVxufVxuIl19
@@ -1,33 +1,200 @@
1
- import { Stack } from "aws-cdk-lib";
2
1
  import { Construct } from "constructs";
3
- import { Connections, IConnectable, IVpc, SubnetType } from "aws-cdk-lib/aws-ec2";
4
- interface ExistingVpcConfig {
5
- vpcId?: string;
6
- subnetType?: SubnetType;
7
- }
8
- interface NewVpcConfig {
9
- subnetType?: SubnetType;
10
- accountId: string;
11
- }
12
- type VpcProps = ExistingVpcConfig | NewVpcConfig;
13
- type DatabaseType = "Aurora" | "Instance" | "FreeTier";
14
- interface DatabaseProps {
15
- type: DatabaseType;
16
- databaseName: string;
17
- vpc: VpcProps;
18
- tags: {
19
- [key: string]: string;
2
+ import type App from "../../app";
3
+ import { type Secret } from "../../resources/aws/secrets";
4
+ import { type Connections, type IConnectable, type IVpc, type SubnetSelection } from "aws-cdk-lib/aws-ec2";
5
+ import { type IInstanceEngine, type IClusterEngine } from "aws-cdk-lib/aws-rds";
6
+ import { type Duration } from "aws-cdk-lib";
7
+ import { type IKey } from "aws-cdk-lib/aws-kms";
8
+ export type DatabaseEngine = "postgresql" | "mysql";
9
+ export interface EngineConfig {
10
+ defaultUsername: string;
11
+ sslParameters: Record<string, string>;
12
+ rotationAppName: string;
13
+ }
14
+ export declare const DATABASE_ENGINE_CONFIG: Record<DatabaseEngine, {
15
+ aurora: {
16
+ version: string;
17
+ majorVersion: string;
20
18
  };
19
+ instance: {
20
+ version: string;
21
+ majorVersion: string;
22
+ };
23
+ defaultUsername: string;
24
+ sslParameters: Record<string, string>;
25
+ rotationAppName: string;
26
+ }>;
27
+ export declare function getAuroraClusterEngine(engine: DatabaseEngine): IClusterEngine;
28
+ export declare function getInstanceEngine(engine: DatabaseEngine): IInstanceEngine;
29
+ export declare function getEngineConfig(engine: DatabaseEngine): EngineConfig;
30
+ export interface ProxyConfig {
31
+ maxConnections?: number;
32
+ maxIdleConnections?: number;
33
+ connectionBorrowTimeout?: number;
34
+ requireTLS?: boolean;
35
+ vpcSubnets?: SubnetSelection;
36
+ }
37
+ export interface ReadReplicaConfig {
38
+ instanceType?: string;
39
+ availabilityZone?: string;
40
+ }
41
+ export interface CredentialsConfig {
42
+ username?: string;
43
+ secretRotation?: SecretRotationConfig | false;
44
+ }
45
+ export interface SecretRotationConfig {
46
+ automaticallyAfter?: Duration;
47
+ }
48
+ export interface EncryptionConfig {
49
+ storageKey?: EncryptionKeySpec;
21
50
  }
22
51
  /**
23
- * @deprecated Use Storage instead
52
+ * Valid Performance Insights retention periods in days.
53
+ * - 7: Free tier (no charge)
54
+ * - 31: 1 month (default for paid)
55
+ * - 93: 3 months
56
+ * - 186: 6 months
57
+ * - 372: 1 year
58
+ * - 731: 2 years (maximum)
24
59
  */
25
- export declare class Database extends Stack implements IConnectable {
26
- connections: Connections;
60
+ export type PerformanceInsightsRetentionPeriod = 7 | 31 | 93 | 186 | 372 | 731;
61
+ export interface PerformanceInsightsConfig {
62
+ encryptionKey?: EncryptionKeySpec;
63
+ /** Retention period in days. Default: 31 (1 month). */
64
+ retentionPeriod?: PerformanceInsightsRetentionPeriod;
65
+ }
66
+ /**
67
+ * Marker for AWS managed encryption key (aws/rds, aws/s3, etc.)
68
+ * Use this instead of a Customer Managed Key when:
69
+ * - Cost optimization is a priority
70
+ * - You don't need cross-account access
71
+ * - You don't need custom key policies
72
+ */
73
+ export interface AwsManagedKey {
74
+ readonly awsManaged: true;
75
+ }
76
+ /**
77
+ * Encryption key specification for RDS resources.
78
+ * - `IKey`: Use a specific KMS key you control
79
+ * - `{ awsManaged: true }`: Use AWS managed key (aws/rds) - cost-effective
80
+ * - `undefined`: Auto-create a Customer Managed Key (secure default)
81
+ */
82
+ export type EncryptionKeySpec = IKey | AwsManagedKey;
83
+ /**
84
+ * Type guard to check if the encryption key spec is AWS managed.
85
+ * @example
86
+ * if (isAwsManagedKey(props.encryption?.storageKey)) {
87
+ * // Use AWS managed key
88
+ * }
89
+ */
90
+ export declare function isAwsManagedKey(spec: EncryptionKeySpec | undefined): spec is AwsManagedKey;
91
+ /**
92
+ * Convenience constant for specifying AWS managed encryption.
93
+ * @example
94
+ * encryption: { storageKey: AWS_MANAGED }
95
+ */
96
+ export declare const AWS_MANAGED: AwsManagedKey;
97
+ /**
98
+ * **DESTRUCTIVE**: Changing `storageKey` after cluster creation causes cluster REPLACEMENT.
99
+ */
100
+ export interface AuroraEncryptionConfig {
101
+ /** DESTRUCTIVE: Changing after creation causes cluster replacement */
102
+ storageKey?: EncryptionKeySpec;
103
+ }
104
+ export interface AuroraReaderConfig {
105
+ scaleWithWriter?: boolean;
106
+ enablePerformanceInsights?: boolean;
107
+ identifierSuffix?: string;
108
+ availabilityZone?: string;
109
+ }
110
+ export interface AuroraWriterConfig {
111
+ enablePerformanceInsights?: boolean;
112
+ identifierSuffix?: string;
113
+ availabilityZone?: string;
114
+ }
115
+ export interface AuroraReadersConfig {
116
+ /** Mutually exclusive with instances */
117
+ count?: number;
118
+ /** Mutually exclusive with count */
119
+ instances?: AuroraReaderConfig[];
120
+ defaultEnablePerformanceInsights?: boolean;
121
+ }
122
+ type BaseDatabaseProps = {
27
123
  vpc: IVpc;
124
+ databaseName: string;
125
+ instanceType?: string;
126
+ };
127
+ export interface AuroraDatabaseProps extends BaseDatabaseProps {
128
+ type: "Aurora";
129
+ databaseEngine?: DatabaseEngine;
130
+ /** Overrides databaseEngine if provided */
131
+ engine?: IClusterEngine;
132
+ writer?: AuroraWriterConfig;
133
+ readers?: AuroraReadersConfig | false;
134
+ proxy?: ProxyConfig | false;
135
+ credentials?: CredentialsConfig;
136
+ /** DESTRUCTIVE: Changing storageKey causes cluster replacement */
137
+ encryption?: AuroraEncryptionConfig;
138
+ backupRetention?: number;
139
+ monitoringInterval?: Duration;
140
+ preferredMaintenanceWindow?: string;
141
+ port?: number;
142
+ performanceInsights?: PerformanceInsightsConfig | false;
143
+ }
144
+ export interface GlobalAuroraDatabaseProps extends BaseDatabaseProps {
145
+ type: "GlobalAurora";
146
+ primaryRegion: string;
147
+ secondaryRegions?: string[];
148
+ globalClusterIdentifier?: string;
149
+ enableGlobalWriteForwarding?: boolean;
150
+ databaseEngine?: DatabaseEngine;
151
+ /** Overrides databaseEngine if provided */
152
+ engine?: IClusterEngine;
153
+ writer?: AuroraWriterConfig;
154
+ readers?: AuroraReadersConfig | false;
155
+ proxy?: ProxyConfig | false;
156
+ credentials?: CredentialsConfig;
157
+ /** DESTRUCTIVE: Changing storageKey causes cluster replacement */
158
+ encryption?: AuroraEncryptionConfig;
159
+ backupRetention?: number;
160
+ monitoringInterval?: Duration;
161
+ preferredMaintenanceWindow?: string;
162
+ port?: number;
163
+ performanceInsights?: PerformanceInsightsConfig | false;
164
+ }
165
+ export interface InstanceDatabaseProps extends BaseDatabaseProps {
166
+ type: "Instance";
167
+ databaseEngine?: DatabaseEngine;
168
+ /** Overrides databaseEngine if provided */
169
+ engine?: IInstanceEngine;
170
+ allocatedStorage?: number;
171
+ port?: number;
172
+ multiAz?: boolean;
173
+ performanceInsights?: PerformanceInsightsConfig | false;
174
+ proxy?: ProxyConfig | false;
175
+ readReplica?: ReadReplicaConfig | false;
176
+ credentials?: CredentialsConfig;
177
+ encryption?: EncryptionConfig;
178
+ }
179
+ export type IDatabaseProps = AuroraDatabaseProps | InstanceDatabaseProps | GlobalAuroraDatabaseProps;
180
+ export declare class DatabaseFactory {
181
+ static build<T extends IDatabaseProps>(id: string, props: T): (app: App, scope: Construct) => Database;
182
+ }
183
+ export declare class Database extends Construct implements IConnectable {
184
+ id: string;
185
+ scope: Construct;
186
+ vpc: IVpc;
187
+ connections: Connections;
188
+ private databaseName;
28
189
  private database;
29
- constructor(scope: Construct, id: string, props: DatabaseProps);
30
- addVpc(props: DatabaseProps): void;
31
- addDatabase(props: DatabaseProps): void;
190
+ constructor(scope: Construct, id: string, props: IDatabaseProps);
191
+ addDatabase(props: IDatabaseProps): void;
192
+ private addAurora;
193
+ private addAuroraGlobal;
194
+ private addRdsInstance;
195
+ getCredentials(): Secret;
196
+ getHostEndpoint(): string;
197
+ getHostPort(): string;
198
+ getDatabaseName(): string;
32
199
  }
33
200
  export {};