@fjall/components-infrastructure 0.73.9 → 0.73.12

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 (47) hide show
  1. package/dist/lib/__tests__/patterns/__snapshots__/compute.test.js.snap +433 -0
  2. package/dist/lib/__tests__/patterns/compute.test.d.ts +1 -0
  3. package/dist/lib/__tests__/patterns/compute.test.js +137 -0
  4. package/dist/lib/__tests__/simple.test.d.ts +0 -0
  5. package/dist/lib/__tests__/simple.test.js +12 -0
  6. package/dist/lib/resources/aws/backup/backupPlan.d.ts +24 -0
  7. package/dist/lib/resources/aws/backup/backupPlan.js +172 -0
  8. package/dist/lib/resources/aws/backup/backupVault.d.ts +19 -0
  9. package/dist/lib/resources/aws/backup/backupVault.js +44 -0
  10. package/dist/lib/resources/aws/backup/index.d.ts +2 -0
  11. package/dist/lib/resources/aws/backup/index.js +19 -0
  12. package/dist/lib/resources/aws/compute/ecs.d.ts +13 -2
  13. package/dist/lib/resources/aws/compute/ecs.js +6 -2
  14. package/dist/lib/resources/aws/organisations/account.d.ts +37 -0
  15. package/dist/lib/resources/aws/organisations/account.js +220 -0
  16. package/dist/lib/resources/aws/organisations/delegatedAdministrator.d.ts +14 -0
  17. package/dist/lib/resources/aws/organisations/delegatedAdministrator.js +61 -0
  18. package/dist/lib/resources/aws/organisations/index.d.ts +8 -0
  19. package/dist/lib/resources/aws/organisations/index.js +22 -0
  20. package/dist/lib/resources/aws/organisations/interfaces.d.ts +105 -0
  21. package/dist/lib/resources/aws/organisations/interfaces.js +3 -0
  22. package/dist/lib/resources/aws/organisations/organisation.d.ts +47 -0
  23. package/dist/lib/resources/aws/organisations/organisation.js +263 -0
  24. package/dist/lib/resources/aws/organisations/organisationalUnit.d.ts +28 -0
  25. package/dist/lib/resources/aws/organisations/organisationalUnit.js +170 -0
  26. package/dist/lib/resources/aws/organisations/policy.d.ts +17 -0
  27. package/dist/lib/resources/aws/organisations/policy.js +93 -0
  28. package/dist/lib/resources/aws/organisations/trustedServiceAccess.d.ts +13 -0
  29. package/dist/lib/resources/aws/organisations/trustedServiceAccess.js +58 -0
  30. package/dist/lib/resources/aws/organisations/types.d.ts +165 -0
  31. package/dist/lib/resources/aws/organisations/types.js +36 -0
  32. package/dist/lib/utils/directTagging.d.ts +31 -0
  33. package/dist/lib/utils/directTagging.js +86 -0
  34. package/dist/lib/utils/fjallConstruct.d.ts +8 -0
  35. package/dist/lib/utils/fjallConstruct.js +18 -0
  36. package/dist/lib/utils/fjallStackSynthesizer.d.ts +9 -0
  37. package/dist/lib/utils/fjallStackSynthesizer.js +22 -0
  38. package/dist/lib/utils/standardTagsAspect.js +2 -2
  39. package/dist/lib/utils/tagContext.d.ts +28 -0
  40. package/dist/lib/utils/tagContext.js +53 -0
  41. package/dist/lib/utils/tagSynthesizer.d.ts +13 -0
  42. package/dist/lib/utils/tagSynthesizer.js +55 -0
  43. package/package.json +3 -3
  44. package/dist/lib/patterns/aws/ec2.d.ts +0 -43
  45. package/dist/lib/patterns/aws/ec2.js +0 -123
  46. package/dist/lib/utils/getCidr.d.ts +0 -8
  47. package/dist/lib/utils/getCidr.js +0 -40
@@ -446,7 +446,7 @@ class StandardTagsAspect {
446
446
  // Add IPAM pool tag for VPCs with IPAM configuration
447
447
  if (resource.cfnResourceType === "AWS::EC2::VPC") {
448
448
  const properties = resource.cfnProperties || {};
449
- if (properties.ipv4IpamPoolId) {
449
+ if (properties.Ipv4IpamPoolId) {
450
450
  const stack = aws_cdk_lib_1.Stack.of(resource);
451
451
  const accountId = stack.node.tryGetContext("accountId");
452
452
  const region = stack.region;
@@ -467,4 +467,4 @@ class StandardTagsAspect {
467
467
  }
468
468
  }
469
469
  exports.StandardTagsAspect = StandardTagsAspect;
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRUYWdzQXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEQ7QUFHMUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsa0JBQWtCO0lBSTdCLFlBQVksWUFBdUM7UUFGbEMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzNELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLHlCQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQW1CLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQXFCO1FBQzlDLDZGQUE2RjtRQUM3RixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsTUFBTTtZQUNOLGtDQUFrQztZQUVsQyxjQUFjO1lBQ2QsMEJBQTBCO1lBQzFCLGtDQUFrQztZQUNsQyw2QkFBNkI7WUFDN0Isb0NBQW9DO1lBQ3BDLHVDQUF1QztZQUN2QyxrQ0FBa0M7WUFDbEMseUJBQXlCO1lBQ3pCLHdCQUF3QjtZ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LElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzVCLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3pELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsbUNBQW1DO1FBQ25DLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxHQUFHLEVBQUUsR0FBRztZQUNSLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0Y7QUFyZ0JELGdEQXFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXNwZWN0LCBDZm5SZXNvdXJjZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIEFzcGVjdCB0byBlbmZvcmNlIGEgc3RhbmRhcmQgc2V0IG9mIHRhZ3Mgb24gZXZlcnkgdGFnLWNhcGFibGUgcmVzb3VyY2UgaW4gYSBjb25zdHJ1Y3QgdHJlZS5cbiAqXG4gKiBVcGRhdGVkIGZvciBDREsgdjIuMjA2LjArIGNvbXBhdGliaWxpdHk6XG4gKiAtIEF2b2lkcyB1c2luZyBhbnkgdGFnZ2luZyBBUElzIGR1cmluZyBhc3BlY3QgdmlzaXRhdGlvbiB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gKiAtIFVzZXMgYSBzeW50aGVzaXMtdGltZSBhcHByb2FjaCB0byBtb2RpZnkgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzXG4gKiAtIE1haW50YWlucyB0aGUgc2FtZSBjbGVhbiBBUEkgYW5kIGF1dG9tYXRpYyB0YWdnaW5nIGJlbmVmaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZFRhZ3NBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFnZ2VkUmVzb3VyY2VzID0gbmV3IFdlYWtTZXQ8SUNvbnN0cnVjdD4oKTtcblxuICBjb25zdHJ1Y3RvcihyZXF1aXJlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnJlcXVpcmVkVGFncyA9IHJlcXVpcmVkVGFncztcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgaWYgKHRoaXMudGFnZ2VkUmVzb3VyY2VzLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgTDEgKENGTikgcmVzb3VyY2VzIG9ubHlcbiAgICBpZiAoQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShub2RlKSkge1xuICAgICAgdGhpcy5wcm9jZXNzQ2ZuUmVzb3VyY2Uobm9kZSBhcyBDZm5SZXNvdXJjZSk7XG4gICAgICB0aGlzLnRhZ2dlZFJlc291cmNlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2ZuUmVzb3VyY2UocmVzb3VyY2U6IENmblJlc291cmNlKTogdm9pZCB7XG4gICAgLy8gU2tpcCBTZWNyZXRSb3RhdGlvbiByZXNvdXJjZXMgYXMgdGhleSBjcmVhdGUgbmVzdGVkIHN0YWNrcyB3aXRoIGRpZmZlcmVudCB0YWcgcmVxdWlyZW1lbnRzXG4gICAgaWYgKHJlc291cmNlLm5vZGUucGF0aC5pbmNsdWRlcyhcIlNlY3JldFJvdGF0aW9uXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29tcHJlaGVuc2l2ZSBsaXN0IG9mIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0YWdzXG4gICAgLy8gVGhpcyBsaXN0IGlzIGJhc2VkIG9uIEFXUyBDbG91ZEZvcm1hdGlvbiBkb2N1bWVudGF0aW9uIGFuZCBrbm93biBsaW1pdGF0aW9uc1xuICAgIGNvbnN0IHVuc3VwcG9ydGVkVHlwZXMgPSBbXG4gICAgICAvLyBBQ01cbiAgICAgIFwiQVdTOjpDZXJ0aWZpY2F0ZU1hbmFnZXI6OkFjY291bnRcIixcblxuICAgICAgLy8gQVBJIEdhdGV3YXlcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpBY2NvdW50XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6QmFzZVBhdGhNYXBwaW5nXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6RGVwbG95bWVudFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OkRvY3VtZW50YXRpb25QYXJ0XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6RG9jdW1lbnRhdGlvblZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpHYXRld2F5UmVzcG9uc2VcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNb2RlbFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlcXVlc3RWYWxpZGF0b3JcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpSZXNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpTWFwcGluZ1wiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXV0aG9yaXplclwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6RGVwbG95bWVudFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6SW50ZWdyYXRpb25cIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5VjI6OkludGVncmF0aW9uUmVzcG9uc2VcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5VjI6Ok1vZGVsXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpSb3V0ZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6Um91dGVSZXNwb25zZVwiLFxuXG4gICAgICAvLyBBcHBTeW5jXG4gICAgICBcIkFXUzo6QXBwU3luYzo6RGF0YVNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkFwcFN5bmM6OkZ1bmN0aW9uQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OkFwcFN5bmM6OlJlc29sdmVyXCIsXG5cbiAgICAgIC8vIEF0aGVuYVxuICAgICAgXCJBV1M6OkF0aGVuYTo6UHJlcGFyZWRTdGF0ZW1lbnRcIixcblxuICAgICAgLy8gQ2xvdWRGb3JtYXRpb25cbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6Q3VzdG9tUmVzb3VyY2VcIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TWFjcm9cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TW9kdWxlRGVmYXVsdFZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TW9kdWxlVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpQdWJsaWNUeXBlVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpQdWJsaXNoZXJcIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6UmVzb3VyY2VEZWZhdWx0VmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpSZXNvdXJjZVZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6VHlwZUFjdGl2YXRpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6V2FpdENvbmRpdGlvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpXYWl0Q29uZGl0aW9uSGFuZGxlXCIsXG5cbiAgICAgIC8vIENsb3VkV2F0Y2hcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiLFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6OkFub21hbHlEZXRlY3RvclwiLFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6OkNvbXBvc2l0ZUFsYXJtXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6RGFzaGJvYXJkXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6SW5zaWdodFJ1bGVcIixcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpNZXRyaWNTdHJlYW1cIixcblxuICAgICAgLy8gQ29kZUJ1aWxkXG4gICAgICBcIkFXUzo6Q29kZUJ1aWxkOjpSZXBvcnRHcm91cFwiLFxuICAgICAgXCJBV1M6OkNvZGVCdWlsZDo6U291cmNlQ3JlZGVudGlhbFwiLFxuXG4gICAgICAvLyBDb2RlRGVwbG95XG4gICAgICBcIkFXUzo6Q29kZURlcGxveTo6RGVwbG95bWVudENvbmZpZ1wiLFxuXG4gICAgICAvLyBDb2RlUGlwZWxpbmVcbiAgICAgIFwiQVdTOjpDb2RlUGlwZWxpbmU6OkN1c3RvbUFjdGlvblR5cGVcIixcbiAgICAgIFwiQVdTOjpDb2RlUGlwZWxpbmU6OldlYmhvb2tcIixcblxuICAgICAgLy8gQ29nbml0b1xuICAgICAgXCJBV1M6OkNvZ25pdG86OklkZW50aXR5UG9vbFJvbGVBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6Q29nbml0bzo6VXNlclBvb2xDbGllbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbERvbWFpblwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sR3JvdXBcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbElkZW50aXR5UHJvdmlkZXJcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFJlc291cmNlU2VydmVyXCIsXG4gICAgICBcIkFXUzo6Q29nbml0bzo6VXNlclBvb2xSaXNrQ29uZmlndXJhdGlvbkF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVJQ3VzdG9taXphdGlvbkF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVzZXJcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVzZXJUb0dyb3VwQXR0YWNobWVudFwiLFxuXG4gICAgICAvLyBDb25maWdcbiAgICAgIFwiQVdTOjpDb25maWc6OkFnZ3JlZ2F0aW9uQXV0aG9yaXphdGlvblwiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6Q29uZmlndXJhdGlvbkFnZ3JlZ2F0b3JcIixcbiAgICAgIFwiQVdTOjpDb25maWc6OkNvbmZvcm1hbmNlUGFja1wiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6T3JnYW5pemF0aW9uQ29uZm9ybWFuY2VQYWNrXCIsXG4gICAgICBcIkFXUzo6Q29uZmlnOjpSZW1lZGlhdGlvbkNvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpDb25maWc6OlN0b3JlZFF1ZXJ5XCIsXG5cbiAgICAgIC8vIER5bmFtb0RCXG4gICAgICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCIsXG5cbiAgICAgIC8vIEVDMlxuICAgICAgXCJBV1M6OkVDMjo6Q2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0XCIsXG4gICAgICBcIkFXUzo6RUMyOjpDYXJyaWVyR2F0ZXdheVwiLFxuICAgICAgXCJBV1M6OkVDMjo6REhDUE9wdGlvbnNcIixcbiAgICAgIFwiQVdTOjpFQzI6OkVDMkZsZWV0XCIsXG4gICAgICBcIkFXUzo6RUMyOjpFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5XCIsXG4gICAgICBcIkFXUzo6RUMyOjpFSVBBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6RW5jbGF2ZUNlcnRpZmljYXRlSWFtUm9sZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpGbG93TG9nXCIsXG4gICAgICBcIkFXUzo6RUMyOjpHYXRld2F5Um91dGVUYWJsZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpJbnN0YW5jZUNvbm5lY3RFbmRwb2ludFwiLFxuICAgICAgXCJBV1M6OkVDMjo6S2V5UGFpclwiLFxuICAgICAgXCJBV1M6OkVDMjo6TGF1bmNoVGVtcGxhdGVcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW5zaWdodHNBbmFseXNpc1wiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0luc2lnaHRzUGF0aFwiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0ludGVyZmFjZUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpQbGFjZW1lbnRHcm91cFwiLFxuICAgICAgXCJBV1M6OkVDMjo6Um91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBFZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpTdWJuZXRDaWRyQmxvY2tcIixcbiAgICAgIFwiQVdTOjpFQzI6OlN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6U3VibmV0Um91dGVUYWJsZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Q29ubmVjdFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzRW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzR3JvdXBcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzSW5zdGFuY2VcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OkVDMjo6Vm9sdW1lQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDQ2lkckJsb2NrXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENESENQT3B0aW9uc0Fzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0VuZHBvaW50U2VydmljZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnNcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0dhdGV3YXlBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUE5Db25uZWN0aW9uUm91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQTkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uXCIsXG5cbiAgICAgIC8vIEVDUlxuICAgICAgXCJBV1M6OkVDUjo6UHVibGljUmVwb3NpdG9yeVwiLFxuICAgICAgXCJBV1M6OkVDUjo6UHVsbFRocm91Z2hDYWNoZVJ1bGVcIixcbiAgICAgIFwiQVdTOjpFQ1I6OlJlZ2lzdHJ5UG9saWN5XCIsXG4gICAgICBcIkFXUzo6RUNSOjpSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cIixcblxuICAgICAgLy8gRUNTXG4gICAgICBcIkFXUzo6RUNTOjpBY2NvdW50U2V0dGluZ1wiLFxuICAgICAgXCJBV1M6OkVDUzo6Q2FwYWNpdHlQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OkVDUzo6Q2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnNcIixcbiAgICAgIFwiQVdTOjpFQ1M6OlByaW1hcnlUYXNrU2V0XCIsXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrU2V0XCIsXG5cbiAgICAgIC8vIEVGU1xuICAgICAgXCJBV1M6OkVGUzo6QWNjZXNzUG9pbnRcIixcbiAgICAgIFwiQVdTOjpFRlM6Ok1vdW50VGFyZ2V0XCIsXG5cbiAgICAgIC8vIEVLU1xuICAgICAgXCJBV1M6OkVLUzo6QWRkb25cIixcbiAgICAgIFwiQVdTOjpFS1M6OkZhcmdhdGVQcm9maWxlXCIsXG4gICAgICBcIkFXUzo6RUtTOjpJZGVudGl0eVByb3ZpZGVyQ29uZmlnXCIsXG5cbiAgICAgIC8vIEVsYXN0aUNhY2hlXG4gICAgICBcIkFXUzo6RWxhc3RpQ2FjaGU6OlBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpQ2FjaGU6OlNlY3VyaXR5R3JvdXBcIixcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6U3VibmV0R3JvdXBcIixcblxuICAgICAgLy8gRWxhc3RpY0JlYW5zdGFsa1xuICAgICAgXCJBV1M6OkVsYXN0aWNCZWFuc3RhbGs6OkFwcGxpY2F0aW9uVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkVsYXN0aWNCZWFuc3RhbGs6OkNvbmZpZ3VyYXRpb25UZW1wbGF0ZVwiLFxuXG4gICAgICAvLyBFbGFzdGljTG9hZEJhbGFuY2luZ1YyXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXJcIixcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lckNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXJSdWxlXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6VGFyZ2V0R3JvdXBBdHRhY2htZW50XCIsXG5cbiAgICAgIC8vIEV2ZW50QnJpZGdlIChFdmVudHMpXG4gICAgICBcIkFXUzo6RXZlbnRzOjpBcGlEZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6QXJjaGl2ZVwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6Q29ubmVjdGlvblwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6RW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpFdmVudHM6OkV2ZW50QnVzUG9saWN5XCIsXG4gICAgICBcIkFXUzo6RXZlbnRzOjpSdWxlXCIsXG5cbiAgICAgIC8vIEZTeFxuICAgICAgXCJBV1M6OkZTeDo6RGF0YVJlcG9zaXRvcnlBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkZTeDo6U25hcHNob3RcIixcbiAgICAgIFwiQVdTOjpGU3g6OlN0b3JhZ2VWaXJ0dWFsTWFjaGluZVwiLFxuICAgICAgXCJBV1M6OkZTeDo6Vm9sdW1lXCIsXG5cbiAgICAgIC8vIEdhbWVMaWZ0XG4gICAgICBcIkFXUzo6R2FtZUxpZnQ6OkdhbWVTZXJ2ZXJHcm91cFwiLFxuICAgICAgXCJBV1M6OkdhbWVMaWZ0OjpMb2NhdGlvblwiLFxuXG4gICAgICAvLyBHbHVlXG4gICAgICBcIkFXUzo6R2x1ZTo6Q29ubmVjdGlvblwiLFxuICAgICAgXCJBV1M6OkdsdWU6OkRhdGFiYXNlXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6RGF0YUNhdGFsb2dFbmNyeXB0aW9uU2V0dGluZ3NcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpQYXJ0aXRpb25cIixcbiAgICAgIFwiQVdTOjpHbHVlOjpTY2hlbWFWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6U2NoZW1hVmVyc2lvbk1ldGFkYXRhXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6U2VjdXJpdHlDb25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6VGFibGVcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpVc2VyRGVmaW5lZEZ1bmN0aW9uXCIsXG5cbiAgICAgIC8vIEd1YXJkRHV0eVxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6RGV0ZWN0b3JcIixcbiAgICAgIFwiQVdTOjpHdWFyZER1dHk6OkZpbHRlclwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpHdWFyZER1dHk6Ok1hc3RlclwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6TWVtYmVyXCIsXG4gICAgICBcIkFXUzo6R3VhcmREdXR5OjpUaHJlYXRJbnRlbFNldFwiLFxuXG4gICAgICAvLyBJQU1cbiAgICAgIFwiQVdTOjpJQU06OkFjY2Vzc0tleVwiLFxuICAgICAgXCJBV1M6OklBTTo6R3JvdXBcIixcbiAgICAgIFwiQVdTOjpJQU06Okdyb3VwUG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpJbnN0YW5jZVByb2ZpbGVcIixcbiAgICAgIFwiQVdTOjpJQU06Ok1hbmFnZWRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06Ok9JRENQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OklBTTo6UG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlUG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpTQU1MUHJvdmlkZXJcIixcbiAgICAgIFwiQVdTOjpJQU06OlNlcnZlckNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclBvbGljeVwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclRvR3JvdXBBZGRpdGlvblwiLFxuICAgICAgXCJBV1M6OklBTTo6VmlydHVhbE1GQURldmljZVwiLFxuXG4gICAgICAvLyBJb1RcbiAgICAgIFwiQVdTOjpJb1Q6OkFjY291bnRBdWRpdENvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpJb1Q6OkF1dGhvcml6ZXJcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpDdXN0b21NZXRyaWNcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkRpbWVuc2lvblwiLFxuICAgICAgXCJBV1M6OklvVDo6RG9tYWluQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OklvVDo6RmxlZXRNZXRyaWNcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkpvYlRlbXBsYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpMb2dnaW5nXCIsXG4gICAgICBcIkFXUzo6SW9UOjpNaXRpZ2F0aW9uQWN0aW9uXCIsXG4gICAgICBcIkFXUzo6SW9UOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlBvbGljeVByaW5jaXBhbEF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlByb3Zpc2lvbmluZ1RlbXBsYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpSZXNvdXJjZVNwZWNpZmljTG9nZ2luZ1wiLFxuICAgICAgXCJBV1M6OklvVDo6Um9sZUFsaWFzXCIsXG4gICAgICBcIkFXUzo6SW9UOjpTY2hlZHVsZWRBdWRpdFwiLFxuICAgICAgXCJBV1M6OklvVDo6U2VjdXJpdHlQcm9maWxlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ1wiLFxuICAgICAgXCJBV1M6OklvVDo6VGhpbmdHcm91cFwiLFxuICAgICAgXCJBV1M6OklvVDo6VGhpbmdQcmluY2lwYWxBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ1R5cGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlRvcGljUnVsZVwiLFxuICAgICAgXCJBV1M6OklvVDo6VG9waWNSdWxlRGVzdGluYXRpb25cIixcblxuICAgICAgLy8gS01TXG4gICAgICBcIkFXUzo6S01TOjpBbGlhc1wiLFxuICAgICAgXCJBV1M6OktNUzo6R3JhbnRcIixcbiAgICAgIFwiQVdTOjpLTVM6OlJlcGxpY2FLZXlcIixcblxuICAgICAgLy8gTGFtYmRhXG4gICAgICBcIkFXUzo6TGFtYmRhOjpDb2RlU2lnbmluZ0NvbmZpZ1wiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6RXZlbnRJbnZva2VDb25maWdcIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OkV2ZW50U291cmNlTWFwcGluZ1wiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6TGF5ZXJWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpMYXllclZlcnNpb25QZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpQZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpQcm92aXNpb25lZENvbmN1cnJlbmN5Q29uZmlnXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpVcmxcIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OlZlcnNpb25cIixcblxuICAgICAgLy8gTG9nc1xuICAgICAgXCJBV1M6OkxvZ3M6OkFjY291bnRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpEZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIsXG4gICAgICBcIkFXUzo6TG9nczo6TG9nU3RyZWFtXCIsXG4gICAgICBcIkFXUzo6TG9nczo6TWV0cmljRmlsdGVyXCIsXG4gICAgICBcIkFXUzo6TG9nczo6UXVlcnlEZWZpbml0aW9uXCIsXG4gICAgICBcIkFXUzo6TG9nczo6UmVzb3VyY2VQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpTdWJzY3JpcHRpb25GaWx0ZXJcIixcblxuICAgICAgLy8gTWFjaWVcbiAgICAgIFwiQVdTOjpNYWNpZTo6QWxsb3dMaXN0XCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OkN1c3RvbURhdGFJZGVudGlmaWVyXCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OkZpbmRpbmdzRmlsdGVyXCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OlNlc3Npb25cIixcblxuICAgICAgLy8gTmVwdHVuZVxuICAgICAgXCJBV1M6Ok5lcHR1bmU6OkRCQ2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6TmVwdHVuZTo6REJQYXJhbWV0ZXJHcm91cFwiLFxuICAgICAgXCJBV1M6Ok5lcHR1bmU6OkRCU3VibmV0R3JvdXBcIixcblxuICAgICAgLy8gT3JnYW5pemF0aW9uc1xuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6OkFjY291bnRcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpPcmdhbml6YXRpb25cIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpPcmdhbml6YXRpb25hbFVuaXRcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpSZXNvdXJjZVBvbGljeVwiLFxuXG4gICAgICAvLyBSRFNcbiAgICAgIFwiQVdTOjpSRFM6OkRCQ2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlByb3h5RW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCUHJveHlUYXJnZXRHcm91cFwiLFxuICAgICAgXCJBV1M6OlJEUzo6REJTZWN1cml0eUdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlN1Ym5ldEdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpFdmVudFN1YnNjcmlwdGlvblwiLFxuICAgICAgXCJBV1M6OlJEUzo6R2xvYmFsQ2x1c3RlclwiLFxuICAgICAgXCJBV1M6OlJEUzo6T3B0aW9uR3JvdXBcIixcblxuICAgICAgLy8gUmVkc2hpZnRcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6Q2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkNsdXN0ZXJTZWN1cml0eUdyb3VwXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkNsdXN0ZXJTZWN1cml0eUdyb3VwSW5ncmVzc1wiLFxuICAgICAgXCJBV1M6OlJlZHNoaWZ0OjpDbHVzdGVyU3VibmV0R3JvdXBcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6RW5kcG9pbnRBY2Nlc3NcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6RW5kcG9pbnRBdXRob3JpemF0aW9uXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkV2ZW50U3Vic2NyaXB0aW9uXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OlNjaGVkdWxlZEFjdGlvblwiLFxuXG4gICAgICAvLyBSb3V0ZTUzXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6RE5TU0VDXCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6SGVhbHRoQ2hlY2tcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6S2V5U2lnbmluZ0tleVwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldEdyb3VwXCIsXG5cbiAgICAgIC8vIFJvdXRlNTNSZXNvbHZlclxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6RmlyZXdhbGxEb21haW5MaXN0XCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpGaXJld2FsbFJ1bGVHcm91cFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6RmlyZXdhbGxSdWxlR3JvdXBBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJDb25maWdcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzUmVzb2x2ZXI6OlJlc29sdmVyRE5TU0VDQ29uZmlnXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclF1ZXJ5TG9nZ2luZ0NvbmZpZ1wiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJRdWVyeUxvZ2dpbmdDb25maWdBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJSdWxlXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclJ1bGVBc3NvY2lhdGlvblwiLFxuXG4gICAgICAvLyBTM1xuICAgICAgXCJBV1M6OlMzOjpBY2Nlc3NQb2ludFwiLFxuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpTMzo6TXVsdGlSZWdpb25BY2Nlc3NQb2ludFwiLFxuICAgICAgXCJBV1M6OlMzOjpNdWx0aVJlZ2lvbkFjY2Vzc1BvaW50UG9saWN5XCIsXG4gICAgICBcIkFXUzo6UzM6OlN0b3JhZ2VMZW5zXCIsXG5cbiAgICAgIC8vIFNEQlxuICAgICAgXCJBV1M6OlNEQjo6RG9tYWluXCIsXG5cbiAgICAgIC8vIFNlY3JldHNNYW5hZ2VyXG4gICAgICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlJlc291cmNlUG9saWN5XCIsXG4gICAgICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlJvdGF0aW9uU2NoZWR1bGVcIixcbiAgICAgIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0VGFyZ2V0QXR0YWNobWVudFwiLFxuXG4gICAgICAvLyBTZWN1cml0eUh1YlxuICAgICAgXCJBV1M6OlNlY3VyaXR5SHViOjpIdWJcIixcblxuICAgICAgLy8gU2VydmljZUNhdGFsb2dcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6QWNjZXB0ZWRQb3J0Zm9saW9TaGFyZVwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpMYXVuY2hOb3RpZmljYXRpb25Db25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OkxhdW5jaFJvbGVDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OkxhdW5jaFRlbXBsYXRlQ29uc3RyYWludFwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpQb3J0Zm9saW9QcmluY2lwYWxBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpQb3J0Zm9saW9Qcm9kdWN0QXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6UG9ydGZvbGlvU2hhcmVcIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6UmVzb3VyY2VVcGRhdGVDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlNlcnZpY2VBY3Rpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6U2VydmljZUFjdGlvbkFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlN0YWNrU2V0Q29uc3RyYWludFwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpUYWdPcHRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6VGFnT3B0aW9uQXNzb2NpYXRpb25cIixcblxuICAgICAgLy8gU0VTXG4gICAgICBcIkFXUzo6U0VTOjpDb25maWd1cmF0aW9uU2V0XCIsXG4gICAgICBcIkFXUzo6U0VTOjpDb25maWd1cmF0aW9uU2V0RXZlbnREZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OlNFUzo6Q29udGFjdExpc3RcIixcbiAgICAgIFwiQVdTOjpTRVM6OkRlZGljYXRlZElwUG9vbFwiLFxuICAgICAgXCJBV1M6OlNFUzo6RW1haWxJZGVudGl0eVwiLFxuICAgICAgXCJBV1M6OlNFUzo6UmVjZWlwdEZpbHRlclwiLFxuICAgICAgXCJBV1M6OlNFUzo6UmVjZWlwdFJ1bGVcIixcbiAgICAgIFwiQVdTOjpTRVM6OlJlY2VpcHRSdWxlU2V0XCIsXG4gICAgICBcIkFXUzo6U0VTOjpUZW1wbGF0ZVwiLFxuICAgICAgXCJBV1M6OlNFUzo6VmRtQXR0cmlidXRlc1wiLFxuXG4gICAgICAvLyBTTlNcbiAgICAgIFwiQVdTOjpTTlM6OlN1YnNjcmlwdGlvblwiLFxuICAgICAgXCJBV1M6OlNOUzo6VG9waWNQb2xpY3lcIixcblxuICAgICAgLy8gU1FTXG4gICAgICBcIkFXUzo6U1FTOjpRdWV1ZVBvbGljeVwiLFxuXG4gICAgICAvLyBTU01cbiAgICAgIFwiQVdTOjpTU006OkFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6U1NNOjpEb2N1bWVudFwiLFxuICAgICAgXCJBV1M6OlNTTTo6TWFpbnRlbmFuY2VXaW5kb3dcIixcbiAgICAgIFwiQVdTOjpTU006Ok1haW50ZW5hbmNlV2luZG93VGFyZ2V0XCIsXG4gICAgICBcIkFXUzo6U1NNOjpNYWludGVuYW5jZVdpbmRvd1Rhc2tcIixcbiAgICAgIFwiQVdTOjpTU006OlBhcmFtZXRlclwiLFxuICAgICAgXCJBV1M6OlNTTTo6UGF0Y2hCYXNlbGluZVwiLFxuICAgICAgXCJBV1M6OlNTTTo6UmVzb3VyY2VEYXRhU3luY1wiLFxuICAgICAgXCJBV1M6OlNTTTo6UmVzb3VyY2VQb2xpY3lcIixcblxuICAgICAgLy8gU1NPXG4gICAgICBcIkFXUzo6U1NPOjpBc3NpZ25tZW50XCIsXG4gICAgICBcIkFXUzo6U1NPOjpJbnN0YW5jZUFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVDb25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6U1NPOjpQZXJtaXNzaW9uU2V0XCIsXG5cbiAgICAgIC8vIFN0ZXBGdW5jdGlvbnNcbiAgICAgIFwiQVdTOjpTdGVwRnVuY3Rpb25zOjpBY3Rpdml0eVwiLFxuXG4gICAgICAvLyBXQUYvV0FGdjJcbiAgICAgIFwiQVdTOjpXQUY6OkJ5dGVNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRjo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUY6OlJ1bGVcIixcbiAgICAgIFwiQVdTOjpXQUY6OlNpemVDb25zdHJhaW50U2V0XCIsXG4gICAgICBcIkFXUzo6V0FGOjpTcWxJbmplY3Rpb25NYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRjo6V2ViQUNMXCIsXG4gICAgICBcIkFXUzo6V0FGOjpYc3NNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpCeXRlTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6R2VvTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6UmF0ZUJhc2VkUnVsZVwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpSZWdleFBhdHRlcm5TZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6UnVsZVwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpTaXplQ29uc3RyYWludFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpTcWxJbmplY3Rpb25NYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpXZWJBQ0xcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6V2ViQUNMQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6WHNzTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6TG9nZ2luZ0NvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6UmVnZXhQYXR0ZXJuU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGdjI6OlJ1bGVHcm91cFwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpXZWJBQ0xcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6V2ViQUNMQXNzb2NpYXRpb25cIixcblxuICAgICAgLy8gU2VydmVybGVzc1xuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6OkFwaVwiLFxuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6OkFwcGxpY2F0aW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6RnVuY3Rpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpIdHRwQXBpXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6TGF5ZXJWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6U2ltcGxlVGFibGVcIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpTdGF0ZU1hY2hpbmVcIlxuICAgIF07XG5cbiAgICBpZiAodW5zdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhyZXNvdXJjZS5jZm5SZXNvdXJjZVR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgc3ludGhlc2lzIGhvb2sgdG8gbW9kaWZ5IHRoZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YocmVzb3VyY2UpO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHN0YWNrLmdldExvZ2ljYWxJZChyZXNvdXJjZSk7XG5cbiAgICAvLyBVc2UgYWRkVHJhbnNmb3JtIHRvIGFkZCB0YWdzIGR1cmluZyBzeW50aGVzaXNcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKFwiVGFnc1wiLCB0aGlzLmJ1aWxkVGFnc0FycmF5KHJlc291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGFnc0FycmF5KHJlc291cmNlOiBDZm5SZXNvdXJjZSk6IGFueVtdIHtcbiAgICBjb25zdCB0YWdNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgLy8gQWRkIElQQU0gcG9vbCB0YWcgZm9yIFZQQ3Mgd2l0aCBJUEFNIGNvbmZpZ3VyYXRpb25cbiAgICBpZiAocmVzb3VyY2UuY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6RUMyOjpWUENcIikge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IChyZXNvdXJjZSBhcyBhbnkpLmNmblByb3BlcnRpZXMgfHwge307XG4gICAgICBpZiAocHJvcGVydGllcy5pcHY0SXBhbVBvb2xJZCkge1xuICAgICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHJlc291cmNlKTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gc3RhY2subm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudElkXCIpO1xuICAgICAgICBjb25zdCByZWdpb24gPSBzdGFjay5yZWdpb247XG4gICAgICAgIGlmIChhY2NvdW50SWQgJiYgcmVnaW9uKSB7XG4gICAgICAgICAgdGFnTWFwLnNldChcImZqYWxsOm9wZXJhdGlvbnM6cG9vbFwiLCBgJHthY2NvdW50SWR9LSR7cmVnaW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbmRhcmQgdGFnc1xuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVxdWlyZWRUYWdzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRhZ01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIENsb3VkRm9ybWF0aW9uIGZvcm1hdFxuICAgIHJldHVybiBBcnJheS5mcm9tKHRhZ01hcC5lbnRyaWVzKCkpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgS2V5OiBrZXksXG4gICAgICBWYWx1ZTogdmFsdWVcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ==
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRUYWdzQXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEQ7QUFHMUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsa0JBQWtCO0lBSTdCLFlBQVksWUFBdUM7UUFGbEMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzNELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLHlCQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQW1CLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQXFCO1FBQzlDLDZGQUE2RjtRQUM3RixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDbEQsT0FBTztRQUNULENBQUM7UUFFRCw4RUFBOEU7UUFDOUUsK0VBQStFO1FBQy9FLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsTUFBTTtZQUNOLGtDQUFrQztZQUVsQyxjQUFjO1lBQ2QsMEJBQTBCO1lBQzFCLGtDQUFrQztZQUNsQyw2QkFBNkI7WUFDN0Isb0NBQW9DO1lBQ3BDLHVDQUF1QztZQUN2QyxrQ0FBa0M7WUFDbEMseUJBQXlCO1lBQ3pCLHdCQUF3QjtZQUN4QixtQ0FBbUM7WUFDbkMsMkJBQTJCO1lBQzNCLCtCQUErQjtZQUMvQiwrQkFBK0I7WUFDL0IsK0JBQStCO1lBQy9CLGdDQUFnQztZQUNoQyx3Q0FBd0M7WUFDeEMsMEJBQTBCO1lBQzFCLDBCQUEwQjtZQUMxQixrQ0FBa0M7WUFFbEMsVUFBVTtZQUNWLDBCQUEwQjtZQUMxQixxQ0FBcUM7WUFDckMsd0JBQXdCO1lBRXhCLFNBQVM7WUFDVCxnQ0FBZ0M7WUFFaEMsaUJBQWlCO1lBQ2pCLHFDQUFxQztZQUNyQyw0QkFBNEI7WUFDNUIsMkNBQTJDO1lBQzNDLG9DQUFvQztZQUNwQyx3Q0FBd0M7WUFDeEMsZ0NBQWdDO1lBQ2hDLDZDQUE2QztZQUM3QyxzQ0FBc0M7WUFDdEMscUNBQXFDO1lBQ3JDLG9DQUFvQztZQUNwQywwQ0FBMEM7WUFFMUMsYUFBYTtZQUNiLHdCQUF3QjtZQUN4QixrQ0FBa0M7WUFDbEMsaUNBQWlDO1lBQ2pDLDRCQUE0QjtZQUM1Qiw4QkFBOEI7WUFDOUIsK0JBQStCO1lBRS9CLFlBQVk7WUFDWiw2QkFBNkI7WUFDN0Isa0NBQWtDO1lBRWxDLGFBQWE7WUFDYixtQ0FBbUM7WUFFbkMsZUFBZTtZQUNmLHFDQUFxQztZQUNyQyw0QkFBNEI7WUFFNUIsVUFBVTtZQUNWLDBDQUEwQztZQUMxQyw4QkFBOEI7WUFDOUIsOEJBQThCO1lBQzlCLDZCQUE2QjtZQUM3Qix3Q0FBd0M7WUFDeEMsc0NBQXNDO1lBQ3RDLG1EQUFtRDtZQUNuRCxpREFBaUQ7WUFDakQsNEJBQTRCO1lBQzVCLDZDQUE2QztZQUU3QyxTQUFTO1lBQ1QsdUNBQXVDO1lBQ3ZDLHNDQUFzQztZQUN0Qyw4QkFBOEI7WUFDOUIsMENBQTBDO1lBQzFDLHVDQUF1QztZQUN2QywwQkFBMEI7WUFFMUIsV0FBVztZQUNYLDRCQUE0QjtZQUU1QixNQUFNO1lBQ04sb0NBQW9DO1lBQ3BDLDBCQUEwQjtZQUMxQix1QkFBdUI7WUFDdkIsb0JBQW9CO1lBQ3BCLHFDQUFxQztZQUNyQywwQkFBMEI7WUFDMUIsZ0RBQWdEO1lBQ2hELG1CQUFtQjtZQUNuQix3Q0FBd0M7WUFDeEMsbUNBQW1DO1lBQ25DLG1CQUFtQjtZQUNuQiwwQkFBMEI7WUFDMUIsc0NBQXNDO1lBQ3RDLDhDQUE4QztZQUM5QyxtQ0FBbUM7WUFDbkMsK0JBQStCO1lBQy9CLHNDQUFzQztZQUN0QyxzQ0FBc0M7WUFDdEMsMEJBQTBCO1lBQzFCLGlCQUFpQjtZQUNqQiwrQkFBK0I7WUFDL0IsZ0NBQWdDO1lBQ2hDLDJCQUEyQjtZQUMzQix1Q0FBdUM7WUFDdkMsdUNBQXVDO1lBQ3ZDLG9DQUFvQztZQUNwQyxpQ0FBaUM7WUFDakMseUNBQXlDO1lBQ3pDLG9EQUFvRDtZQUNwRCw4Q0FBOEM7WUFDOUMsOENBQThDO1lBQzlDLDJDQUEyQztZQUMzQywrQkFBK0I7WUFDL0Isb0NBQW9DO1lBQ3BDLCtDQUErQztZQUMvQywrQ0FBK0M7WUFDL0MsdUNBQXVDO1lBQ3ZDLGtDQUFrQztZQUNsQywrQkFBK0I7WUFDL0Isa0NBQWtDO1lBQ2xDLHVDQUF1QztZQUN2Qyw0QkFBNEI7WUFDNUIsd0JBQXdCO1lBQ3hCLHFDQUFxQztZQUNyQyw2Q0FBNkM7WUFDN0MsOEJBQThCO1lBQzlCLHlDQUF5QztZQUN6QyxnQ0FBZ0M7WUFDaEMsOEJBQThCO1lBQzlCLHNDQUFzQztZQUV0QyxNQUFNO1lBQ04sNEJBQTRCO1lBQzVCLGdDQUFnQztZQUNoQywwQkFBMEI7WUFDMUIsb0NBQW9DO1lBRXBDLE1BQU07WUFDTiwwQkFBMEI7WUFDMUIsNEJBQTRCO1lBQzVCLCtDQUErQztZQUMvQywwQkFBMEI7WUFDMUIsbUJBQW1CO1lBRW5CLE1BQU07WUFDTix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBRXZCLE1BQU07WUFDTixpQkFBaUI7WUFDakIsMEJBQTBCO1lBQzFCLGtDQUFrQztZQUVsQyxjQUFjO1lBQ2Qsa0NBQWtDO1lBQ2xDLGlDQUFpQztZQUNqQyx3Q0FBd0M7WUFDeEMsK0JBQStCO1lBRS9CLG1CQUFtQjtZQUNuQiwyQ0FBMkM7WUFDM0MsOENBQThDO1lBRTlDLHlCQUF5QjtZQUN6Qix1Q0FBdUM7WUFDdkMsa0RBQWtEO1lBQ2xELDJDQUEyQztZQUMzQyxvREFBb0Q7WUFFcEQsdUJBQXVCO1lBQ3ZCLDZCQUE2QjtZQUM3QixzQkFBc0I7WUFDdEIseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUN2Qiw2QkFBNkI7WUFDN0IsbUJBQW1CO1lBRW5CLE1BQU07WUFDTixxQ0FBcUM7WUFDckMsb0JBQW9CO1lBQ3BCLGlDQUFpQztZQUNqQyxrQkFBa0I7WUFFbEIsV0FBVztZQUNYLGdDQUFnQztZQUNoQyx5QkFBeUI7WUFFekIsT0FBTztZQUNQLHVCQUF1QjtZQUN2QixxQkFBcUI7WUFDckIsMENBQTBDO1lBQzFDLHNCQUFzQjtZQUN0QiwwQkFBMEI7WUFDMUIsa0NBQWtDO1lBQ2xDLGtDQUFrQztZQUNsQyxrQkFBa0I7WUFDbEIsZ0NBQWdDO1lBRWhDLFlBQVk7WUFDWiwwQkFBMEI7WUFDMUIsd0JBQXdCO1lBQ3hCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIsd0JBQXdCO1lBQ3hCLGdDQUFnQztZQUVoQyxNQUFNO1lBQ04scUJBQXFCO1lBQ3JCLGlCQUFpQjtZQUNqQix1QkFBdUI7WUFDdkIsMkJBQTJCO1lBQzNCLHlCQUF5QjtZQUN6Qix3QkFBd0I7WUFDeEIsa0JBQWtCO1lBQ2xCLGdCQUFnQjtZQUNoQixzQkFBc0I7WUFDdEIsd0JBQXdCO1lBQ3hCLDZCQUE2QjtZQUM3Qiw2QkFBNkI7WUFDN0IsZ0JBQWdCO1lBQ2hCLHNCQUFzQjtZQUN0QiwrQkFBK0I7WUFDL0IsNEJBQTRCO1lBRTVCLE1BQU07WUFDTixxQ0FBcUM7WUFDckMsc0JBQXNCO1lBQ3RCLHVCQUF1QjtZQUN2Qix3QkFBd0I7WUFDeEIscUJBQXFCO1lBQ3JCLCtCQUErQjtZQUMvQix1QkFBdUI7WUFDdkIsdUJBQXVCO1lBQ3ZCLG1CQUFtQjtZQUNuQiw0QkFBNEI7WUFDNUIsa0JBQWtCO1lBQ2xCLHFDQUFxQztZQUNyQyxnQ0FBZ0M7WUFDaEMsbUNBQW1DO1lBQ25DLHFCQUFxQjtZQUNyQiwwQkFBMEI7WUFDMUIsMkJBQTJCO1lBQzNCLGlCQUFpQjtZQUNqQixzQkFBc0I7WUFDdEIsb0NBQW9DO1lBQ3BDLHFCQUFxQjtZQUNyQixxQkFBcUI7WUFDckIsZ0NBQWdDO1lBRWhDLE1BQU07WUFDTixpQkFBaUI7WUFDakIsaUJBQWlCO1lBQ2pCLHNCQUFzQjtZQUV0QixTQUFTO1lBQ1QsZ0NBQWdDO1lBQ2hDLGdDQUFnQztZQUNoQyxpQ0FBaUM7WUFDakMsMkJBQTJCO1lBQzNCLHFDQUFxQztZQUNyQyx5QkFBeUI7WUFDekIsMkNBQTJDO1lBQzNDLGtCQUFrQjtZQUNsQixzQkFBc0I7WUFFdEIsT0FBTztZQUNQLDBCQUEwQjtZQUMxQix3QkFBd0I7WUFDeEIscUJBQXFCO1lBQ3JCLHNCQUFzQjtZQUN0Qix5QkFBeUI7WUFDekIsNEJBQTRCO1lBQzVCLDJCQUEyQjtZQUMzQiwrQkFBK0I7WUFFL0IsUUFBUTtZQUNSLHVCQUF1QjtZQUN2QixrQ0FBa0M7WUFDbEMsNEJBQTRCO1lBQzVCLHFCQUFxQjtZQUVyQixVQUFVO1lBQ1YsdUNBQXVDO1lBQ3ZDLGdDQUFnQztZQUNoQyw2QkFBNkI7WUFFN0IsZ0JBQWdCO1lBQ2hCLDZCQUE2QjtZQUM3QixrQ0FBa0M7WUFDbEMsd0NBQXdDO1lBQ3hDLDRCQUE0QjtZQUM1QixvQ0FBb0M7WUFFcEMsTUFBTTtZQUNOLG1DQUFtQztZQUNuQyw0QkFBNEI7WUFDNUIsMkJBQTJCO1lBQzNCLDhCQUE4QjtZQUM5QiwyQkFBMkI7WUFDM0Isa0NBQWtDO1lBQ2xDLHlCQUF5QjtZQUN6Qiw2QkFBNkI7WUFDN0IseUJBQXlCO1lBQ3pCLHVCQUF1QjtZQUV2QixXQUFXO1lBQ1gsc0NBQXNDO1lBQ3RDLHFDQUFxQztZQUNyQyw0Q0FBNEM7WUFDNUMsbUNBQW1DO1lBQ25DLCtCQUErQjtZQUMvQixzQ0FBc0M7WUFDdEMsa0NBQWtDO1lBQ2xDLGdDQUFnQztZQUVoQyxVQUFVO1lBQ1Ysc0JBQXNCO1lBQ3RCLDJCQUEyQjtZQUMzQiwwQkFBMEI7WUFDMUIsNkJBQTZCO1lBQzdCLHlCQUF5QjtZQUN6Qiw4QkFBOEI7WUFFOUIsa0JBQWtCO1lBQ2xCLDBDQUEwQztZQUMxQyx5Q0FBeUM7WUFDekMsb0RBQW9EO1lBQ3BELHNDQUFzQztZQUN0Qyw0Q0FBNEM7WUFDNUMsa0RBQWtEO1lBQ2xELDZEQUE2RDtZQUM3RCxvQ0FBb0M7WUFDcEMsK0NBQStDO1lBRS9DLEtBQUs7WUFDTCxzQkFBc0I7WUFDdEIsdUJBQXVCO1lBQ3ZCLGlDQUFpQztZQUNqQyx1Q0FBdUM7WUFDdkMsc0JBQXNCO1lBRXRCLE1BQU07WUFDTixrQkFBa0I7WUFFbEIsaUJBQWlCO1lBQ2pCLHFDQUFxQztZQUNyQyx1Q0FBdUM7WUFDdkMsNkNBQTZDO1lBRTdDLGNBQWM7WUFDZCx1QkFBdUI7WUFFdkIsaUJBQWlCO1lBQ2pCLDZDQUE2QztZQUM3QyxtREFBbUQ7WUFDbkQsMkNBQTJDO1lBQzNDLCtDQUErQztZQUMvQyxvREFBb0Q7WUFDcEQsa0RBQWtEO1lBQ2xELHFDQUFxQztZQUNyQywrQ0FBK0M7WUFDL0Msb0NBQW9DO1lBQ3BDLCtDQUErQztZQUMvQyx5Q0FBeUM7WUFDekMsZ0NBQWdDO1lBQ2hDLDJDQUEyQztZQUUzQyxNQUFNO1lBQ04sNEJBQTRCO1lBQzVCLDRDQUE0QztZQUM1Qyx1QkFBdUI7WUFDdkIsMkJBQTJCO1lBQzNCLHlCQUF5QjtZQUN6Qix5QkFBeUI7WUFDekIsdUJBQXVCO1lBQ3ZCLDBCQUEwQjtZQUMxQixvQkFBb0I7WUFDcEIseUJBQXlCO1lBRXpCLE1BQU07WUFDTix3QkFBd0I7WUFDeEIsdUJBQXVCO1lBRXZCLE1BQU07WUFDTix1QkFBdUI7WUFFdkIsTUFBTTtZQUNOLHVCQUF1QjtZQUN2QixvQkFBb0I7WUFDcEIsNkJBQTZCO1lBQzdCLG1DQUFtQztZQUNuQyxpQ0FBaUM7WUFDakMscUJBQXFCO1lBQ3JCLHlCQUF5QjtZQUN6Qiw0QkFBNEI7WUFDNUIsMEJBQTBCO1lBRTFCLE1BQU07WUFDTixzQkFBc0I7WUFDdEIsdURBQXVEO1lBQ3ZELHlCQUF5QjtZQUV6QixnQkFBZ0I7WUFDaEIsOEJBQThCO1lBRTlCLFlBQVk7WUFDWix3QkFBd0I7WUFDeEIsaUJBQWlCO1lBQ2pCLGdCQUFnQjtZQUNoQiw2QkFBNkI7WUFDN0IsZ0NBQWdDO1lBQ2hDLGtCQUFrQjtZQUNsQix1QkFBdUI7WUFDdkIsZ0NBQWdDO1lBQ2hDLCtCQUErQjtZQUMvQix5QkFBeUI7WUFDekIsaUNBQWlDO1lBQ2pDLG1DQUFtQztZQUNuQyx3QkFBd0I7WUFDeEIscUNBQXFDO1lBQ3JDLHdDQUF3QztZQUN4QywwQkFBMEI7WUFDMUIscUNBQXFDO1lBQ3JDLCtCQUErQjtZQUMvQixtQkFBbUI7WUFDbkIsa0NBQWtDO1lBQ2xDLDZCQUE2QjtZQUM3Qix1QkFBdUI7WUFDdkIsb0JBQW9CO1lBQ3BCLCtCQUErQjtZQUUvQixhQUFhO1lBQ2Isc0JBQXNCO1lBQ3RCLDhCQUE4QjtZQUM5QiwyQkFBMkI7WUFDM0IsMEJBQTBCO1lBQzFCLCtCQUErQjtZQUMvQiw4QkFBOEI7WUFDOUIsK0JBQStCO1NBQ2hDLENBQUM7UUFFRixJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPO1FBQ1QsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9DLGdEQUFnRDtRQUNoRCxRQUFRLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sY0FBYyxDQUFDLFFBQXFCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBRXpDLHFEQUFxRDtRQUNyRCxJQUFJLFFBQVEsQ0FBQyxlQUFlLEtBQUssZUFBZSxFQUFFLENBQUM7WUFDakQsTUFBTSxVQUFVLEdBQUksUUFBZ0IsQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDO1lBQ3pELElBQUksVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDakMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzVCLElBQUksU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO29CQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ2hFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHNCQUFzQjtRQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQ3pELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsbUNBQW1DO1FBQ25DLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6RCxHQUFHLEVBQUUsR0FBRztZQUNSLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0NBQ0Y7QUFyZ0JELGdEQXFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXNwZWN0LCBDZm5SZXNvdXJjZSwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIEFzcGVjdCB0byBlbmZvcmNlIGEgc3RhbmRhcmQgc2V0IG9mIHRhZ3Mgb24gZXZlcnkgdGFnLWNhcGFibGUgcmVzb3VyY2UgaW4gYSBjb25zdHJ1Y3QgdHJlZS5cbiAqXG4gKiBVcGRhdGVkIGZvciBDREsgdjIuMjA2LjArIGNvbXBhdGliaWxpdHk6XG4gKiAtIEF2b2lkcyB1c2luZyBhbnkgdGFnZ2luZyBBUElzIGR1cmluZyBhc3BlY3QgdmlzaXRhdGlvbiB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gKiAtIFVzZXMgYSBzeW50aGVzaXMtdGltZSBhcHByb2FjaCB0byBtb2RpZnkgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzXG4gKiAtIE1haW50YWlucyB0aGUgc2FtZSBjbGVhbiBBUEkgYW5kIGF1dG9tYXRpYyB0YWdnaW5nIGJlbmVmaXRzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZFRhZ3NBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1aXJlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFnZ2VkUmVzb3VyY2VzID0gbmV3IFdlYWtTZXQ8SUNvbnN0cnVjdD4oKTtcblxuICBjb25zdHJ1Y3RvcihyZXF1aXJlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnJlcXVpcmVkVGFncyA9IHJlcXVpcmVkVGFncztcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgaWYgKHRoaXMudGFnZ2VkUmVzb3VyY2VzLmhhcyhub2RlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgTDEgKENGTikgcmVzb3VyY2VzIG9ubHlcbiAgICBpZiAoQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShub2RlKSkge1xuICAgICAgdGhpcy5wcm9jZXNzQ2ZuUmVzb3VyY2Uobm9kZSBhcyBDZm5SZXNvdXJjZSk7XG4gICAgICB0aGlzLnRhZ2dlZFJlc291cmNlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2ZuUmVzb3VyY2UocmVzb3VyY2U6IENmblJlc291cmNlKTogdm9pZCB7XG4gICAgLy8gU2tpcCBTZWNyZXRSb3RhdGlvbiByZXNvdXJjZXMgYXMgdGhleSBjcmVhdGUgbmVzdGVkIHN0YWNrcyB3aXRoIGRpZmZlcmVudCB0YWcgcmVxdWlyZW1lbnRzXG4gICAgaWYgKHJlc291cmNlLm5vZGUucGF0aC5pbmNsdWRlcyhcIlNlY3JldFJvdGF0aW9uXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ29tcHJlaGVuc2l2ZSBsaXN0IG9mIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0YWdzXG4gICAgLy8gVGhpcyBsaXN0IGlzIGJhc2VkIG9uIEFXUyBDbG91ZEZvcm1hdGlvbiBkb2N1bWVudGF0aW9uIGFuZCBrbm93biBsaW1pdGF0aW9uc1xuICAgIGNvbnN0IHVuc3VwcG9ydGVkVHlwZXMgPSBbXG4gICAgICAvLyBBQ01cbiAgICAgIFwiQVdTOjpDZXJ0aWZpY2F0ZU1hbmFnZXI6OkFjY291bnRcIixcblxuICAgICAgLy8gQVBJIEdhdGV3YXlcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpBY2NvdW50XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6QmFzZVBhdGhNYXBwaW5nXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6RGVwbG95bWVudFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OkRvY3VtZW50YXRpb25QYXJ0XCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheTo6RG9jdW1lbnRhdGlvblZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpHYXRld2F5UmVzcG9uc2VcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNZXRob2RcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpNb2RlbFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXk6OlJlcXVlc3RWYWxpZGF0b3JcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5OjpSZXNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpTWFwcGluZ1wiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXV0aG9yaXplclwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6RGVwbG95bWVudFwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6SW50ZWdyYXRpb25cIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5VjI6OkludGVncmF0aW9uUmVzcG9uc2VcIixcbiAgICAgIFwiQVdTOjpBcGlHYXRld2F5VjI6Ok1vZGVsXCIsXG4gICAgICBcIkFXUzo6QXBpR2F0ZXdheVYyOjpSb3V0ZVwiLFxuICAgICAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6Um91dGVSZXNwb25zZVwiLFxuXG4gICAgICAvLyBBcHBTeW5jXG4gICAgICBcIkFXUzo6QXBwU3luYzo6RGF0YVNvdXJjZVwiLFxuICAgICAgXCJBV1M6OkFwcFN5bmM6OkZ1bmN0aW9uQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OkFwcFN5bmM6OlJlc29sdmVyXCIsXG5cbiAgICAgIC8vIEF0aGVuYVxuICAgICAgXCJBV1M6OkF0aGVuYTo6UHJlcGFyZWRTdGF0ZW1lbnRcIixcblxuICAgICAgLy8gQ2xvdWRGb3JtYXRpb25cbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6Q3VzdG9tUmVzb3VyY2VcIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TWFjcm9cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TW9kdWxlRGVmYXVsdFZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6TW9kdWxlVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpQdWJsaWNUeXBlVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpQdWJsaXNoZXJcIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6UmVzb3VyY2VEZWZhdWx0VmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpSZXNvdXJjZVZlcnNpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6VHlwZUFjdGl2YXRpb25cIixcbiAgICAgIFwiQVdTOjpDbG91ZEZvcm1hdGlvbjo6V2FpdENvbmRpdGlvblwiLFxuICAgICAgXCJBV1M6OkNsb3VkRm9ybWF0aW9uOjpXYWl0Q29uZGl0aW9uSGFuZGxlXCIsXG5cbiAgICAgIC8vIENsb3VkV2F0Y2hcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiLFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6OkFub21hbHlEZXRlY3RvclwiLFxuICAgICAgXCJBV1M6OkNsb3VkV2F0Y2g6OkNvbXBvc2l0ZUFsYXJtXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6RGFzaGJvYXJkXCIsXG4gICAgICBcIkFXUzo6Q2xvdWRXYXRjaDo6SW5zaWdodFJ1bGVcIixcbiAgICAgIFwiQVdTOjpDbG91ZFdhdGNoOjpNZXRyaWNTdHJlYW1cIixcblxuICAgICAgLy8gQ29kZUJ1aWxkXG4gICAgICBcIkFXUzo6Q29kZUJ1aWxkOjpSZXBvcnRHcm91cFwiLFxuICAgICAgXCJBV1M6OkNvZGVCdWlsZDo6U291cmNlQ3JlZGVudGlhbFwiLFxuXG4gICAgICAvLyBDb2RlRGVwbG95XG4gICAgICBcIkFXUzo6Q29kZURlcGxveTo6RGVwbG95bWVudENvbmZpZ1wiLFxuXG4gICAgICAvLyBDb2RlUGlwZWxpbmVcbiAgICAgIFwiQVdTOjpDb2RlUGlwZWxpbmU6OkN1c3RvbUFjdGlvblR5cGVcIixcbiAgICAgIFwiQVdTOjpDb2RlUGlwZWxpbmU6OldlYmhvb2tcIixcblxuICAgICAgLy8gQ29nbml0b1xuICAgICAgXCJBV1M6OkNvZ25pdG86OklkZW50aXR5UG9vbFJvbGVBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6Q29nbml0bzo6VXNlclBvb2xDbGllbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbERvbWFpblwiLFxuICAgICAgXCJBV1M6OkNvZ25pdG86OlVzZXJQb29sR3JvdXBcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbElkZW50aXR5UHJvdmlkZXJcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFJlc291cmNlU2VydmVyXCIsXG4gICAgICBcIkFXUzo6Q29nbml0bzo6VXNlclBvb2xSaXNrQ29uZmlndXJhdGlvbkF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVJQ3VzdG9taXphdGlvbkF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVzZXJcIixcbiAgICAgIFwiQVdTOjpDb2duaXRvOjpVc2VyUG9vbFVzZXJUb0dyb3VwQXR0YWNobWVudFwiLFxuXG4gICAgICAvLyBDb25maWdcbiAgICAgIFwiQVdTOjpDb25maWc6OkFnZ3JlZ2F0aW9uQXV0aG9yaXphdGlvblwiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6Q29uZmlndXJhdGlvbkFnZ3JlZ2F0b3JcIixcbiAgICAgIFwiQVdTOjpDb25maWc6OkNvbmZvcm1hbmNlUGFja1wiLFxuICAgICAgXCJBV1M6OkNvbmZpZzo6T3JnYW5pemF0aW9uQ29uZm9ybWFuY2VQYWNrXCIsXG4gICAgICBcIkFXUzo6Q29uZmlnOjpSZW1lZGlhdGlvbkNvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpDb25maWc6OlN0b3JlZFF1ZXJ5XCIsXG5cbiAgICAgIC8vIER5bmFtb0RCXG4gICAgICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCIsXG5cbiAgICAgIC8vIEVDMlxuICAgICAgXCJBV1M6OkVDMjo6Q2FwYWNpdHlSZXNlcnZhdGlvbkZsZWV0XCIsXG4gICAgICBcIkFXUzo6RUMyOjpDYXJyaWVyR2F0ZXdheVwiLFxuICAgICAgXCJBV1M6OkVDMjo6REhDUE9wdGlvbnNcIixcbiAgICAgIFwiQVdTOjpFQzI6OkVDMkZsZWV0XCIsXG4gICAgICBcIkFXUzo6RUMyOjpFZ3Jlc3NPbmx5SW50ZXJuZXRHYXRld2F5XCIsXG4gICAgICBcIkFXUzo6RUMyOjpFSVBBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6RW5jbGF2ZUNlcnRpZmljYXRlSWFtUm9sZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpGbG93TG9nXCIsXG4gICAgICBcIkFXUzo6RUMyOjpHYXRld2F5Um91dGVUYWJsZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpJbnN0YW5jZUNvbm5lY3RFbmRwb2ludFwiLFxuICAgICAgXCJBV1M6OkVDMjo6S2V5UGFpclwiLFxuICAgICAgXCJBV1M6OkVDMjo6TGF1bmNoVGVtcGxhdGVcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnNpZ2h0c0FjY2Vzc1Njb3BlXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW5zaWdodHNBY2Nlc3NTY29wZUFuYWx5c2lzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpOZXR3b3JrSW5zaWdodHNBbmFseXNpc1wiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0luc2lnaHRzUGF0aFwiLFxuICAgICAgXCJBV1M6OkVDMjo6TmV0d29ya0ludGVyZmFjZUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6Ok5ldHdvcmtJbnRlcmZhY2VQZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpQbGFjZW1lbnRHcm91cFwiLFxuICAgICAgXCJBV1M6OkVDMjo6Um91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBFZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFQzI6OlNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6RUMyOjpTdWJuZXRDaWRyQmxvY2tcIixcbiAgICAgIFwiQVdTOjpFQzI6OlN1Ym5ldE5ldHdvcmtBY2xBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkVDMjo6U3VibmV0Um91dGVUYWJsZUFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheUF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Q29ubmVjdFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlNdWx0aWNhc3REb21haW5cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0RG9tYWluQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBNZW1iZXJcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5TXVsdGljYXN0R3JvdXBTb3VyY2VcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5UGVlcmluZ0F0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VHJhbnNpdEdhdGV3YXlSb3V0ZVRhYmxlQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlRyYW5zaXRHYXRld2F5Um91dGVUYWJsZVByb3BhZ2F0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpUcmFuc2l0R2F0ZXdheVZwY0F0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzRW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzR3JvdXBcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzSW5zdGFuY2VcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZlcmlmaWVkQWNjZXNzVHJ1c3RQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OkVDMjo6Vm9sdW1lQXR0YWNobWVudFwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDQ2lkckJsb2NrXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENESENQT3B0aW9uc0Fzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUENFbmRwb2ludENvbm5lY3Rpb25Ob3RpZmljYXRpb25cIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0VuZHBvaW50U2VydmljZVwiLFxuICAgICAgXCJBV1M6OkVDMjo6VlBDRW5kcG9pbnRTZXJ2aWNlUGVybWlzc2lvbnNcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQQ0dhdGV3YXlBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6RUMyOjpWUE5Db25uZWN0aW9uUm91dGVcIixcbiAgICAgIFwiQVdTOjpFQzI6OlZQTkdhdGV3YXlSb3V0ZVByb3BhZ2F0aW9uXCIsXG5cbiAgICAgIC8vIEVDUlxuICAgICAgXCJBV1M6OkVDUjo6UHVibGljUmVwb3NpdG9yeVwiLFxuICAgICAgXCJBV1M6OkVDUjo6UHVsbFRocm91Z2hDYWNoZVJ1bGVcIixcbiAgICAgIFwiQVdTOjpFQ1I6OlJlZ2lzdHJ5UG9saWN5XCIsXG4gICAgICBcIkFXUzo6RUNSOjpSZXBsaWNhdGlvbkNvbmZpZ3VyYXRpb25cIixcblxuICAgICAgLy8gRUNTXG4gICAgICBcIkFXUzo6RUNTOjpBY2NvdW50U2V0dGluZ1wiLFxuICAgICAgXCJBV1M6OkVDUzo6Q2FwYWNpdHlQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OkVDUzo6Q2x1c3RlckNhcGFjaXR5UHJvdmlkZXJBc3NvY2lhdGlvbnNcIixcbiAgICAgIFwiQVdTOjpFQ1M6OlByaW1hcnlUYXNrU2V0XCIsXG4gICAgICBcIkFXUzo6RUNTOjpUYXNrU2V0XCIsXG5cbiAgICAgIC8vIEVGU1xuICAgICAgXCJBV1M6OkVGUzo6QWNjZXNzUG9pbnRcIixcbiAgICAgIFwiQVdTOjpFRlM6Ok1vdW50VGFyZ2V0XCIsXG5cbiAgICAgIC8vIEVLU1xuICAgICAgXCJBV1M6OkVLUzo6QWRkb25cIixcbiAgICAgIFwiQVdTOjpFS1M6OkZhcmdhdGVQcm9maWxlXCIsXG4gICAgICBcIkFXUzo6RUtTOjpJZGVudGl0eVByb3ZpZGVyQ29uZmlnXCIsXG5cbiAgICAgIC8vIEVsYXN0aUNhY2hlXG4gICAgICBcIkFXUzo6RWxhc3RpQ2FjaGU6OlBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpQ2FjaGU6OlNlY3VyaXR5R3JvdXBcIixcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcIixcbiAgICAgIFwiQVdTOjpFbGFzdGlDYWNoZTo6U3VibmV0R3JvdXBcIixcblxuICAgICAgLy8gRWxhc3RpY0JlYW5zdGFsa1xuICAgICAgXCJBV1M6OkVsYXN0aWNCZWFuc3RhbGs6OkFwcGxpY2F0aW9uVmVyc2lvblwiLFxuICAgICAgXCJBV1M6OkVsYXN0aWNCZWFuc3RhbGs6OkNvbmZpZ3VyYXRpb25UZW1wbGF0ZVwiLFxuXG4gICAgICAvLyBFbGFzdGljTG9hZEJhbGFuY2luZ1YyXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXJcIixcbiAgICAgIFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lckNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6TGlzdGVuZXJSdWxlXCIsXG4gICAgICBcIkFXUzo6RWxhc3RpY0xvYWRCYWxhbmNpbmdWMjo6VGFyZ2V0R3JvdXBBdHRhY2htZW50XCIsXG5cbiAgICAgIC8vIEV2ZW50QnJpZGdlIChFdmVudHMpXG4gICAgICBcIkFXUzo6RXZlbnRzOjpBcGlEZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6QXJjaGl2ZVwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6Q29ubmVjdGlvblwiLFxuICAgICAgXCJBV1M6OkV2ZW50czo6RW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpFdmVudHM6OkV2ZW50QnVzUG9saWN5XCIsXG4gICAgICBcIkFXUzo6RXZlbnRzOjpSdWxlXCIsXG5cbiAgICAgIC8vIEZTeFxuICAgICAgXCJBV1M6OkZTeDo6RGF0YVJlcG9zaXRvcnlBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OkZTeDo6U25hcHNob3RcIixcbiAgICAgIFwiQVdTOjpGU3g6OlN0b3JhZ2VWaXJ0dWFsTWFjaGluZVwiLFxuICAgICAgXCJBV1M6OkZTeDo6Vm9sdW1lXCIsXG5cbiAgICAgIC8vIEdhbWVMaWZ0XG4gICAgICBcIkFXUzo6R2FtZUxpZnQ6OkdhbWVTZXJ2ZXJHcm91cFwiLFxuICAgICAgXCJBV1M6OkdhbWVMaWZ0OjpMb2NhdGlvblwiLFxuXG4gICAgICAvLyBHbHVlXG4gICAgICBcIkFXUzo6R2x1ZTo6Q29ubmVjdGlvblwiLFxuICAgICAgXCJBV1M6OkdsdWU6OkRhdGFiYXNlXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6RGF0YUNhdGFsb2dFbmNyeXB0aW9uU2V0dGluZ3NcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpQYXJ0aXRpb25cIixcbiAgICAgIFwiQVdTOjpHbHVlOjpTY2hlbWFWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6U2NoZW1hVmVyc2lvbk1ldGFkYXRhXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6U2VjdXJpdHlDb25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6R2x1ZTo6VGFibGVcIixcbiAgICAgIFwiQVdTOjpHbHVlOjpVc2VyRGVmaW5lZEZ1bmN0aW9uXCIsXG5cbiAgICAgIC8vIEd1YXJkRHV0eVxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6RGV0ZWN0b3JcIixcbiAgICAgIFwiQVdTOjpHdWFyZER1dHk6OkZpbHRlclwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpHdWFyZER1dHk6Ok1hc3RlclwiLFxuICAgICAgXCJBV1M6Okd1YXJkRHV0eTo6TWVtYmVyXCIsXG4gICAgICBcIkFXUzo6R3VhcmREdXR5OjpUaHJlYXRJbnRlbFNldFwiLFxuXG4gICAgICAvLyBJQU1cbiAgICAgIFwiQVdTOjpJQU06OkFjY2Vzc0tleVwiLFxuICAgICAgXCJBV1M6OklBTTo6R3JvdXBcIixcbiAgICAgIFwiQVdTOjpJQU06Okdyb3VwUG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpJbnN0YW5jZVByb2ZpbGVcIixcbiAgICAgIFwiQVdTOjpJQU06Ok1hbmFnZWRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJQU06Ok9JRENQcm92aWRlclwiLFxuICAgICAgXCJBV1M6OklBTTo6UG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpSb2xlUG9saWN5XCIsXG4gICAgICBcIkFXUzo6SUFNOjpTQU1MUHJvdmlkZXJcIixcbiAgICAgIFwiQVdTOjpJQU06OlNlcnZlckNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6SUFNOjpTZXJ2aWNlTGlua2VkUm9sZVwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclBvbGljeVwiLFxuICAgICAgXCJBV1M6OklBTTo6VXNlclRvR3JvdXBBZGRpdGlvblwiLFxuICAgICAgXCJBV1M6OklBTTo6VmlydHVhbE1GQURldmljZVwiLFxuXG4gICAgICAvLyBJb1RcbiAgICAgIFwiQVdTOjpJb1Q6OkFjY291bnRBdWRpdENvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpJb1Q6OkF1dGhvcml6ZXJcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkNlcnRpZmljYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpDdXN0b21NZXRyaWNcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkRpbWVuc2lvblwiLFxuICAgICAgXCJBV1M6OklvVDo6RG9tYWluQ29uZmlndXJhdGlvblwiLFxuICAgICAgXCJBV1M6OklvVDo6RmxlZXRNZXRyaWNcIixcbiAgICAgIFwiQVdTOjpJb1Q6OkpvYlRlbXBsYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpMb2dnaW5nXCIsXG4gICAgICBcIkFXUzo6SW9UOjpNaXRpZ2F0aW9uQWN0aW9uXCIsXG4gICAgICBcIkFXUzo6SW9UOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlBvbGljeVByaW5jaXBhbEF0dGFjaG1lbnRcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlByb3Zpc2lvbmluZ1RlbXBsYXRlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpSZXNvdXJjZVNwZWNpZmljTG9nZ2luZ1wiLFxuICAgICAgXCJBV1M6OklvVDo6Um9sZUFsaWFzXCIsXG4gICAgICBcIkFXUzo6SW9UOjpTY2hlZHVsZWRBdWRpdFwiLFxuICAgICAgXCJBV1M6OklvVDo6U2VjdXJpdHlQcm9maWxlXCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ1wiLFxuICAgICAgXCJBV1M6OklvVDo6VGhpbmdHcm91cFwiLFxuICAgICAgXCJBV1M6OklvVDo6VGhpbmdQcmluY2lwYWxBdHRhY2htZW50XCIsXG4gICAgICBcIkFXUzo6SW9UOjpUaGluZ1R5cGVcIixcbiAgICAgIFwiQVdTOjpJb1Q6OlRvcGljUnVsZVwiLFxuICAgICAgXCJBV1M6OklvVDo6VG9waWNSdWxlRGVzdGluYXRpb25cIixcblxuICAgICAgLy8gS01TXG4gICAgICBcIkFXUzo6S01TOjpBbGlhc1wiLFxuICAgICAgXCJBV1M6OktNUzo6R3JhbnRcIixcbiAgICAgIFwiQVdTOjpLTVM6OlJlcGxpY2FLZXlcIixcblxuICAgICAgLy8gTGFtYmRhXG4gICAgICBcIkFXUzo6TGFtYmRhOjpDb2RlU2lnbmluZ0NvbmZpZ1wiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6RXZlbnRJbnZva2VDb25maWdcIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OkV2ZW50U291cmNlTWFwcGluZ1wiLFxuICAgICAgXCJBV1M6OkxhbWJkYTo6TGF5ZXJWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpMYXllclZlcnNpb25QZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpQZXJtaXNzaW9uXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpQcm92aXNpb25lZENvbmN1cnJlbmN5Q29uZmlnXCIsXG4gICAgICBcIkFXUzo6TGFtYmRhOjpVcmxcIixcbiAgICAgIFwiQVdTOjpMYW1iZGE6OlZlcnNpb25cIixcblxuICAgICAgLy8gTG9nc1xuICAgICAgXCJBV1M6OkxvZ3M6OkFjY291bnRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpEZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OkxvZ3M6OkxvZ0dyb3VwXCIsXG4gICAgICBcIkFXUzo6TG9nczo6TG9nU3RyZWFtXCIsXG4gICAgICBcIkFXUzo6TG9nczo6TWV0cmljRmlsdGVyXCIsXG4gICAgICBcIkFXUzo6TG9nczo6UXVlcnlEZWZpbml0aW9uXCIsXG4gICAgICBcIkFXUzo6TG9nczo6UmVzb3VyY2VQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpMb2dzOjpTdWJzY3JpcHRpb25GaWx0ZXJcIixcblxuICAgICAgLy8gTWFjaWVcbiAgICAgIFwiQVdTOjpNYWNpZTo6QWxsb3dMaXN0XCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OkN1c3RvbURhdGFJZGVudGlmaWVyXCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OkZpbmRpbmdzRmlsdGVyXCIsXG4gICAgICBcIkFXUzo6TWFjaWU6OlNlc3Npb25cIixcblxuICAgICAgLy8gTmVwdHVuZVxuICAgICAgXCJBV1M6Ok5lcHR1bmU6OkRCQ2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6TmVwdHVuZTo6REJQYXJhbWV0ZXJHcm91cFwiLFxuICAgICAgXCJBV1M6Ok5lcHR1bmU6OkRCU3VibmV0R3JvdXBcIixcblxuICAgICAgLy8gT3JnYW5pemF0aW9uc1xuICAgICAgXCJBV1M6Ok9yZ2FuaXphdGlvbnM6OkFjY291bnRcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpPcmdhbml6YXRpb25cIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpPcmdhbml6YXRpb25hbFVuaXRcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpPcmdhbml6YXRpb25zOjpSZXNvdXJjZVBvbGljeVwiLFxuXG4gICAgICAvLyBSRFNcbiAgICAgIFwiQVdTOjpSRFM6OkRCQ2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlByb3h5RW5kcG9pbnRcIixcbiAgICAgIFwiQVdTOjpSRFM6OkRCUHJveHlUYXJnZXRHcm91cFwiLFxuICAgICAgXCJBV1M6OlJEUzo6REJTZWN1cml0eUdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlNlY3VyaXR5R3JvdXBJbmdyZXNzXCIsXG4gICAgICBcIkFXUzo6UkRTOjpEQlN1Ym5ldEdyb3VwXCIsXG4gICAgICBcIkFXUzo6UkRTOjpFdmVudFN1YnNjcmlwdGlvblwiLFxuICAgICAgXCJBV1M6OlJEUzo6R2xvYmFsQ2x1c3RlclwiLFxuICAgICAgXCJBV1M6OlJEUzo6T3B0aW9uR3JvdXBcIixcblxuICAgICAgLy8gUmVkc2hpZnRcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6Q2x1c3RlclBhcmFtZXRlckdyb3VwXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkNsdXN0ZXJTZWN1cml0eUdyb3VwXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkNsdXN0ZXJTZWN1cml0eUdyb3VwSW5ncmVzc1wiLFxuICAgICAgXCJBV1M6OlJlZHNoaWZ0OjpDbHVzdGVyU3VibmV0R3JvdXBcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6RW5kcG9pbnRBY2Nlc3NcIixcbiAgICAgIFwiQVdTOjpSZWRzaGlmdDo6RW5kcG9pbnRBdXRob3JpemF0aW9uXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OkV2ZW50U3Vic2NyaXB0aW9uXCIsXG4gICAgICBcIkFXUzo6UmVkc2hpZnQ6OlNjaGVkdWxlZEFjdGlvblwiLFxuXG4gICAgICAvLyBSb3V0ZTUzXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6RE5TU0VDXCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6SGVhbHRoQ2hlY2tcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXCIsXG4gICAgICBcIkFXUzo6Um91dGU1Mzo6S2V5U2lnbmluZ0tleVwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldEdyb3VwXCIsXG5cbiAgICAgIC8vIFJvdXRlNTNSZXNvbHZlclxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6RmlyZXdhbGxEb21haW5MaXN0XCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpGaXJld2FsbFJ1bGVHcm91cFwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6RmlyZXdhbGxSdWxlR3JvdXBBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJDb25maWdcIixcbiAgICAgIFwiQVdTOjpSb3V0ZTUzUmVzb2x2ZXI6OlJlc29sdmVyRE5TU0VDQ29uZmlnXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclF1ZXJ5TG9nZ2luZ0NvbmZpZ1wiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJRdWVyeUxvZ2dpbmdDb25maWdBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlJvdXRlNTNSZXNvbHZlcjo6UmVzb2x2ZXJSdWxlXCIsXG4gICAgICBcIkFXUzo6Um91dGU1M1Jlc29sdmVyOjpSZXNvbHZlclJ1bGVBc3NvY2lhdGlvblwiLFxuXG4gICAgICAvLyBTM1xuICAgICAgXCJBV1M6OlMzOjpBY2Nlc3NQb2ludFwiLFxuICAgICAgXCJBV1M6OlMzOjpCdWNrZXRQb2xpY3lcIixcbiAgICAgIFwiQVdTOjpTMzo6TXVsdGlSZWdpb25BY2Nlc3NQb2ludFwiLFxuICAgICAgXCJBV1M6OlMzOjpNdWx0aVJlZ2lvbkFjY2Vzc1BvaW50UG9saWN5XCIsXG4gICAgICBcIkFXUzo6UzM6OlN0b3JhZ2VMZW5zXCIsXG5cbiAgICAgIC8vIFNEQlxuICAgICAgXCJBV1M6OlNEQjo6RG9tYWluXCIsXG5cbiAgICAgIC8vIFNlY3JldHNNYW5hZ2VyXG4gICAgICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlJlc291cmNlUG9saWN5XCIsXG4gICAgICBcIkFXUzo6U2VjcmV0c01hbmFnZXI6OlJvdGF0aW9uU2NoZWR1bGVcIixcbiAgICAgIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0VGFyZ2V0QXR0YWNobWVudFwiLFxuXG4gICAgICAvLyBTZWN1cml0eUh1YlxuICAgICAgXCJBV1M6OlNlY3VyaXR5SHViOjpIdWJcIixcblxuICAgICAgLy8gU2VydmljZUNhdGFsb2dcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6QWNjZXB0ZWRQb3J0Zm9saW9TaGFyZVwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpMYXVuY2hOb3RpZmljYXRpb25Db25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OkxhdW5jaFJvbGVDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OkxhdW5jaFRlbXBsYXRlQ29uc3RyYWludFwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpQb3J0Zm9saW9QcmluY2lwYWxBc3NvY2lhdGlvblwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpQb3J0Zm9saW9Qcm9kdWN0QXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6UG9ydGZvbGlvU2hhcmVcIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6UmVzb3VyY2VVcGRhdGVDb25zdHJhaW50XCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlNlcnZpY2VBY3Rpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6U2VydmljZUFjdGlvbkFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmljZUNhdGFsb2c6OlN0YWNrU2V0Q29uc3RyYWludFwiLFxuICAgICAgXCJBV1M6OlNlcnZpY2VDYXRhbG9nOjpUYWdPcHRpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2aWNlQ2F0YWxvZzo6VGFnT3B0aW9uQXNzb2NpYXRpb25cIixcblxuICAgICAgLy8gU0VTXG4gICAgICBcIkFXUzo6U0VTOjpDb25maWd1cmF0aW9uU2V0XCIsXG4gICAgICBcIkFXUzo6U0VTOjpDb25maWd1cmF0aW9uU2V0RXZlbnREZXN0aW5hdGlvblwiLFxuICAgICAgXCJBV1M6OlNFUzo6Q29udGFjdExpc3RcIixcbiAgICAgIFwiQVdTOjpTRVM6OkRlZGljYXRlZElwUG9vbFwiLFxuICAgICAgXCJBV1M6OlNFUzo6RW1haWxJZGVudGl0eVwiLFxuICAgICAgXCJBV1M6OlNFUzo6UmVjZWlwdEZpbHRlclwiLFxuICAgICAgXCJBV1M6OlNFUzo6UmVjZWlwdFJ1bGVcIixcbiAgICAgIFwiQVdTOjpTRVM6OlJlY2VpcHRSdWxlU2V0XCIsXG4gICAgICBcIkFXUzo6U0VTOjpUZW1wbGF0ZVwiLFxuICAgICAgXCJBV1M6OlNFUzo6VmRtQXR0cmlidXRlc1wiLFxuXG4gICAgICAvLyBTTlNcbiAgICAgIFwiQVdTOjpTTlM6OlN1YnNjcmlwdGlvblwiLFxuICAgICAgXCJBV1M6OlNOUzo6VG9waWNQb2xpY3lcIixcblxuICAgICAgLy8gU1FTXG4gICAgICBcIkFXUzo6U1FTOjpRdWV1ZVBvbGljeVwiLFxuXG4gICAgICAvLyBTU01cbiAgICAgIFwiQVdTOjpTU006OkFzc29jaWF0aW9uXCIsXG4gICAgICBcIkFXUzo6U1NNOjpEb2N1bWVudFwiLFxuICAgICAgXCJBV1M6OlNTTTo6TWFpbnRlbmFuY2VXaW5kb3dcIixcbiAgICAgIFwiQVdTOjpTU006Ok1haW50ZW5hbmNlV2luZG93VGFyZ2V0XCIsXG4gICAgICBcIkFXUzo6U1NNOjpNYWludGVuYW5jZVdpbmRvd1Rhc2tcIixcbiAgICAgIFwiQVdTOjpTU006OlBhcmFtZXRlclwiLFxuICAgICAgXCJBV1M6OlNTTTo6UGF0Y2hCYXNlbGluZVwiLFxuICAgICAgXCJBV1M6OlNTTTo6UmVzb3VyY2VEYXRhU3luY1wiLFxuICAgICAgXCJBV1M6OlNTTTo6UmVzb3VyY2VQb2xpY3lcIixcblxuICAgICAgLy8gU1NPXG4gICAgICBcIkFXUzo6U1NPOjpBc3NpZ25tZW50XCIsXG4gICAgICBcIkFXUzo6U1NPOjpJbnN0YW5jZUFjY2Vzc0NvbnRyb2xBdHRyaWJ1dGVDb25maWd1cmF0aW9uXCIsXG4gICAgICBcIkFXUzo6U1NPOjpQZXJtaXNzaW9uU2V0XCIsXG5cbiAgICAgIC8vIFN0ZXBGdW5jdGlvbnNcbiAgICAgIFwiQVdTOjpTdGVwRnVuY3Rpb25zOjpBY3Rpdml0eVwiLFxuXG4gICAgICAvLyBXQUYvV0FGdjJcbiAgICAgIFwiQVdTOjpXQUY6OkJ5dGVNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRjo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUY6OlJ1bGVcIixcbiAgICAgIFwiQVdTOjpXQUY6OlNpemVDb25zdHJhaW50U2V0XCIsXG4gICAgICBcIkFXUzo6V0FGOjpTcWxJbmplY3Rpb25NYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRjo6V2ViQUNMXCIsXG4gICAgICBcIkFXUzo6V0FGOjpYc3NNYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpCeXRlTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6R2VvTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6UmF0ZUJhc2VkUnVsZVwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpSZWdleFBhdHRlcm5TZXRcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6UnVsZVwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpTaXplQ29uc3RyYWludFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpTcWxJbmplY3Rpb25NYXRjaFNldFwiLFxuICAgICAgXCJBV1M6OldBRlJlZ2lvbmFsOjpXZWJBQ0xcIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6V2ViQUNMQXNzb2NpYXRpb25cIixcbiAgICAgIFwiQVdTOjpXQUZSZWdpb25hbDo6WHNzTWF0Y2hTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6SVBTZXRcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6TG9nZ2luZ0NvbmZpZ3VyYXRpb25cIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6UmVnZXhQYXR0ZXJuU2V0XCIsXG4gICAgICBcIkFXUzo6V0FGdjI6OlJ1bGVHcm91cFwiLFxuICAgICAgXCJBV1M6OldBRnYyOjpXZWJBQ0xcIixcbiAgICAgIFwiQVdTOjpXQUZ2Mjo6V2ViQUNMQXNzb2NpYXRpb25cIixcblxuICAgICAgLy8gU2VydmVybGVzc1xuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6OkFwaVwiLFxuICAgICAgXCJBV1M6OlNlcnZlcmxlc3M6OkFwcGxpY2F0aW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6RnVuY3Rpb25cIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpIdHRwQXBpXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6TGF5ZXJWZXJzaW9uXCIsXG4gICAgICBcIkFXUzo6U2VydmVybGVzczo6U2ltcGxlVGFibGVcIixcbiAgICAgIFwiQVdTOjpTZXJ2ZXJsZXNzOjpTdGF0ZU1hY2hpbmVcIlxuICAgIF07XG5cbiAgICBpZiAodW5zdXBwb3J0ZWRUeXBlcy5pbmNsdWRlcyhyZXNvdXJjZS5jZm5SZXNvdXJjZVR5cGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgc3ludGhlc2lzIGhvb2sgdG8gbW9kaWZ5IHRoZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YocmVzb3VyY2UpO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHN0YWNrLmdldExvZ2ljYWxJZChyZXNvdXJjZSk7XG5cbiAgICAvLyBVc2UgYWRkVHJhbnNmb3JtIHRvIGFkZCB0YWdzIGR1cmluZyBzeW50aGVzaXNcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eU92ZXJyaWRlKFwiVGFnc1wiLCB0aGlzLmJ1aWxkVGFnc0FycmF5KHJlc291cmNlKSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkVGFnc0FycmF5KHJlc291cmNlOiBDZm5SZXNvdXJjZSk6IGFueVtdIHtcbiAgICBjb25zdCB0YWdNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gICAgLy8gQWRkIElQQU0gcG9vbCB0YWcgZm9yIFZQQ3Mgd2l0aCBJUEFNIGNvbmZpZ3VyYXRpb25cbiAgICBpZiAocmVzb3VyY2UuY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6RUMyOjpWUENcIikge1xuICAgICAgY29uc3QgcHJvcGVydGllcyA9IChyZXNvdXJjZSBhcyBhbnkpLmNmblByb3BlcnRpZXMgfHwge307XG4gICAgICBpZiAocHJvcGVydGllcy5JcHY0SXBhbVBvb2xJZCkge1xuICAgICAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHJlc291cmNlKTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gc3RhY2subm9kZS50cnlHZXRDb250ZXh0KFwiYWNjb3VudElkXCIpO1xuICAgICAgICBjb25zdCByZWdpb24gPSBzdGFjay5yZWdpb247XG4gICAgICAgIGlmIChhY2NvdW50SWQgJiYgcmVnaW9uKSB7XG4gICAgICAgICAgdGFnTWFwLnNldChcImZqYWxsOm9wZXJhdGlvbnM6cG9vbFwiLCBgJHthY2NvdW50SWR9LSR7cmVnaW9ufWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgc3RhbmRhcmQgdGFnc1xuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVxdWlyZWRUYWdzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRhZ01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDb252ZXJ0IHRvIENsb3VkRm9ybWF0aW9uIGZvcm1hdFxuICAgIHJldHVybiBBcnJheS5mcm9tKHRhZ01hcC5lbnRyaWVzKCkpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgS2V5OiBrZXksXG4gICAgICBWYWx1ZTogdmFsdWVcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { Node } from "constructs";
2
+ /**
3
+ * TagContext provides a CDK context-based approach for passing tags
4
+ * down the construct tree without using aspects.
5
+ *
6
+ * This avoids the infinite loop issue with Tags.of() creating aspects
7
+ * during the aspect visitation phase in CDK v2.206.0+
8
+ */
9
+ export declare class TagContext {
10
+ private static readonly TAG_CONTEXT_KEY;
11
+ /**
12
+ * Set tags in the context for a construct
13
+ */
14
+ static setTags(node: Node, tags: {
15
+ [key: string]: string;
16
+ }): void;
17
+ /**
18
+ * Get tags from the context, including inherited tags from parent constructs
19
+ */
20
+ static getTags(node: Node): {
21
+ [key: string]: string;
22
+ };
23
+ /**
24
+ * Apply tags from context to a construct using a safe approach
25
+ * This should be called during construction, not during synthesis
26
+ */
27
+ static applyTagsFromContext(node: Node): void;
28
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagContext = void 0;
4
+ const constructs_1 = require("constructs");
5
+ /**
6
+ * TagContext provides a CDK context-based approach for passing tags
7
+ * down the construct tree without using aspects.
8
+ *
9
+ * This avoids the infinite loop issue with Tags.of() creating aspects
10
+ * during the aspect visitation phase in CDK v2.206.0+
11
+ */
12
+ class TagContext {
13
+ /**
14
+ * Set tags in the context for a construct
15
+ */
16
+ static setTags(node, tags) {
17
+ const existingTags = this.getTags(node);
18
+ node.setContext(this.TAG_CONTEXT_KEY, {
19
+ ...existingTags,
20
+ ...tags
21
+ });
22
+ }
23
+ /**
24
+ * Get tags from the context, including inherited tags from parent constructs
25
+ */
26
+ static getTags(node) {
27
+ // Get tags from this node
28
+ const nodeTags = node.tryGetContext(this.TAG_CONTEXT_KEY) || {};
29
+ // Get inherited tags from parent
30
+ const parentTags = node.scope ? this.getTags(constructs_1.Node.of(node.scope)) : {};
31
+ // Node tags override parent tags
32
+ return {
33
+ ...parentTags,
34
+ ...nodeTags
35
+ };
36
+ }
37
+ /**
38
+ * Apply tags from context to a construct using a safe approach
39
+ * This should be called during construction, not during synthesis
40
+ */
41
+ static applyTagsFromContext(node) {
42
+ const tags = this.getTags(node);
43
+ if (Object.keys(tags).length === 0) {
44
+ return;
45
+ }
46
+ // Instead of using Tags.of() which creates aspects,
47
+ // we'll store tags as metadata that can be processed later
48
+ node.addMetadata('fjall:applied-tags', tags);
49
+ }
50
+ }
51
+ exports.TagContext = TagContext;
52
+ TagContext.TAG_CONTEXT_KEY = "fjall:tags";
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy90YWdDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUFrQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxNQUFhLFVBQVU7SUFHckI7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVUsRUFBRSxJQUErQjtRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQyxHQUFHLFlBQVk7WUFDZixHQUFHLElBQUk7U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVU7UUFDOUIsMEJBQTBCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVoRSxpQ0FBaUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXZFLGlDQUFpQztRQUNqQyxPQUFPO1lBQ0wsR0FBRyxVQUFVO1lBQ2IsR0FBRyxRQUFRO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBVTtRQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7QUE3Q0gsZ0NBOENDO0FBN0N5QiwwQkFBZSxHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIFRhZ0NvbnRleHQgcHJvdmlkZXMgYSBDREsgY29udGV4dC1iYXNlZCBhcHByb2FjaCBmb3IgcGFzc2luZyB0YWdzXG4gKiBkb3duIHRoZSBjb25zdHJ1Y3QgdHJlZSB3aXRob3V0IHVzaW5nIGFzcGVjdHMuXG4gKiBcbiAqIFRoaXMgYXZvaWRzIHRoZSBpbmZpbml0ZSBsb29wIGlzc3VlIHdpdGggVGFncy5vZigpIGNyZWF0aW5nIGFzcGVjdHNcbiAqIGR1cmluZyB0aGUgYXNwZWN0IHZpc2l0YXRpb24gcGhhc2UgaW4gQ0RLIHYyLjIwNi4wK1xuICovXG5leHBvcnQgY2xhc3MgVGFnQ29udGV4dCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19DT05URVhUX0tFWSA9IFwiZmphbGw6dGFnc1wiO1xuXG4gIC8qKlxuICAgKiBTZXQgdGFncyBpbiB0aGUgY29udGV4dCBmb3IgYSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0VGFncyhub2RlOiBOb2RlLCB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdUYWdzID0gdGhpcy5nZXRUYWdzKG5vZGUpO1xuICAgIG5vZGUuc2V0Q29udGV4dCh0aGlzLlRBR19DT05URVhUX0tFWSwge1xuICAgICAgLi4uZXhpc3RpbmdUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0YWdzIGZyb20gdGhlIGNvbnRleHQsIGluY2x1ZGluZyBpbmhlcml0ZWQgdGFncyBmcm9tIHBhcmVudCBjb25zdHJ1Y3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFRhZ3Mobm9kZTogTm9kZSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIC8vIEdldCB0YWdzIGZyb20gdGhpcyBub2RlXG4gICAgY29uc3Qgbm9kZVRhZ3MgPSBub2RlLnRyeUdldENvbnRleHQodGhpcy5UQUdfQ09OVEVYVF9LRVkpIHx8IHt9O1xuICAgIFxuICAgIC8vIEdldCBpbmhlcml0ZWQgdGFncyBmcm9tIHBhcmVudFxuICAgIGNvbnN0IHBhcmVudFRhZ3MgPSBub2RlLnNjb3BlID8gdGhpcy5nZXRUYWdzKE5vZGUub2Yobm9kZS5zY29wZSkpIDoge307XG4gICAgXG4gICAgLy8gTm9kZSB0YWdzIG92ZXJyaWRlIHBhcmVudCB0YWdzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcmVudFRhZ3MsXG4gICAgICAuLi5ub2RlVGFnc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGFncyBmcm9tIGNvbnRleHQgdG8gYSBjb25zdHJ1Y3QgdXNpbmcgYSBzYWZlIGFwcHJvYWNoXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uLCBub3QgZHVyaW5nIHN5bnRoZXNpc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcHBseVRhZ3NGcm9tQ29udGV4dChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0VGFncyhub2RlKTtcbiAgICBcbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5zdGVhZCBvZiB1c2luZyBUYWdzLm9mKCkgd2hpY2ggY3JlYXRlcyBhc3BlY3RzLFxuICAgIC8vIHdlJ2xsIHN0b3JlIHRhZ3MgYXMgbWV0YWRhdGEgdGhhdCBjYW4gYmUgcHJvY2Vzc2VkIGxhdGVyXG4gICAgbm9kZS5hZGRNZXRhZGF0YSgnZmphbGw6YXBwbGllZC10YWdzJywgdGFncyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ import { IConstruct } from "constructs";
2
+ import { IAspect } from "aws-cdk-lib";
3
+ /**
4
+ * TagSynthesizer is a specialized aspect that runs during synthesis
5
+ * to apply tags stored in metadata to CloudFormation resources.
6
+ *
7
+ * This approach avoids creating new aspects during aspect visitation,
8
+ * which causes the infinite loop in CDK v2.206.0+
9
+ */
10
+ export declare class TagSynthesizer implements IAspect {
11
+ visit(node: IConstruct): void;
12
+ private collectTagsFromTree;
13
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TagSynthesizer = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ /**
7
+ * TagSynthesizer is a specialized aspect that runs during synthesis
8
+ * to apply tags stored in metadata to CloudFormation resources.
9
+ *
10
+ * This approach avoids creating new aspects during aspect visitation,
11
+ * which causes the infinite loop in CDK v2.206.0+
12
+ */
13
+ class TagSynthesizer {
14
+ visit(node) {
15
+ // Only process CfnResource nodes
16
+ if (!aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
17
+ return;
18
+ }
19
+ // Walk up the tree to collect all tag metadata
20
+ const collectedTags = {};
21
+ this.collectTagsFromTree(node, collectedTags);
22
+ if (Object.keys(collectedTags).length === 0) {
23
+ return;
24
+ }
25
+ // Apply tags directly to the CloudFormation resource
26
+ // This doesn't create new aspects, avoiding the infinite loop
27
+ const cfnResource = node;
28
+ // Apply tags using the TagManager directly
29
+ const tagManager = aws_cdk_lib_1.TagManager.of(cfnResource);
30
+ if (tagManager) {
31
+ Object.entries(collectedTags).forEach(([key, value]) => {
32
+ tagManager.setTag(key, value);
33
+ });
34
+ }
35
+ }
36
+ collectTagsFromTree(node, collectedTags) {
37
+ // Walk up the tree
38
+ let current = node;
39
+ const tagSets = [];
40
+ while (current) {
41
+ const metadata = constructs_1.Node.of(current).metadata;
42
+ const tagMetadata = metadata.find(m => m.type === 'fjall:applied-tags');
43
+ if (tagMetadata && tagMetadata.data) {
44
+ tagSets.unshift(tagMetadata.data);
45
+ }
46
+ current = current.node.scope;
47
+ }
48
+ // Apply tags in order (parent to child) so child tags override parent tags
49
+ tagSets.forEach(tags => {
50
+ Object.assign(collectedTags, tags);
51
+ });
52
+ }
53
+ }
54
+ exports.TagSynthesizer = TagSynthesizer;
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnU3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnU3ludGhlc2l6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQThDO0FBQzlDLDZDQUErRDtBQUUvRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLGNBQWM7SUFDbEIsS0FBSyxDQUFDLElBQWdCO1FBQzNCLGlDQUFpQztRQUNqQyxJQUFJLENBQUMseUJBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUVELCtDQUErQztRQUMvQyxNQUFNLGFBQWEsR0FBOEIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFOUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPO1FBQ1QsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCw4REFBOEQ7UUFDOUQsTUFBTSxXQUFXLEdBQUcsSUFBbUIsQ0FBQztRQUV4QywyQ0FBMkM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsd0JBQVUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDckQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQWdCLEVBQUUsYUFBd0M7UUFDcEYsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxHQUEyQixJQUFJLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQXFDLEVBQUUsQ0FBQztRQUVyRCxPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLEdBQUcsaUJBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzNDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDLENBQUM7WUFFeEUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFpQyxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUVELE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQStCLENBQUM7UUFDekQsQ0FBQztRQUVELDJFQUEyRTtRQUMzRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBakRELHdDQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDb25zdHJ1Y3QsIE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIElBc3BlY3QsIFRhZ01hbmFnZXIgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBUYWdTeW50aGVzaXplciBpcyBhIHNwZWNpYWxpemVkIGFzcGVjdCB0aGF0IHJ1bnMgZHVyaW5nIHN5bnRoZXNpc1xuICogdG8gYXBwbHkgdGFncyBzdG9yZWQgaW4gbWV0YWRhdGEgdG8gQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2VzLlxuICogXG4gKiBUaGlzIGFwcHJvYWNoIGF2b2lkcyBjcmVhdGluZyBuZXcgYXNwZWN0cyBkdXJpbmcgYXNwZWN0IHZpc2l0YXRpb24sXG4gKiB3aGljaCBjYXVzZXMgdGhlIGluZmluaXRlIGxvb3AgaW4gQ0RLIHYyLjIwNi4wK1xuICovXG5leHBvcnQgY2xhc3MgVGFnU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgQ2ZuUmVzb3VyY2Ugbm9kZXNcbiAgICBpZiAoIUNmblJlc291cmNlLmlzQ2ZuUmVzb3VyY2Uobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHVwIHRoZSB0cmVlIHRvIGNvbGxlY3QgYWxsIHRhZyBtZXRhZGF0YVxuICAgIGNvbnN0IGNvbGxlY3RlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICB0aGlzLmNvbGxlY3RUYWdzRnJvbVRyZWUobm9kZSwgY29sbGVjdGVkVGFncyk7XG4gICAgXG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3RlZFRhZ3MpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHRhZ3MgZGlyZWN0bHkgdG8gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlXG4gICAgLy8gVGhpcyBkb2Vzbid0IGNyZWF0ZSBuZXcgYXNwZWN0cywgYXZvaWRpbmcgdGhlIGluZmluaXRlIGxvb3BcbiAgICBjb25zdCBjZm5SZXNvdXJjZSA9IG5vZGUgYXMgQ2ZuUmVzb3VyY2U7XG4gICAgXG4gICAgLy8gQXBwbHkgdGFncyB1c2luZyB0aGUgVGFnTWFuYWdlciBkaXJlY3RseVxuICAgIGNvbnN0IHRhZ01hbmFnZXIgPSBUYWdNYW5hZ2VyLm9mKGNmblJlc291cmNlKTtcbiAgICBpZiAodGFnTWFuYWdlcikge1xuICAgICAgT2JqZWN0LmVudHJpZXMoY29sbGVjdGVkVGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHRhZ01hbmFnZXIuc2V0VGFnKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGNvbGxlY3RUYWdzRnJvbVRyZWUobm9kZTogSUNvbnN0cnVjdCwgY29sbGVjdGVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIFdhbGsgdXAgdGhlIHRyZWVcbiAgICBsZXQgY3VycmVudDogSUNvbnN0cnVjdCB8IHVuZGVmaW5lZCA9IG5vZGU7XG4gICAgY29uc3QgdGFnU2V0czogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBOb2RlLm9mKGN1cnJlbnQpLm1ldGFkYXRhO1xuICAgICAgY29uc3QgdGFnTWV0YWRhdGEgPSBtZXRhZGF0YS5maW5kKG0gPT4gbS50eXBlID09PSAnZmphbGw6YXBwbGllZC10YWdzJyk7XG4gICAgICBcbiAgICAgIGlmICh0YWdNZXRhZGF0YSAmJiB0YWdNZXRhZGF0YS5kYXRhKSB7XG4gICAgICAgIHRhZ1NldHMudW5zaGlmdCh0YWdNZXRhZGF0YS5kYXRhIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5ub2RlLnNjb3BlIGFzIElDb25zdHJ1Y3QgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IHRhZ3MgaW4gb3JkZXIgKHBhcmVudCB0byBjaGlsZCkgc28gY2hpbGQgdGFncyBvdmVycmlkZSBwYXJlbnQgdGFnc1xuICAgIHRhZ1NldHMuZm9yRWFjaCh0YWdzID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29sbGVjdGVkVGFncywgdGFncyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fjall/components-infrastructure",
3
- "version": "0.73.9",
3
+ "version": "0.73.12",
4
4
  "bin": {
5
5
  "infrastructure": "bin/infrastructure.js"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@aws-sdk/client-organizations": "^3.716.0",
38
- "@fjall/util": "^0.73.9",
38
+ "@fjall/util": "^0.73.12",
39
39
  "@pepperize/cdk-organizations": "^0.7.135",
40
40
  "cdk-time-sleep": "^1.0.0",
41
41
  "constructs": "^10.0.0",
@@ -44,7 +44,7 @@
44
44
  "overrides": {
45
45
  "@smithy/core": "2.5.5"
46
46
  },
47
- "gitHead": "6a44daf2cfd3a81217b024a526cbb4f394ce9575",
47
+ "gitHead": "c743a27fa262f4cff0c2471b295c61b8eb9a2236",
48
48
  "peerDependencies": {
49
49
  "aws-cdk": "^2.206.0",
50
50
  "aws-cdk-lib": "^2.206.0",
@@ -1,43 +0,0 @@
1
- import { BlockDevice, IMachineImage, IVpc, SubnetType, UserData, SecurityGroup, IConnectable, Connections } from "aws-cdk-lib/aws-ec2";
2
- import { Construct } from "constructs";
3
- import { StackProps } from "aws-cdk-lib";
4
- import { Role } from "aws-cdk-lib/aws-iam";
5
- import { KeyValue } from "../../types";
6
- interface ExistingVpcConfig {
7
- vpcId?: string;
8
- subnetType?: SubnetType;
9
- }
10
- interface NewVpcConfig {
11
- subnetType: SubnetType;
12
- }
13
- export type VpcProps = ExistingVpcConfig | NewVpcConfig;
14
- interface Ec2InstanceProps extends StackProps {
15
- spotCapacityPercentage?: number;
16
- blockDevices?: BlockDevice[];
17
- accountId?: string;
18
- serviceName: string;
19
- vpc: VpcProps;
20
- minCapcity?: number;
21
- maxCapacity?: number;
22
- instanceType: string;
23
- machineImage?: IMachineImage;
24
- userData?: UserData;
25
- role?: Role;
26
- enableSSH?: boolean;
27
- tags: KeyValue;
28
- }
29
- export declare class Ec2Instance extends Construct implements IConnectable {
30
- private launchTemplate;
31
- vpc: IVpc;
32
- asgSecurityGroup: SecurityGroup;
33
- private autoScalingGroup;
34
- private keyPair;
35
- constructor(scope: Construct, id: string, props: Ec2InstanceProps);
36
- connections: Connections;
37
- addVpc(props: Ec2InstanceProps): void;
38
- addKeyPair(props: Ec2InstanceProps): void;
39
- addLaunchTemplate(props: Ec2InstanceProps): void;
40
- addAutoScalingGroup(props: Ec2InstanceProps): void;
41
- suspendAutoScaling(): void;
42
- }
43
- export {};
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Ec2Instance = void 0;
4
- const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
5
- const constructs_1 = require("constructs");
6
- const aws_cdk_lib_1 = require("aws-cdk-lib");
7
- const tagResource_1 = require("../../utils/tagResource");
8
- const aws_autoscaling_1 = require("aws-cdk-lib/aws-autoscaling");
9
- const awsCustomResource_1 = require("../../resources/aws/utilities/awsCustomResource");
10
- const custom_resources_1 = require("aws-cdk-lib/custom-resources");
11
- const vpc_1 = require("../../resources/aws/networking/vpc");
12
- class Ec2Instance extends constructs_1.Construct {
13
- constructor(scope, id, props) {
14
- super(scope, id);
15
- this.addVpc(props);
16
- if (props.enableSSH) {
17
- this.addKeyPair(props);
18
- }
19
- this.addLaunchTemplate(props);
20
- this.addAutoScalingGroup(props);
21
- this.suspendAutoScaling();
22
- //TODO: Add load balancer as boolean prop, then configure load balancer
23
- }
24
- addVpc(props) {
25
- if ("vpcId" in props.vpc) {
26
- this.vpc = vpc_1.Vpc.fromLookup(this, `${props.serviceName}Vpc`, {
27
- vpcId: props.vpc.vpcId
28
- });
29
- }
30
- else {
31
- this.vpc = new vpc_1.Vpc(this, `${props.serviceName}Vpc`, {
32
- accountId: props.accountId,
33
- tags: props.tags,
34
- subnetConfiguration: [
35
- {
36
- name: `${props.serviceName}`,
37
- subnetType: props.vpc.subnetType || aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
38
- }
39
- ]
40
- });
41
- }
42
- }
43
- addKeyPair(props) {
44
- // TODO: Breakout into a seperate construct for use with better prop handling
45
- this.keyPair = new aws_ec2_1.KeyPair(this, "KeyPair", {
46
- keyPairName: `${props.serviceName}KeyPair`
47
- });
48
- }
49
- addLaunchTemplate(props) {
50
- this.asgSecurityGroup = new aws_ec2_1.SecurityGroup(this, `AsgSecurityGroup`, {
51
- vpc: this.vpc,
52
- description: `Security group for the ${props.serviceName} auto scaling group`
53
- });
54
- if (props.enableSSH) {
55
- this.asgSecurityGroup.addIngressRule(aws_ec2_1.Peer.anyIpv4(), aws_ec2_1.Port.tcp(22), "Allow SSH");
56
- }
57
- this.launchTemplate = new aws_ec2_1.LaunchTemplate(this, "LaunchTemplate", {
58
- launchTemplateName: `${props.serviceName}LaunchTemplate`,
59
- instanceType: new aws_ec2_1.InstanceType(`${props.instanceType}`),
60
- machineImage: props.machineImage || aws_ec2_1.MachineImage.latestAmazonLinux2(),
61
- userData: props.userData,
62
- role: props.role,
63
- blockDevices: props?.blockDevices,
64
- securityGroup: this.asgSecurityGroup,
65
- detailedMonitoring: true,
66
- requireImdsv2: true,
67
- httpPutResponseHopLimit: 2,
68
- httpTokens: aws_ec2_1.LaunchTemplateHttpTokens.REQUIRED,
69
- instanceMetadataTags: true,
70
- keyPair: this.keyPair
71
- });
72
- }
73
- addAutoScalingGroup(props) {
74
- // TODO: Support spot instances
75
- // TODO: Handle terminating EC2 instances when updating, currently hangs.
76
- this.autoScalingGroup = new aws_autoscaling_1.AutoScalingGroup(this, "AutoScalingGroup", {
77
- vpc: this.vpc,
78
- vpcSubnets: {
79
- subnetType: props.enableSSH ? aws_ec2_1.SubnetType.PUBLIC : undefined
80
- },
81
- minCapacity: props.minCapcity,
82
- maxCapacity: props.maxCapacity,
83
- launchTemplate: this.launchTemplate,
84
- cooldown: aws_cdk_lib_1.Duration.seconds(60),
85
- groupMetrics: [aws_autoscaling_1.GroupMetrics.all()],
86
- updatePolicy: aws_autoscaling_1.UpdatePolicy.replacingUpdate(),
87
- newInstancesProtectedFromScaleIn: true,
88
- // securityGroup: this.asgSecurityGroup,
89
- terminationPolicies: [
90
- aws_autoscaling_1.TerminationPolicy.OLDEST_LAUNCH_CONFIGURATION,
91
- aws_autoscaling_1.TerminationPolicy.CLOSEST_TO_NEXT_INSTANCE_HOUR
92
- ],
93
- ssmSessionPermissions: true
94
- });
95
- (0, tagResource_1.default)(this.autoScalingGroup, props.tags);
96
- }
97
- suspendAutoScaling() {
98
- new awsCustomResource_1.AwsCustomResource(this, "SuspendAutoscaling", {
99
- functionName: "suspendAutoScaling",
100
- onCreate: {
101
- service: "AutoScaling",
102
- action: "suspendProcesses",
103
- parameters: {
104
- AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
105
- ScalingProcesses: ["AZRebalance"]
106
- },
107
- physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
108
- },
109
- onUpdate: {
110
- service: "AutoScaling",
111
- action: "suspendProcesses",
112
- parameters: {
113
- AutoScalingGroupName: this.autoScalingGroup.autoScalingGroupName,
114
- ScalingProcesses: ["AZRebalance"]
115
- },
116
- physicalResourceId: custom_resources_1.PhysicalResourceId.of("suspendAutoScaling")
117
- },
118
- resourceType: "Custom::suspendAutoscaling"
119
- });
120
- }
121
- }
122
- exports.Ec2Instance = Ec2Instance;
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3BhdHRlcm5zL2F3cy9lYzIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaURBaUI2QjtBQUM3QiwyQ0FBdUM7QUFDdkMsNkNBQW1EO0FBQ25ELHlEQUFrRDtBQUVsRCxpRUFLcUM7QUFFckMsdUZBQW9GO0FBQ3BGLG1FQUFrRTtBQUNsRSw0REFBeUQ7QUE2QnpELE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBT3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsdUVBQXVFO0lBQ3pFLENBQUM7SUFHRCxNQUFNLENBQUMsS0FBdUI7UUFDNUIsSUFBSSxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUU7Z0JBQ3pELEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUs7YUFDdkIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksU0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxX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QXdDO1lBQ3hDLG1CQUFtQixFQUFFO2dCQUNuQixtQ0FBaUIsQ0FBQywyQkFBMkI7Z0JBQzdDLG1DQUFpQixDQUFDLDZCQUE2QjthQUNoRDtZQUNELHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxxQkFBVyxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLHFDQUFpQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNoRCxZQUFZLEVBQUUsb0JBQW9CO1lBQ2xDLFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIsVUFBVSxFQUFFO29CQUNWLG9CQUFvQixFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0I7b0JBQ2hFLGdCQUFnQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUNsQztnQkFDRCxrQkFBa0IsRUFBRSxxQ0FBa0IsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUM7YUFDaEU7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsT0FBTyxFQUFFLGFBQWE7Z0JBQ3RCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLFVBQVUsRUFBRTtvQkFDVixvQkFBb0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CO29CQUNoRSxnQkFBZ0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDbEM7Z0JBQ0Qsa0JBQWtCLEVBQUUscUNBQWtCLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDO2FBQ2hFO1lBQ0QsWUFBWSxFQUFFLDRCQUE0QjtTQUMzQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFoSUQsa0NBZ0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmxvY2tEZXZpY2UsXG4gIElNYWNoaW5lSW1hZ2UsXG4gIEluc3RhbmNlVHlwZSxcbiAgSVZwYyxcbiAgTGF1bmNoVGVtcGxhdGUsXG4gIFN1Ym5ldFR5cGUsXG4gIFVzZXJEYXRhLFxuICBNYWNoaW5lSW1hZ2UsXG4gIExhdW5jaFRlbXBsYXRlSHR0cFRva2VucyxcbiAgS2V5UGFpcixcbiAgSUtleVBhaXIsXG4gIFNlY3VyaXR5R3JvdXAsXG4gIFBlZXIsXG4gIFBvcnQsXG4gIElDb25uZWN0YWJsZSxcbiAgQ29ubmVjdGlvbnNcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHRhZ1Jlc291cmNlIGZyb20gXCIuLi8uLi91dGlscy90YWdSZXNvdXJjZVwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBBdXRvU2NhbGluZ0dyb3VwLFxuICBHcm91cE1ldHJpY3MsXG4gIFRlcm1pbmF0aW9uUG9saWN5LFxuICBVcGRhdGVQb2xpY3lcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hdXRvc2NhbGluZ1wiO1xuaW1wb3J0IHsgS2V5VmFsdWUgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcbmltcG9ydCB7IEF3c0N1c3RvbVJlc291cmNlIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvdXRpbGl0aWVzL2F3c0N1c3RvbVJlc291cmNlXCI7XG5pbXBvcnQgeyBQaHlzaWNhbFJlc291cmNlSWQgfSBmcm9tIFwiYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlc1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNcIjtcblxuaW50ZXJmYWNlIEV4aXN0aW5nVnBjQ29uZmlnIHtcbiAgdnBjSWQ/OiBzdHJpbmc7XG4gIHN1Ym5ldFR5cGU/OiBTdWJuZXRUeXBlO1xufVxuXG5pbnRlcmZhY2UgTmV3VnBjQ29uZmlnIHtcbiAgc3VibmV0VHlwZTogU3VibmV0VHlwZTtcbn1cblxuZXhwb3J0IHR5cGUgVnBjUHJvcHMgPSBFeGlzdGluZ1ZwY0NvbmZpZyB8IE5ld1ZwY0NvbmZpZztcblxuaW50ZXJmYWNlIEVjMkluc3RhbmNlUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgc3BvdENhcGFjaXR5UGVyY2VudGFnZT86IG51bWJlcjtcbiAgYmxvY2tEZXZpY2VzPzogQmxvY2tEZXZpY2VbXTtcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuICB2cGM6IFZwY1Byb3BzO1xuICBtaW5DYXBjaXR5PzogbnVtYmVyO1xuICBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgaW5zdGFuY2VUeXBlOiBzdHJpbmc7XG4gIG1hY2hpbmVJbWFnZT86IElNYWNoaW5lSW1hZ2U7XG4gIHVzZXJEYXRhPzogVXNlckRhdGE7XG4gIHJvbGU/OiBSb2xlO1xuICBlbmFibGVTU0g/OiBib29sZWFuO1xuICB0YWdzOiBLZXlWYWx1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIEVjMkluc3RhbmNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSUNvbm5lY3RhYmxlIHtcbiAgcHJpdmF0ZSBsYXVuY2hUZW1wbGF0ZTogTGF1bmNoVGVtcGxhdGU7XG4gIHB1YmxpYyB2cGM6IElWcGM7XG4gIHB1YmxpYyBhc2dTZWN1cml0eUdyb3VwOiBTZWN1cml0eUdyb3VwO1xuICBwcml2YXRlIGF1dG9TY2FsaW5nR3JvdXA6IEF1dG9TY2FsaW5nR3JvdXA7XG4gIHByaXZhdGUga2V5UGFpcjogSUtleVBhaXI7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5hZGRWcGMocHJvcHMpO1xuICAgIGlmIChwcm9wcy5lbmFibGVTU0gpIHtcbiAgICAgIHRoaXMuYWRkS2V5UGFpcihwcm9wcyk7XG4gICAgfVxuICAgIHRoaXMuYWRkTGF1bmNoVGVtcGxhdGUocHJvcHMpO1xuICAgIHRoaXMuYWRkQXV0b1NjYWxpbmdHcm91cChwcm9wcyk7XG4gICAgdGhpcy5zdXNwZW5kQXV0b1NjYWxpbmcoKTtcblxuICAgIC8vVE9ETzogQWRkIGxvYWQgYmFsYW5jZXIgYXMgYm9vbGVhbiBwcm9wLCB0aGVuIGNvbmZpZ3VyZSBsb2FkIGJhbGFuY2VyXG4gIH1cbiAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25zO1xuXG4gIGFkZFZwYyhwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIGlmIChcInZwY0lkXCIgaW4gcHJvcHMudnBjKSB7XG4gICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tTG9va3VwKHRoaXMsIGAke3Byb3BzLnNlcnZpY2VOYW1lfVZwY2AsIHtcbiAgICAgICAgdnBjSWQ6IHByb3BzLnZwYy52cGNJZFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudnBjID0gbmV3IFZwYyh0aGlzLCBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1WcGNgLCB7XG4gICAgICAgIGFjY291bnRJZDogcHJvcHMuYWNjb3VudElkLFxuICAgICAgICB0YWdzOiBwcm9wcy50YWdzLFxuICAgICAgICBzdWJuZXRDb25maWd1cmF0aW9uOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcHMuc2VydmljZU5hbWV9YCxcbiAgICAgICAgICAgIHN1Ym5ldFR5cGU6IHByb3BzLnZwYy5zdWJuZXRUeXBlIHx8IFN1Ym5ldFR5cGUuUFJJVkFURV9XSVRIX0VHUkVTU1xuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYWRkS2V5UGFpcihwcm9wczogRWMySW5zdGFuY2VQcm9wcykge1xuICAgIC8vIFRPRE86IEJyZWFrb3V0IGludG8gYSBzZXBlcmF0ZSBjb25zdHJ1Y3QgZm9yIHVzZSB3aXRoIGJldHRlciBwcm9wIGhhbmRsaW5nXG4gICAgdGhpcy5rZXlQYWlyID0gbmV3IEtleVBhaXIodGhpcywgXCJLZXlQYWlyXCIsIHtcbiAgICAgIGtleVBhaXJOYW1lOiBgJHtwcm9wcy5zZXJ2aWNlTmFtZX1LZXlQYWlyYFxuICAgIH0pO1xuICB9XG5cbiAgYWRkTGF1bmNoVGVtcGxhdGUocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICB0aGlzLmFzZ1NlY3VyaXR5R3JvdXAgPSBuZXcgU2VjdXJpdHlHcm91cCh0aGlzLCBgQXNnU2VjdXJpdHlHcm91cGAsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogYFNlY3VyaXR5IGdyb3VwIGZvciB0aGUgJHtwcm9wcy5zZXJ2aWNlTmFtZX0gYXV0byBzY2FsaW5nIGdyb3VwYFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZVNTSCkge1xuICAgICAgdGhpcy5hc2dTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgICBQZWVyLmFueUlwdjQoKSxcbiAgICAgICAgUG9ydC50Y3AoMjIpLFxuICAgICAgICBcIkFsbG93IFNTSFwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubGF1bmNoVGVtcGxhdGUgPSBuZXcgTGF1bmNoVGVtcGxhdGUodGhpcywgXCJMYXVuY2hUZW1wbGF0ZVwiLCB7XG4gICAgICBsYXVuY2hUZW1wbGF0ZU5hbWU6IGAke3Byb3BzLnNlcnZpY2VOYW1lfUxhdW5jaFRlbXBsYXRlYCxcbiAgICAgIGluc3RhbmNlVHlwZTogbmV3IEluc3RhbmNlVHlwZShgJHtwcm9wcy5pbnN0YW5jZVR5cGV9YCksXG4gICAgICBtYWNoaW5lSW1hZ2U6IHByb3BzLm1hY2hpbmVJbWFnZSB8fCBNYWNoaW5lSW1hZ2UubGF0ZXN0QW1hem9uTGludXgyKCksXG4gICAgICB1c2VyRGF0YTogcHJvcHMudXNlckRhdGEsXG4gICAgICByb2xlOiBwcm9wcy5yb2xlLFxuICAgICAgYmxvY2tEZXZpY2VzOiBwcm9wcz8uYmxvY2tEZXZpY2VzLFxuICAgICAgc2VjdXJpdHlHcm91cDogdGhpcy5hc2dTZWN1cml0eUdyb3VwLFxuICAgICAgZGV0YWlsZWRNb25pdG9yaW5nOiB0cnVlLFxuICAgICAgcmVxdWlyZUltZHN2MjogdHJ1ZSxcbiAgICAgIGh0dHBQdXRSZXNwb25zZUhvcExpbWl0OiAyLFxuICAgICAgaHR0cFRva2VuczogTGF1bmNoVGVtcGxhdGVIdHRwVG9rZW5zLlJFUVVJUkVELFxuICAgICAgaW5zdGFuY2VNZXRhZGF0YVRhZ3M6IHRydWUsXG4gICAgICBrZXlQYWlyOiB0aGlzLmtleVBhaXJcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEF1dG9TY2FsaW5nR3JvdXAocHJvcHM6IEVjMkluc3RhbmNlUHJvcHMpIHtcbiAgICAvLyBUT0RPOiBTdXBwb3J0IHNwb3QgaW5zdGFuY2VzXG4gICAgLy8gVE9ETzogSGFuZGxlIHRlcm1pbmF0aW5nIEVDMiBpbnN0YW5jZXMgd2hlbiB1cGRhdGluZywgY3VycmVudGx5IGhhbmdzLlxuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IG5ldyBBdXRvU2NhbGluZ0dyb3VwKHRoaXMsIFwiQXV0b1NjYWxpbmdHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRUeXBlOiBwcm9wcy5lbmFibGVTU0ggPyBTdWJuZXRUeXBlLlBVQkxJQyA6IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICAgIG1pbkNhcGFjaXR5OiBwcm9wcy5taW5DYXBjaXR5LFxuICAgICAgbWF4Q2FwYWNpdHk6IHByb3BzLm1heENhcGFjaXR5LFxuICAgICAgbGF1bmNoVGVtcGxhdGU6IHRoaXMubGF1bmNoVGVtcGxhdGUsXG4gICAgICBjb29sZG93bjogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBncm91cE1ldHJpY3M6IFtHcm91cE1ldHJpY3MuYWxsKCldLFxuICAgICAgdXBkYXRlUG9saWN5OiBVcGRhdGVQb2xpY3kucmVwbGFjaW5nVXBkYXRlKCksXG4gICAgICBuZXdJbnN0YW5jZXNQcm90ZWN0ZWRGcm9tU2NhbGVJbjogdHJ1ZSxcbiAgICAgIC8vIHNlY3VyaXR5R3JvdXA6IHRoaXMuYXNnU2VjdXJpdHlHcm91cCxcbiAgICAgIHRlcm1pbmF0aW9uUG9saWNpZXM6IFtcbiAgICAgICAgVGVybWluYXRpb25Qb2xpY3kuT0xERVNUX0xBVU5DSF9DT05GSUdVUkFUSU9OLFxuICAgICAgICBUZXJtaW5hdGlvblBvbGljeS5DTE9TRVNUX1RPX05FWFRfSU5TVEFOQ0VfSE9VUlxuICAgICAgXSxcbiAgICAgIHNzbVNlc3Npb25QZXJtaXNzaW9uczogdHJ1ZVxuICAgIH0pO1xuICAgIHRhZ1Jlc291cmNlKHRoaXMuYXV0b1NjYWxpbmdHcm91cCwgcHJvcHMudGFncyk7XG4gIH1cblxuICBzdXNwZW5kQXV0b1NjYWxpbmcoKSB7XG4gICAgbmV3IEF3c0N1c3RvbVJlc291cmNlKHRoaXMsIFwiU3VzcGVuZEF1dG9zY2FsaW5nXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogXCJzdXNwZW5kQXV0b1NjYWxpbmdcIixcbiAgICAgIG9uQ3JlYXRlOiB7XG4gICAgICAgIHNlcnZpY2U6IFwiQXV0b1NjYWxpbmdcIixcbiAgICAgICAgYWN0aW9uOiBcInN1c3BlbmRQcm9jZXNzZXNcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIEF1dG9TY2FsaW5nR3JvdXBOYW1lOiB0aGlzLmF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWUsXG4gICAgICAgICAgU2NhbGluZ1Byb2Nlc3NlczogW1wiQVpSZWJhbGFuY2VcIl1cbiAgICAgICAgfSxcbiAgICAgICAgcGh5c2ljYWxSZXNvdXJjZUlkOiBQaHlzaWNhbFJlc291cmNlSWQub2YoXCJzdXNwZW5kQXV0b1NjYWxpbmdcIilcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZToge1xuICAgICAgICBzZXJ2aWNlOiBcIkF1dG9TY2FsaW5nXCIsXG4gICAgICAgIGFjdGlvbjogXCJzdXNwZW5kUHJvY2Vzc2VzXCIsXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICBBdXRvU2NhbGluZ0dyb3VwTmFtZTogdGhpcy5hdXRvU2NhbGluZ0dyb3VwLmF1dG9TY2FsaW5nR3JvdXBOYW1lLFxuICAgICAgICAgIFNjYWxpbmdQcm9jZXNzZXM6IFtcIkFaUmViYWxhbmNlXCJdXG4gICAgICAgIH0sXG4gICAgICAgIHBoeXNpY2FsUmVzb3VyY2VJZDogUGh5c2ljYWxSZXNvdXJjZUlkLm9mKFwic3VzcGVuZEF1dG9TY2FsaW5nXCIpXG4gICAgICB9LFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6c3VzcGVuZEF1dG9zY2FsaW5nXCJcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,8 +0,0 @@
1
- export default class CidrBlock {
2
- private cidrBlock;
3
- private configFile;
4
- constructor();
5
- writeState(): void;
6
- getCidrBlock(): string;
7
- updateState(cidrBlock: string, status: boolean): void;
8
- }
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const fs = require("fs");
4
- class CidrBlock {
5
- constructor() {
6
- this.configFile = "../cidr-config.json";
7
- // Import config, or create it if it doesn't exist
8
- if (fs.existsSync(this.configFile)) {
9
- const configString = fs.readFileSync(this.configFile, "utf-8");
10
- this.cidrBlock = JSON.parse(configString);
11
- }
12
- else {
13
- this.cidrBlock = {};
14
- for (let i = 1; i <= 255; i++) {
15
- this.cidrBlock[`${i}.0.0.0/8`] = true;
16
- }
17
- const configString = JSON.stringify(this.cidrBlock, null, 2);
18
- fs.writeFileSync(this.configFile, configString);
19
- }
20
- }
21
- writeState() {
22
- // JSON-ify config and write to file
23
- const configString = JSON.stringify(this.cidrBlock, null, 2);
24
- fs.writeFileSync(this.configFile, configString);
25
- }
26
- getCidrBlock() {
27
- for (const key in this.cidrBlock) {
28
- if (this.cidrBlock[key]) {
29
- return key;
30
- }
31
- }
32
- return "0.0.0.0/8";
33
- }
34
- updateState(cidrBlock, status) {
35
- this.cidrBlock[cidrBlock] = status;
36
- this.writeState();
37
- }
38
- }
39
- exports.default = CidrBlock;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0Q2lkci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9nZXRDaWRyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUJBQXlCO0FBTXpCLE1BQXFCLFNBQVM7SUFJNUI7UUFGUSxlQUFVLEdBQUcscUJBQXFCLENBQUM7UUFHekMsa0RBQWtEO1FBQ2xELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDeEMsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLG9DQUFvQztRQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdELEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsWUFBWTtRQUNWLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVcsQ0FBQyxTQUFpQixFQUFFLE1BQWU7UUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXRDRCw0QkFzQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcblxuaW50ZXJmYWNlIGNpZHJUYWJsZSB7XG4gIFtrZXk6IHN0cmluZ106IGJvb2xlYW47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENpZHJCbG9jayB7XG4gIHByaXZhdGUgY2lkckJsb2NrOiBjaWRyVGFibGU7XG4gIHByaXZhdGUgY29uZmlnRmlsZSA9IFwiLi4vY2lkci1jb25maWcuanNvblwiO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEltcG9ydCBjb25maWcsIG9yIGNyZWF0ZSBpdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKGZzLmV4aXN0c1N5bmModGhpcy5jb25maWdGaWxlKSkge1xuICAgICAgY29uc3QgY29uZmlnU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuY29uZmlnRmlsZSwgXCJ1dGYtOFwiKTtcbiAgICAgIHRoaXMuY2lkckJsb2NrID0gSlNPTi5wYXJzZShjb25maWdTdHJpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNpZHJCbG9jayA9IHt9O1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gMjU1OyBpKyspIHtcbiAgICAgICAgdGhpcy5jaWRyQmxvY2tbYCR7aX0uMC4wLjAvOGBdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpZ1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRoaXMuY2lkckJsb2NrLCBudWxsLCAyKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb25maWdGaWxlLCBjb25maWdTdHJpbmcpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlU3RhdGUoKSB7XG4gICAgLy8gSlNPTi1pZnkgY29uZmlnIGFuZCB3cml0ZSB0byBmaWxlXG4gICAgY29uc3QgY29uZmlnU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5jaWRyQmxvY2ssIG51bGwsIDIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jb25maWdGaWxlLCBjb25maWdTdHJpbmcpO1xuICB9XG5cbiAgZ2V0Q2lkckJsb2NrKCkge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuY2lkckJsb2NrKSB7XG4gICAgICBpZiAodGhpcy5jaWRyQmxvY2tba2V5XSkge1xuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gXCIwLjAuMC4wLzhcIjtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKGNpZHJCbG9jazogc3RyaW5nLCBzdGF0dXM6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNpZHJCbG9ja1tjaWRyQmxvY2tdID0gc3RhdHVzO1xuICAgIHRoaXMud3JpdGVTdGF0ZSgpO1xuICB9XG59XG4iXX0=