@aws-solutions-constructs/aws-route53-apigateway 2.98.0 → 2.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.jsii CHANGED
@@ -8,8 +8,8 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "@aws-solutions-constructs/core": "2.98.0",
12
- "aws-cdk-lib": "^2.234.0",
11
+ "@aws-solutions-constructs/core": "2.100.0",
12
+ "aws-cdk-lib": "^2.239.0",
13
13
  "constructs": "^10.0.0"
14
14
  },
15
15
  "dependencyClosure": {
@@ -100,8 +100,7 @@
100
100
  "dotnet": {
101
101
  "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png",
102
102
  "namespace": "Amazon.SolutionsConstructs.AWS.Core",
103
- "packageId": "Amazon.SolutionsConstructs.AWS.Core",
104
- "signAssembly": true
103
+ "packageId": "Amazon.SolutionsConstructs.AWS.Core"
105
104
  },
106
105
  "java": {
107
106
  "maven": {
@@ -2631,6 +2630,19 @@
2631
2630
  }
2632
2631
  }
2633
2632
  },
2633
+ "aws-cdk-lib.aws_mwaaserverless": {
2634
+ "targets": {
2635
+ "dotnet": {
2636
+ "namespace": "Amazon.CDK.AWS.MWAAServerless"
2637
+ },
2638
+ "java": {
2639
+ "package": "software.amazon.awscdk.services.mwaaserverless"
2640
+ },
2641
+ "python": {
2642
+ "module": "aws_cdk.aws_mwaaserverless"
2643
+ }
2644
+ }
2645
+ },
2634
2646
  "aws-cdk-lib.aws_neptune": {
2635
2647
  "targets": {
2636
2648
  "dotnet": {
@@ -6836,6 +6848,22 @@
6836
6848
  }
6837
6849
  }
6838
6850
  },
6851
+ "aws-cdk-lib.interfaces.aws_mwaaserverless": {
6852
+ "targets": {
6853
+ "dotnet": {
6854
+ "namespace": "Amazon.CDK.Interfaces.MWAAServerless"
6855
+ },
6856
+ "go": {
6857
+ "packageName": "interfacesawsmwaaserverless"
6858
+ },
6859
+ "java": {
6860
+ "package": "software.amazon.awscdk.interfaces.mwaaserverless"
6861
+ },
6862
+ "python": {
6863
+ "module": "aws_cdk.interfaces.aws_mwaaserverless"
6864
+ }
6865
+ }
6866
+ },
6839
6867
  "aws-cdk-lib.interfaces.aws_neptune": {
6840
6868
  "targets": {
6841
6869
  "dotnet": {
@@ -8492,7 +8520,7 @@
8492
8520
  },
8493
8521
  "description": "CDK constructs for connecting an Amazon Route53 domain to an API Gateway.",
8494
8522
  "homepage": "https://github.com/awslabs/aws-solutions-constructs.git",
8495
- "jsiiVersion": "5.9.8 (build 3d2e131)",
8523
+ "jsiiVersion": "5.9.28 (build cbad63d)",
8496
8524
  "keywords": [
8497
8525
  "aws",
8498
8526
  "cdk",
@@ -8523,8 +8551,7 @@
8523
8551
  "dotnet": {
8524
8552
  "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png",
8525
8553
  "namespace": "Amazon.SolutionsConstructs.AWS.Route53ApiGateway",
8526
- "packageId": "Amazon.SolutionsConstructs.AWS.Route53ApiGateway",
8527
- "signAssembly": true
8554
+ "packageId": "Amazon.SolutionsConstructs.AWS.Route53ApiGateway"
8528
8555
  },
8529
8556
  "java": {
8530
8557
  "maven": {
@@ -8768,6 +8795,6 @@
8768
8795
  "symbolId": "lib/index:Route53ToApiGatewayProps"
8769
8796
  }
8770
8797
  },
8771
- "version": "2.98.0",
8772
- "fingerprint": "nrw51z1Xyij0PoU6JD7+xq9Chx+12UvaqZYQNskFD9s="
8798
+ "version": "2.100.0",
8799
+ "fingerprint": "pmId679PaVO0CYTE/VIh8nUePAJEpm6/OwqJrk0ozUQ="
8773
8800
  }
package/lib/index.js CHANGED
@@ -22,6 +22,7 @@ class Route53ToApiGateway extends constructs_1.Construct {
22
22
  */
23
23
  constructor(scope, id, props) {
24
24
  super(scope, id);
25
+ defaults.ValidatePrivateHostedZoneProps(this, props.privateHostedZoneProps);
25
26
  this.certificate = props.existingCertificateInterface;
26
27
  if (props.existingVpc) {
27
28
  this.vpc = props.existingVpc;
@@ -78,5 +79,5 @@ class Route53ToApiGateway extends constructs_1.Construct {
78
79
  }
79
80
  exports.Route53ToApiGateway = Route53ToApiGateway;
80
81
  _a = JSII_RTTI_SYMBOL_1;
81
- Route53ToApiGateway[_a] = { fqn: "@aws-solutions-constructs/aws-route53-apigateway.Route53ToApiGateway", version: "2.98.0" };
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWVBLG1EQUFtRDtBQUNuRCwyREFBMkQ7QUFFM0QsMkRBQTJEO0FBRTNELHdGQUF3RjtBQUN4RiwyQ0FBdUM7QUErQ3ZDOztHQUVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUtoRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLDRCQUE0QixDQUFDO1FBRXRELElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztRQUMvQixDQUFDO1FBRUQseUNBQXlDO1FBQ3pDLElBQUksS0FBSyxDQUFDLDJCQUEyQixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsMkJBQTJCLENBQUM7WUFDcEQsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFDLENBQUM7YUFBTSxDQUFDLENBQUMsaUNBQWlDO1lBQ3hDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxNQUFNLGlCQUFpQixHQUFtQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNsSSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekYsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQywyQkFBMEMsQ0FBQztRQUVuRSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7WUFDaEQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUNwQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDOUIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQXlCO1lBQ3pDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVTtZQUNyQixNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNoRixDQUFDO1FBRUYsbUVBQW1FO1FBQ25FLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUseUJBQXlCLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVO0lBQ2hGLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxLQUErQjtRQUNqRSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywwRkFBMEYsQ0FBQyxDQUFDO1FBQzlHLENBQUM7SUFDSCxDQUFDO0lBRU8sNEJBQTRCLENBQUMsS0FBK0I7UUFDbEUsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwRUFBMEUsQ0FBQyxDQUFDO1FBQzlGLENBQUM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLG9GQUFvRixDQUFDLENBQUM7UUFDeEcsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDSCxDQUFDOztBQTVFSCxrREE2RUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vLyBJbXBvcnRzXG5pbXBvcnQgKiBhcyBhcGkgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCAqIGFzIHRhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXJvdXRlNTMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tICdAYXdzLXNvbHV0aW9ucy1jb25zdHJ1Y3RzL2NvcmUnO1xuaW1wb3J0ICogYXMgY2VydGlmaWNhdGVtYW5hZ2VyIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXInO1xuLy8gTm90ZTogVG8gZW5zdXJlIENES3YyIGNvbXBhdGliaWxpdHksIGtlZXAgdGhlIGltcG9ydCBzdGF0ZW1lbnQgZm9yIENvbnN0cnVjdCBzZXBhcmF0ZVxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogVGhlIHByb3BlcnRpZXMgZm9yIHRoZSBSb3V0ZTUzVG9BcGlHYXRld2F5IGNsYXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNyZWF0ZSBhIHB1YmxpYyBvciBwcml2YXRlIEFQSS4gVGhpcyB2YWx1ZSBoYXMgaW1wbGljYXRpb25zXG4gICAqIGZvciB0aGUgVlBDLCB0aGUgdHlwZSBvZiBIb3N0ZWQgWm9uZSBhbmQgdGhlIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXJcbiAgICovXG4gIHJlYWRvbmx5IHB1YmxpY0FwaTogYm9vbGVhblxuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHByb3BlcnRpZXMgZm9yIGEgbmV3IFByaXZhdGUgSG9zdGVkIFpvbmUuIENhbm5vdCBiZSBzcGVjaWZpZWQgZm9yIGFcbiAgICogcHVibGljIEFQSS4gQ2Fubm90IHNwZWNpZnkgYSBWUEMsIGl0IHdpbGwgdXNlIHRoZSBWUEMgaW4gZXhpc3RpbmdWcGMgb3IgdGhlIFZQQyBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3QuXG4gICAqIFByb3ZpZGluZyBib3RoIHRoaXMgYW5kIGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSBjYXVzZXMgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wcz86IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmVQcm9wcyB8IGFueSxcbiAgLyoqXG4gICAqIEV4aXN0aW5nIFB1YmxpYyBvciBQcml2YXRlIEhvc3RlZCBab25lLiBJZiBhIFByaXZhdGUgSG9zdGVkIFpvbmUsIG11c3RcbiAgICogZXhpc3QgaW4gdGhlIHNhbWUgVlBDIHNwZWNpZmllZCBpbiBleGlzdGluZ1ZwY1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZT86IHJvdXRlNTMuSUhvc3RlZFpvbmUsXG4gIC8qKlxuICAgKiBBbiBleGlzdGluZyBWUEMuIElmIGFuIGV4aXN0aW5nIFByaXZhdGUgSG9zdGVkIFpvbmUgaXMgcHJvdmlkZWQsXG4gICAqIHRoaXMgdmFsdWUgbXVzdCBiZSB0aGUgVlBDIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSByZXNvdXJjZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdWcGM/OiBlYzIuSVZwYyxcbiAgLyoqXG4gICAqIFRoZSBleGlzdGluZyBBUEkgR2F0ZXdheSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgcHJvdGVjdGVkIHdpdGggdGhlIFJvdXRlIDUzIGhvc3RlZCB6b25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogYXBpLklSZXN0QXBpLFxuICAvKipcbiAgICogQW4gZXhpc3RpbmcgQVdTIENlcnRpZmljYXRlIE1hbmFnZXIgY2VydGlmaWNhdGUgZm9yIHlvdXIgY3VzdG9tIGRvbWFpbiBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlbWFuYWdlci5JQ2VydGlmaWNhdGU7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVGhlIFJvdXRlNTNUb0FwaUdhdGV3YXkgY2xhc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZTUzVG9BcGlHYXRld2F5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGhvc3RlZFpvbmU6IHJvdXRlNTMuSUhvc3RlZFpvbmU7XG4gIHB1YmxpYyByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcbiAgcHVibGljIHJlYWRvbmx5IGFwaUdhdGV3YXk6IGFwaS5SZXN0QXBpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2VydGlmaWNhdGU6IGNlcnRpZmljYXRlbWFuYWdlci5JQ2VydGlmaWNhdGU7XG4gIC8qKlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBSb3V0ZTUzVG9BcGlHYXRld2F5IGNsYXNzLlxuICAgKiBAcGFyYW0ge2Nkay5BcHB9IHNjb3BlIC0gcmVwcmVzZW50cyB0aGUgc2NvcGUgZm9yIGFsbCB0aGUgcmVzb3VyY2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSB0aGlzIGlzIGEgYSBzY29wZS11bmlxdWUgaWQuXG4gICAqIEBwYXJhbSB7Um91dGU1M1RvQXBpR2F0ZXdheVByb3BzfSBwcm9wcyAtIHVzZXIgcHJvdmlkZWQgcHJvcHMgZm9yIHRoZSBjb25zdHJ1Y3RcbiAgICogQHNpbmNlIDAuOC4wXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuY2VydGlmaWNhdGUgPSBwcm9wcy5leGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlO1xuXG4gICAgaWYgKHByb3BzLmV4aXN0aW5nVnBjKSB7XG4gICAgICB0aGlzLnZwYyA9IHByb3BzLmV4aXN0aW5nVnBjO1xuICAgIH1cblxuICAgIC8vIEV4aXN0aW5nIFB1YmxpYyBvciBQcml2YXRlIEhvc3RlZCBab25lXG4gICAgaWYgKHByb3BzLmV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSkge1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gcHJvcHMuZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlO1xuICAgICAgdGhpcy5FeGlzdGluZ0hvc3RlZFpvbmVQcm9wQ2hlY2socHJvcHMpO1xuXG4gICAgfSBlbHNlIHsgLy8gQ3JlYXRpbmcgYSBQcml2YXRlIEhvc3RlZCBab25lXG4gICAgICB0aGlzLlByaXZhdGVIb3N0ZWRab25lUHJvcHNDaGVja3MocHJvcHMpO1xuICAgICAgY29uc3QgbWFudWZhY3R1cmVkUHJvcHM6IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmVQcm9wcyA9IGRlZmF1bHRzLm92ZXJyaWRlUHJvcHMocHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcywgeyB2cGM6IHRoaXMudnBjIH0pO1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gbmV3IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmUodGhpcywgYCR7aWR9LXpvbmVgLCBtYW51ZmFjdHVyZWRQcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBJUmVzdEFwaSB0byBSZXN0QXBpXG4gICAgdGhpcy5hcGlHYXRld2F5ID0gcHJvcHMuZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlIGFzIGFwaS5SZXN0QXBpO1xuXG4gICAgLy8gQWRkIGN1c3RvbSBkb21haW4gbmFtZSBpbiBBUEkgR2F0ZXdheVxuICAgIHRoaXMuYXBpR2F0ZXdheS5hZGREb21haW5OYW1lKCdDdXN0b21Eb21haW5OYW1lJywge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMuY2VydGlmaWNhdGVcbiAgICB9KTtcblxuICAgIGNvbnN0IGFyZWNvcmRQcm9wczogcm91dGU1My5BUmVjb3JkUHJvcHMgPSB7XG4gICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgdGFyZ2V0cy5BcGlHYXRld2F5KHRoaXMuYXBpR2F0ZXdheSkpXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBBIFJlY29yZCBpbiBjdXN0b20gZG9tYWluIHRvIHJvdXRlIHRyYWZmaWMgdG8gQVBJIEdhdGV3YXlcbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHRoaXMsICdDdXN0b21Eb21haW5BbGlhc1JlY29yZCcsIGFyZWNvcmRQcm9wcyk7IC8vIE5PU09OQVJcbiAgfVxuXG4gIHByaXZhdGUgRXhpc3RpbmdIb3N0ZWRab25lUHJvcENoZWNrKHByb3BzOiBSb3V0ZTUzVG9BcGlHYXRld2F5UHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZXhpc3RpbmdWcGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb3ZpZGUgYW4gZXhpc3RpbmcgVlBDIHRvIGFuIGV4aXN0aW5nIFByaXZhdGUgSG9zdGVkIFpvbmUuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5wcml2YXRlSG9zdGVkWm9uZVByb3BzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBlaXRoZXIgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIG9yIHByaXZhdGVIb3N0ZWRab25lUHJvcHMsIGJ1dCBub3QgYm90aC4nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIFByaXZhdGVIb3N0ZWRab25lUHJvcHNDaGVja3MocHJvcHM6IFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wcykge1xuICAgIGlmIChwcm9wcy5wdWJsaWNBcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHVibGljIEFQSXMgcmVxdWlyZSBhbiBleGlzdGluZ0hvc3RlZFpvbmUgYmUgcGFzc2VkIGluIHRoZSBQcm9wcyBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICghcHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgZWl0aGVyIGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSBvciBwcml2YXRlSG9zdGVkWm9uZVByb3BzLicpO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIFZQQyBzcGVjcyBtdXN0IGJlIHByb3ZpZGVkIGF0IHRoZSBDb25zdHJ1Y3QgbGV2ZWwgaW4gUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzLicpO1xuICAgIH1cbiAgICBpZiAoIXByb3BzLnByaXZhdGVIb3N0ZWRab25lUHJvcHMuem9uZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBzdXBwbHkgem9uZU5hbWUgZm9yIFByaXZhdGUgSG9zdGVkIFpvbmUgUHJvcHMuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBzcGVjaWZ5IGFuIGV4aXN0aW5nVlBDIGZvciB0aGUgUHJpdmF0ZSBIb3N0ZWQgWm9uZSBpbiB0aGUgY29uc3RydWN0IHByb3BzLicpO1xuICAgIH1cbiAgfVxufVxuIl19
82
+ Route53ToApiGateway[_a] = { fqn: "@aws-solutions-constructs/aws-route53-apigateway.Route53ToApiGateway", version: "2.100.0" };
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWVBLG1EQUFtRDtBQUNuRCwyREFBMkQ7QUFFM0QsMkRBQTJEO0FBRTNELHdGQUF3RjtBQUN4RiwyQ0FBdUM7QUErQ3ZDOztHQUVHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUztJQUtoRDs7Ozs7OztPQU9HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUN2RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLFFBQVEsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsNEJBQTRCLENBQUM7UUFFdEQsSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQy9CLENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQywyQkFBMkIsQ0FBQztZQUNwRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUMsQ0FBQzthQUFNLENBQUMsQ0FBQyxpQ0FBaUM7WUFDeEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pDLE1BQU0saUJBQWlCLEdBQW1DLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xJLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLDJCQUEwQyxDQUFDO1FBRW5FLHdDQUF3QztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRTtZQUNoRCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRO1lBQ3BDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM5QixDQUFDLENBQUM7UUFFSCxNQUFNLFlBQVksR0FBeUI7WUFDekMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3JCLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2hGLENBQUM7UUFFRixtRUFBbUU7UUFDbkUsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSx5QkFBeUIsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVU7SUFDaEYsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEtBQStCO1FBQ2pFLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDBGQUEwRixDQUFDLENBQUM7UUFDOUcsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxLQUErQjtRQUNsRSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUM7UUFDOUYsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQztRQUN4RyxDQUFDO1FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGlGQUFpRixDQUFDLENBQUM7UUFDckcsQ0FBQztJQUNILENBQUM7O0FBN0VILGtEQThFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIEltcG9ydHNcbmltcG9ydCAqIGFzIGFwaSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQgKiBhcyByb3V0ZTUzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtcm91dGU1M1wiO1xuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtcm91dGU1My10YXJnZXRzJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gJ0Bhd3Mtc29sdXRpb25zLWNvbnN0cnVjdHMvY29yZSc7XG5pbXBvcnQgKiBhcyBjZXJ0aWZpY2F0ZW1hbmFnZXIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlcic7XG4vLyBOb3RlOiBUbyBlbnN1cmUgQ0RLdjIgY29tcGF0aWJpbGl0eSwga2VlcCB0aGUgaW1wb3J0IHN0YXRlbWVudCBmb3IgQ29uc3RydWN0IHNlcGFyYXRlXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgcHJvcGVydGllcyBmb3IgdGhlIFJvdXRlNTNUb0FwaUdhdGV3YXkgY2xhc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gY3JlYXRlIGEgcHVibGljIG9yIHByaXZhdGUgQVBJLiBUaGlzIHZhbHVlIGhhcyBpbXBsaWNhdGlvbnNcbiAgICogZm9yIHRoZSBWUEMsIHRoZSB0eXBlIG9mIEhvc3RlZCBab25lIGFuZCB0aGUgQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlclxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQXBpOiBib29sZWFuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gcHJvcGVydGllcyBmb3IgYSBuZXcgUHJpdmF0ZSBIb3N0ZWQgWm9uZS4gQ2Fubm90IGJlIHNwZWNpZmllZCBmb3IgYVxuICAgKiBwdWJsaWMgQVBJLiBDYW5ub3Qgc3BlY2lmeSBhIFZQQywgaXQgd2lsbCB1c2UgdGhlIFZQQyBpbiBleGlzdGluZ1ZwYyBvciB0aGUgVlBDIGNyZWF0ZWQgYnkgdGhlIGNvbnN0cnVjdC5cbiAgICogUHJvdmlkaW5nIGJvdGggdGhpcyBhbmQgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIGNhdXNlcyBhbiBlcnJvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBwcml2YXRlSG9zdGVkWm9uZVByb3BzPzogcm91dGU1My5Qcml2YXRlSG9zdGVkWm9uZVByb3BzIHwgYW55LFxuICAvKipcbiAgICogRXhpc3RpbmcgUHVibGljIG9yIFByaXZhdGUgSG9zdGVkIFpvbmUuIElmIGEgUHJpdmF0ZSBIb3N0ZWQgWm9uZSwgbXVzdFxuICAgKiBleGlzdCBpbiB0aGUgc2FtZSBWUEMgc3BlY2lmaWVkIGluIGV4aXN0aW5nVnBjXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlPzogcm91dGU1My5JSG9zdGVkWm9uZSxcbiAgLyoqXG4gICAqIEFuIGV4aXN0aW5nIFZQQy4gSWYgYW4gZXhpc3RpbmcgUHJpdmF0ZSBIb3N0ZWQgWm9uZSBpcyBwcm92aWRlZCxcbiAgICogdGhpcyB2YWx1ZSBtdXN0IGJlIHRoZSBWUEMgYXNzb2NpYXRlZCB3aXRoIHRob3NlIHJlc291cmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ1ZwYz86IGVjMi5JVnBjLFxuICAvKipcbiAgICogVGhlIGV4aXN0aW5nIEFQSSBHYXRld2F5IGluc3RhbmNlIHRoYXQgd2lsbCBiZSBwcm90ZWN0ZWQgd2l0aCB0aGUgUm91dGUgNTMgaG9zdGVkIHpvbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiBhcGkuSVJlc3RBcGksXG4gIC8qKlxuICAgKiBBbiBleGlzdGluZyBBV1MgQ2VydGlmaWNhdGUgTWFuYWdlciBjZXJ0aWZpY2F0ZSBmb3IgeW91ciBjdXN0b20gZG9tYWluIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdDZXJ0aWZpY2F0ZUludGVyZmFjZTogY2VydGlmaWNhdGVtYW5hZ2VyLklDZXJ0aWZpY2F0ZTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBUaGUgUm91dGU1M1RvQXBpR2F0ZXdheSBjbGFzcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlNTNUb0FwaUdhdGV3YXkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgaG9zdGVkWm9uZTogcm91dGU1My5JSG9zdGVkWm9uZTtcbiAgcHVibGljIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpR2F0ZXdheTogYXBpLlJlc3RBcGk7XG4gIHB1YmxpYyByZWFkb25seSBjZXJ0aWZpY2F0ZTogY2VydGlmaWNhdGVtYW5hZ2VyLklDZXJ0aWZpY2F0ZTtcbiAgLyoqXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFJvdXRlNTNUb0FwaUdhdGV3YXkgY2xhc3MuXG4gICAqIEBwYXJhbSB7Y2RrLkFwcH0gc2NvcGUgLSByZXByZXNlbnRzIHRoZSBzY29wZSBmb3IgYWxsIHRoZSByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIHRoaXMgaXMgYSBhIHNjb3BlLXVuaXF1ZSBpZC5cbiAgICogQHBhcmFtIHtSb3V0ZTUzVG9BcGlHYXRld2F5UHJvcHN9IHByb3BzIC0gdXNlciBwcm92aWRlZCBwcm9wcyBmb3IgdGhlIGNvbnN0cnVjdFxuICAgKiBAc2luY2UgMC44LjBcbiAgICogQGFjY2VzcyBwdWJsaWNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBSb3V0ZTUzVG9BcGlHYXRld2F5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIGRlZmF1bHRzLlZhbGlkYXRlUHJpdmF0ZUhvc3RlZFpvbmVQcm9wcyh0aGlzLCBwcm9wcy5wcml2YXRlSG9zdGVkWm9uZVByb3BzKTtcblxuICAgIHRoaXMuY2VydGlmaWNhdGUgPSBwcm9wcy5leGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlO1xuXG4gICAgaWYgKHByb3BzLmV4aXN0aW5nVnBjKSB7XG4gICAgICB0aGlzLnZwYyA9IHByb3BzLmV4aXN0aW5nVnBjO1xuICAgIH1cblxuICAgIC8vIEV4aXN0aW5nIFB1YmxpYyBvciBQcml2YXRlIEhvc3RlZCBab25lXG4gICAgaWYgKHByb3BzLmV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSkge1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gcHJvcHMuZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlO1xuICAgICAgdGhpcy5FeGlzdGluZ0hvc3RlZFpvbmVQcm9wQ2hlY2socHJvcHMpO1xuXG4gICAgfSBlbHNlIHsgLy8gQ3JlYXRpbmcgYSBQcml2YXRlIEhvc3RlZCBab25lXG4gICAgICB0aGlzLlByaXZhdGVIb3N0ZWRab25lUHJvcHNDaGVja3MocHJvcHMpO1xuICAgICAgY29uc3QgbWFudWZhY3R1cmVkUHJvcHM6IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmVQcm9wcyA9IGRlZmF1bHRzLm92ZXJyaWRlUHJvcHMocHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcywgeyB2cGM6IHRoaXMudnBjIH0pO1xuICAgICAgdGhpcy5ob3N0ZWRab25lID0gbmV3IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmUodGhpcywgYCR7aWR9LXpvbmVgLCBtYW51ZmFjdHVyZWRQcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBJUmVzdEFwaSB0byBSZXN0QXBpXG4gICAgdGhpcy5hcGlHYXRld2F5ID0gcHJvcHMuZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlIGFzIGFwaS5SZXN0QXBpO1xuXG4gICAgLy8gQWRkIGN1c3RvbSBkb21haW4gbmFtZSBpbiBBUEkgR2F0ZXdheVxuICAgIHRoaXMuYXBpR2F0ZXdheS5hZGREb21haW5OYW1lKCdDdXN0b21Eb21haW5OYW1lJywge1xuICAgICAgZG9tYWluTmFtZTogdGhpcy5ob3N0ZWRab25lLnpvbmVOYW1lLFxuICAgICAgY2VydGlmaWNhdGU6IHRoaXMuY2VydGlmaWNhdGVcbiAgICB9KTtcblxuICAgIGNvbnN0IGFyZWNvcmRQcm9wczogcm91dGU1My5BUmVjb3JkUHJvcHMgPSB7XG4gICAgICB6b25lOiB0aGlzLmhvc3RlZFpvbmUsXG4gICAgICB0YXJnZXQ6IHJvdXRlNTMuUmVjb3JkVGFyZ2V0LmZyb21BbGlhcyhuZXcgdGFyZ2V0cy5BcGlHYXRld2F5KHRoaXMuYXBpR2F0ZXdheSkpXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBBIFJlY29yZCBpbiBjdXN0b20gZG9tYWluIHRvIHJvdXRlIHRyYWZmaWMgdG8gQVBJIEdhdGV3YXlcbiAgICBuZXcgcm91dGU1My5BUmVjb3JkKHRoaXMsICdDdXN0b21Eb21haW5BbGlhc1JlY29yZCcsIGFyZWNvcmRQcm9wcyk7IC8vIE5PU09OQVJcbiAgfVxuXG4gIHByaXZhdGUgRXhpc3RpbmdIb3N0ZWRab25lUHJvcENoZWNrKHByb3BzOiBSb3V0ZTUzVG9BcGlHYXRld2F5UHJvcHMpIHtcbiAgICBpZiAocHJvcHMuZXhpc3RpbmdWcGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb3ZpZGUgYW4gZXhpc3RpbmcgVlBDIHRvIGFuIGV4aXN0aW5nIFByaXZhdGUgSG9zdGVkIFpvbmUuJyk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5wcml2YXRlSG9zdGVkWm9uZVByb3BzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBlaXRoZXIgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIG9yIHByaXZhdGVIb3N0ZWRab25lUHJvcHMsIGJ1dCBub3QgYm90aC4nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIFByaXZhdGVIb3N0ZWRab25lUHJvcHNDaGVja3MocHJvcHM6IFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wcykge1xuICAgIGlmIChwcm9wcy5wdWJsaWNBcGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUHVibGljIEFQSXMgcmVxdWlyZSBhbiBleGlzdGluZ0hvc3RlZFpvbmUgYmUgcGFzc2VkIGluIHRoZSBQcm9wcyBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICghcHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IHByb3ZpZGUgZWl0aGVyIGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSBvciBwcml2YXRlSG9zdGVkWm9uZVByb3BzLicpO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJpdmF0ZUhvc3RlZFpvbmVQcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWxsIFZQQyBzcGVjcyBtdXN0IGJlIHByb3ZpZGVkIGF0IHRoZSBDb25zdHJ1Y3QgbGV2ZWwgaW4gUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzLicpO1xuICAgIH1cbiAgICBpZiAoIXByb3BzLnByaXZhdGVIb3N0ZWRab25lUHJvcHMuem9uZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBzdXBwbHkgem9uZU5hbWUgZm9yIFByaXZhdGUgSG9zdGVkIFpvbmUgUHJvcHMuJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBzcGVjaWZ5IGFuIGV4aXN0aW5nVlBDIGZvciB0aGUgUHJpdmF0ZSBIb3N0ZWQgWm9uZSBpbiB0aGUgY29uc3RydWN0IHByb3BzLicpO1xuICAgIH1cbiAgfVxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aws-solutions-constructs/aws-route53-apigateway",
3
- "version": "2.98.0",
3
+ "version": "2.100.0",
4
4
  "description": "CDK constructs for connecting an Amazon Route53 domain to an API Gateway.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -45,7 +45,6 @@
45
45
  "dotnet": {
46
46
  "namespace": "Amazon.SolutionsConstructs.AWS.Route53ApiGateway",
47
47
  "packageId": "Amazon.SolutionsConstructs.AWS.Route53ApiGateway",
48
- "signAssembly": true,
49
48
  "iconUrl": "https://raw.githubusercontent.com/aws/aws-cdk/master/logo/default-256-dark.png"
50
49
  },
51
50
  "python": {
@@ -55,14 +54,14 @@
55
54
  }
56
55
  },
57
56
  "dependencies": {
58
- "@aws-solutions-constructs/core": "2.98.0",
57
+ "@aws-solutions-constructs/core": "2.100.0",
59
58
  "constructs": "^10.0.0"
60
59
  },
61
60
  "devDependencies": {
62
- "@aws-cdk/integ-tests-alpha": "2.234.0-alpha.0",
61
+ "@aws-cdk/integ-tests-alpha": "2.239.0-alpha.0",
63
62
  "@types/node": "^10.3.0",
64
63
  "constructs": "^10.0.0",
65
- "aws-cdk-lib": "2.234.0"
64
+ "aws-cdk-lib": "2.239.0"
66
65
  },
67
66
  "jest": {
68
67
  "moduleFileExtensions": [
@@ -79,9 +78,9 @@
79
78
  ]
80
79
  },
81
80
  "peerDependencies": {
82
- "@aws-solutions-constructs/core": "2.98.0",
81
+ "@aws-solutions-constructs/core": "2.100.0",
83
82
  "constructs": "^10.0.0",
84
- "aws-cdk-lib": "^2.234.0"
83
+ "aws-cdk-lib": "^2.239.0"
85
84
  },
86
85
  "keywords": [
87
86
  "aws",
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
6
+ * with the License. A copy of the License is located at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
11
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
12
+ * and limitations under the License.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ // Imports
16
+ const cdk = require("aws-cdk-lib");
17
+ const lib_1 = require("../lib");
18
+ const route53 = require("aws-cdk-lib/aws-route53");
19
+ const defaults = require("@aws-solutions-constructs/core");
20
+ const acm = require("aws-cdk-lib/aws-certificatemanager");
21
+ const assertions_1 = require("aws-cdk-lib/assertions");
22
+ const ec2 = require("aws-cdk-lib/aws-ec2");
23
+ // Deploying Public/Private Existing Hosted Zones
24
+ function deployApi(stack, publicApi) {
25
+ const regionalRestApiResponse = defaults.RegionalRestApi(stack);
26
+ regionalRestApiResponse.api.root.addMethod('GET');
27
+ const domainName = "www.test-example.com";
28
+ let newZone;
29
+ if (publicApi) {
30
+ newZone = new route53.PublicHostedZone(stack, "new-zone", {
31
+ zoneName: domainName,
32
+ });
33
+ }
34
+ else {
35
+ const vpc = defaults.buildVpc(stack, {
36
+ defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
37
+ constructVpcProps: {
38
+ enableDnsHostnames: true,
39
+ enableDnsSupport: true,
40
+ ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
41
+ },
42
+ });
43
+ newZone = new route53.PrivateHostedZone(stack, "new-zone", {
44
+ zoneName: domainName,
45
+ vpc
46
+ });
47
+ }
48
+ const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
49
+ // Definitions
50
+ const props = {
51
+ publicApi,
52
+ existingHostedZoneInterface: newZone,
53
+ existingApiGatewayInterface: regionalRestApiResponse.api,
54
+ existingCertificateInterface: certificate,
55
+ };
56
+ return new lib_1.Route53ToApiGateway(stack, "api-stack", props);
57
+ }
58
+ // --------------------------------------------------------------
59
+ // Check for pattern props
60
+ // --------------------------------------------------------------
61
+ test("Test for default params construct props", () => {
62
+ // Initial Setup
63
+ const stack = new cdk.Stack();
64
+ const construct = deployApi(stack, false);
65
+ // Assertion
66
+ expect(construct.apiGateway).not.toBeNull();
67
+ expect(construct.hostedZone).not.toBeNull();
68
+ expect(construct.vpc).not.toBeNull();
69
+ expect(construct.certificate).not.toBeNull();
70
+ });
71
+ // --------------------------------------------------------------
72
+ // Check for errors when creating a private hosted zone
73
+ // --------------------------------------------------------------
74
+ test("Test for errors when creating a private hosted zone", () => {
75
+ // Initial Setup
76
+ const stack = new cdk.Stack();
77
+ const regionalRestApiResponse = defaults.RegionalRestApi(stack);
78
+ const domainName = "www.test-example.com";
79
+ const vpc = defaults.buildVpc(stack, {
80
+ defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
81
+ constructVpcProps: {
82
+ enableDnsHostnames: true,
83
+ enableDnsSupport: true,
84
+ ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
85
+ },
86
+ });
87
+ const newZone = new route53.PrivateHostedZone(stack, "new-zone", {
88
+ zoneName: domainName,
89
+ vpc
90
+ });
91
+ const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
92
+ let app = () => new lib_1.Route53ToApiGateway(stack, "api-stack1", {
93
+ publicApi: true,
94
+ existingApiGatewayInterface: regionalRestApiResponse.api,
95
+ existingCertificateInterface: certificate
96
+ });
97
+ // Assertion 1
98
+ expect(app).toThrow("Public APIs require an existingHostedZone be passed in the Props object.");
99
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack2", {
100
+ publicApi: false,
101
+ existingApiGatewayInterface: regionalRestApiResponse.api,
102
+ existingCertificateInterface: certificate
103
+ });
104
+ // Assertion 2
105
+ expect(app).toThrow("Must provide either existingHostedZoneInterface or privateHostedZoneProps.");
106
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack3", {
107
+ publicApi: false,
108
+ privateHostedZoneProps: {
109
+ zoneName: "test-example.com",
110
+ vpc,
111
+ },
112
+ existingApiGatewayInterface: regionalRestApiResponse.api,
113
+ existingCertificateInterface: certificate
114
+ });
115
+ // Assertion 3
116
+ expect(app).toThrow("All VPC specs must be provided at the Construct level in Route53ToApiGatewayProps");
117
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack4", {
118
+ publicApi: false,
119
+ existingHostedZoneInterface: newZone,
120
+ existingVpc: vpc,
121
+ existingApiGatewayInterface: regionalRestApiResponse.api,
122
+ existingCertificateInterface: certificate
123
+ });
124
+ // Assertion 4
125
+ expect(app).toThrow("Cannot provide an existing VPC to an existing Private Hosted Zone.");
126
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack5", {
127
+ publicApi: false,
128
+ existingHostedZoneInterface: newZone,
129
+ existingApiGatewayInterface: regionalRestApiResponse.api,
130
+ privateHostedZoneProps: {
131
+ zoneName: "test-example.com"
132
+ },
133
+ existingCertificateInterface: certificate
134
+ });
135
+ // Assertion 5
136
+ expect(app).toThrow("Must provide either existingHostedZoneInterface or privateHostedZoneProps, but not both.");
137
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack6", {
138
+ publicApi: false,
139
+ privateHostedZoneProps: {},
140
+ existingApiGatewayInterface: regionalRestApiResponse.api,
141
+ existingCertificateInterface: certificate
142
+ });
143
+ // Assertion 6
144
+ expect(app).toThrow('Must supply zoneName for Private Hosted Zone Props.');
145
+ app = () => new lib_1.Route53ToApiGateway(stack, "api-stack7", {
146
+ publicApi: false,
147
+ privateHostedZoneProps: {
148
+ zoneName: "test.example.com"
149
+ },
150
+ existingApiGatewayInterface: regionalRestApiResponse.api,
151
+ existingCertificateInterface: certificate
152
+ });
153
+ // Assertion 7
154
+ expect(app).toThrow('Must specify an existingVPC for the Private Hosted Zone in the construct props.');
155
+ });
156
+ // --------------------------------------------------------------
157
+ // Check for providing private hosted zone props
158
+ // --------------------------------------------------------------
159
+ test("Test for providing private hosted zone props", () => {
160
+ // Initial Setup
161
+ const stack = new cdk.Stack();
162
+ const regionalRestApiResponse = defaults.RegionalRestApi(stack);
163
+ regionalRestApiResponse.api.root.addMethod('GET');
164
+ const domainName = "www.private-zone.com";
165
+ const vpc = defaults.buildVpc(stack, {
166
+ defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
167
+ constructVpcProps: {
168
+ enableDnsHostnames: true,
169
+ enableDnsSupport: true,
170
+ ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
171
+ },
172
+ });
173
+ const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
174
+ new lib_1.Route53ToApiGateway(stack, "api-stack1", {
175
+ publicApi: false,
176
+ existingApiGatewayInterface: regionalRestApiResponse.api,
177
+ privateHostedZoneProps: {
178
+ zoneName: domainName,
179
+ },
180
+ existingVpc: vpc,
181
+ existingCertificateInterface: certificate
182
+ });
183
+ const template = assertions_1.Template.fromStack(stack);
184
+ template.hasResourceProperties("AWS::Route53::HostedZone", {
185
+ Name: "www.private-zone.com.",
186
+ VPCs: [
187
+ {
188
+ VPCId: {
189
+ Ref: "Vpc8378EB38",
190
+ },
191
+ VPCRegion: {
192
+ Ref: "AWS::Region",
193
+ },
194
+ },
195
+ ],
196
+ });
197
+ });
198
+ // --------------------------------------------------------------
199
+ // Check for A record creation in Public Hosted Zone
200
+ // --------------------------------------------------------------
201
+ test("Integration test for A record creation in Public Hosted Zone ", () => {
202
+ // Initial Setup
203
+ const stack = new cdk.Stack();
204
+ deployApi(stack, true);
205
+ // Assertions
206
+ const template = assertions_1.Template.fromStack(stack);
207
+ template.hasResourceProperties("AWS::Route53::RecordSet", {
208
+ Name: "www.test-example.com.",
209
+ Type: "A",
210
+ AliasTarget: {
211
+ DNSName: {
212
+ "Fn::GetAtt": [
213
+ "RestApiCustomDomainName94F28E16",
214
+ "RegionalDomainName",
215
+ ],
216
+ },
217
+ HostedZoneId: {
218
+ "Fn::GetAtt": [
219
+ "RestApiCustomDomainName94F28E16",
220
+ "RegionalHostedZoneId",
221
+ ],
222
+ },
223
+ },
224
+ HostedZoneId: {
225
+ Ref: "newzone1D011936",
226
+ },
227
+ });
228
+ template.hasResourceProperties("AWS::ApiGateway::RestApi", {
229
+ EndpointConfiguration: {
230
+ Types: [
231
+ "REGIONAL"
232
+ ]
233
+ },
234
+ Name: "RestApi"
235
+ });
236
+ });
237
+ // --------------------------------------------------------------
238
+ // Check for A record creation in Private Hosted Zone
239
+ // --------------------------------------------------------------
240
+ test("Integration test for A record creation in Private Hosted Zone ", () => {
241
+ // Initial Setup
242
+ const stack = new cdk.Stack();
243
+ deployApi(stack, false);
244
+ // Assertions
245
+ const template = assertions_1.Template.fromStack(stack);
246
+ template.hasResourceProperties("AWS::Route53::RecordSet", {
247
+ Name: "www.test-example.com.",
248
+ Type: "A",
249
+ AliasTarget: {
250
+ DNSName: {
251
+ "Fn::GetAtt": [
252
+ "RestApiCustomDomainName94F28E16",
253
+ "RegionalDomainName",
254
+ ],
255
+ },
256
+ HostedZoneId: {
257
+ "Fn::GetAtt": [
258
+ "RestApiCustomDomainName94F28E16",
259
+ "RegionalHostedZoneId",
260
+ ],
261
+ },
262
+ },
263
+ HostedZoneId: {
264
+ Ref: "newzone1D011936",
265
+ },
266
+ });
267
+ template.hasResourceProperties("AWS::Route53::HostedZone", {
268
+ Name: "www.test-example.com.",
269
+ VPCs: [
270
+ {
271
+ VPCId: {
272
+ Ref: "Vpc8378EB38",
273
+ },
274
+ VPCRegion: {
275
+ Ref: "AWS::Region",
276
+ },
277
+ },
278
+ ],
279
+ });
280
+ template.hasResourceProperties("AWS::ApiGateway::RestApi", {
281
+ EndpointConfiguration: {
282
+ Types: [
283
+ "REGIONAL"
284
+ ]
285
+ },
286
+ Name: "RestApi"
287
+ });
288
+ });
289
+ test('Test that ValidatePrivateHostedZoneProps() is being called', () => {
290
+ const stack = new cdk.Stack();
291
+ // Definitions
292
+ const props = {
293
+ publicApi: false,
294
+ existingHostedZoneInterface: {},
295
+ existingApiGatewayInterface: {},
296
+ existingCertificateInterface: {},
297
+ privateHostedZoneProps: {
298
+ invalidProperty: true
299
+ }
300
+ };
301
+ const app = () => {
302
+ new lib_1.Route53ToApiGateway(stack, "api-stack", props);
303
+ };
304
+ expect(app).toThrow(/ERROR - invalidProperty is not a valid property of PrivateHostedZoneProps/);
305
+ });
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGU1My1hcGlnYXRld2F5LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJyb3V0ZTUzLWFwaWdhdGV3YXkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7O0FBRUgsVUFBVTtBQUNWLG1DQUFtQztBQUNuQyxnQ0FBdUU7QUFDdkUsbURBQW1EO0FBQ25ELDJEQUEyRDtBQUMzRCwwREFBMEQ7QUFDMUQsdURBQWtEO0FBQ2xELDJDQUEyQztBQUczQyxpREFBaUQ7QUFDakQsU0FBUyxTQUFTLENBQ2hCLEtBQWdCLEVBQ2hCLFNBQWtCO0lBRWxCLE1BQU0sdUJBQXVCLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVsRCxNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQztJQUUxQyxJQUFJLE9BQTZELENBQUM7SUFFbEUsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ3hELFFBQVEsRUFBRSxVQUFVO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDbkMsZUFBZSxFQUFFLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtZQUN4RCxpQkFBaUIsRUFBRTtnQkFDakIsa0JBQWtCLEVBQUUsSUFBSTtnQkFDeEIsZ0JBQWdCLEVBQUUsSUFBSTtnQkFDdEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2FBQ3BEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLGlCQUFpQixDQUFD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NEIsRUFBRSxFQUFzQjtRQUNwRCxzQkFBc0IsRUFBRTtZQUN0QixlQUFlLEVBQUUsSUFBSTtTQUN0QjtLQUNGLENBQUM7SUFFRixNQUFNLEdBQUcsR0FBRyxHQUFHLEVBQUU7UUFDZixJQUFJLHlCQUFtQixDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDckQsQ0FBQyxDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQywyRUFBMkUsQ0FBQyxDQUFDO0FBQ25HLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2VcbiAqICB3aXRoIHRoZSBMaWNlbnNlLiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIG9yIGluIHRoZSAnbGljZW5zZScgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTXG4gKiAgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnNcbiAqICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLy8gSW1wb3J0c1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgUm91dGU1M1RvQXBpR2F0ZXdheSwgUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzIH0gZnJvbSBcIi4uL2xpYlwiO1xuaW1wb3J0ICogYXMgcm91dGU1MyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXJvdXRlNTNcIjtcbmltcG9ydCAqIGFzIGRlZmF1bHRzIGZyb20gXCJAYXdzLXNvbHV0aW9ucy1jb25zdHJ1Y3RzL2NvcmVcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGFwaWdhdGV3YXkgZnJvbSAnYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXknO1xuXG4vLyBEZXBsb3lpbmcgUHVibGljL1ByaXZhdGUgRXhpc3RpbmcgSG9zdGVkIFpvbmVzXG5mdW5jdGlvbiBkZXBsb3lBcGkoXG4gIHN0YWNrOiBjZGsuU3RhY2ssXG4gIHB1YmxpY0FwaTogYm9vbGVhblxuKSB7XG4gIGNvbnN0IHJlZ2lvbmFsUmVzdEFwaVJlc3BvbnNlID0gZGVmYXVsdHMuUmVnaW9uYWxSZXN0QXBpKHN0YWNrKTtcbiAgcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLnJvb3QuYWRkTWV0aG9kKCdHRVQnKTtcblxuICBjb25zdCBkb21haW5OYW1lID0gXCJ3d3cudGVzdC1leGFtcGxlLmNvbVwiO1xuXG4gIGxldCBuZXdab25lOiByb3V0ZTUzLlB1YmxpY0hvc3RlZFpvbmUgfCByb3V0ZTUzLlByaXZhdGVIb3N0ZWRab25lO1xuXG4gIGlmIChwdWJsaWNBcGkpIHtcbiAgICBuZXdab25lID0gbmV3IHJvdXRlNTMuUHVibGljSG9zdGVkWm9uZShzdGFjaywgXCJuZXctem9uZVwiLCB7XG4gICAgICB6b25lTmFtZTogZG9tYWluTmFtZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB2cGMgPSBkZWZhdWx0cy5idWlsZFZwYyhzdGFjaywge1xuICAgICAgZGVmYXVsdFZwY1Byb3BzOiBkZWZhdWx0cy5EZWZhdWx0UHVibGljUHJpdmF0ZVZwY1Byb3BzKCksXG4gICAgICBjb25zdHJ1Y3RWcGNQcm9wczoge1xuICAgICAgICBlbmFibGVEbnNIb3N0bmFtZXM6IHRydWUsXG4gICAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgIGlwQWRkcmVzc2VzOiBlYzIuSXBBZGRyZXNzZXMuY2lkcihcIjE3Mi4xNjguMC4wLzE2XCIpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG5ld1pvbmUgPSBuZXcgcm91dGU1My5Qcml2YXRlSG9zdGVkWm9uZShzdGFjaywgXCJuZXctem9uZVwiLCB7XG4gICAgICB6b25lTmFtZTogZG9tYWluTmFtZSxcbiAgICAgIHZwY1xuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgY2VydGlmaWNhdGUgPSBhY20uQ2VydGlmaWNhdGUuZnJvbUNlcnRpZmljYXRlQXJuKFxuICAgIHN0YWNrLFxuICAgIFwiZmFrZS1jZXJ0XCIsXG4gICAgXCJhcm46YXdzOmFjbTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmNlcnRpZmljYXRlLzExMTEyMjIyLTMzMzMtMTIzNC0xMjM0LTEyMzQ1Njc4OTAxMlwiXG4gICk7XG5cbiAgLy8gRGVmaW5pdGlvbnNcbiAgY29uc3QgcHJvcHM6IFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wcyA9IHtcbiAgICBwdWJsaWNBcGksXG4gICAgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlOiBuZXdab25lLFxuICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLFxuICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUm91dGU1M1RvQXBpR2F0ZXdheShzdGFjaywgXCJhcGktc3RhY2tcIiwgcHJvcHMpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIHBhdHRlcm4gcHJvcHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KFwiVGVzdCBmb3IgZGVmYXVsdCBwYXJhbXMgY29uc3RydWN0IHByb3BzXCIsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgY29uc3QgY29uc3RydWN0ID0gZGVwbG95QXBpKHN0YWNrLCBmYWxzZSk7XG5cbiAgLy8gQXNzZXJ0aW9uXG4gIGV4cGVjdChjb25zdHJ1Y3QuYXBpR2F0ZXdheSkubm90LnRvQmVOdWxsKCk7XG4gIGV4cGVjdChjb25zdHJ1Y3QuaG9zdGVkWm9uZSkubm90LnRvQmVOdWxsKCk7XG4gIGV4cGVjdChjb25zdHJ1Y3QudnBjKS5ub3QudG9CZU51bGwoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5jZXJ0aWZpY2F0ZSkubm90LnRvQmVOdWxsKCk7XG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENoZWNrIGZvciBlcnJvcnMgd2hlbiBjcmVhdGluZyBhIHByaXZhdGUgaG9zdGVkIHpvbmVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG50ZXN0KFwiVGVzdCBmb3IgZXJyb3JzIHdoZW4gY3JlYXRpbmcgYSBwcml2YXRlIGhvc3RlZCB6b25lXCIsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgY29uc3QgcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UgPSBkZWZhdWx0cy5SZWdpb25hbFJlc3RBcGkoc3RhY2spO1xuICBjb25zdCBkb21haW5OYW1lID0gXCJ3d3cudGVzdC1leGFtcGxlLmNvbVwiO1xuXG4gIGNvbnN0IHZwYyA9IGRlZmF1bHRzLmJ1aWxkVnBjKHN0YWNrLCB7XG4gICAgZGVmYXVsdFZwY1Byb3BzOiBkZWZhdWx0cy5EZWZhdWx0UHVibGljUHJpdmF0ZVZwY1Byb3BzKCksXG4gICAgY29uc3RydWN0VnBjUHJvcHM6IHtcbiAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgIGVuYWJsZURuc1N1cHBvcnQ6IHRydWUsXG4gICAgICBpcEFkZHJlc3NlczogZWMyLklwQWRkcmVzc2VzLmNpZHIoXCIxNzIuMTY4LjAuMC8xNlwiKSxcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBuZXdab25lID0gbmV3IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmUoc3RhY2ssIFwibmV3LXpvbmVcIiwge1xuICAgIHpvbmVOYW1lOiBkb21haW5OYW1lLFxuICAgIHZwY1xuICB9KTtcblxuICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGFjbS5DZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgc3RhY2ssXG4gICAgXCJmYWtlLWNlcnRcIixcbiAgICBcImFybjphd3M6YWNtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Y2VydGlmaWNhdGUvMTExMTIyMjItMzMzMy0xMjM0LTEyMzQtMTIzNDU2Nzg5MDEyXCJcbiAgKTtcblxuICBsZXQgYXBwID0gKCkgPT5cbiAgICBuZXcgUm91dGU1M1RvQXBpR2F0ZXdheShzdGFjaywgXCJhcGktc3RhY2sxXCIsIHtcbiAgICAgIHB1YmxpY0FwaTogdHJ1ZSxcbiAgICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLFxuICAgICAgZXhpc3RpbmdDZXJ0aWZpY2F0ZUludGVyZmFjZTogY2VydGlmaWNhdGVcbiAgICB9KTtcbiAgLy8gQXNzZXJ0aW9uIDFcbiAgZXhwZWN0KGFwcCkudG9UaHJvdyhcbiAgICBcIlB1YmxpYyBBUElzIHJlcXVpcmUgYW4gZXhpc3RpbmdIb3N0ZWRab25lIGJlIHBhc3NlZCBpbiB0aGUgUHJvcHMgb2JqZWN0LlwiXG4gICk7XG5cbiAgYXBwID0gKCkgPT5cbiAgICBuZXcgUm91dGU1M1RvQXBpR2F0ZXdheShzdGFjaywgXCJhcGktc3RhY2syXCIsIHtcbiAgICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgICBleGlzdGluZ0FwaUdhdGV3YXlJbnRlcmZhY2U6IHJlZ2lvbmFsUmVzdEFwaVJlc3BvbnNlLmFwaSxcbiAgICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlXG4gICAgfSk7XG5cbiAgLy8gQXNzZXJ0aW9uIDJcbiAgZXhwZWN0KGFwcCkudG9UaHJvdyhcbiAgICBcIk11c3QgcHJvdmlkZSBlaXRoZXIgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIG9yIHByaXZhdGVIb3N0ZWRab25lUHJvcHMuXCJcbiAgKTtcblxuICBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazNcIiwge1xuICAgICAgcHVibGljQXBpOiBmYWxzZSxcbiAgICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgICAgem9uZU5hbWU6IFwidGVzdC1leGFtcGxlLmNvbVwiLFxuICAgICAgICB2cGMsXG4gICAgICB9LFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiAzXG4gIGV4cGVjdChhcHApLnRvVGhyb3coXG4gICAgXCJBbGwgVlBDIHNwZWNzIG11c3QgYmUgcHJvdmlkZWQgYXQgdGhlIENvbnN0cnVjdCBsZXZlbCBpbiBSb3V0ZTUzVG9BcGlHYXRld2F5UHJvcHNcIlxuICApO1xuXG4gIGFwcCA9ICgpID0+XG4gICAgbmV3IFJvdXRlNTNUb0FwaUdhdGV3YXkoc3RhY2ssIFwiYXBpLXN0YWNrNFwiLCB7XG4gICAgICBwdWJsaWNBcGk6IGZhbHNlLFxuICAgICAgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlOiBuZXdab25lLFxuICAgICAgZXhpc3RpbmdWcGM6IHZwYyxcbiAgICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLFxuICAgICAgZXhpc3RpbmdDZXJ0aWZpY2F0ZUludGVyZmFjZTogY2VydGlmaWNhdGVcbiAgICB9KTtcblxuICAvLyBBc3NlcnRpb24gNFxuICBleHBlY3QoYXBwKS50b1Rocm93KFxuICAgIFwiQ2Fubm90IHByb3ZpZGUgYW4gZXhpc3RpbmcgVlBDIHRvIGFuIGV4aXN0aW5nIFByaXZhdGUgSG9zdGVkIFpvbmUuXCJcbiAgKTtcblxuICBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazVcIiwge1xuICAgICAgcHVibGljQXBpOiBmYWxzZSxcbiAgICAgIGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZTogbmV3Wm9uZSxcbiAgICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLFxuICAgICAgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wczoge1xuICAgICAgICB6b25lTmFtZTogXCJ0ZXN0LWV4YW1wbGUuY29tXCJcbiAgICAgIH0sXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiA1XG4gIGV4cGVjdChhcHApLnRvVGhyb3coXG4gICAgXCJNdXN0IHByb3ZpZGUgZWl0aGVyIGV4aXN0aW5nSG9zdGVkWm9uZUludGVyZmFjZSBvciBwcml2YXRlSG9zdGVkWm9uZVByb3BzLCBidXQgbm90IGJvdGguXCJcbiAgKTtcblxuICBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazZcIiwge1xuICAgICAgcHVibGljQXBpOiBmYWxzZSxcbiAgICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgIH0sXG4gICAgICBleGlzdGluZ0FwaUdhdGV3YXlJbnRlcmZhY2U6IHJlZ2lvbmFsUmVzdEFwaVJlc3BvbnNlLmFwaSxcbiAgICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlXG4gICAgfSk7XG5cbiAgLy8gQXNzZXJ0aW9uIDZcbiAgZXhwZWN0KGFwcCkudG9UaHJvdyhcbiAgICAnTXVzdCBzdXBwbHkgem9uZU5hbWUgZm9yIFByaXZhdGUgSG9zdGVkIFpvbmUgUHJvcHMuJ1xuICApO1xuXG4gIGFwcCA9ICgpID0+XG4gICAgbmV3IFJvdXRlNTNUb0FwaUdhdGV3YXkoc3RhY2ssIFwiYXBpLXN0YWNrN1wiLCB7XG4gICAgICBwdWJsaWNBcGk6IGZhbHNlLFxuICAgICAgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wczoge1xuICAgICAgICB6b25lTmFtZTogXCJ0ZXN0LmV4YW1wbGUuY29tXCJcbiAgICAgIH0sXG4gICAgICBleGlzdGluZ0FwaUdhdGV3YXlJbnRlcmZhY2U6IHJlZ2lvbmFsUmVzdEFwaVJlc3BvbnNlLmFwaSxcbiAgICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlXG4gICAgfSk7XG5cbiAgLy8gQXNzZXJ0aW9uIDdcbiAgZXhwZWN0KGFwcCkudG9UaHJvdyhcbiAgICAnTXVzdCBzcGVjaWZ5IGFuIGV4aXN0aW5nVlBDIGZvciB0aGUgUHJpdmF0ZSBIb3N0ZWQgWm9uZSBpbiB0aGUgY29uc3RydWN0IHByb3BzLidcbiAgKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIHByb3ZpZGluZyBwcml2YXRlIGhvc3RlZCB6b25lIHByb3BzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdChcIlRlc3QgZm9yIHByb3ZpZGluZyBwcml2YXRlIGhvc3RlZCB6b25lIHByb3BzXCIsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgY29uc3QgcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UgPSBkZWZhdWx0cy5SZWdpb25hbFJlc3RBcGkoc3RhY2spO1xuICByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGkucm9vdC5hZGRNZXRob2QoJ0dFVCcpO1xuXG4gIGNvbnN0IGRvbWFpbk5hbWUgPSBcInd3dy5wcml2YXRlLXpvbmUuY29tXCI7XG5cbiAgY29uc3QgdnBjID0gZGVmYXVsdHMuYnVpbGRWcGMoc3RhY2ssIHtcbiAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgICBjb25zdHJ1Y3RWcGNQcm9wczoge1xuICAgICAgZW5hYmxlRG5zSG9zdG5hbWVzOiB0cnVlLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdHJ1ZSxcbiAgICAgIGlwQWRkcmVzc2VzOiBlYzIuSXBBZGRyZXNzZXMuY2lkcihcIjE3Mi4xNjguMC4wLzE2XCIpLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGNlcnRpZmljYXRlID0gYWNtLkNlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybihcbiAgICBzdGFjayxcbiAgICBcImZha2UtY2VydFwiLFxuICAgIFwiYXJuOmF3czphY206dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpjZXJ0aWZpY2F0ZS8xMTExMjIyMi0zMzMzLTEyMzQtMTIzNC0xMjM0NTY3ODkwMTJcIlxuICApO1xuXG4gIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazFcIiwge1xuICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wczoge1xuICAgICAgem9uZU5hbWU6IGRvbWFpbk5hbWUsXG4gICAgfSxcbiAgICBleGlzdGluZ1ZwYzogdnBjLFxuICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlXG4gIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXCIsIHtcbiAgICBOYW1lOiBcInd3dy5wcml2YXRlLXpvbmUuY29tLlwiLFxuICAgIFZQQ3M6IFtcbiAgICAgIHtcbiAgICAgICAgVlBDSWQ6IHtcbiAgICAgICAgICBSZWY6IFwiVnBjODM3OEVCMzhcIixcbiAgICAgICAgfSxcbiAgICAgICAgVlBDUmVnaW9uOiB7XG4gICAgICAgICAgUmVmOiBcIkFXUzo6UmVnaW9uXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgQSByZWNvcmQgY3JlYXRpb24gaW4gUHVibGljIEhvc3RlZCBab25lXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdChcIkludGVncmF0aW9uIHRlc3QgZm9yIEEgcmVjb3JkIGNyZWF0aW9uIGluIFB1YmxpYyBIb3N0ZWQgWm9uZSBcIiwgKCkgPT4ge1xuICAvLyBJbml0aWFsIFNldHVwXG4gIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICBkZXBsb3lBcGkoc3RhY2ssIHRydWUpO1xuXG4gIC8vIEFzc2VydGlvbnNcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBUeXBlOiBcIkFcIixcbiAgICBBbGlhc1RhcmdldDoge1xuICAgICAgRE5TTmFtZToge1xuICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgIFwiUmVzdEFwaUN1c3RvbURvbWFpbk5hbWU5NEYyOEUxNlwiLFxuICAgICAgICAgIFwiUmVnaW9uYWxEb21haW5OYW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgSG9zdGVkWm9uZUlkOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJSZXN0QXBpQ3VzdG9tRG9tYWluTmFtZTk0RjI4RTE2XCIsXG4gICAgICAgICAgXCJSZWdpb25hbEhvc3RlZFpvbmVJZFwiLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIEhvc3RlZFpvbmVJZDoge1xuICAgICAgUmVmOiBcIm5ld3pvbmUxRDAxMTkzNlwiLFxuICAgIH0sXG4gIH0pO1xuXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiLCB7XG4gICAgRW5kcG9pbnRDb25maWd1cmF0aW9uOiB7XG4gICAgICBUeXBlczogW1xuICAgICAgICBcIlJFR0lPTkFMXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIE5hbWU6IFwiUmVzdEFwaVwiXG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgQSByZWNvcmQgY3JlYXRpb24gaW4gUHJpdmF0ZSBIb3N0ZWQgWm9uZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoXCJJbnRlZ3JhdGlvbiB0ZXN0IGZvciBBIHJlY29yZCBjcmVhdGlvbiBpbiBQcml2YXRlIEhvc3RlZCBab25lIFwiLCAoKSA9PiB7XG4gIC8vIEluaXRpYWwgU2V0dXBcbiAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gIGRlcGxveUFwaShzdGFjaywgZmFsc2UpO1xuXG4gIC8vIEFzc2VydGlvbnNcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBUeXBlOiBcIkFcIixcbiAgICBBbGlhc1RhcmdldDoge1xuICAgICAgRE5TTmFtZToge1xuICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgIFwiUmVzdEFwaUN1c3RvbURvbWFpbk5hbWU5NEYyOEUxNlwiLFxuICAgICAgICAgIFwiUmVnaW9uYWxEb21haW5OYW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgSG9zdGVkWm9uZUlkOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJSZXN0QXBpQ3VzdG9tRG9tYWluTmFtZTk0RjI4RTE2XCIsXG4gICAgICAgICAgXCJSZWdpb25hbEhvc3RlZFpvbmVJZFwiLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIEhvc3RlZFpvbmVJZDoge1xuICAgICAgUmVmOiBcIm5ld3pvbmUxRDAxMTkzNlwiLFxuICAgIH0sXG4gIH0pO1xuXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6Um91dGU1Mzo6SG9zdGVkWm9uZVwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBWUENzOiBbXG4gICAgICB7XG4gICAgICAgIFZQQ0lkOiB7XG4gICAgICAgICAgUmVmOiBcIlZwYzgzNzhFQjM4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFZQQ1JlZ2lvbjoge1xuICAgICAgICAgIFJlZjogXCJBV1M6OlJlZ2lvblwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OkFwaUdhdGV3YXk6OlJlc3RBcGlcIiwge1xuICAgIEVuZHBvaW50Q29uZmlndXJhdGlvbjoge1xuICAgICAgVHlwZXM6IFtcbiAgICAgICAgXCJSRUdJT05BTFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBOYW1lOiBcIlJlc3RBcGlcIlxuICB9KTtcbn0pO1xuXG50ZXN0KCdUZXN0IHRoYXQgVmFsaWRhdGVQcml2YXRlSG9zdGVkWm9uZVByb3BzKCkgaXMgYmVpbmcgY2FsbGVkJywgKCkgPT4ge1xuICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcblxuICAvLyBEZWZpbml0aW9uc1xuICBjb25zdCBwcm9wczogUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzID0ge1xuICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlOiB7fSBhcyByb3V0ZTUzLklIb3N0ZWRab25lLFxuICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZToge30gYXMgYXBpZ2F0ZXdheS5JUmVzdEFwaSxcbiAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiB7fSBhcyBhY20uSUNlcnRpZmljYXRlLFxuICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgIGludmFsaWRQcm9wZXJ0eTogdHJ1ZVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBhcHAgPSAoKSA9PiB7XG4gICAgbmV3IFJvdXRlNTNUb0FwaUdhdGV3YXkoc3RhY2ssIFwiYXBpLXN0YWNrXCIsIHByb3BzKTtcbiAgfTtcblxuICBleHBlY3QoYXBwKS50b1Rocm93KC9FUlJPUiAtIGludmFsaWRQcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCBwcm9wZXJ0eSBvZiBQcml2YXRlSG9zdGVkWm9uZVByb3BzLyk7XG59KTtcbiJdfQ==
@@ -1,291 +0,0 @@
1
- "use strict";
2
- /**
3
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
6
- * with the License. A copy of the License is located at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
11
- * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
12
- * and limitations under the License.
13
- */
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- // Imports
16
- const cdk = require("aws-cdk-lib");
17
- const lib_1 = require("../lib");
18
- const route53 = require("aws-cdk-lib/aws-route53");
19
- const defaults = require("@aws-solutions-constructs/core");
20
- const acm = require("aws-cdk-lib/aws-certificatemanager");
21
- const assertions_1 = require("aws-cdk-lib/assertions");
22
- const ec2 = require("aws-cdk-lib/aws-ec2");
23
- // Deploying Public/Private Existing Hosted Zones
24
- function deployApi(stack, publicApi) {
25
- const regionalRestApiResponse = defaults.RegionalRestApi(stack);
26
- regionalRestApiResponse.api.root.addMethod('GET');
27
- const domainName = "www.test-example.com";
28
- let newZone;
29
- if (publicApi) {
30
- newZone = new route53.PublicHostedZone(stack, "new-zone", {
31
- zoneName: domainName,
32
- });
33
- }
34
- else {
35
- const vpc = defaults.buildVpc(stack, {
36
- defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
37
- constructVpcProps: {
38
- enableDnsHostnames: true,
39
- enableDnsSupport: true,
40
- ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
41
- },
42
- });
43
- newZone = new route53.PrivateHostedZone(stack, "new-zone", {
44
- zoneName: domainName,
45
- vpc
46
- });
47
- }
48
- const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
49
- // Definitions
50
- const props = {
51
- publicApi,
52
- existingHostedZoneInterface: newZone,
53
- existingApiGatewayInterface: regionalRestApiResponse.api,
54
- existingCertificateInterface: certificate,
55
- };
56
- return new lib_1.Route53ToApiGateway(stack, "api-stack", props);
57
- }
58
- // --------------------------------------------------------------
59
- // Check for pattern props
60
- // --------------------------------------------------------------
61
- test("Test for default params construct props", () => {
62
- // Initial Setup
63
- const stack = new cdk.Stack();
64
- const construct = deployApi(stack, false);
65
- // Assertion
66
- expect(construct.apiGateway).not.toBeNull();
67
- expect(construct.hostedZone).not.toBeNull();
68
- expect(construct.vpc).not.toBeNull();
69
- expect(construct.certificate).not.toBeNull();
70
- });
71
- // --------------------------------------------------------------
72
- // Check for errors when creating a private hosted zone
73
- // --------------------------------------------------------------
74
- test("Test for errors when creating a private hosted zone", () => {
75
- // Initial Setup
76
- const stack = new cdk.Stack();
77
- const regionalRestApiResponse = defaults.RegionalRestApi(stack);
78
- const domainName = "www.test-example.com";
79
- const vpc = defaults.buildVpc(stack, {
80
- defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
81
- constructVpcProps: {
82
- enableDnsHostnames: true,
83
- enableDnsSupport: true,
84
- ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
85
- },
86
- });
87
- const newZone = new route53.PrivateHostedZone(stack, "new-zone", {
88
- zoneName: domainName,
89
- vpc
90
- });
91
- const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
92
- let app = () => new lib_1.Route53ToApiGateway(stack, "api-stack1", {
93
- publicApi: true,
94
- existingApiGatewayInterface: regionalRestApiResponse.api,
95
- existingCertificateInterface: certificate
96
- });
97
- // Assertion 1
98
- expect(app).toThrowError("Public APIs require an existingHostedZone be passed in the Props object.");
99
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack2", {
100
- publicApi: false,
101
- existingApiGatewayInterface: regionalRestApiResponse.api,
102
- existingCertificateInterface: certificate
103
- });
104
- // Assertion 2
105
- expect(app).toThrowError("Must provide either existingHostedZoneInterface or privateHostedZoneProps.");
106
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack3", {
107
- publicApi: false,
108
- privateHostedZoneProps: {
109
- zoneName: "test-example.com",
110
- vpc,
111
- },
112
- existingApiGatewayInterface: regionalRestApiResponse.api,
113
- existingCertificateInterface: certificate
114
- });
115
- // Assertion 3
116
- expect(app).toThrowError("All VPC specs must be provided at the Construct level in Route53ToApiGatewayProps");
117
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack4", {
118
- publicApi: false,
119
- existingHostedZoneInterface: newZone,
120
- existingVpc: vpc,
121
- existingApiGatewayInterface: regionalRestApiResponse.api,
122
- existingCertificateInterface: certificate
123
- });
124
- // Assertion 4
125
- expect(app).toThrowError("Cannot provide an existing VPC to an existing Private Hosted Zone.");
126
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack5", {
127
- publicApi: false,
128
- existingHostedZoneInterface: newZone,
129
- existingApiGatewayInterface: regionalRestApiResponse.api,
130
- privateHostedZoneProps: {
131
- domainName: "test-example.com"
132
- },
133
- existingCertificateInterface: certificate
134
- });
135
- // Assertion 5
136
- expect(app).toThrowError("Must provide either existingHostedZoneInterface or privateHostedZoneProps, but not both.");
137
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack6", {
138
- publicApi: false,
139
- privateHostedZoneProps: {
140
- domainName: "test.example.com"
141
- },
142
- existingApiGatewayInterface: regionalRestApiResponse.api,
143
- existingCertificateInterface: certificate
144
- });
145
- // Assertion 6
146
- expect(app).toThrowError('Must supply zoneName for Private Hosted Zone Props.');
147
- app = () => new lib_1.Route53ToApiGateway(stack, "api-stack7", {
148
- publicApi: false,
149
- privateHostedZoneProps: {
150
- zoneName: "test.example.com"
151
- },
152
- existingApiGatewayInterface: regionalRestApiResponse.api,
153
- existingCertificateInterface: certificate
154
- });
155
- // Assertion 7
156
- expect(app).toThrowError('Must specify an existingVPC for the Private Hosted Zone in the construct props.');
157
- });
158
- // --------------------------------------------------------------
159
- // Check for providing private hosted zone props
160
- // --------------------------------------------------------------
161
- test("Test for providing private hosted zone props", () => {
162
- // Initial Setup
163
- const stack = new cdk.Stack();
164
- const regionalRestApiResponse = defaults.RegionalRestApi(stack);
165
- regionalRestApiResponse.api.root.addMethod('GET');
166
- const domainName = "www.private-zone.com";
167
- const vpc = defaults.buildVpc(stack, {
168
- defaultVpcProps: defaults.DefaultPublicPrivateVpcProps(),
169
- constructVpcProps: {
170
- enableDnsHostnames: true,
171
- enableDnsSupport: true,
172
- ipAddresses: ec2.IpAddresses.cidr("172.168.0.0/16"),
173
- },
174
- });
175
- const certificate = acm.Certificate.fromCertificateArn(stack, "fake-cert", "arn:aws:acm:us-east-1:123456789012:certificate/11112222-3333-1234-1234-123456789012");
176
- new lib_1.Route53ToApiGateway(stack, "api-stack1", {
177
- publicApi: false,
178
- existingApiGatewayInterface: regionalRestApiResponse.api,
179
- privateHostedZoneProps: {
180
- zoneName: domainName,
181
- },
182
- existingVpc: vpc,
183
- existingCertificateInterface: certificate
184
- });
185
- const template = assertions_1.Template.fromStack(stack);
186
- template.hasResourceProperties("AWS::Route53::HostedZone", {
187
- Name: "www.private-zone.com.",
188
- VPCs: [
189
- {
190
- VPCId: {
191
- Ref: "Vpc8378EB38",
192
- },
193
- VPCRegion: {
194
- Ref: "AWS::Region",
195
- },
196
- },
197
- ],
198
- });
199
- });
200
- // --------------------------------------------------------------
201
- // Check for A record creation in Public Hosted Zone
202
- // --------------------------------------------------------------
203
- test("Integration test for A record creation in Public Hosted Zone ", () => {
204
- // Initial Setup
205
- const stack = new cdk.Stack();
206
- deployApi(stack, true);
207
- // Assertions
208
- const template = assertions_1.Template.fromStack(stack);
209
- template.hasResourceProperties("AWS::Route53::RecordSet", {
210
- Name: "www.test-example.com.",
211
- Type: "A",
212
- AliasTarget: {
213
- DNSName: {
214
- "Fn::GetAtt": [
215
- "RestApiCustomDomainName94F28E16",
216
- "RegionalDomainName",
217
- ],
218
- },
219
- HostedZoneId: {
220
- "Fn::GetAtt": [
221
- "RestApiCustomDomainName94F28E16",
222
- "RegionalHostedZoneId",
223
- ],
224
- },
225
- },
226
- HostedZoneId: {
227
- Ref: "newzone1D011936",
228
- },
229
- });
230
- template.hasResourceProperties("AWS::ApiGateway::RestApi", {
231
- EndpointConfiguration: {
232
- Types: [
233
- "REGIONAL"
234
- ]
235
- },
236
- Name: "RestApi"
237
- });
238
- });
239
- // --------------------------------------------------------------
240
- // Check for A record creation in Private Hosted Zone
241
- // --------------------------------------------------------------
242
- test("Integration test for A record creation in Private Hosted Zone ", () => {
243
- // Initial Setup
244
- const stack = new cdk.Stack();
245
- deployApi(stack, false);
246
- // Assertions
247
- const template = assertions_1.Template.fromStack(stack);
248
- template.hasResourceProperties("AWS::Route53::RecordSet", {
249
- Name: "www.test-example.com.",
250
- Type: "A",
251
- AliasTarget: {
252
- DNSName: {
253
- "Fn::GetAtt": [
254
- "RestApiCustomDomainName94F28E16",
255
- "RegionalDomainName",
256
- ],
257
- },
258
- HostedZoneId: {
259
- "Fn::GetAtt": [
260
- "RestApiCustomDomainName94F28E16",
261
- "RegionalHostedZoneId",
262
- ],
263
- },
264
- },
265
- HostedZoneId: {
266
- Ref: "newzone1D011936",
267
- },
268
- });
269
- template.hasResourceProperties("AWS::Route53::HostedZone", {
270
- Name: "www.test-example.com.",
271
- VPCs: [
272
- {
273
- VPCId: {
274
- Ref: "Vpc8378EB38",
275
- },
276
- VPCRegion: {
277
- Ref: "AWS::Region",
278
- },
279
- },
280
- ],
281
- });
282
- template.hasResourceProperties("AWS::ApiGateway::RestApi", {
283
- EndpointConfiguration: {
284
- Types: [
285
- "REGIONAL"
286
- ]
287
- },
288
- Name: "RestApi"
289
- });
290
- });
291
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5yb3V0ZTUzLWFwaWdhdGV3YXkudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3Qucm91dGU1My1hcGlnYXRld2F5LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOztBQUVILFVBQVU7QUFDVixtQ0FBbUM7QUFDbkMsZ0NBQXVFO0FBQ3ZFLG1EQUFtRDtBQUNuRCwyREFBMkQ7QUFDM0QsMERBQTBEO0FBQzFELHVEQUFrRDtBQUNsRCwyQ0FBMkM7QUFFM0MsaURBQWlEO0FBQ2pELFNBQVMsU0FBUyxDQUNoQixLQUFnQixFQUNoQixTQUFrQjtJQUVsQixNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEUsdUJBQXVCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEQsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUM7SUFFMUMsSUFBSSxPQUE2RCxDQUFDO0lBRWxFLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUN4RCxRQUFRLEVBQUUsVUFBVTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ25DLGVBQWUsRUFBRSxRQUFRLENBQUMsNEJBQTRCLEVBQUU7WUFDeEQsaUJBQWlCLEVBQUU7Z0JBQ2pCLGtCQUFrQixFQUFFLElBQUk7Z0JBQ3hCLGdCQUFnQixFQUFFLElBQUk7Z0JBQ3RCLFdBQVcsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQzthQUNwRDtTQUNGLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxp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QUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhCLGFBQWE7SUFDYixNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxRQUFRLENBQUMscUJBQXFCLENBQUMseUJBQXlCLEVBQUU7UUFDeEQsSUFBSSxFQUFFLHVCQUF1QjtRQUM3QixJQUFJLEVBQUUsR0FBRztRQUNULFdBQVcsRUFBRTtZQUNYLE9BQU8sRUFBRTtnQkFDUCxZQUFZLEVBQUU7b0JBQ1osaUNBQWlDO29CQUNqQyxvQkFBb0I7aUJBQ3JCO2FBQ0Y7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osWUFBWSxFQUFFO29CQUNaLGlDQUFpQztvQkFDakMsc0JBQXNCO2lCQUN2QjthQUNGO1NBQ0Y7UUFDRCxZQUFZLEVBQUU7WUFDWixHQUFHLEVBQUUsaUJBQWlCO1NBQ3ZCO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHFCQUFxQixDQUFDLDBCQUEwQixFQUFFO1FBQ3pELElBQUksRUFBRSx1QkFBdUI7UUFDN0IsSUFBSSxFQUFFO1lBQ0o7Z0JBQ0UsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxhQUFhO2lCQUNuQjtnQkFDRCxTQUFTLEVBQUU7b0JBQ1QsR0FBRyxFQUFFLGFBQWE7aUJBQ25CO2FBQ0Y7U0FDRjtLQUNGLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQywwQkFBMEIsRUFBRTtRQUN6RCxxQkFBcUIsRUFBRTtZQUNyQixLQUFLLEVBQUU7Z0JBQ0wsVUFBVTthQUNYO1NBQ0Y7UUFDRCxJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIEltcG9ydHNcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IFJvdXRlNTNUb0FwaUdhdGV3YXksIFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wcyB9IGZyb20gXCIuLi9saWJcIjtcbmltcG9ydCAqIGFzIHJvdXRlNTMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1yb3V0ZTUzXCI7XG5pbXBvcnQgKiBhcyBkZWZhdWx0cyBmcm9tIFwiQGF3cy1zb2x1dGlvbnMtY29uc3RydWN0cy9jb3JlXCI7XG5pbXBvcnQgKiBhcyBhY20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jZXJ0aWZpY2F0ZW1hbmFnZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5cbi8vIERlcGxveWluZyBQdWJsaWMvUHJpdmF0ZSBFeGlzdGluZyBIb3N0ZWQgWm9uZXNcbmZ1bmN0aW9uIGRlcGxveUFwaShcbiAgc3RhY2s6IGNkay5TdGFjayxcbiAgcHVibGljQXBpOiBib29sZWFuXG4pIHtcbiAgY29uc3QgcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UgPSBkZWZhdWx0cy5SZWdpb25hbFJlc3RBcGkoc3RhY2spO1xuICByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGkucm9vdC5hZGRNZXRob2QoJ0dFVCcpO1xuXG4gIGNvbnN0IGRvbWFpbk5hbWUgPSBcInd3dy50ZXN0LWV4YW1wbGUuY29tXCI7XG5cbiAgbGV0IG5ld1pvbmU6IHJvdXRlNTMuUHVibGljSG9zdGVkWm9uZSB8IHJvdXRlNTMuUHJpdmF0ZUhvc3RlZFpvbmU7XG5cbiAgaWYgKHB1YmxpY0FwaSkge1xuICAgIG5ld1pvbmUgPSBuZXcgcm91dGU1My5QdWJsaWNIb3N0ZWRab25lKHN0YWNrLCBcIm5ldy16b25lXCIsIHtcbiAgICAgIHpvbmVOYW1lOiBkb21haW5OYW1lLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZwYyA9IGRlZmF1bHRzLmJ1aWxkVnBjKHN0YWNrLCB7XG4gICAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgICAgIGNvbnN0cnVjdFZwY1Byb3BzOiB7XG4gICAgICAgIGVuYWJsZURuc0hvc3RuYW1lczogdHJ1ZSxcbiAgICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgaXBBZGRyZXNzZXM6IGVjMi5JcEFkZHJlc3Nlcy5jaWRyKFwiMTcyLjE2OC4wLjAvMTZcIiksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgbmV3Wm9uZSA9IG5ldyByb3V0ZTUzLlByaXZhdGVIb3N0ZWRab25lKHN0YWNrLCBcIm5ldy16b25lXCIsIHtcbiAgICAgIHpvbmVOYW1lOiBkb21haW5OYW1lLFxuICAgICAgdnBjXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGFjbS5DZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVBcm4oXG4gICAgc3RhY2ssXG4gICAgXCJmYWtlLWNlcnRcIixcbiAgICBcImFybjphd3M6YWNtOnVzLWVhc3QtMToxMjM0NTY3ODkwMTI6Y2VydGlmaWNhdGUvMTExMTIyMjItMzMzMy0xMjM0LTEyMzQtMTIzNDU2Nzg5MDEyXCJcbiAgKTtcblxuICAvLyBEZWZpbml0aW9uc1xuICBjb25zdCBwcm9wczogUm91dGU1M1RvQXBpR2F0ZXdheVByb3BzID0ge1xuICAgIHB1YmxpY0FwaSxcbiAgICBleGlzdGluZ0hvc3RlZFpvbmVJbnRlcmZhY2U6IG5ld1pvbmUsXG4gICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgZXhpc3RpbmdDZXJ0aWZpY2F0ZUludGVyZmFjZTogY2VydGlmaWNhdGUsXG4gIH07XG5cbiAgcmV0dXJuIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFja1wiLCBwcm9wcyk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgcGF0dGVybiBwcm9wc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoXCJUZXN0IGZvciBkZWZhdWx0IHBhcmFtcyBjb25zdHJ1Y3QgcHJvcHNcIiwgKCkgPT4ge1xuICAvLyBJbml0aWFsIFNldHVwXG4gIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICBjb25zdCBjb25zdHJ1Y3QgPSBkZXBsb3lBcGkoc3RhY2ssIGZhbHNlKTtcblxuICAvLyBBc3NlcnRpb25cbiAgZXhwZWN0KGNvbnN0cnVjdC5hcGlHYXRld2F5KS5ub3QudG9CZU51bGwoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC5ob3N0ZWRab25lKS5ub3QudG9CZU51bGwoKTtcbiAgZXhwZWN0KGNvbnN0cnVjdC52cGMpLm5vdC50b0JlTnVsbCgpO1xuICBleHBlY3QoY29uc3RydWN0LmNlcnRpZmljYXRlKS5ub3QudG9CZU51bGwoKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIGVycm9ycyB3aGVuIGNyZWF0aW5nIGEgcHJpdmF0ZSBob3N0ZWQgem9uZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoXCJUZXN0IGZvciBlcnJvcnMgd2hlbiBjcmVhdGluZyBhIHByaXZhdGUgaG9zdGVkIHpvbmVcIiwgKCkgPT4ge1xuICAvLyBJbml0aWFsIFNldHVwXG4gIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICBjb25zdCByZWdpb25hbFJlc3RBcGlSZXNwb25zZSA9IGRlZmF1bHRzLlJlZ2lvbmFsUmVzdEFwaShzdGFjayk7XG4gIGNvbnN0IGRvbWFpbk5hbWUgPSBcInd3dy50ZXN0LWV4YW1wbGUuY29tXCI7XG5cbiAgY29uc3QgdnBjID0gZGVmYXVsdHMuYnVpbGRWcGMoc3RhY2ssIHtcbiAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgICBjb25zdHJ1Y3RWcGNQcm9wczoge1xuICAgICAgZW5hYmxlRG5zSG9zdG5hbWVzOiB0cnVlLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdHJ1ZSxcbiAgICAgIGlwQWRkcmVzc2VzOiBlYzIuSXBBZGRyZXNzZXMuY2lkcihcIjE3Mi4xNjguMC4wLzE2XCIpLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG5ld1pvbmUgPSBuZXcgcm91dGU1My5Qcml2YXRlSG9zdGVkWm9uZShzdGFjaywgXCJuZXctem9uZVwiLCB7XG4gICAgem9uZU5hbWU6IGRvbWFpbk5hbWUsXG4gICAgdnBjXG4gIH0pO1xuXG4gIGNvbnN0IGNlcnRpZmljYXRlID0gYWNtLkNlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybihcbiAgICBzdGFjayxcbiAgICBcImZha2UtY2VydFwiLFxuICAgIFwiYXJuOmF3czphY206dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpjZXJ0aWZpY2F0ZS8xMTExMjIyMi0zMzMzLTEyMzQtMTIzNC0xMjM0NTY3ODkwMTJcIlxuICApO1xuXG4gIGxldCBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazFcIiwge1xuICAgICAgcHVibGljQXBpOiB0cnVlLFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuICAvLyBBc3NlcnRpb24gMVxuICBleHBlY3QoYXBwKS50b1Rocm93RXJyb3IoXG4gICAgXCJQdWJsaWMgQVBJcyByZXF1aXJlIGFuIGV4aXN0aW5nSG9zdGVkWm9uZSBiZSBwYXNzZWQgaW4gdGhlIFByb3BzIG9iamVjdC5cIlxuICApO1xuXG4gIGFwcCA9ICgpID0+XG4gICAgbmV3IFJvdXRlNTNUb0FwaUdhdGV3YXkoc3RhY2ssIFwiYXBpLXN0YWNrMlwiLCB7XG4gICAgICBwdWJsaWNBcGk6IGZhbHNlLFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiAyXG4gIGV4cGVjdChhcHApLnRvVGhyb3dFcnJvcihcbiAgICBcIk11c3QgcHJvdmlkZSBlaXRoZXIgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIG9yIHByaXZhdGVIb3N0ZWRab25lUHJvcHMuXCJcbiAgKTtcblxuICBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazNcIiwge1xuICAgICAgcHVibGljQXBpOiBmYWxzZSxcbiAgICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgICAgem9uZU5hbWU6IFwidGVzdC1leGFtcGxlLmNvbVwiLFxuICAgICAgICB2cGMsXG4gICAgICB9LFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiAzXG4gIGV4cGVjdChhcHApLnRvVGhyb3dFcnJvcihcbiAgICBcIkFsbCBWUEMgc3BlY3MgbXVzdCBiZSBwcm92aWRlZCBhdCB0aGUgQ29uc3RydWN0IGxldmVsIGluIFJvdXRlNTNUb0FwaUdhdGV3YXlQcm9wc1wiXG4gICk7XG5cbiAgYXBwID0gKCkgPT5cbiAgICBuZXcgUm91dGU1M1RvQXBpR2F0ZXdheShzdGFjaywgXCJhcGktc3RhY2s0XCIsIHtcbiAgICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgICBleGlzdGluZ0hvc3RlZFpvbmVJbnRlcmZhY2U6IG5ld1pvbmUsXG4gICAgICBleGlzdGluZ1ZwYzogdnBjLFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiA0XG4gIGV4cGVjdChhcHApLnRvVGhyb3dFcnJvcihcbiAgICBcIkNhbm5vdCBwcm92aWRlIGFuIGV4aXN0aW5nIFZQQyB0byBhbiBleGlzdGluZyBQcml2YXRlIEhvc3RlZCBab25lLlwiXG4gICk7XG5cbiAgYXBwID0gKCkgPT5cbiAgICBuZXcgUm91dGU1M1RvQXBpR2F0ZXdheShzdGFjaywgXCJhcGktc3RhY2s1XCIsIHtcbiAgICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgICBleGlzdGluZ0hvc3RlZFpvbmVJbnRlcmZhY2U6IG5ld1pvbmUsXG4gICAgICBleGlzdGluZ0FwaUdhdGV3YXlJbnRlcmZhY2U6IHJlZ2lvbmFsUmVzdEFwaVJlc3BvbnNlLmFwaSxcbiAgICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgICAgZG9tYWluTmFtZTogXCJ0ZXN0LWV4YW1wbGUuY29tXCJcbiAgICAgIH0sXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiA1XG4gIGV4cGVjdChhcHApLnRvVGhyb3dFcnJvcihcbiAgICBcIk11c3QgcHJvdmlkZSBlaXRoZXIgZXhpc3RpbmdIb3N0ZWRab25lSW50ZXJmYWNlIG9yIHByaXZhdGVIb3N0ZWRab25lUHJvcHMsIGJ1dCBub3QgYm90aC5cIlxuICApO1xuXG4gIGFwcCA9ICgpID0+XG4gICAgbmV3IFJvdXRlNTNUb0FwaUdhdGV3YXkoc3RhY2ssIFwiYXBpLXN0YWNrNlwiLCB7XG4gICAgICBwdWJsaWNBcGk6IGZhbHNlLFxuICAgICAgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wczoge1xuICAgICAgICBkb21haW5OYW1lOiBcInRlc3QuZXhhbXBsZS5jb21cIlxuICAgICAgfSxcbiAgICAgIGV4aXN0aW5nQXBpR2F0ZXdheUludGVyZmFjZTogcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UuYXBpLFxuICAgICAgZXhpc3RpbmdDZXJ0aWZpY2F0ZUludGVyZmFjZTogY2VydGlmaWNhdGVcbiAgICB9KTtcblxuICAvLyBBc3NlcnRpb24gNlxuICBleHBlY3QoYXBwKS50b1Rocm93RXJyb3IoXG4gICAgJ011c3Qgc3VwcGx5IHpvbmVOYW1lIGZvciBQcml2YXRlIEhvc3RlZCBab25lIFByb3BzLidcbiAgKTtcblxuICBhcHAgPSAoKSA9PlxuICAgIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazdcIiwge1xuICAgICAgcHVibGljQXBpOiBmYWxzZSxcbiAgICAgIHByaXZhdGVIb3N0ZWRab25lUHJvcHM6IHtcbiAgICAgICAgem9uZU5hbWU6IFwidGVzdC5leGFtcGxlLmNvbVwiXG4gICAgICB9LFxuICAgICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgICBleGlzdGluZ0NlcnRpZmljYXRlSW50ZXJmYWNlOiBjZXJ0aWZpY2F0ZVxuICAgIH0pO1xuXG4gIC8vIEFzc2VydGlvbiA3XG4gIGV4cGVjdChhcHApLnRvVGhyb3dFcnJvcihcbiAgICAnTXVzdCBzcGVjaWZ5IGFuIGV4aXN0aW5nVlBDIGZvciB0aGUgUHJpdmF0ZSBIb3N0ZWQgWm9uZSBpbiB0aGUgY29uc3RydWN0IHByb3BzLidcbiAgKTtcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ2hlY2sgZm9yIHByb3ZpZGluZyBwcml2YXRlIGhvc3RlZCB6b25lIHByb3BzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdChcIlRlc3QgZm9yIHByb3ZpZGluZyBwcml2YXRlIGhvc3RlZCB6b25lIHByb3BzXCIsICgpID0+IHtcbiAgLy8gSW5pdGlhbCBTZXR1cFxuICBjb25zdCBzdGFjayA9IG5ldyBjZGsuU3RhY2soKTtcbiAgY29uc3QgcmVnaW9uYWxSZXN0QXBpUmVzcG9uc2UgPSBkZWZhdWx0cy5SZWdpb25hbFJlc3RBcGkoc3RhY2spO1xuICByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGkucm9vdC5hZGRNZXRob2QoJ0dFVCcpO1xuXG4gIGNvbnN0IGRvbWFpbk5hbWUgPSBcInd3dy5wcml2YXRlLXpvbmUuY29tXCI7XG5cbiAgY29uc3QgdnBjID0gZGVmYXVsdHMuYnVpbGRWcGMoc3RhY2ssIHtcbiAgICBkZWZhdWx0VnBjUHJvcHM6IGRlZmF1bHRzLkRlZmF1bHRQdWJsaWNQcml2YXRlVnBjUHJvcHMoKSxcbiAgICBjb25zdHJ1Y3RWcGNQcm9wczoge1xuICAgICAgZW5hYmxlRG5zSG9zdG5hbWVzOiB0cnVlLFxuICAgICAgZW5hYmxlRG5zU3VwcG9ydDogdHJ1ZSxcbiAgICAgIGlwQWRkcmVzc2VzOiBlYzIuSXBBZGRyZXNzZXMuY2lkcihcIjE3Mi4xNjguMC4wLzE2XCIpLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGNlcnRpZmljYXRlID0gYWNtLkNlcnRpZmljYXRlLmZyb21DZXJ0aWZpY2F0ZUFybihcbiAgICBzdGFjayxcbiAgICBcImZha2UtY2VydFwiLFxuICAgIFwiYXJuOmF3czphY206dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpjZXJ0aWZpY2F0ZS8xMTExMjIyMi0zMzMzLTEyMzQtMTIzNC0xMjM0NTY3ODkwMTJcIlxuICApO1xuXG4gIG5ldyBSb3V0ZTUzVG9BcGlHYXRld2F5KHN0YWNrLCBcImFwaS1zdGFjazFcIiwge1xuICAgIHB1YmxpY0FwaTogZmFsc2UsXG4gICAgZXhpc3RpbmdBcGlHYXRld2F5SW50ZXJmYWNlOiByZWdpb25hbFJlc3RBcGlSZXNwb25zZS5hcGksXG4gICAgcHJpdmF0ZUhvc3RlZFpvbmVQcm9wczoge1xuICAgICAgem9uZU5hbWU6IGRvbWFpbk5hbWUsXG4gICAgfSxcbiAgICBleGlzdGluZ1ZwYzogdnBjLFxuICAgIGV4aXN0aW5nQ2VydGlmaWNhdGVJbnRlcmZhY2U6IGNlcnRpZmljYXRlXG4gIH0pO1xuXG4gIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcbiAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKFwiQVdTOjpSb3V0ZTUzOjpIb3N0ZWRab25lXCIsIHtcbiAgICBOYW1lOiBcInd3dy5wcml2YXRlLXpvbmUuY29tLlwiLFxuICAgIFZQQ3M6IFtcbiAgICAgIHtcbiAgICAgICAgVlBDSWQ6IHtcbiAgICAgICAgICBSZWY6IFwiVnBjODM3OEVCMzhcIixcbiAgICAgICAgfSxcbiAgICAgICAgVlBDUmVnaW9uOiB7XG4gICAgICAgICAgUmVmOiBcIkFXUzo6UmVnaW9uXCIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgQSByZWNvcmQgY3JlYXRpb24gaW4gUHVibGljIEhvc3RlZCBab25lXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxudGVzdChcIkludGVncmF0aW9uIHRlc3QgZm9yIEEgcmVjb3JkIGNyZWF0aW9uIGluIFB1YmxpYyBIb3N0ZWQgWm9uZSBcIiwgKCkgPT4ge1xuICAvLyBJbml0aWFsIFNldHVwXG4gIGNvbnN0IHN0YWNrID0gbmV3IGNkay5TdGFjaygpO1xuICBkZXBsb3lBcGkoc3RhY2ssIHRydWUpO1xuXG4gIC8vIEFzc2VydGlvbnNcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBUeXBlOiBcIkFcIixcbiAgICBBbGlhc1RhcmdldDoge1xuICAgICAgRE5TTmFtZToge1xuICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgIFwiUmVzdEFwaUN1c3RvbURvbWFpbk5hbWU5NEYyOEUxNlwiLFxuICAgICAgICAgIFwiUmVnaW9uYWxEb21haW5OYW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgSG9zdGVkWm9uZUlkOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJSZXN0QXBpQ3VzdG9tRG9tYWluTmFtZTk0RjI4RTE2XCIsXG4gICAgICAgICAgXCJSZWdpb25hbEhvc3RlZFpvbmVJZFwiLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIEhvc3RlZFpvbmVJZDoge1xuICAgICAgUmVmOiBcIm5ld3pvbmUxRDAxMTkzNlwiLFxuICAgIH0sXG4gIH0pO1xuXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiLCB7XG4gICAgRW5kcG9pbnRDb25maWd1cmF0aW9uOiB7XG4gICAgICBUeXBlczogW1xuICAgICAgICBcIlJFR0lPTkFMXCJcbiAgICAgIF1cbiAgICB9LFxuICAgIE5hbWU6IFwiUmVzdEFwaVwiXG4gIH0pO1xufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDaGVjayBmb3IgQSByZWNvcmQgY3JlYXRpb24gaW4gUHJpdmF0ZSBIb3N0ZWQgWm9uZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbnRlc3QoXCJJbnRlZ3JhdGlvbiB0ZXN0IGZvciBBIHJlY29yZCBjcmVhdGlvbiBpbiBQcml2YXRlIEhvc3RlZCBab25lIFwiLCAoKSA9PiB7XG4gIC8vIEluaXRpYWwgU2V0dXBcbiAgY29uc3Qgc3RhY2sgPSBuZXcgY2RrLlN0YWNrKCk7XG4gIGRlcGxveUFwaShzdGFjaywgZmFsc2UpO1xuXG4gIC8vIEFzc2VydGlvbnNcbiAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OlJvdXRlNTM6OlJlY29yZFNldFwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBUeXBlOiBcIkFcIixcbiAgICBBbGlhc1RhcmdldDoge1xuICAgICAgRE5TTmFtZToge1xuICAgICAgICBcIkZuOjpHZXRBdHRcIjogW1xuICAgICAgICAgIFwiUmVzdEFwaUN1c3RvbURvbWFpbk5hbWU5NEYyOEUxNlwiLFxuICAgICAgICAgIFwiUmVnaW9uYWxEb21haW5OYW1lXCIsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgSG9zdGVkWm9uZUlkOiB7XG4gICAgICAgIFwiRm46OkdldEF0dFwiOiBbXG4gICAgICAgICAgXCJSZXN0QXBpQ3VzdG9tRG9tYWluTmFtZTk0RjI4RTE2XCIsXG4gICAgICAgICAgXCJSZWdpb25hbEhvc3RlZFpvbmVJZFwiLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIEhvc3RlZFpvbmVJZDoge1xuICAgICAgUmVmOiBcIm5ld3pvbmUxRDAxMTkzNlwiLFxuICAgIH0sXG4gIH0pO1xuXG4gIHRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcyhcIkFXUzo6Um91dGU1Mzo6SG9zdGVkWm9uZVwiLCB7XG4gICAgTmFtZTogXCJ3d3cudGVzdC1leGFtcGxlLmNvbS5cIixcbiAgICBWUENzOiBbXG4gICAgICB7XG4gICAgICAgIFZQQ0lkOiB7XG4gICAgICAgICAgUmVmOiBcIlZwYzgzNzhFQjM4XCIsXG4gICAgICAgIH0sXG4gICAgICAgIFZQQ1JlZ2lvbjoge1xuICAgICAgICAgIFJlZjogXCJBV1M6OlJlZ2lvblwiLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICB9KTtcblxuICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoXCJBV1M6OkFwaUdhdGV3YXk6OlJlc3RBcGlcIiwge1xuICAgIEVuZHBvaW50Q29uZmlndXJhdGlvbjoge1xuICAgICAgVHlwZXM6IFtcbiAgICAgICAgXCJSRUdJT05BTFwiXG4gICAgICBdXG4gICAgfSxcbiAgICBOYW1lOiBcIlJlc3RBcGlcIlxuICB9KTtcbn0pOyJdfQ==