cdktn 0.25.0-pre.2 → 0.25.0-pre.21

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 (86) hide show
  1. package/.jsii +927 -107
  2. package/lib/annotations.js +4 -4
  3. package/lib/app.js +54 -5
  4. package/lib/aspect.js +3 -4
  5. package/lib/asset-hash.d.ts +75 -0
  6. package/lib/asset-hash.js +129 -0
  7. package/lib/assets.d.ts +168 -0
  8. package/lib/assets.js +128 -0
  9. package/lib/backends/azurerm-backend.js +4 -6
  10. package/lib/backends/cloud-backend.js +10 -10
  11. package/lib/backends/consul-backend.js +4 -6
  12. package/lib/backends/cos-backend.js +4 -6
  13. package/lib/backends/gcs-backend.js +4 -6
  14. package/lib/backends/http-backend.js +4 -6
  15. package/lib/backends/local-backend.js +38 -7
  16. package/lib/backends/oss-backend.js +4 -6
  17. package/lib/backends/pg-backend.js +4 -6
  18. package/lib/backends/remote-backend.js +8 -10
  19. package/lib/backends/s3-backend.js +4 -6
  20. package/lib/backends/swift-backend.js +4 -6
  21. package/lib/complex-computed-list.js +114 -65
  22. package/lib/errors.d.ts +6 -0
  23. package/lib/errors.js +24 -3
  24. package/lib/functions/provider-function.js +2 -4
  25. package/lib/functions/terraform-functions.generated.js +2 -4
  26. package/lib/ignore-strategy.d.ts +82 -0
  27. package/lib/ignore-strategy.js +29 -0
  28. package/lib/importable-resource.js +3 -4
  29. package/lib/index.d.ts +3 -0
  30. package/lib/index.js +27 -2
  31. package/lib/manifest.js +56 -14
  32. package/lib/private/fs.d.ts +74 -2
  33. package/lib/private/fs.js +129 -17
  34. package/lib/private/unique.js +35 -2
  35. package/lib/resource.js +3 -4
  36. package/lib/synthesize/synthesizer.js +43 -4
  37. package/lib/terraform-asset.d.ts +33 -2
  38. package/lib/terraform-asset.js +118 -34
  39. package/lib/terraform-backend.js +3 -4
  40. package/lib/terraform-count.js +3 -4
  41. package/lib/terraform-data-resource.js +12 -10
  42. package/lib/terraform-data-source.js +10 -4
  43. package/lib/terraform-dynamic-block.js +5 -2
  44. package/lib/terraform-dynamic-expression.js +4 -1
  45. package/lib/terraform-element.js +34 -6
  46. package/lib/terraform-ephemeral-resource.js +10 -4
  47. package/lib/terraform-functions.js +2 -4
  48. package/lib/terraform-hcl-module.js +3 -4
  49. package/lib/terraform-iterator.js +11 -12
  50. package/lib/terraform-local.js +3 -4
  51. package/lib/terraform-module-asset.js +45 -5
  52. package/lib/terraform-module.js +8 -4
  53. package/lib/terraform-operators.js +2 -4
  54. package/lib/terraform-output.js +7 -4
  55. package/lib/terraform-provider.js +5 -4
  56. package/lib/terraform-provisioner.js +2 -4
  57. package/lib/terraform-remote-state.js +5 -5
  58. package/lib/terraform-resource-targets.js +3 -7
  59. package/lib/terraform-resource.js +16 -5
  60. package/lib/terraform-stack.js +38 -38
  61. package/lib/terraform-variable.js +25 -22
  62. package/lib/testing/index.js +42 -8
  63. package/lib/testing/matchers.js +39 -6
  64. package/lib/tfExpression.js +25 -8
  65. package/lib/tokens/lazy.js +11 -7
  66. package/lib/tokens/private/dependency.js +2 -2
  67. package/lib/tokens/private/encoding.js +6 -1
  68. package/lib/tokens/private/intrinsic.js +6 -1
  69. package/lib/tokens/private/resolve.js +2 -5
  70. package/lib/tokens/private/token-map.js +4 -6
  71. package/lib/tokens/private/uniqueid.js +35 -2
  72. package/lib/tokens/resolvable.js +4 -6
  73. package/lib/tokens/string-fragments.js +6 -10
  74. package/lib/tokens/token.js +15 -18
  75. package/lib/upgrade-id-aspect.js +37 -6
  76. package/lib/validations/target-versions.js +39 -2
  77. package/lib/validations/validate-binary-version.js +39 -2
  78. package/lib/validations/validate-function-version-support.js +2 -1
  79. package/lib/validations/validate-provider-function-target-support.js +2 -1
  80. package/lib/validations/validate-provider-presence.js +10 -9
  81. package/lib/validations/validate-terraform-version.js +3 -1
  82. package/package.json +5 -5
  83. package/scripts/pack.mjs +57 -15
  84. package/lib/tsconfig.tsbuildinfo +0 -1
  85. package/tsconfig.json +0 -40
  86. package/tsconfig.test.json +0 -12
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.TerraformResource = void 0;
5
4
  exports.lifecycleToTerraform = lifecycleToTerraform;
@@ -44,9 +43,23 @@ function lifecycleToTerraform(lifecycle) {
44
43
  }
45
44
  // eslint-disable-next-line jsdoc/require-jsdoc
46
45
  class TerraformResource extends terraform_element_1.TerraformElement {
46
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformResource", version: "0.25.0-pre.21" };
47
+ terraformResourceType;
48
+ terraformGeneratorMetadata;
49
+ // TerraformMetaArguments
50
+ dependsOn;
51
+ count;
52
+ provider;
53
+ lifecycle;
54
+ forEach;
55
+ connection;
56
+ provisioners;
57
+ _imported;
58
+ _movedByTarget;
59
+ _movedById;
60
+ _hasMoved = false;
47
61
  constructor(scope, id, config) {
48
62
  super(scope, id, config.terraformResourceType);
49
- this._hasMoved = false;
50
63
  Object.defineProperty(this, TERRAFORM_RESOURCE_SYMBOL, { value: true });
51
64
  this.terraformResourceType = config.terraformResourceType;
52
65
  this.terraformGeneratorMetadata = config.terraformGeneratorMetadata;
@@ -399,6 +412,4 @@ class TerraformResource extends terraform_element_1.TerraformElement {
399
412
  }
400
413
  }
401
414
  exports.TerraformResource = TerraformResource;
402
- _a = JSII_RTTI_SYMBOL_1;
403
- TerraformResource[_a] = { fqn: "cdktn.TerraformResource", version: "0.25.0-pre.2" };
404
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS1yZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBdUVBLG9EQXFCQzs7QUF6RkQscUNBQWlDO0FBQ2pDLDJEQUF1RDtBQUV2RCxpQ0FLZ0I7QUFFaEIsaURBQWlEO0FBRWpELDhEQUFvRTtBQUNwRSxpRkFBaUU7QUFJakUsdURBQW1EO0FBS25ELGlFQUFpRTtBQUNqRSxpQ0FBa0M7QUFNbEMseUZBQW9GO0FBQ3BGLHVEQUFtRDtBQUNuRCxxQ0FLa0I7QUFFbEIsTUFBTSx5QkFBeUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUF5QnhFOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsU0FBc0M7SUFFdEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLFNBQVM7UUFDWixHQUFHLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU07WUFDdkMsQ0FBQyxDQUFDO2dCQUNFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDM0QsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQzt3QkFDMUIsT0FBTyxDQUFDLENBQUM7b0JBQ1gsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFDZixDQUFDO2dCQUNILENBQUMsQ0FBQzthQUNIO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztLQUNmLENBQUM7QUFDSixDQUFDO0FBd0NELCtDQUErQztBQUMvQyxNQUFhLGlCQUNYLFNBQVEsb0NBQWdCO0lBc0J4QixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE1BQStCO1FBQ3ZF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LElBQUksQ0FBQyxxQkFBcUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7YUFDL0QsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUc7WUFDaEIsRUFBRSxFQUFFLEVBQUU7WUFDTixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1NBQy9ELENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksVUFBVSxDQUFDLEVBQVU7UUFDMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFBLDJDQUFrQyxFQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFDWixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFDdEQ7Z0JBQ0UsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTthQUMvRCxDQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzVELElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztJQUNKLENBQUM7O0FBdmRILDhDQXdkQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiLi90b2tlbnNcIjtcbmltcG9ydCB7IFRlcnJhZm9ybUVsZW1lbnQgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZWxlbWVudFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXIgfSBmcm9tIFwiLi90ZXJyYWZvcm0tcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGtleXNUb1NuYWtlQ2FzZSxcbiAgZGVlcE1lcmdlLFxuICBwcm9jZXNzRHluYW1pY0F0dHJpYnV0ZXMsXG4gIHByb2Nlc3NEeW5hbWljQXR0cmlidXRlc0ZvckhjbCxcbn0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgSVRlcnJhZm9ybURlcGVuZGFibGUgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuaW1wb3J0IHsgcmVmLCBkZXBlbmRhYmxlIH0gZnJvbSBcIi4vdGZFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcIi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IGNhcHR1cmVDcmVhdGlvblN0YWNrIH0gZnJvbSBcIi4vdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2VcIjtcbmltcG9ydCB7IFByb3ZpZGVyRmVhdHVyZSB9IGZyb20gXCIuL3Byb3ZpZGVyLWZlYXR1cmUtY29uc3RyYWludHNcIjtcbmltcG9ydCB7IElJbnRlcnBvbGF0aW5nUGFyZW50IH0gZnJvbSBcIi4vdGVycmFmb3JtLWFkZHJlc3NhYmxlXCI7XG5pbXBvcnQgeyBJVGVycmFmb3JtSXRlcmF0b3IgfSBmcm9tIFwiLi90ZXJyYWZvcm0taXRlcmF0b3JcIjtcbmltcG9ydCB7IFByZWNvbmRpdGlvbiwgUG9zdGNvbmRpdGlvbiB9IGZyb20gXCIuL3RlcnJhZm9ybS1jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Db3VudCB9IGZyb20gXCIuL3RlcnJhZm9ybS1jb3VudFwiO1xuaW1wb3J0IHtcbiAgU1NIUHJvdmlzaW9uZXJDb25uZWN0aW9uLFxuICBXaW5ybVByb3Zpc2lvbmVyQ29ubmVjdGlvbixcbn0gZnJvbSBcIi4vdGVycmFmb3JtLXByb3Zpc2lvbmVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5pbXBvcnQge1xuICBGaWxlUHJvdmlzaW9uZXIsXG4gIExvY2FsRXhlY1Byb3Zpc2lvbmVyLFxuICBSZW1vdGVFeGVjUHJvdmlzaW9uZXIsXG59IGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aXNpb25lclwiO1xuaW1wb3J0IHsgVmFsaWRhdGVUZXJyYWZvcm1WZXJzaW9uIH0gZnJvbSBcIi4vdmFsaWRhdGlvbnMvdmFsaWRhdGUtdGVycmFmb3JtLXZlcnNpb25cIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4vdGVycmFmb3JtLXN0YWNrXCI7XG5pbXBvcnQge1xuICBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUsXG4gIHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQsXG4gIHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0LFxuICByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldEFuZElkLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuY29uc3QgVEVSUkFGT1JNX1JFU09VUkNFX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJjZGt0Zi9UZXJyYWZvcm1SZXNvdXJjZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBJVGVycmFmb3JtUmVzb3VyY2Uge1xuICByZWFkb25seSB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZyaWVuZGx5VW5pcXVlSWQ6IHN0cmluZztcblxuICBkZXBlbmRzT24/OiBzdHJpbmdbXTtcbiAgY291bnQ/OiBudW1iZXIgfCBUZXJyYWZvcm1Db3VudDtcbiAgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbiAgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIGZvckVhY2g/OiBJVGVycmFmb3JtSXRlcmF0b3I7XG5cbiAgaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZyk6IElSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlTGlmZWN5Y2xlIHtcbiAgcmVhZG9ubHkgY3JlYXRlQmVmb3JlRGVzdHJveT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHByZXZlbnREZXN0cm95PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdIHwgXCJhbGxcIjtcbiAgcmVhZG9ubHkgcmVwbGFjZVRyaWdnZXJlZEJ5PzogQXJyYXk8SVRlcnJhZm9ybURlcGVuZGFibGUgfCBzdHJpbmc+O1xuICByZWFkb25seSBwcmVjb25kaXRpb24/OiBQcmVjb25kaXRpb25bXTtcbiAgcmVhZG9ubHkgcG9zdGNvbmRpdGlvbj86IFBvc3Rjb25kaXRpb25bXTtcbn1cblxuLyoqXG4gKiBwcmVwYXJlcyBhIGxpZmVjeWNsZSBvYmplY3QgZm9yIGJlaW5nIHJlbmRlcmVkIGFzIEpTT05cbiAqIGN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uOlxuICogIC0gY29udmVydHMgYWxsIHJlcGxhY2VUcmlnZ2VyZWRCeSBpdGVtcyB0aGF0IGFyZSBJVGVycmFmb3JtRGVwZW5kYWJsZXMgdG8gc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlmZWN5Y2xlVG9UZXJyYWZvcm0oXG4gIGxpZmVjeWNsZT86IFRlcnJhZm9ybVJlc291cmNlTGlmZWN5Y2xlLFxuKTogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGUgfCB1bmRlZmluZWQge1xuICBpZiAoIWxpZmVjeWNsZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmxpZmVjeWNsZSxcbiAgICAuLi4obGlmZWN5Y2xlPy5yZXBsYWNlVHJpZ2dlcmVkQnk/Lmxlbmd0aFxuICAgICAgPyB7XG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJlZEJ5OiBsaWZlY3ljbGU/LnJlcGxhY2VUcmlnZ2VyZWRCeT8ubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geC5mcW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgcmVhZG9ubHkgZGVwZW5kc09uPzogSVRlcnJhZm9ybURlcGVuZGFibGVbXTtcbiAgcmVhZG9ubHkgY291bnQ/OiBudW1iZXIgfCBUZXJyYWZvcm1Db3VudDtcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbiAgcmVhZG9ubHkgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIHJlYWRvbmx5IGZvckVhY2g/OiBJVGVycmFmb3JtSXRlcmF0b3I7XG4gIHJlYWRvbmx5IHByb3Zpc2lvbmVycz86IEFycmF5PFxuICAgIEZpbGVQcm92aXNpb25lciB8IExvY2FsRXhlY1Byb3Zpc2lvbmVyIHwgUmVtb3RlRXhlY1Byb3Zpc2lvbmVyXG4gID47XG4gIHJlYWRvbmx5IGNvbm5lY3Rpb24/OiBTU0hQcm92aXNpb25lckNvbm5lY3Rpb24gfCBXaW5ybVByb3Zpc2lvbmVyQ29ubmVjdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyVmVyc2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1SZXNvdXJjZUNvbmZpZyBleHRlbmRzIFRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICByZWFkb25seSB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE/OiBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlTW92ZUJ5VGFyZ2V0IHtcbiAgcmVhZG9ubHkgbW92ZVRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSBpbmRleD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeUlkIHtcbiAgcmVhZG9ubHkgdG86IHN0cmluZztcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlSW1wb3J0IHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1SZXNvdXJjZVxuICBleHRlbmRzIFRlcnJhZm9ybUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJVGVycmFmb3JtUmVzb3VyY2UsIElUZXJyYWZvcm1EZXBlbmRhYmxlLCBJSW50ZXJwb2xhdGluZ1BhcmVudFxue1xuICBwdWJsaWMgcmVhZG9ubHkgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YT86IFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yTWV0YWRhdGE7XG5cbiAgLy8gVGVycmFmb3JtTWV0YUFyZ3VtZW50c1xuXG4gIHB1YmxpYyBkZXBlbmRzT24/OiBzdHJpbmdbXTtcbiAgcHVibGljIGNvdW50PzogbnVtYmVyIHwgVGVycmFmb3JtQ291bnQ7XG4gIHB1YmxpYyBwcm92aWRlcj86IFRlcnJhZm9ybVByb3ZpZGVyO1xuICBwdWJsaWMgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIHB1YmxpYyBmb3JFYWNoPzogSVRlcnJhZm9ybUl0ZXJhdG9yO1xuICBwdWJsaWMgY29ubmVjdGlvbj86IFNTSFByb3Zpc2lvbmVyQ29ubmVjdGlvbiB8IFdpbnJtUHJvdmlzaW9uZXJDb25uZWN0aW9uO1xuICBwdWJsaWMgcHJvdmlzaW9uZXJzPzogQXJyYXk8XG4gICAgRmlsZVByb3Zpc2lvbmVyIHwgTG9jYWxFeGVjUHJvdmlzaW9uZXIgfCBSZW1vdGVFeGVjUHJvdmlzaW9uZXJcbiAgPjtcbiAgcHJpdmF0ZSBfaW1wb3J0ZWQ/OiBUZXJyYWZvcm1SZXNvdXJjZUltcG9ydDtcbiAgcHJpdmF0ZSBfbW92ZWRCeVRhcmdldD86IFRlcnJhZm9ybVJlc291cmNlTW92ZUJ5VGFyZ2V0O1xuICBwcml2YXRlIF9tb3ZlZEJ5SWQ/OiBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeUlkO1xuICBwcml2YXRlIF9oYXNNb3ZlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogVGVycmFmb3JtUmVzb3VyY2VDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIGNvbmZpZy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBURVJSQUZPUk1fUkVTT1VSQ0VfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUgPSBjb25maWcudGVycmFmb3JtUmVzb3VyY2VUeXBlO1xuICAgIHRoaXMudGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEgPSBjb25maWcudGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmRlcGVuZHNPbikpIHtcbiAgICAgIHRoaXMuZGVwZW5kc09uID0gY29uZmlnLmRlcGVuZHNPbi5tYXAoKGRlcGVuZGVuY3kpID0+XG4gICAgICAgIGRlcGVuZGFibGUoZGVwZW5kZW5jeSksXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvdW50ID0gY29uZmlnLmNvdW50O1xuICAgIHRoaXMucHJvdmlkZXIgPSBjb25maWcucHJvdmlkZXI7XG4gICAgdGhpcy5saWZlY3ljbGUgPSBjb25maWcubGlmZWN5Y2xlO1xuICAgIHRoaXMuZm9yRWFjaCA9IGNvbmZpZy5mb3JFYWNoO1xuICAgIHRoaXMucHJvdmlzaW9uZXJzID0gY29uZmlnLnByb3Zpc2lvbmVycztcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25maWcuY29ubmVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNUZXJyYWZvcm1SZXNvdXJjZSh4OiBhbnkpOiB4IGlzIFRlcnJhZm9ybVJlc291cmNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgeCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBURVJSQUZPUk1fUkVTT1VSQ0VfU1lNQk9MIGluIHhcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGhhc1Jlc291cmNlTW92ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW92ZWRCeUlkIHx8IHRoaXMuX21vdmVkQnlUYXJnZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1iZXJBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNOdW1iZXIodGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldExpc3RBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNMaXN0KHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCb29sZWFuQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHVibGljIGdldE51bWJlckxpc3RBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNOdW1iZXJMaXN0KFxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmdNYXBBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmdNYXAoXG4gICAgICB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldE51bWJlck1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc051bWJlck1hcChcbiAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Qm9vbGVhbk1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc0Jvb2xlYW5NYXAoXG4gICAgICB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFueU1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc0FueU1hcCh0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRlcnJhZm9ybU1ldGFBcmd1bWVudHMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmZvckVhY2ggfHwgdHlwZW9mIHRoaXMuY291bnQgPT09IFwidW5kZWZpbmVkXCIsXG4gICAgICBgZm9yRWFjaCBhbmQgY291bnQgYXJlIGJvdGggc2V0LCBidXQgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBZb3UgY2FuIG9ubHkgdXNlIGVpdGhlciBvZiB0aGVtLiBDaGVjayB0aGUgcmVzb3VyY2UgYXQgcGF0aDogJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kc09uOiB0aGlzLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBUZXJyYWZvcm1Db3VudC5pc1RlcnJhZm9ybUNvdW50KHRoaXMuY291bnQpXG4gICAgICAgID8gdGhpcy5jb3VudC50b1RlcnJhZm9ybSgpXG4gICAgICAgIDogdGhpcy5jb3VudCxcbiAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyPy5mcW4sXG4gICAgICBsaWZlY3ljbGU6IGxpZmVjeWNsZVRvVGVycmFmb3JtKHRoaXMubGlmZWN5Y2xlKSxcbiAgICAgIGZvckVhY2g6IHRoaXMuZm9yRWFjaD8uX2dldEZvckVhY2hFeHByZXNzaW9uKCksXG4gICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIGpzaWkgY2FuJ3QgaGFuZGxlIGFic3RyYWN0IGNsYXNzZXM/XG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgd3JpdGUtb25seSBhdHRyaWJ1dGUncyBhbHJlYWR5LW1hcHBlZCB2YWx1ZSBzbyB0aGF0XG4gICAqIGBQcm92aWRlckZlYXR1cmUuV1JJVEVfT05MWV9BVFRSSUJVVEVTYCB1c2FnZSBpcyByZWdpc3RlcmVkIGF0XG4gICAqICpyZXNvbHZlKiB0aW1lIGluc3RlYWQgb2YgYXQgbXV0YXRpb24gdGltZSAoc2V0dGVyL2NvbnN0cnVjdG9yKS5cbiAgICogQ2FsbGVkIGJ5IGdlbmVyYXRlZCBiaW5kaW5ncyBmcm9tIGBzeW50aGVzaXplQXR0cmlidXRlcygpYCBhbmRcbiAgICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgLCBlLmcuXG4gICAqIGBzZWNyZXRfa2V5X3dvOiB0aGlzLm1hcmtXcml0ZU9ubHlBdHRyaWJ1dGUoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fc2VjcmV0S2V5V28pKWA7XG4gICAqIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHBhc3NlcyB0aHJvdWdoIGNvbXBsZXRlbHkgdW5jaGFuZ2VkLCBzbyB0aGUgZXhpc3RpbmdcbiAgICogdW5kZWZpbmVkLWZpbHRlcmluZyB0aGF0IG9taXRzIHVuc2V0IGF0dHJpYnV0ZXMgZnJvbSBzeW50aGVzaXplZFxuICAgKiBvdXRwdXQgKHNlZSBgcmVzb2x2ZSgpYCBpbiBgdG9rZW5zL3ByaXZhdGUvcmVzb2x2ZS50c2AsIGFuZCB0aGVcbiAgICogYHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRgIGZpbHRlciBpbiBnZW5lcmF0ZWRcbiAgICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgKSBrZWVwcyB3b3JraW5nIHVudG91Y2hlZC4gYG51bGxgIGlzIGFsc29cbiAgICogcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkOiBpdCBhbHJlYWR5IHJlbmRlcnMgYXMgYW4gZXhwbGljaXRcbiAgICogbnVsbC1vdXQgYW5kIG11c3Qgbm90IGFybSB0aGUgdmFsaWRhdGlvbiBlaXRoZXIuXG4gICAqXG4gICAqIEFueSBvdGhlciB2YWx1ZSAtIGluY2x1ZGluZyBvbmUgdGhhdCB3aWxsIGl0c2VsZiByZXNvbHZlIHRvIG5vdGhpbmdcbiAgICogKGUuZy4gYSBgTGF6eWAvYElSZXNvbHZhYmxlYCBwcm9kdWNlciB3aXRoIG5vIHZhbHVlIHRvIGNvbnRyaWJ1dGUpIC1cbiAgICogaXMgd3JhcHBlZCBpbiBhIHRva2VuIHdob3NlIGByZXNvbHZlKClgIGRlZmVycyB0byB0aGUgcmVhbCByZXNvbHZlclxuICAgKiBmaXJzdCBhbmQgcmVnaXN0ZXJzIHVzYWdlIG9ubHkgaWYgd2hhdCBjb21lcyBiYWNrIGlzIG5vdFxuICAgKiBgbnVsbGAvYHVuZGVmaW5lZGA7IHRoZSByZXNvbHZlZCB2YWx1ZSBpcyB0aGVuIHJldHVybmVkIHVuY2hhbmdlZCxcbiAgICogc28gd2hhdCBhY3R1YWxseSByZW5kZXJzIGlzIHVudG91Y2hlZCBieSB0aGlzIHdyYXBwZXIuIEEgcHJvZHVjZXJcbiAgICogdGhhdCByZXNvbHZlcyB0byBgdW5kZWZpbmVkYCB0aGVyZWZvcmUgbmVpdGhlciByZWdpc3RlcnMgdXNhZ2Ugbm9yXG4gICAqIGxlYXZlcyBhbnl0aGluZyBiZWhpbmQgaW4gdGhlIHN5bnRoZXNpemVkIGF0dHJpYnV0ZSAtIHRoZSBvbWlzc2lvblxuICAgKiBiZWhhdmVzIGV4YWN0bHkgYXMgaWYgdGhlIGF0dHJpYnV0ZSBoYWQgbmV2ZXIgYmVlbiBzZXQuXG4gICAqXG4gICAqIFJlZ2lzdHJhdGlvbiBnb2VzIHRocm91Z2ggYF9yZWdpc3RlclJlc29sdmVEaXNjb3ZlcmVkUHJvdmlkZXJGZWF0dXJlVXNhZ2VgXG4gICAqIHJhdGhlciB0aGFuIGByZWdpc3RlclByb3ZpZGVyRmVhdHVyZVVzYWdlYDogdXNhZ2UgaGVyZSBpcyBvbmx5IGtub3duIGF0XG4gICAqIHJlc29sdmUgdGltZSwgYW5kIGEgZ2l2ZW4gZWxlbWVudCBjYW4gYmUgcmVzb2x2ZWQgYWNyb3NzIG1hbnlcbiAgICogc3ludGhlc2lzIHBhc3NlcyBvdmVyIGl0cyBsaWZldGltZSAocmVwZWF0ZWQgYGFwcC5zeW50aCgpYCBjYWxscyxcbiAgICogdGVzdHMgcmV1c2luZyBhIGNvbnN0cnVjdCB0cmVlKSwgc28gaXQgbXVzdCByZXByZXNlbnQgb25seSB0aGUgQ1VSUkVOVFxuICAgKiBwYXNzIHJhdGhlciB0aGFuIGFjY3VtdWxhdGUgZm9yZXZlci4gRXZlcnkgdmFsaWRhdGlvbi1lbmFibGVkIGVudHJ5XG4gICAqIHBvaW50IChgQXBwLnN5bnRoYDsgYFRlc3Rpbmcuc3ludGhgL2BzeW50aEhjbGAgd2l0aCB2YWxpZGF0aW9ucztcbiAgICogYFN0YWNrU3ludGhlc2l6ZXIuc3ludGhlc2l6ZWApIHJ1bnMgYSBwcmVwYXJlIHN0ZXAgdGhhdCBkZWFjdGl2YXRlcyBhbnlcbiAgICogc3RhbGUgcmVnaXN0cmF0aW9uIGFuZCB0aGVuIHJlc29sdmVzIGV2ZXJ5IGVsZW1lbnQncyBgdG9UZXJyYWZvcm0oKWBcbiAgICogYmVmb3JlIHRoYXQgc2FtZSBlbnRyeSBwb2ludCdzIHZhbGlkYXRpb25zIHJ1biAtIHNlZVxuICAgKiBgVGVycmFmb3JtU3RhY2suX3J1blByZXBhcmluZ1Jlc29sdmVgIC0gc28gd2hhdGV2ZXIgdGhpcyBjbG9zdXJlXG4gICAqIChyZS0pcmVnaXN0ZXJzIGR1cmluZyB0aGF0IHByZXBhcmUgc3RlcCBpcyBhbHdheXMgdmlzaWJsZSB0byB0aGVcbiAgICogdmFsaWRhdGlvbiB0aGF0IHJlYWRzIGl0IGFmdGVyd2FyZHMsIGFuZCBub3RoaW5nIGxlZnQgb3ZlciBmcm9tIGFuXG4gICAqIGVhcmxpZXIgcGFzcyBsZWFrcyBpbnRvIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIHByb3RlY3RlZCBtYXJrV3JpdGVPbmx5QXR0cmlidXRlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0aW9uU3RhY2s6IGNhcHR1cmVDcmVhdGlvblN0YWNrKCksXG4gICAgICAvLyBBcnJvdyBmdW5jdGlvbjogYHRoaXNgIHN0YXlzIHRoZSByZXNvdXJjZSBsZXhpY2FsbHkuIGB0b1N0cmluZygpYFxuICAgICAgLy8gYmVsb3cgbXVzdCByZW1haW4gYSBzaG9ydGhhbmQgbWV0aG9kIGluc3RlYWQgLSBpdHMgYHRoaXNgIGlzIHRoZVxuICAgICAgLy8gd3JhcHBlciB0b2tlbiBvYmplY3QgYmVpbmcgc3RyaW5naWZpZWQuXG4gICAgICByZXNvbHZlOiAoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogYW55ID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBjb250ZXh0LnJlc29sdmUodmFsdWUpO1xuICAgICAgICBpZiAocmVzb2x2ZWQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyUmVzb2x2ZURpc2NvdmVyZWRQcm92aWRlckZlYXR1cmVVc2FnZShcbiAgICAgICAgICAgIFByb3ZpZGVyRmVhdHVyZS5XUklURV9PTkxZX0FUVFJJQlVURVMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9LFxuICAgICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICAgICAgfSxcbiAgICB9IGFzIElSZXNvbHZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhpcyByZXNvdXJjZSB0byB0aGUgdGVycmFmb3JtIEpTT04gb3V0cHV0LlxuICAgKi9cbiAgcHVibGljIHRvVGVycmFmb3JtKCk6IGFueSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRlZXBNZXJnZShcbiAgICAgIHByb2Nlc3NEeW5hbWljQXR0cmlidXRlcyh0aGlzLnN5bnRoZXNpemVBdHRyaWJ1dGVzKCkpLFxuICAgICAga2V5c1RvU25ha2VDYXNlKHRoaXMudGVycmFmb3JtTWV0YUFyZ3VtZW50cyksXG4gICAgICB7XG4gICAgICAgIHByb3Zpc2lvbmVyOiB0aGlzLnByb3Zpc2lvbmVycz8ubWFwKCh7IHR5cGUsIC4uLnByb3BzIH0pID0+ICh7XG4gICAgICAgICAgW3R5cGVdOiBrZXlzVG9TbmFrZUNhc2UocHJvcHMpLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgdGhpcy5yYXdPdmVycmlkZXMsXG4gICAgKTtcblxuICAgIGF0dHJpYnV0ZXNbXCIvL1wiXSA9IHtcbiAgICAgIC4uLihhdHRyaWJ1dGVzW1wiLy9cIl0gPz8ge30pLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3ROb2RlTWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vdmVkQmxvY2sgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2soKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2U6IHRoaXMuX2hhc01vdmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDoge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXToge1xuICAgICAgICAgICAgICBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgIG1vdmVkOiBtb3ZlZEJsb2NrXG4gICAgICAgID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0bzogbW92ZWRCbG9jay50byxcbiAgICAgICAgICAgICAgZnJvbTogbW92ZWRCbG9jay5mcm9tLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW1wb3J0OiB0aGlzLl9pbXBvcnRlZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMuX2ltcG9ydGVkLnByb3ZpZGVyPy5mcW4sXG4gICAgICAgICAgICAgIGlkOiB0aGlzLl9pbXBvcnRlZC5pZCxcbiAgICAgICAgICAgICAgdG86IGAke3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3RoaXMuZnJpZW5kbHlVbmlxdWVJZH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9IY2xUZXJyYWZvcm0oKTogYW55IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVlcE1lcmdlKFxuICAgICAgcHJvY2Vzc0R5bmFtaWNBdHRyaWJ1dGVzRm9ySGNsKHRoaXMuc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKSksXG4gICAgICBrZXlzVG9TbmFrZUNhc2UodGhpcy50ZXJyYWZvcm1NZXRhQXJndW1lbnRzKSxcbiAgICAgIHtcbiAgICAgICAgcHJvdmlzaW9uZXI6IHRoaXMucHJvdmlzaW9uZXJzPy5tYXAoKHsgdHlwZSwgLi4ucHJvcHMgfSkgPT4gKHtcbiAgICAgICAgICBbdHlwZV06IHtcbiAgICAgICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICB2YWx1ZToga2V5c1RvU25ha2VDYXNlKHByb3BzKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgdGhpcy5yYXdPdmVycmlkZXMsXG4gICAgKTtcblxuICAgIGF0dHJpYnV0ZXNbXCIvL1wiXSA9IHtcbiAgICAgIC4uLihhdHRyaWJ1dGVzW1wiLy9cIl0gPz8ge30pLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3ROb2RlTWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vdmVkQmxvY2sgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2soKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2U6IHRoaXMuX2hhc01vdmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDoge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXToge1xuICAgICAgICAgICAgICBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgIG1vdmVkOiBtb3ZlZEJsb2NrXG4gICAgICAgID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0bzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBtb3ZlZEJsb2NrLnRvLFxuICAgICAgICAgICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgICAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJyZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnJvbToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBtb3ZlZEJsb2NrLmZyb20sXG4gICAgICAgICAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW1wb3J0OiB0aGlzLl9pbXBvcnRlZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG86IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9pbXBvcnRlZC5pZCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzLl9pbXBvcnRlZC5wcm92aWRlclxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5faW1wb3J0ZWQucHJvdmlkZXIuZnFuLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9NZXRhZGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKS5sZW5ndGhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBbdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGVdOiBPYmplY3Qua2V5cyh0aGlzLnJhd092ZXJyaWRlcyksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGltcG9ydHM6IHRoaXMuX2ltcG9ydGVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXTogW3RoaXMuZnJpZW5kbHlVbmlxdWVJZF0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG1vdmVkOlxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0IHx8IHRoaXMuX21vdmVkQnlJZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBbdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGVdOiBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVmKFxuICAgICAgYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfSR7XG4gICAgICAgIHRoaXMuZm9yRWFjaCA/IFwiLipcIiA6IFwiXCJcbiAgICAgIH0uJHt0ZXJyYWZvcm1BdHRyaWJ1dGV9YCxcbiAgICAgIHRoaXMuY2RrdGZTdGFjayxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb20oaWQ6IHN0cmluZywgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcikge1xuICAgIHRoaXMuX2ltcG9ydGVkID0geyBpZCwgcHJvdmlkZXIgfTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgIG5ldyBWYWxpZGF0ZVRlcnJhZm9ybVZlcnNpb24oXG4gICAgICAgIFwiPj0xLjVcIixcbiAgICAgICAgYEltcG9ydCBibG9ja3MgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBUZXJyYWZvcm0gPj0xLjUuIFBsZWFzZSB1cGdyYWRlIHlvdXIgVGVycmFmb3JtIHZlcnNpb24uYCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQ6IHN0cmluZykge1xuICAgIHJldHVybiBUZXJyYWZvcm1TdGFjay5vZih0aGlzKS5tb3ZlVGFyZ2V0cy5nZXRSZXNvdXJjZUJ5VGFyZ2V0KG1vdmVUYXJnZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkUmVzb3VyY2VUYXJnZXQobW92ZVRhcmdldDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFRlcnJhZm9ybVN0YWNrLm9mKHRoaXMpLm1vdmVUYXJnZXRzLmFkZFJlc291cmNlVGFyZ2V0KFxuICAgICAgdGhpcyxcbiAgICAgIG1vdmVUYXJnZXQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkTW92ZWRCbG9ja0J5VGFyZ2V0KFxuICAgIG1vdmVkVGFyZ2V0OiBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeVRhcmdldCxcbiAgKTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBtb3ZlVGFyZ2V0LCBpbmRleCB9ID0gbW92ZWRUYXJnZXQ7XG4gICAgY29uc3QgcmVzb3VyY2VUb01vdmVUbyA9IHRoaXMuX2dldFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQpO1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZSAhPT0gcmVzb3VyY2VUb01vdmVUby50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpIHtcbiAgICAgIHRocm93IG1vdmVkVG9SZXNvdXJjZU9mRGlmZmVyZW50VHlwZShcbiAgICAgICAgbW92ZVRhcmdldCxcbiAgICAgICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUsXG4gICAgICAgIHJlc291cmNlVG9Nb3ZlVG8udGVycmFmb3JtUmVzb3VyY2VUeXBlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdG8gPSBpbmRleFxuICAgICAgPyB0eXBlb2YgaW5kZXggPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHtyZXNvdXJjZVRvTW92ZVRvLmZyaWVuZGx5VW5pcXVlSWR9W1wiJHtpbmRleH1cIl1gXG4gICAgICAgIDogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7cmVzb3VyY2VUb01vdmVUby5mcmllbmRseVVuaXF1ZUlkfVske2luZGV4fV1gXG4gICAgICA6IGAke3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3Jlc291cmNlVG9Nb3ZlVG8uZnJpZW5kbHlVbmlxdWVJZH1gO1xuICAgIGNvbnN0IGZyb20gPSBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YDtcbiAgICByZXR1cm4geyB0bywgZnJvbSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRNb3ZlZEJsb2NrKCk6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0ICYmIHRoaXMuX21vdmVkQnlJZCkge1xuICAgICAgdGhyb3cgcmVzb3VyY2VHaXZlblR3b01vdmVPcGVyYXRpb25zQnlUYXJnZXRBbmRJZChcbiAgICAgICAgdGhpcy5ub2RlLmlkLFxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0Lm1vdmVUYXJnZXQsXG4gICAgICAgIHsgdG86IHRoaXMuX21vdmVkQnlJZC50bywgZnJvbTogdGhpcy5fbW92ZWRCeUlkLmZyb20gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0KSB7XG4gICAgICBjb25zdCBtb3ZlZEJsb2NrQnlUYXJnZXQgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2tCeVRhcmdldChcbiAgICAgICAgdGhpcy5fbW92ZWRCeVRhcmdldCxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyB0bzogbW92ZWRCbG9ja0J5VGFyZ2V0LnRvLCBmcm9tOiBtb3ZlZEJsb2NrQnlUYXJnZXQuZnJvbSB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbW92ZWRCeUlkKSB7XG4gICAgICByZXR1cm4geyB0bzogdGhpcy5fbW92ZWRCeUlkLnRvLCBmcm9tOiB0aGlzLl9tb3ZlZEJ5SWQuZnJvbSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGlzIHJlc291cmNlIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2UgZ2l2ZW4gYnkgbW92ZVRhcmdldC5cbiAgICogQHBhcmFtIG1vdmVUYXJnZXQgVGhlIHByZXZpb3VzbHkgc2V0IHVzZXIgZGVmaW5lZCBzdHJpbmcgc2V0IGJ5IC5hZGRNb3ZlVGFyZ2V0KCkgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzb3VyY2UgdG8gbW92ZSB0by5cbiAgICogQHBhcmFtIGluZGV4IE9wdGlvbmFsIFRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgdGhlIHJlc291cmNlIGlzIHRvIGFwcGVhciBpbiB0aGUgZm9yZWFjaCBvZiBhIHJlc291cmNlIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVG8obW92ZVRhcmdldDogc3RyaW5nLCBpbmRleD86IHN0cmluZyB8IG51bWJlcikge1xuICAgIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0KSB7XG4gICAgICB0aHJvdyByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldChcbiAgICAgICAgdGhpcy5mcmllbmRseVVuaXF1ZUlkLFxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0Lm1vdmVUYXJnZXQsXG4gICAgICAgIG1vdmVUYXJnZXQsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0ID0geyBtb3ZlVGFyZ2V0LCBpbmRleCB9O1xuICAgIHRoaXMuX2hhc01vdmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdXNlciBkZWZpbmVkIG1vdmVUYXJnZXQgc3RyaW5nIHRvIHRoaXMgcmVzb3VyY2UgdG8gYmUgbGF0ZXIgdXNlZCBpbiAubW92ZVRvKG1vdmVUYXJnZXQpIHRvIHJlc29sdmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBtb3ZlLlxuICAgKiBAcGFyYW0gbW92ZVRhcmdldCBUaGUgc3RyaW5nIG1vdmUgdGFyZ2V0IHRoYXQgd2lsbCBjb3JyZXNwb25kIHRvIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBhZGRNb3ZlVGFyZ2V0KG1vdmVUYXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX2FkZFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoaXMgcmVzb3VyY2UgdG8gdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gXCJpZFwiXG4gICAqIEBwYXJhbSBpZCBGdWxsIGlkIG9mIHJlc291cmNlIHRvIG1vdmUgdG8sIGUuZy4gXCJhd3NfczNfYnVja2V0LmV4YW1wbGVcIlxuICAgKi9cbiAgcHVibGljIG1vdmVUb0lkKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbW92ZWRCeUlkKSB7XG4gICAgICB0aHJvdyByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeUlkKFxuICAgICAgICB0aGlzLm5vZGUuaWQsXG4gICAgICAgIHsgdG86IHRoaXMuX21vdmVkQnlJZC5mcm9tLCBmcm9tOiB0aGlzLl9tb3ZlZEJ5SWQudG8gfSxcbiAgICAgICAge1xuICAgICAgICAgIHRvOiBpZCxcbiAgICAgICAgICBmcm9tOiBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbW92ZWRCeUlkID0ge1xuICAgICAgdG86IGlkLFxuICAgICAgZnJvbTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgfTtcbiAgICB0aGlzLl9oYXNNb3ZlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgcmVzb3VyY2UgY29ycmVzcG9uZGluZyB0byBcImlkXCIgdG8gdGhpcyByZXNvdXJjZS4gTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWluZyBtb3ZlZCBmcm9tIG11c3QgYmUgbWFya2VkIGFzIG1vdmVkIHVzaW5nIGl0cyBpbnN0YW5jZSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIGlkIEZ1bGwgaWQgb2YgcmVzb3VyY2UgYmVpbmcgbW92ZWQgZnJvbSwgZS5nLiBcImF3c19zM19idWNrZXQuZXhhbXBsZVwiXG4gICAqL1xuICBwdWJsaWMgbW92ZUZyb21JZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21vdmVkQnlJZCkge1xuICAgICAgdGhyb3cgcmVzb3VyY2VHaXZlblR3b01vdmVPcGVyYXRpb25zQnlJZChcbiAgICAgICAgdGhpcy5ub2RlLmlkLFxuICAgICAgICB7IHRvOiB0aGlzLl9tb3ZlZEJ5SWQuZnJvbSwgZnJvbTogdGhpcy5fbW92ZWRCeUlkLnRvIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0bzogaWQsXG4gICAgICAgICAgZnJvbTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9tb3ZlZEJ5SWQgPSB7XG4gICAgICB0bzogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICBmcm9tOiBpZCxcbiAgICB9O1xuICB9XG59XG4iXX0=
415
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS1yZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1RUEsb0RBcUJDOztBQXpGRCxxQ0FBaUM7QUFDakMsMkRBQXVEO0FBRXZELGlDQUtnQjtBQUVoQixpREFBaUQ7QUFFakQsOERBQW9FO0FBQ3BFLGlGQUFpRTtBQUlqRSx1REFBbUQ7QUFLbkQsaUVBQWlFO0FBQ2pFLGlDQUFrQztBQU1sQyx5RkFBb0Y7QUFDcEYsdURBQW1EO0FBQ25ELHFDQUtrQjtBQUVsQixNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQXlCeEU7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxTQUFzQztJQUV0QyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsT0FBTztRQUNMLEdBQUcsU0FBUztRQUNaLEdBQUcsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTTtZQUN2QyxDQUFDLENBQUM7Z0JBQ0Usa0JBQWtCLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUMzRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUMxQixPQUFPLENBQUMsQ0FBQztvQkFDWCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUNmLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDO2FBQ0g7WUFDSCxDQUFDLENBQUMsU0FBUyxDQUFDO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUF3Q0QsK0NBQStDO0FBQy9DLE1BQWEsaUJBQ1gsU0FBUSxvQ0FBZ0I7O0lBR1IscUJBQXFCLENBQVM7SUFDOUIsMEJBQTBCLENBQXNDO0lBRWhGLHlC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Q0FBQztJQUNKLENBQUM7O0FBdmRILDhDQXdkQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgVG9rZW4gfSBmcm9tIFwiLi90b2tlbnNcIjtcbmltcG9ydCB7IFRlcnJhZm9ybUVsZW1lbnQgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZWxlbWVudFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUHJvdmlkZXIgfSBmcm9tIFwiLi90ZXJyYWZvcm0tcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGtleXNUb1NuYWtlQ2FzZSxcbiAgZGVlcE1lcmdlLFxuICBwcm9jZXNzRHluYW1pY0F0dHJpYnV0ZXMsXG4gIHByb2Nlc3NEeW5hbWljQXR0cmlidXRlc0ZvckhjbCxcbn0gZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IHsgSVRlcnJhZm9ybURlcGVuZGFibGUgfSBmcm9tIFwiLi90ZXJyYWZvcm0tZGVwZW5kYWJsZVwiO1xuaW1wb3J0IHsgcmVmLCBkZXBlbmRhYmxlIH0gZnJvbSBcIi4vdGZFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBJUmVzb2x2YWJsZSwgSVJlc29sdmVDb250ZXh0IH0gZnJvbSBcIi4vdG9rZW5zL3Jlc29sdmFibGVcIjtcbmltcG9ydCB7IGNhcHR1cmVDcmVhdGlvblN0YWNrIH0gZnJvbSBcIi4vdG9rZW5zL3ByaXZhdGUvc3RhY2stdHJhY2VcIjtcbmltcG9ydCB7IFByb3ZpZGVyRmVhdHVyZSB9IGZyb20gXCIuL3Byb3ZpZGVyLWZlYXR1cmUtY29uc3RyYWludHNcIjtcbmltcG9ydCB7IElJbnRlcnBvbGF0aW5nUGFyZW50IH0gZnJvbSBcIi4vdGVycmFmb3JtLWFkZHJlc3NhYmxlXCI7XG5pbXBvcnQgeyBJVGVycmFmb3JtSXRlcmF0b3IgfSBmcm9tIFwiLi90ZXJyYWZvcm0taXRlcmF0b3JcIjtcbmltcG9ydCB7IFByZWNvbmRpdGlvbiwgUG9zdGNvbmRpdGlvbiB9IGZyb20gXCIuL3RlcnJhZm9ybS1jb25kaXRpb25zXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Db3VudCB9IGZyb20gXCIuL3RlcnJhZm9ybS1jb3VudFwiO1xuaW1wb3J0IHtcbiAgU1NIUHJvdmlzaW9uZXJDb25uZWN0aW9uLFxuICBXaW5ybVByb3Zpc2lvbmVyQ29ubmVjdGlvbixcbn0gZnJvbSBcIi4vdGVycmFmb3JtLXByb3Zpc2lvbmVyXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuaW1wb3J0IGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG5pbXBvcnQge1xuICBGaWxlUHJvdmlzaW9uZXIsXG4gIExvY2FsRXhlY1Byb3Zpc2lvbmVyLFxuICBSZW1vdGVFeGVjUHJvdmlzaW9uZXIsXG59IGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aXNpb25lclwiO1xuaW1wb3J0IHsgVmFsaWRhdGVUZXJyYWZvcm1WZXJzaW9uIH0gZnJvbSBcIi4vdmFsaWRhdGlvbnMvdmFsaWRhdGUtdGVycmFmb3JtLXZlcnNpb25cIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4vdGVycmFmb3JtLXN0YWNrXCI7XG5pbXBvcnQge1xuICBtb3ZlZFRvUmVzb3VyY2VPZkRpZmZlcmVudFR5cGUsXG4gIHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5SWQsXG4gIHJlc291cmNlR2l2ZW5Ud29Nb3ZlT3BlcmF0aW9uc0J5VGFyZ2V0LFxuICByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldEFuZElkLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuY29uc3QgVEVSUkFGT1JNX1JFU09VUkNFX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJjZGt0Zi9UZXJyYWZvcm1SZXNvdXJjZVwiKTtcblxuZXhwb3J0IGludGVyZmFjZSBJVGVycmFmb3JtUmVzb3VyY2Uge1xuICByZWFkb25seSB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZyaWVuZGx5VW5pcXVlSWQ6IHN0cmluZztcblxuICBkZXBlbmRzT24/OiBzdHJpbmdbXTtcbiAgY291bnQ/OiBudW1iZXIgfCBUZXJyYWZvcm1Db3VudDtcbiAgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbiAgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIGZvckVhY2g/OiBJVGVycmFmb3JtSXRlcmF0b3I7XG5cbiAgaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZyk6IElSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlTGlmZWN5Y2xlIHtcbiAgcmVhZG9ubHkgY3JlYXRlQmVmb3JlRGVzdHJveT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHByZXZlbnREZXN0cm95PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaWdub3JlQ2hhbmdlcz86IHN0cmluZ1tdIHwgXCJhbGxcIjtcbiAgcmVhZG9ubHkgcmVwbGFjZVRyaWdnZXJlZEJ5PzogQXJyYXk8SVRlcnJhZm9ybURlcGVuZGFibGUgfCBzdHJpbmc+O1xuICByZWFkb25seSBwcmVjb25kaXRpb24/OiBQcmVjb25kaXRpb25bXTtcbiAgcmVhZG9ubHkgcG9zdGNvbmRpdGlvbj86IFBvc3Rjb25kaXRpb25bXTtcbn1cblxuLyoqXG4gKiBwcmVwYXJlcyBhIGxpZmVjeWNsZSBvYmplY3QgZm9yIGJlaW5nIHJlbmRlcmVkIGFzIEpTT05cbiAqIGN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uOlxuICogIC0gY29udmVydHMgYWxsIHJlcGxhY2VUcmlnZ2VyZWRCeSBpdGVtcyB0aGF0IGFyZSBJVGVycmFmb3JtRGVwZW5kYWJsZXMgdG8gc3RyaW5nc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGlmZWN5Y2xlVG9UZXJyYWZvcm0oXG4gIGxpZmVjeWNsZT86IFRlcnJhZm9ybVJlc291cmNlTGlmZWN5Y2xlLFxuKTogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGUgfCB1bmRlZmluZWQge1xuICBpZiAoIWxpZmVjeWNsZSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmxpZmVjeWNsZSxcbiAgICAuLi4obGlmZWN5Y2xlPy5yZXBsYWNlVHJpZ2dlcmVkQnk/Lmxlbmd0aFxuICAgICAgPyB7XG4gICAgICAgICAgcmVwbGFjZVRyaWdnZXJlZEJ5OiBsaWZlY3ljbGU/LnJlcGxhY2VUcmlnZ2VyZWRCeT8ubWFwKCh4KSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4geC5mcW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkKSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgcmVhZG9ubHkgZGVwZW5kc09uPzogSVRlcnJhZm9ybURlcGVuZGFibGVbXTtcbiAgcmVhZG9ubHkgY291bnQ/OiBudW1iZXIgfCBUZXJyYWZvcm1Db3VudDtcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbiAgcmVhZG9ubHkgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIHJlYWRvbmx5IGZvckVhY2g/OiBJVGVycmFmb3JtSXRlcmF0b3I7XG4gIHJlYWRvbmx5IHByb3Zpc2lvbmVycz86IEFycmF5PFxuICAgIEZpbGVQcm92aXNpb25lciB8IExvY2FsRXhlY1Byb3Zpc2lvbmVyIHwgUmVtb3RlRXhlY1Byb3Zpc2lvbmVyXG4gID47XG4gIHJlYWRvbmx5IGNvbm5lY3Rpb24/OiBTU0hQcm92aXNpb25lckNvbm5lY3Rpb24gfCBXaW5ybVByb3Zpc2lvbmVyQ29ubmVjdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck1ldGFkYXRhIHtcbiAgcmVhZG9ubHkgcHJvdmlkZXJOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb3ZpZGVyVmVyc2lvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1SZXNvdXJjZUNvbmZpZyBleHRlbmRzIFRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICByZWFkb25seSB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE/OiBUZXJyYWZvcm1Qcm92aWRlckdlbmVyYXRvck1ldGFkYXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlTW92ZUJ5VGFyZ2V0IHtcbiAgcmVhZG9ubHkgbW92ZVRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSBpbmRleD86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeUlkIHtcbiAgcmVhZG9ubHkgdG86IHN0cmluZztcbiAgcmVhZG9ubHkgZnJvbTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVJlc291cmNlSW1wb3J0IHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcjtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1SZXNvdXJjZVxuICBleHRlbmRzIFRlcnJhZm9ybUVsZW1lbnRcbiAgaW1wbGVtZW50cyBJVGVycmFmb3JtUmVzb3VyY2UsIElUZXJyYWZvcm1EZXBlbmRhYmxlLCBJSW50ZXJwb2xhdGluZ1BhcmVudFxue1xuICBwdWJsaWMgcmVhZG9ubHkgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YT86IFRlcnJhZm9ybVByb3ZpZGVyR2VuZXJhdG9yTWV0YWRhdGE7XG5cbiAgLy8gVGVycmFmb3JtTWV0YUFyZ3VtZW50c1xuXG4gIHB1YmxpYyBkZXBlbmRzT24/OiBzdHJpbmdbXTtcbiAgcHVibGljIGNvdW50PzogbnVtYmVyIHwgVGVycmFmb3JtQ291bnQ7XG4gIHB1YmxpYyBwcm92aWRlcj86IFRlcnJhZm9ybVByb3ZpZGVyO1xuICBwdWJsaWMgbGlmZWN5Y2xlPzogVGVycmFmb3JtUmVzb3VyY2VMaWZlY3ljbGU7XG4gIHB1YmxpYyBmb3JFYWNoPzogSVRlcnJhZm9ybUl0ZXJhdG9yO1xuICBwdWJsaWMgY29ubmVjdGlvbj86IFNTSFByb3Zpc2lvbmVyQ29ubmVjdGlvbiB8IFdpbnJtUHJvdmlzaW9uZXJDb25uZWN0aW9uO1xuICBwdWJsaWMgcHJvdmlzaW9uZXJzPzogQXJyYXk8XG4gICAgRmlsZVByb3Zpc2lvbmVyIHwgTG9jYWxFeGVjUHJvdmlzaW9uZXIgfCBSZW1vdGVFeGVjUHJvdmlzaW9uZXJcbiAgPjtcbiAgcHJpdmF0ZSBfaW1wb3J0ZWQ/OiBUZXJyYWZvcm1SZXNvdXJjZUltcG9ydDtcbiAgcHJpdmF0ZSBfbW92ZWRCeVRhcmdldD86IFRlcnJhZm9ybVJlc291cmNlTW92ZUJ5VGFyZ2V0O1xuICBwcml2YXRlIF9tb3ZlZEJ5SWQ/OiBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeUlkO1xuICBwcml2YXRlIF9oYXNNb3ZlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogVGVycmFmb3JtUmVzb3VyY2VDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIGNvbmZpZy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBURVJSQUZPUk1fUkVTT1VSQ0VfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG4gICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUgPSBjb25maWcudGVycmFmb3JtUmVzb3VyY2VUeXBlO1xuICAgIHRoaXMudGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGEgPSBjb25maWcudGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmRlcGVuZHNPbikpIHtcbiAgICAgIHRoaXMuZGVwZW5kc09uID0gY29uZmlnLmRlcGVuZHNPbi5tYXAoKGRlcGVuZGVuY3kpID0+XG4gICAgICAgIGRlcGVuZGFibGUoZGVwZW5kZW5jeSksXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmNvdW50ID0gY29uZmlnLmNvdW50O1xuICAgIHRoaXMucHJvdmlkZXIgPSBjb25maWcucHJvdmlkZXI7XG4gICAgdGhpcy5saWZlY3ljbGUgPSBjb25maWcubGlmZWN5Y2xlO1xuICAgIHRoaXMuZm9yRWFjaCA9IGNvbmZpZy5mb3JFYWNoO1xuICAgIHRoaXMucHJvdmlzaW9uZXJzID0gY29uZmlnLnByb3Zpc2lvbmVycztcbiAgICB0aGlzLmNvbm5lY3Rpb24gPSBjb25maWcuY29ubmVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNUZXJyYWZvcm1SZXNvdXJjZSh4OiBhbnkpOiB4IGlzIFRlcnJhZm9ybVJlc291cmNlIHtcbiAgICByZXR1cm4gKFxuICAgICAgeCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBURVJSQUZPUk1fUkVTT1VSQ0VfU1lNQk9MIGluIHhcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGhhc1Jlc291cmNlTW92ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW92ZWRCeUlkIHx8IHRoaXMuX21vdmVkQnlUYXJnZXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3RyaW5nQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROdW1iZXJBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNOdW1iZXIodGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZSkpO1xuICB9XG5cbiAgcHVibGljIGdldExpc3RBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNMaXN0KHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCb29sZWFuQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpO1xuICB9XG5cbiAgcHVibGljIGdldE51bWJlckxpc3RBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNOdW1iZXJMaXN0KFxuICAgICAgdGhpcy5pbnRlcnBvbGF0aW9uRm9yQXR0cmlidXRlKHRlcnJhZm9ybUF0dHJpYnV0ZSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHJpbmdNYXBBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gVG9rZW4uYXNTdHJpbmdNYXAoXG4gICAgICB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldE51bWJlck1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc051bWJlck1hcChcbiAgICAgIHRoaXMuaW50ZXJwb2xhdGlvbkZvckF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGUpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Qm9vbGVhbk1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc0Jvb2xlYW5NYXAoXG4gICAgICB0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFueU1hcEF0dHJpYnV0ZSh0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHJldHVybiBUb2tlbi5hc0FueU1hcCh0aGlzLmludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRlcnJhZm9ybU1ldGFBcmd1bWVudHMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGFzc2VydChcbiAgICAgICF0aGlzLmZvckVhY2ggfHwgdHlwZW9mIHRoaXMuY291bnQgPT09IFwidW5kZWZpbmVkXCIsXG4gICAgICBgZm9yRWFjaCBhbmQgY291bnQgYXJlIGJvdGggc2V0LCBidXQgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBZb3UgY2FuIG9ubHkgdXNlIGVpdGhlciBvZiB0aGVtLiBDaGVjayB0aGUgcmVzb3VyY2UgYXQgcGF0aDogJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVwZW5kc09uOiB0aGlzLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBUZXJyYWZvcm1Db3VudC5pc1RlcnJhZm9ybUNvdW50KHRoaXMuY291bnQpXG4gICAgICAgID8gdGhpcy5jb3VudC50b1RlcnJhZm9ybSgpXG4gICAgICAgIDogdGhpcy5jb3VudCxcbiAgICAgIHByb3ZpZGVyOiB0aGlzLnByb3ZpZGVyPy5mcW4sXG4gICAgICBsaWZlY3ljbGU6IGxpZmVjeWNsZVRvVGVycmFmb3JtKHRoaXMubGlmZWN5Y2xlKSxcbiAgICAgIGZvckVhY2g6IHRoaXMuZm9yRWFjaD8uX2dldEZvckVhY2hFeHByZXNzaW9uKCksXG4gICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24sXG4gICAgfTtcbiAgfVxuXG4gIC8vIGpzaWkgY2FuJ3QgaGFuZGxlIGFic3RyYWN0IGNsYXNzZXM/XG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgd3JpdGUtb25seSBhdHRyaWJ1dGUncyBhbHJlYWR5LW1hcHBlZCB2YWx1ZSBzbyB0aGF0XG4gICAqIGBQcm92aWRlckZlYXR1cmUuV1JJVEVfT05MWV9BVFRSSUJVVEVTYCB1c2FnZSBpcyByZWdpc3RlcmVkIGF0XG4gICAqICpyZXNvbHZlKiB0aW1lIGluc3RlYWQgb2YgYXQgbXV0YXRpb24gdGltZSAoc2V0dGVyL2NvbnN0cnVjdG9yKS5cbiAgICogQ2FsbGVkIGJ5IGdlbmVyYXRlZCBiaW5kaW5ncyBmcm9tIGBzeW50aGVzaXplQXR0cmlidXRlcygpYCBhbmRcbiAgICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgLCBlLmcuXG4gICAqIGBzZWNyZXRfa2V5X3dvOiB0aGlzLm1hcmtXcml0ZU9ubHlBdHRyaWJ1dGUoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fc2VjcmV0S2V5V28pKWA7XG4gICAqIG5vdCBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqXG4gICAqIGB1bmRlZmluZWRgIHBhc3NlcyB0aHJvdWdoIGNvbXBsZXRlbHkgdW5jaGFuZ2VkLCBzbyB0aGUgZXhpc3RpbmdcbiAgICogdW5kZWZpbmVkLWZpbHRlcmluZyB0aGF0IG9taXRzIHVuc2V0IGF0dHJpYnV0ZXMgZnJvbSBzeW50aGVzaXplZFxuICAgKiBvdXRwdXQgKHNlZSBgcmVzb2x2ZSgpYCBpbiBgdG9rZW5zL3ByaXZhdGUvcmVzb2x2ZS50c2AsIGFuZCB0aGVcbiAgICogYHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRgIGZpbHRlciBpbiBnZW5lcmF0ZWRcbiAgICogYHN5bnRoZXNpemVIY2xBdHRyaWJ1dGVzKClgKSBrZWVwcyB3b3JraW5nIHVudG91Y2hlZC4gYG51bGxgIGlzIGFsc29cbiAgICogcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkOiBpdCBhbHJlYWR5IHJlbmRlcnMgYXMgYW4gZXhwbGljaXRcbiAgICogbnVsbC1vdXQgYW5kIG11c3Qgbm90IGFybSB0aGUgdmFsaWRhdGlvbiBlaXRoZXIuXG4gICAqXG4gICAqIEFueSBvdGhlciB2YWx1ZSAtIGluY2x1ZGluZyBvbmUgdGhhdCB3aWxsIGl0c2VsZiByZXNvbHZlIHRvIG5vdGhpbmdcbiAgICogKGUuZy4gYSBgTGF6eWAvYElSZXNvbHZhYmxlYCBwcm9kdWNlciB3aXRoIG5vIHZhbHVlIHRvIGNvbnRyaWJ1dGUpIC1cbiAgICogaXMgd3JhcHBlZCBpbiBhIHRva2VuIHdob3NlIGByZXNvbHZlKClgIGRlZmVycyB0byB0aGUgcmVhbCByZXNvbHZlclxuICAgKiBmaXJzdCBhbmQgcmVnaXN0ZXJzIHVzYWdlIG9ubHkgaWYgd2hhdCBjb21lcyBiYWNrIGlzIG5vdFxuICAgKiBgbnVsbGAvYHVuZGVmaW5lZGA7IHRoZSByZXNvbHZlZCB2YWx1ZSBpcyB0aGVuIHJldHVybmVkIHVuY2hhbmdlZCxcbiAgICogc28gd2hhdCBhY3R1YWxseSByZW5kZXJzIGlzIHVudG91Y2hlZCBieSB0aGlzIHdyYXBwZXIuIEEgcHJvZHVjZXJcbiAgICogdGhhdCByZXNvbHZlcyB0byBgdW5kZWZpbmVkYCB0aGVyZWZvcmUgbmVpdGhlciByZWdpc3RlcnMgdXNhZ2Ugbm9yXG4gICAqIGxlYXZlcyBhbnl0aGluZyBiZWhpbmQgaW4gdGhlIHN5bnRoZXNpemVkIGF0dHJpYnV0ZSAtIHRoZSBvbWlzc2lvblxuICAgKiBiZWhhdmVzIGV4YWN0bHkgYXMgaWYgdGhlIGF0dHJpYnV0ZSBoYWQgbmV2ZXIgYmVlbiBzZXQuXG4gICAqXG4gICAqIFJlZ2lzdHJhdGlvbiBnb2VzIHRocm91Z2ggYF9yZWdpc3RlclJlc29sdmVEaXNjb3ZlcmVkUHJvdmlkZXJGZWF0dXJlVXNhZ2VgXG4gICAqIHJhdGhlciB0aGFuIGByZWdpc3RlclByb3ZpZGVyRmVhdHVyZVVzYWdlYDogdXNhZ2UgaGVyZSBpcyBvbmx5IGtub3duIGF0XG4gICAqIHJlc29sdmUgdGltZSwgYW5kIGEgZ2l2ZW4gZWxlbWVudCBjYW4gYmUgcmVzb2x2ZWQgYWNyb3NzIG1hbnlcbiAgICogc3ludGhlc2lzIHBhc3NlcyBvdmVyIGl0cyBsaWZldGltZSAocmVwZWF0ZWQgYGFwcC5zeW50aCgpYCBjYWxscyxcbiAgICogdGVzdHMgcmV1c2luZyBhIGNvbnN0cnVjdCB0cmVlKSwgc28gaXQgbXVzdCByZXByZXNlbnQgb25seSB0aGUgQ1VSUkVOVFxuICAgKiBwYXNzIHJhdGhlciB0aGFuIGFjY3VtdWxhdGUgZm9yZXZlci4gRXZlcnkgdmFsaWRhdGlvbi1lbmFibGVkIGVudHJ5XG4gICAqIHBvaW50IChgQXBwLnN5bnRoYDsgYFRlc3Rpbmcuc3ludGhgL2BzeW50aEhjbGAgd2l0aCB2YWxpZGF0aW9ucztcbiAgICogYFN0YWNrU3ludGhlc2l6ZXIuc3ludGhlc2l6ZWApIHJ1bnMgYSBwcmVwYXJlIHN0ZXAgdGhhdCBkZWFjdGl2YXRlcyBhbnlcbiAgICogc3RhbGUgcmVnaXN0cmF0aW9uIGFuZCB0aGVuIHJlc29sdmVzIGV2ZXJ5IGVsZW1lbnQncyBgdG9UZXJyYWZvcm0oKWBcbiAgICogYmVmb3JlIHRoYXQgc2FtZSBlbnRyeSBwb2ludCdzIHZhbGlkYXRpb25zIHJ1biAtIHNlZVxuICAgKiBgVGVycmFmb3JtU3RhY2suX3J1blByZXBhcmluZ1Jlc29sdmVgIC0gc28gd2hhdGV2ZXIgdGhpcyBjbG9zdXJlXG4gICAqIChyZS0pcmVnaXN0ZXJzIGR1cmluZyB0aGF0IHByZXBhcmUgc3RlcCBpcyBhbHdheXMgdmlzaWJsZSB0byB0aGVcbiAgICogdmFsaWRhdGlvbiB0aGF0IHJlYWRzIGl0IGFmdGVyd2FyZHMsIGFuZCBub3RoaW5nIGxlZnQgb3ZlciBmcm9tIGFuXG4gICAqIGVhcmxpZXIgcGFzcyBsZWFrcyBpbnRvIHRoZSBjdXJyZW50IG9uZS5cbiAgICovXG4gIHByb3RlY3RlZCBtYXJrV3JpdGVPbmx5QXR0cmlidXRlKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNyZWF0aW9uU3RhY2s6IGNhcHR1cmVDcmVhdGlvblN0YWNrKCksXG4gICAgICAvLyBBcnJvdyBmdW5jdGlvbjogYHRoaXNgIHN0YXlzIHRoZSByZXNvdXJjZSBsZXhpY2FsbHkuIGB0b1N0cmluZygpYFxuICAgICAgLy8gYmVsb3cgbXVzdCByZW1haW4gYSBzaG9ydGhhbmQgbWV0aG9kIGluc3RlYWQgLSBpdHMgYHRoaXNgIGlzIHRoZVxuICAgICAgLy8gd3JhcHBlciB0b2tlbiBvYmplY3QgYmVpbmcgc3RyaW5naWZpZWQuXG4gICAgICByZXNvbHZlOiAoY29udGV4dDogSVJlc29sdmVDb250ZXh0KTogYW55ID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBjb250ZXh0LnJlc29sdmUodmFsdWUpO1xuICAgICAgICBpZiAocmVzb2x2ZWQgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyUmVzb2x2ZURpc2NvdmVyZWRQcm92aWRlckZlYXR1cmVVc2FnZShcbiAgICAgICAgICAgIFByb3ZpZGVyRmVhdHVyZS5XUklURV9PTkxZX0FUVFJJQlVURVMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gICAgICB9LFxuICAgICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFRva2VuLmFzU3RyaW5nKHRoaXMpO1xuICAgICAgfSxcbiAgICB9IGFzIElSZXNvbHZhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhpcyByZXNvdXJjZSB0byB0aGUgdGVycmFmb3JtIEpTT04gb3V0cHV0LlxuICAgKi9cbiAgcHVibGljIHRvVGVycmFmb3JtKCk6IGFueSB7XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGRlZXBNZXJnZShcbiAgICAgIHByb2Nlc3NEeW5hbWljQXR0cmlidXRlcyh0aGlzLnN5bnRoZXNpemVBdHRyaWJ1dGVzKCkpLFxuICAgICAga2V5c1RvU25ha2VDYXNlKHRoaXMudGVycmFmb3JtTWV0YUFyZ3VtZW50cyksXG4gICAgICB7XG4gICAgICAgIHByb3Zpc2lvbmVyOiB0aGlzLnByb3Zpc2lvbmVycz8ubWFwKCh7IHR5cGUsIC4uLnByb3BzIH0pID0+ICh7XG4gICAgICAgICAgW3R5cGVdOiBrZXlzVG9TbmFrZUNhc2UocHJvcHMpLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgdGhpcy5yYXdPdmVycmlkZXMsXG4gICAgKTtcblxuICAgIGF0dHJpYnV0ZXNbXCIvL1wiXSA9IHtcbiAgICAgIC4uLihhdHRyaWJ1dGVzW1wiLy9cIl0gPz8ge30pLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3ROb2RlTWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vdmVkQmxvY2sgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2soKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2U6IHRoaXMuX2hhc01vdmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDoge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXToge1xuICAgICAgICAgICAgICBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgIG1vdmVkOiBtb3ZlZEJsb2NrXG4gICAgICAgID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0bzogbW92ZWRCbG9jay50byxcbiAgICAgICAgICAgICAgZnJvbTogbW92ZWRCbG9jay5mcm9tLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW1wb3J0OiB0aGlzLl9pbXBvcnRlZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJvdmlkZXI6IHRoaXMuX2ltcG9ydGVkLnByb3ZpZGVyPy5mcW4sXG4gICAgICAgICAgICAgIGlkOiB0aGlzLl9pbXBvcnRlZC5pZCxcbiAgICAgICAgICAgICAgdG86IGAke3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3RoaXMuZnJpZW5kbHlVbmlxdWVJZH1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9IY2xUZXJyYWZvcm0oKTogYW55IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZGVlcE1lcmdlKFxuICAgICAgcHJvY2Vzc0R5bmFtaWNBdHRyaWJ1dGVzRm9ySGNsKHRoaXMuc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKSksXG4gICAgICBrZXlzVG9TbmFrZUNhc2UodGhpcy50ZXJyYWZvcm1NZXRhQXJndW1lbnRzKSxcbiAgICAgIHtcbiAgICAgICAgcHJvdmlzaW9uZXI6IHRoaXMucHJvdmlzaW9uZXJzPy5tYXAoKHsgdHlwZSwgLi4ucHJvcHMgfSkgPT4gKHtcbiAgICAgICAgICBbdHlwZV06IHtcbiAgICAgICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICB2YWx1ZToga2V5c1RvU25ha2VDYXNlKHByb3BzKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgICAgdGhpcy5yYXdPdmVycmlkZXMsXG4gICAgKTtcblxuICAgIGF0dHJpYnV0ZXNbXCIvL1wiXSA9IHtcbiAgICAgIC4uLihhdHRyaWJ1dGVzW1wiLy9cIl0gPz8ge30pLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3ROb2RlTWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGNvbnN0IG1vdmVkQmxvY2sgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2soKTtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb3VyY2U6IHRoaXMuX2hhc01vdmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDoge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXToge1xuICAgICAgICAgICAgICBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXTogYXR0cmlidXRlcyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgIG1vdmVkOiBtb3ZlZEJsb2NrXG4gICAgICAgID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0bzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBtb3ZlZEJsb2NrLnRvLFxuICAgICAgICAgICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgICAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJyZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnJvbToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBtb3ZlZEJsb2NrLmZyb20sXG4gICAgICAgICAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgaW1wb3J0OiB0aGlzLl9pbXBvcnRlZFxuICAgICAgICA/IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdG86IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBpZDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9pbXBvcnRlZC5pZCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICAgICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHByb3ZpZGVyOiB0aGlzLl9pbXBvcnRlZC5wcm92aWRlclxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5faW1wb3J0ZWQucHJvdmlkZXIuZnFuLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICAgICAgICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInJlZmVyZW5jZVwiLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9NZXRhZGF0YSgpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBvdmVycmlkZXM6IE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKS5sZW5ndGhcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBbdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGVdOiBPYmplY3Qua2V5cyh0aGlzLnJhd092ZXJyaWRlcyksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGltcG9ydHM6IHRoaXMuX2ltcG9ydGVkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgW3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlXTogW3RoaXMuZnJpZW5kbHlVbmlxdWVJZF0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIG1vdmVkOlxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0IHx8IHRoaXMuX21vdmVkQnlJZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBbdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGVdOiBbdGhpcy5mcmllbmRseVVuaXF1ZUlkXSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGludGVycG9sYXRpb25Gb3JBdHRyaWJ1dGUodGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVmKFxuICAgICAgYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfSR7XG4gICAgICAgIHRoaXMuZm9yRWFjaCA/IFwiLipcIiA6IFwiXCJcbiAgICAgIH0uJHt0ZXJyYWZvcm1BdHRyaWJ1dGV9YCxcbiAgICAgIHRoaXMuY2RrdGZTdGFjayxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGltcG9ydEZyb20oaWQ6IHN0cmluZywgcHJvdmlkZXI/OiBUZXJyYWZvcm1Qcm92aWRlcikge1xuICAgIHRoaXMuX2ltcG9ydGVkID0geyBpZCwgcHJvdmlkZXIgfTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgIG5ldyBWYWxpZGF0ZVRlcnJhZm9ybVZlcnNpb24oXG4gICAgICAgIFwiPj0xLjVcIixcbiAgICAgICAgYEltcG9ydCBibG9ja3MgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciBUZXJyYWZvcm0gPj0xLjUuIFBsZWFzZSB1cGdyYWRlIHlvdXIgVGVycmFmb3JtIHZlcnNpb24uYCxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQ6IHN0cmluZykge1xuICAgIHJldHVybiBUZXJyYWZvcm1TdGFjay5vZih0aGlzKS5tb3ZlVGFyZ2V0cy5nZXRSZXNvdXJjZUJ5VGFyZ2V0KG1vdmVUYXJnZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkUmVzb3VyY2VUYXJnZXQobW92ZVRhcmdldDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFRlcnJhZm9ybVN0YWNrLm9mKHRoaXMpLm1vdmVUYXJnZXRzLmFkZFJlc291cmNlVGFyZ2V0KFxuICAgICAgdGhpcyxcbiAgICAgIG1vdmVUYXJnZXQsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkTW92ZWRCbG9ja0J5VGFyZ2V0KFxuICAgIG1vdmVkVGFyZ2V0OiBUZXJyYWZvcm1SZXNvdXJjZU1vdmVCeVRhcmdldCxcbiAgKTogeyB0bzogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBtb3ZlVGFyZ2V0LCBpbmRleCB9ID0gbW92ZWRUYXJnZXQ7XG4gICAgY29uc3QgcmVzb3VyY2VUb01vdmVUbyA9IHRoaXMuX2dldFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQpO1xuICAgIGlmICh0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZSAhPT0gcmVzb3VyY2VUb01vdmVUby50ZXJyYWZvcm1SZXNvdXJjZVR5cGUpIHtcbiAgICAgIHRocm93IG1vdmVkVG9SZXNvdXJjZU9mRGlmZmVyZW50VHlwZShcbiAgICAgICAgbW92ZVRhcmdldCxcbiAgICAgICAgdGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGUsXG4gICAgICAgIHJlc291cmNlVG9Nb3ZlVG8udGVycmFmb3JtUmVzb3VyY2VUeXBlLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdG8gPSBpbmRleFxuICAgICAgPyB0eXBlb2YgaW5kZXggPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHtyZXNvdXJjZVRvTW92ZVRvLmZyaWVuZGx5VW5pcXVlSWR9W1wiJHtpbmRleH1cIl1gXG4gICAgICAgIDogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7cmVzb3VyY2VUb01vdmVUby5mcmllbmRseVVuaXF1ZUlkfVske2luZGV4fV1gXG4gICAgICA6IGAke3RoaXMudGVycmFmb3JtUmVzb3VyY2VUeXBlfS4ke3Jlc291cmNlVG9Nb3ZlVG8uZnJpZW5kbHlVbmlxdWVJZH1gO1xuICAgIGNvbnN0IGZyb20gPSBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YDtcbiAgICByZXR1cm4geyB0bywgZnJvbSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRNb3ZlZEJsb2NrKCk6IHsgdG86IHN0cmluZzsgZnJvbTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0ICYmIHRoaXMuX21vdmVkQnlJZCkge1xuICAgICAgdGhyb3cgcmVzb3VyY2VHaXZlblR3b01vdmVPcGVyYXRpb25zQnlUYXJnZXRBbmRJZChcbiAgICAgICAgdGhpcy5ub2RlLmlkLFxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0Lm1vdmVUYXJnZXQsXG4gICAgICAgIHsgdG86IHRoaXMuX21vdmVkQnlJZC50bywgZnJvbTogdGhpcy5fbW92ZWRCeUlkLmZyb20gfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0KSB7XG4gICAgICBjb25zdCBtb3ZlZEJsb2NrQnlUYXJnZXQgPSB0aGlzLl9idWlsZE1vdmVkQmxvY2tCeVRhcmdldChcbiAgICAgICAgdGhpcy5fbW92ZWRCeVRhcmdldCxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyB0bzogbW92ZWRCbG9ja0J5VGFyZ2V0LnRvLCBmcm9tOiBtb3ZlZEJsb2NrQnlUYXJnZXQuZnJvbSB9O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbW92ZWRCeUlkKSB7XG4gICAgICByZXR1cm4geyB0bzogdGhpcy5fbW92ZWRCeUlkLnRvLCBmcm9tOiB0aGlzLl9tb3ZlZEJ5SWQuZnJvbSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGlzIHJlc291cmNlIHRvIHRoZSB0YXJnZXQgcmVzb3VyY2UgZ2l2ZW4gYnkgbW92ZVRhcmdldC5cbiAgICogQHBhcmFtIG1vdmVUYXJnZXQgVGhlIHByZXZpb3VzbHkgc2V0IHVzZXIgZGVmaW5lZCBzdHJpbmcgc2V0IGJ5IC5hZGRNb3ZlVGFyZ2V0KCkgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzb3VyY2UgdG8gbW92ZSB0by5cbiAgICogQHBhcmFtIGluZGV4IE9wdGlvbmFsIFRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgdGhlIHJlc291cmNlIGlzIHRvIGFwcGVhciBpbiB0aGUgZm9yZWFjaCBvZiBhIHJlc291cmNlIHRvIG1vdmUgdG9cbiAgICovXG4gIHB1YmxpYyBtb3ZlVG8obW92ZVRhcmdldDogc3RyaW5nLCBpbmRleD86IHN0cmluZyB8IG51bWJlcikge1xuICAgIGlmICh0aGlzLl9tb3ZlZEJ5VGFyZ2V0KSB7XG4gICAgICB0aHJvdyByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeVRhcmdldChcbiAgICAgICAgdGhpcy5mcmllbmRseVVuaXF1ZUlkLFxuICAgICAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0Lm1vdmVUYXJnZXQsXG4gICAgICAgIG1vdmVUYXJnZXQsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9tb3ZlZEJ5VGFyZ2V0ID0geyBtb3ZlVGFyZ2V0LCBpbmRleCB9O1xuICAgIHRoaXMuX2hhc01vdmVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgdXNlciBkZWZpbmVkIG1vdmVUYXJnZXQgc3RyaW5nIHRvIHRoaXMgcmVzb3VyY2UgdG8gYmUgbGF0ZXIgdXNlZCBpbiAubW92ZVRvKG1vdmVUYXJnZXQpIHRvIHJlc29sdmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBtb3ZlLlxuICAgKiBAcGFyYW0gbW92ZVRhcmdldCBUaGUgc3RyaW5nIG1vdmUgdGFyZ2V0IHRoYXQgd2lsbCBjb3JyZXNwb25kIHRvIHRoaXMgcmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBhZGRNb3ZlVGFyZ2V0KG1vdmVUYXJnZXQ6IHN0cmluZykge1xuICAgIHRoaXMuX2FkZFJlc291cmNlVGFyZ2V0KG1vdmVUYXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoaXMgcmVzb3VyY2UgdG8gdGhlIHJlc291cmNlIGNvcnJlc3BvbmRpbmcgdG8gXCJpZFwiXG4gICAqIEBwYXJhbSBpZCBGdWxsIGlkIG9mIHJlc291cmNlIHRvIG1vdmUgdG8sIGUuZy4gXCJhd3NfczNfYnVja2V0LmV4YW1wbGVcIlxuICAgKi9cbiAgcHVibGljIG1vdmVUb0lkKGlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5fbW92ZWRCeUlkKSB7XG4gICAgICB0aHJvdyByZXNvdXJjZUdpdmVuVHdvTW92ZU9wZXJhdGlvbnNCeUlkKFxuICAgICAgICB0aGlzLm5vZGUuaWQsXG4gICAgICAgIHsgdG86IHRoaXMuX21vdmVkQnlJZC5mcm9tLCBmcm9tOiB0aGlzLl9tb3ZlZEJ5SWQudG8gfSxcbiAgICAgICAge1xuICAgICAgICAgIHRvOiBpZCxcbiAgICAgICAgICBmcm9tOiBgJHt0aGlzLnRlcnJhZm9ybVJlc291cmNlVHlwZX0uJHt0aGlzLmZyaWVuZGx5VW5pcXVlSWR9YCxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fbW92ZWRCeUlkID0ge1xuICAgICAgdG86IGlkLFxuICAgICAgZnJvbTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgfTtcbiAgICB0aGlzLl9oYXNNb3ZlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgcmVzb3VyY2UgY29ycmVzcG9uZGluZyB0byBcImlkXCIgdG8gdGhpcyByZXNvdXJjZS4gTm90ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWluZyBtb3ZlZCBmcm9tIG11c3QgYmUgbWFya2VkIGFzIG1vdmVkIHVzaW5nIGl0cyBpbnN0YW5jZSBmdW5jdGlvbi5cbiAgICogQHBhcmFtIGlkIEZ1bGwgaWQgb2YgcmVzb3VyY2UgYmVpbmcgbW92ZWQgZnJvbSwgZS5nLiBcImF3c19zM19idWNrZXQuZXhhbXBsZVwiXG4gICAqL1xuICBwdWJsaWMgbW92ZUZyb21JZChpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX21vdmVkQnlJZCkge1xuICAgICAgdGhyb3cgcmVzb3VyY2VHaXZlblR3b01vdmVPcGVyYXRpb25zQnlJZChcbiAgICAgICAgdGhpcy5ub2RlLmlkLFxuICAgICAgICB7IHRvOiB0aGlzLl9tb3ZlZEJ5SWQuZnJvbSwgZnJvbTogdGhpcy5fbW92ZWRCeUlkLnRvIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0bzogaWQsXG4gICAgICAgICAgZnJvbTogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9tb3ZlZEJ5SWQgPSB7XG4gICAgICB0bzogYCR7dGhpcy50ZXJyYWZvcm1SZXNvdXJjZVR5cGV9LiR7dGhpcy5mcmllbmRseVVuaXF1ZUlkfWAsXG4gICAgICBmcm9tOiBpZCxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,5 +1,4 @@
1
1
  "use strict";
2
- var _a;
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
3
  exports.TerraformStack = void 0;
5
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
@@ -39,42 +38,45 @@ function throwIfIdContainsWhitespace(str) {
39
38
  }
40
39
  // eslint-disable-next-line jsdoc/require-jsdoc
41
40
  class TerraformStack extends constructs_1.Construct {
41
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.TerraformStack", version: "0.25.0-pre.21" };
42
+ rawOverrides = {};
43
+ cdktfVersion;
44
+ crossStackOutputs = {};
45
+ crossStackDataSources = {};
46
+ synthesizer;
47
+ dependencies = [];
48
+ moveTargets = new terraform_resource_targets_1.TerraformResourceTargets();
49
+ /**
50
+ * Terraform functions (`Fn.*`) and provider-defined
51
+ * (`provider::<name>::<function>`) functions actually rendered while
52
+ * resolving THIS stack's own elements during the current synthesis pass.
53
+ *
54
+ * Usage is stack-owned rather than App-owned: `ValidateFunctionVersionSupport`
55
+ * / `ValidateProviderFunctionTargetSupport` are registered in this
56
+ * constructor with the stack itself as scope, and `resolveTargetVersions`
57
+ * walks context up FROM that scope - i.e. from the stack, not the App root.
58
+ * Sibling stacks can therefore declare different `targetVersions` via
59
+ * stack-level `node.setContext`, and a per-App-root usage record would let
60
+ * one stack's usage be validated against a DIFFERENT stack's targets
61
+ * (false positives/negatives depending on which sibling happens to be
62
+ * stricter). Keying usage by the stack that actually rendered it makes
63
+ * each stack's validation see only its own usage, checked against its own
64
+ * targets.
65
+ *
66
+ * Represents the CURRENT synthesis pass only, not the stack's whole
67
+ * lifetime: `_runPreparingResolve` clears both sets at the start of every
68
+ * pass, before re-discovering what that pass actually renders (see
69
+ * `_recordFunctionUsage`/`_recordProviderFunctionUsage`, called from
70
+ * `FunctionCall.resolve()` in `tfExpression.ts`).
71
+ */
72
+ _usedFunctions = new Set();
73
+ /**
74
+ * See `_usedFunctions` - same per-stack, per-pass semantics, for
75
+ * provider-defined (`provider::<name>::<function>`) function calls.
76
+ */
77
+ _usedProviderFunctions = new Set();
42
78
  constructor(scope, id) {
43
79
  super(scope, id);
44
- this.rawOverrides = {};
45
- this.crossStackOutputs = {};
46
- this.crossStackDataSources = {};
47
- this.dependencies = [];
48
- this.moveTargets = new terraform_resource_targets_1.TerraformResourceTargets();
49
- /**
50
- * Terraform functions (`Fn.*`) and provider-defined
51
- * (`provider::<name>::<function>`) functions actually rendered while
52
- * resolving THIS stack's own elements during the current synthesis pass.
53
- *
54
- * Usage is stack-owned rather than App-owned: `ValidateFunctionVersionSupport`
55
- * / `ValidateProviderFunctionTargetSupport` are registered in this
56
- * constructor with the stack itself as scope, and `resolveTargetVersions`
57
- * walks context up FROM that scope - i.e. from the stack, not the App root.
58
- * Sibling stacks can therefore declare different `targetVersions` via
59
- * stack-level `node.setContext`, and a per-App-root usage record would let
60
- * one stack's usage be validated against a DIFFERENT stack's targets
61
- * (false positives/negatives depending on which sibling happens to be
62
- * stricter). Keying usage by the stack that actually rendered it makes
63
- * each stack's validation see only its own usage, checked against its own
64
- * targets.
65
- *
66
- * Represents the CURRENT synthesis pass only, not the stack's whole
67
- * lifetime: `_runPreparingResolve` clears both sets at the start of every
68
- * pass, before re-discovering what that pass actually renders (see
69
- * `_recordFunctionUsage`/`_recordProviderFunctionUsage`, called from
70
- * `FunctionCall.resolve()` in `tfExpression.ts`).
71
- */
72
- this._usedFunctions = new Set();
73
- /**
74
- * See `_usedFunctions` - same per-stack, per-pass semantics, for
75
- * provider-defined (`provider::<name>::<function>`) function calls.
76
- */
77
- this._usedProviderFunctions = new Set();
78
80
  throwIfIdIsGlobCharacter(id);
79
81
  throwIfIdContainsWhitespace(id);
80
82
  this.cdktfVersion = this.node.tryGetContext("cdktfVersion");
@@ -456,8 +458,6 @@ class TerraformStack extends constructs_1.Construct {
456
458
  }
457
459
  }
458
460
  exports.TerraformStack = TerraformStack;
459
- _a = JSII_RTTI_SYMBOL_1;
460
- TerraformStack[_a] = { fqn: "cdktn.TerraformStack", version: "0.25.0-pre.2" };
461
461
  // eslint-disable-next-line jsdoc/require-jsdoc
462
462
  function terraformElements(node, into = []) {
463
463
  if (terraform_element_1.TerraformElement.isTerraformElement(node)) {
@@ -472,4 +472,4 @@ function terraformElements(node, into = []) {
472
472
  }
473
473
  return into;
474
474
  }
475
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsMkNBQXlEO0FBQ3pELHVDQUFvQztBQUVwQywyREFBdUQ7QUFDdkQsaUNBQW1DO0FBQ25DLDZEQUF5RDtBQUN6RCw0REFBd0Q7QUFDeEQsaURBQXFDO0FBQ3JDLHlEQUFxRDtBQUVyRCw2Q0FBZ0Q7QUFFaEQsMERBQTREO0FBRTVELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUN4RCwrQ0FJdUI7QUFDdkIsK0JBQTRCO0FBQzVCLDJEQUF1RDtBQUN2RCw2RUFBd0U7QUFDeEUsNkRBQXlEO0FBQ3pELHlDQWFzQjtBQUN0QixxQ0FNa0I7QUFjbEIsK0NBQStDO0FBQy9DLFNBQVMsd0JBQXdCLENBQUMsR0FBVztJQUMzQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQ25ELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBQSxvQ0FBMkIsRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELCtDQUErQztBQUMvQyxTQUFTLDJCQUEyQixDQUFDLEdBQVc7SUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFBLGtDQUF5QixFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7QUFDSCxDQUFDO0FBRUQsK0NBQStDO0FB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RSxDQUFDO2dCQUNoQixNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUEscUJBQVksRUFBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELElBQUEsZ0JBQVMsRUFBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBQSxxQkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2YsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUEsb0JBQVcsRUFBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNoQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBQSxxQkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hCLElBQUEsZ0JBQVMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNsQixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBQSx1QkFBYyxFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztRQUV4QyxJQUFBLGdCQUFTLEVBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqQyxNQUFNLGNBQWMsR0FBSSxFQUFVLEVBQUUsU0FBUyxDQUFDO1FBRTlDLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsaUJBQWlCLEdBQUcsSUFBQSx3QkFBZSxFQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BELElBQUEsZ0JBQVMsRUFBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBQSx5QkFBZ0IsRUFBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUVELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsU0FBUyxHQUFHLElBQUEscUJBQVksRUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFeEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCw4RUFBOEU7Z0JBQzlFLFNBQVMsR0FBRyxNQUFNLEdBQUcsU0FBUyxDQUFDO1lBQ2pDLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFBLGlCQUFPLEVBQ1YsSUFBSSxFQUNKLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUN6RDtZQUNELFFBQVEsRUFBRSxJQUFBLGlCQUFPLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQztTQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVNLFdBQVc7UUFDaEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBRWQsTUFBTSxRQUFRLEdBQTJCO1lBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMxQixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsaURBQWlEO1lBQ25FLEtBQUssRUFBRSxTQUFTLEVBQUUsMERBQTBEO1lBQzVFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDM0MsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7Z0JBQzFELENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDO1FBRUYsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBQSxpQkFBTyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBQSxnQkFBUyxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQWdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGtDQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsSUFBQSxnQkFBUyxFQUNQLEtBQUssRUFDTCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUN6RCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN6QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDM0MsQ0FBQztnQkFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ1AsQ0FBQztZQUVGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRU4sRUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTFDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUEsaUJBQU8sRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RSxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUEsZ0JBQVMsRUFBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUVELElBQUEsZ0JBQVMsRUFBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBQSxpQkFBTyxFQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU0sbUNBQW1DLENBQUMsVUFBa0I7UUFDM0QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQ0FBZSxDQUNoQyxJQUFJLEVBQ0osc0JBQXNCLFVBQVUsRUFBRSxFQUNsQztZQUNFLEtBQUssRUFBRSxJQUFBLGtCQUFHLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQztZQUM1QixTQUFTLEVBQUUsSUFBSTtTQUNoQixDQUNGLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQzVDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxtQ0FBbUMsQ0FBQyxTQUF5QjtRQUNsRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUN0RCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV2QyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsd0JBQXdCLENBQ3hELElBQUksRUFDSiwrQkFBK0IsVUFBVSxFQUFFLEVBQzNDLFVBQVUsQ0FDWCxDQUFDO1FBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNyRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsK0NBQStDO0lBQ3hDLFNBQVMsQ0FBQyxLQUFxQjtRQUNwQyxPQUFPLENBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ2xELENBQUM7SUFDSixDQUFDO0lBRU0sYUFBYSxDQUFDLFVBQTBCO1FBQzdDLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBQSxtQ0FBMEIsRUFBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUN0QixNQUFNLE1BQU0sR0FBOEMsSUFBSSxDQUFDLElBQUk7YUFDaEUsT0FBTyxFQUFFO2FBQ1QsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FDeEU7YUFDQSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sU0FBUyxHQUFHLE1BQU07aUJBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDaEIsTUFBTSxJQUFBLCtCQUFzQixFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRU0sZUFBZTtRQUNwQixPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksc0NBQWlCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7Z0JBQ3BFLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxoQkgsd0NBbWhCQzs7O0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsaUJBQWlCLENBQ3hCLElBQWdCLEVBQ2hCLE9BQTJCLEVBQUU7SUFFN0IsSUFBSSxvQ0FBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxnQ0FBZ0M7UUFDaEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsU0FBUztRQUNYLENBQUM7UUFFRCxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QsIE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCIuL190b2tlbnNcIjtcblxuaW1wb3J0IHsgVGVycmFmb3JtRWxlbWVudCB9IGZyb20gXCIuL3RlcnJhZm9ybS1lbGVtZW50XCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1Qcm92aWRlciB9IGZyb20gXCIuL3RlcnJhZm9ybS1wcm92aWRlclwiO1xuaW1wb3J0IHsgTG9jYWxCYWNrZW5kIH0gZnJvbSBcIi4vYmFja2VuZHMvbG9jYWwtYmFja2VuZFwiO1xuaW1wb3J0IHsgcmVmIH0gZnJvbSBcIi4vdGZFeHByZXNzaW9uXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1PdXRwdXQgfSBmcm9tIFwiLi90ZXJyYWZvcm0tb3V0cHV0XCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1SZW1vdGVTdGF0ZSB9IGZyb20gXCIuL3RlcnJhZm9ybS1yZW1vdGUtc3RhdGVcIjtcbmltcG9ydCB7IG1ha2VVbmlxdWVJZCB9IGZyb20gXCIuL3ByaXZhdGUvdW5pcXVlXCI7XG5pbXBvcnQgeyBJU3RhY2tTeW50aGVzaXplciB9IGZyb20gXCIuL3N5bnRoZXNpemUvdHlwZXNcIjtcbmltcG9ydCB7IFN0YWNrU3ludGhlc2l6ZXIgfSBmcm9tIFwiLi9zeW50aGVzaXplL3N5bnRoZXNpemVyXCI7XG5cbmNvbnN0IFNUQUNLX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJjZGt0Zi9UZXJyYWZvcm1TdGFja1wiKTtcbmltcG9ydCB7XG4gIFZhbGlkYXRlRnVuY3Rpb25WZXJzaW9uU3VwcG9ydCxcbiAgVmFsaWRhdGVQcm92aWRlckZ1bmN0aW9uVGFyZ2V0U3VwcG9ydCxcbiAgVmFsaWRhdGVQcm92aWRlclByZXNlbmNlLFxufSBmcm9tIFwiLi92YWxpZGF0aW9uc1wiO1xuaW1wb3J0IHsgQXBwIH0gZnJvbSBcIi4vYXBwXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1CYWNrZW5kIH0gZnJvbSBcIi4vdGVycmFmb3JtLWJhY2tlbmRcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVJlc291cmNlVGFyZ2V0cyB9IGZyb20gXCIuL3RlcnJhZm9ybS1yZXNvdXJjZS10YXJnZXRzXCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1SZXNvdXJjZSB9IGZyb20gXCIuL3RlcnJhZm9ybS1yZXNvdXJjZVwiO1xuaW1wb3J0IHtcbiAgcmVuZGVyRGF0YXNvdXJjZSxcbiAgcmVuZGVyRXBoZW1lcmFsLFxuICByZW5kZXJNb2R1bGUsXG4gIHJlbmRlck1vdmVkLFxuICByZW5kZXJPdXRwdXQsXG4gIHJlbmRlclByb3ZpZGVyLFxuICByZW5kZXJSZXNvdXJjZSxcbiAgcmVuZGVyVGVycmFmb3JtLFxuICByZW5kZXJMb2NhbHMsXG4gIHJlbmRlclZhcmlhYmxlLFxuICByZW5kZXJJbXBvcnQsXG4gIGNsZWFuRm9yTWV0YWRhdGEsXG59IGZyb20gXCIuL2hjbC9yZW5kZXJcIjtcbmltcG9ydCB7XG4gIG5vU3RhY2tGb3JDb25zdHJ1Y3QsXG4gIHN0YWNrQ29udGFpbnNEaXNhbGxvd2VkQ2hhcixcbiAgc3RhY2tIYXNDaXJjdWxhckRlcGVuZGVuY3ksXG4gIHN0YWNrSWRDb250YWluc1doaXRlc3BhY2UsXG4gIHN0YWNrVmFsaWRhdGlvbkZhaWx1cmUsXG59IGZyb20gXCIuL2Vycm9yc1wiO1xuXG50eXBlIFN0YWNrSWRlbnRpZmllciA9IHN0cmluZztcbnR5cGUgT3V0cHV0SWRNYXAgPVxuICB8IHsgW2NvbnN0cnVjdElkOiBzdHJpbmddOiBzdHJpbmcgfVxuICB8IHsgW3N0YWNrT3JDb25zdHJ1Y3RJZDogc3RyaW5nXTogT3V0cHV0SWRNYXAgfTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXJyYWZvcm1TdGFja01ldGFkYXRhIHtcbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYmFja2VuZDogc3RyaW5nO1xuICByZWFkb25seSBjbG91ZD86IHN0cmluZztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIHRocm93SWZJZElzR2xvYkNoYXJhY3RlcihzdHI6IHN0cmluZyk6IHZvaWQge1xuICBbXCIqXCIsIFwiP1wiLCBcIltcIiwgXCJdXCIsIFwie1wiLCBcIn1cIiwgXCIhXCJdLmZvckVhY2goKGNoYXIpID0+IHtcbiAgICBpZiAoc3RyLmluY2x1ZGVzKGNoYXIpKSB7XG4gICAgICB0aHJvdyBzdGFja0NvbnRhaW5zRGlzYWxsb3dlZENoYXIoc3RyLCBjaGFyKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gdGhyb3dJZklkQ29udGFpbnNXaGl0ZXNwYWNlKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gIGlmICgvXFxzLy50ZXN0KHN0cikpIHtcbiAgICB0aHJvdyBzdGFja0lkQ29udGFpbnNXaGl0ZXNwYWNlKHN0cik7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBjbGFzcyBUZXJyYWZvcm1TdGFjayBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF3T3ZlcnJpZGVzOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZGt0ZlZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBjcm9zc1N0YWNrT3V0cHV0czogUmVjb3JkPFN0YWNrSWRlbnRpZmllciwgVGVycmFmb3JtT3V0cHV0PiA9IHt9O1xuICBwcml2YXRlIGNyb3NzU3RhY2tEYXRhU291cmNlczogUmVjb3JkPFN0YWNrSWRlbnRpZmllciwgVGVycmFmb3JtUmVtb3RlU3RhdGU+ID1cbiAgICB7fTtcbiAgcHVibGljIHN5bnRoZXNpemVyOiBJU3RhY2tTeW50aGVzaXplcjtcbiAgcHVibGljIGRlcGVuZGVuY2llczogVGVycmFmb3JtU3RhY2tbXSA9IFtdO1xuICBwdWJsaWMgbW92ZVRhcmdldHM6IFRlcnJhZm9ybVJlc291cmNlVGFyZ2V0cyA9IG5ldyBUZXJyYWZvcm1SZXNvdXJjZVRhcmdldHMoKTtcblxuICAvKipcbiAgICogVGVycmFmb3JtIGZ1bmN0aW9ucyAoYEZuLipgKSBhbmQgcHJvdmlkZXItZGVmaW5lZFxuICAgKiAoYHByb3ZpZGVyOjo8bmFtZT46OjxmdW5jdGlvbj5gKSBmdW5jdGlvbnMgYWN0dWFsbHkgcmVuZGVyZWQgd2hpbGVcbiAgICogcmVzb2x2aW5nIFRISVMgc3RhY2sncyBvd24gZWxlbWVudHMgZHVyaW5nIHRoZSBjdXJyZW50IHN5bnRoZXNpcyBwYXNzLlxuICAgKlxuICAgKiBVc2FnZSBpcyBzdGFjay1vd25lZCByYXRoZXIgdGhhbiBBcHAtb3duZWQ6IGBWYWxpZGF0ZUZ1bmN0aW9uVmVyc2lvblN1cHBvcnRgXG4gICAqIC8gYFZhbGlkYXRlUHJvdmlkZXJGdW5jdGlvblRhcmdldFN1cHBvcnRgIGFyZSByZWdpc3RlcmVkIGluIHRoaXNcbiAgICogY29uc3RydWN0b3Igd2l0aCB0aGUgc3RhY2sgaXRzZWxmIGFzIHNjb3BlLCBhbmQgYHJlc29sdmVUYXJnZXRWZXJzaW9uc2BcbiAgICogd2Fsa3MgY29udGV4dCB1cCBGUk9NIHRoYXQgc2NvcGUgLSBpLmUuIGZyb20gdGhlIHN0YWNrLCBub3QgdGhlIEFwcCByb290LlxuICAgKiBTaWJsaW5nIHN0YWNrcyBjYW4gdGhlcmVmb3JlIGRlY2xhcmUgZGlmZmVyZW50IGB0YXJnZXRWZXJzaW9uc2AgdmlhXG4gICAqIHN0YWNrLWxldmVsIGBub2RlLnNldENvbnRleHRgLCBhbmQgYSBwZXItQXBwLXJvb3QgdXNhZ2UgcmVjb3JkIHdvdWxkIGxldFxuICAgKiBvbmUgc3RhY2sncyB1c2FnZSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBhIERJRkZFUkVOVCBzdGFjaydzIHRhcmdldHNcbiAgICogKGZhbHNlIHBvc2l0aXZlcy9uZWdhdGl2ZXMgZGVwZW5kaW5nIG9uIHdoaWNoIHNpYmxpbmcgaGFwcGVucyB0byBiZVxuICAgKiBzdHJpY3RlcikuIEtleWluZyB1c2FnZSBieSB0aGUgc3RhY2sgdGhhdCBhY3R1YWxseSByZW5kZXJlZCBpdCBtYWtlc1xuICAgKiBlYWNoIHN0YWNrJ3MgdmFsaWRhdGlvbiBzZWUgb25seSBpdHMgb3duIHVzYWdlLCBjaGVja2VkIGFnYWluc3QgaXRzIG93blxuICAgKiB0YXJnZXRzLlxuICAgKlxuICAgKiBSZXByZXNlbnRzIHRoZSBDVVJSRU5UIHN5bnRoZXNpcyBwYXNzIG9ubHksIG5vdCB0aGUgc3RhY2sncyB3aG9sZVxuICAgKiBsaWZldGltZTogYF9ydW5QcmVwYXJpbmdSZXNvbHZlYCBjbGVhcnMgYm90aCBzZXRzIGF0IHRoZSBzdGFydCBvZiBldmVyeVxuICAgKiBwYXNzLCBiZWZvcmUgcmUtZGlzY292ZXJpbmcgd2hhdCB0aGF0IHBhc3MgYWN0dWFsbHkgcmVuZGVycyAoc2VlXG4gICAqIGBfcmVjb3JkRnVuY3Rpb25Vc2FnZWAvYF9yZWNvcmRQcm92aWRlckZ1bmN0aW9uVXNhZ2VgLCBjYWxsZWQgZnJvbVxuICAgKiBgRnVuY3Rpb25DYWxsLnJlc29sdmUoKWAgaW4gYHRmRXhwcmVzc2lvbi50c2ApLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlZEZ1bmN0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBTZWUgYF91c2VkRnVuY3Rpb25zYCAtIHNhbWUgcGVyLXN0YWNrLCBwZXItcGFzcyBzZW1hbnRpY3MsIGZvclxuICAgKiBwcm92aWRlci1kZWZpbmVkIChgcHJvdmlkZXI6OjxuYW1lPjo6PGZ1bmN0aW9uPmApIGZ1bmN0aW9uIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlZFByb3ZpZGVyRnVuY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aHJvd0lmSWRJc0dsb2JDaGFyYWN0ZXIoaWQpO1xuICAgIHRocm93SWZJZENvbnRhaW5zV2hpdGVzcGFjZShpZCk7XG4gICAgdGhpcy5jZGt0ZlZlcnNpb24gPSB0aGlzLm5vZGUudHJ5R2V0Q29udGV4dChcImNka3RmVmVyc2lvblwiKTtcbiAgICB0aGlzLnN5bnRoZXNpemVyID0gbmV3IFN0YWNrU3ludGhlc2l6ZXIoXG4gICAgICB0aGlzLFxuICAgICAgcHJvY2Vzcy5lbnYuQ0RLVEZfQ09OVElOVUVfU1lOVEhfT05fRVJST1JfQU5OT1RBVElPTlMgIT09IHVuZGVmaW5lZCxcbiAgICAgIHByb2Nlc3MuZW52LlNZTlRIX0hDTF9PVVRQVVQgPT09IFwidHJ1ZVwiIHx8XG4gICAgICAgIHByb2Nlc3MuZW52LlNZTlRIX0hDTF9PVVRQVVQgPT09IFwiMVwiLFxuICAgICk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFNUQUNLX1NZTUJPTCwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihuZXcgVmFsaWRhdGVQcm92aWRlclByZXNlbmNlKHRoaXMpKTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihuZXcgVmFsaWRhdGVGdW5jdGlvblZlcnNpb25TdXBwb3J0KHRoaXMpKTtcbiAgICB0aGlzLm5vZGUuYWRkVmFsaWRhdGlvbihuZXcgVmFsaWRhdGVQcm92aWRlckZ1bmN0aW9uVGFyZ2V0U3VwcG9ydCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzU3RhY2soeDogYW55KTogeCBpcyBUZXJyYWZvcm1TdGFjayB7XG4gICAgcmV0dXJuIHggIT09IG51bGwgJiYgdHlwZW9mIHggPT09IFwib2JqZWN0XCIgJiYgU1RBQ0tfU1lNQk9MIGluIHg7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyB0aGF0IGBmdW5jdGlvbk5hbWVgIChhIGBGbi4qYCBUZXJyYWZvcm0gZnVuY3Rpb24pIHdhcyByZW5kZXJlZFxuICAgKiB3aGlsZSByZXNvbHZpbmcgb25lIG9mIHRoaXMgc3RhY2sncyBlbGVtZW50cyBkdXJpbmcgdGhlIGN1cnJlbnRcbiAgICogc3ludGhlc2lzIHBhc3MuIENhbGxlZCBmcm9tIGBGdW5jdGlvbkNhbGwucmVzb2x2ZSgpYCBpbiBgdGZFeHByZXNzaW9uLnRzYFxuICAgKiAtIHNlZSBgX3VzZWRGdW5jdGlvbnNgIGZvciB3aHkgdXNhZ2UgaXMgc3RhY2stb3duZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZWNvcmRGdW5jdGlvblVzYWdlKGZ1bmN0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlZEZ1bmN0aW9ucy5hZGQoZnVuY3Rpb25OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgYGZ1bGxOYW1lYCAoYSBgcHJvdmlkZXI6OjxuYW1lPjo6PGZ1bmN0aW9uPmAgY2FsbCkgd2FzXG4gICAqIHJlbmRlcmVkIHdoaWxlIHJlc29sdmluZyBvbmUgb2YgdGhpcyBzdGFjaydzIGVsZW1lbnRzIGR1cmluZyB0aGVcbiAgICogY3VycmVudCBzeW50aGVzaXMgcGFzcy4gQ2FsbGVkIGZyb20gYEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKClgIGluXG4gICAqIGB0ZkV4cHJlc3Npb24udHNgIC0gc2VlIGBfdXNlZEZ1bmN0aW9uc2AgZm9yIHdoeSB1c2FnZSBpcyBzdGFjay1vd25lZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlY29yZFByb3ZpZGVyRnVuY3Rpb25Vc2FnZShmdWxsTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlZFByb3ZpZGVyRnVuY3Rpb25zLmFkZChmdWxsTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYEZuLipgIFRlcnJhZm9ybSBmdW5jdGlvbiBuYW1lcyByZW5kZXJlZCB3aGlsZSByZXNvbHZpbmdcbiAgICogdGhpcyBzdGFjaydzIGVsZW1lbnRzIGR1cmluZyB0aGUgY3VycmVudCBzeW50aGVzaXMgcGFzcy4gUmVhZCBieVxuICAgKiBgVmFsaWRhdGVGdW5jdGlvblZlcnNpb25TdXBwb3J0YC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2dldFVzZWRGdW5jdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3VzZWRGdW5jdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGBwcm92aWRlcjo6PG5hbWU+Ojo8ZnVuY3Rpb24+YCBjYWxscyByZW5kZXJlZCB3aGlsZVxuICAgKiByZXNvbHZpbmcgdGhpcyBzdGFjaydzIGVsZW1lbnRzIGR1cmluZyB0aGUgY3VycmVudCBzeW50aGVzaXMgcGFzcy4gUmVhZFxuICAgKiBieSBgVmFsaWRhdGVQcm92aWRlckZ1bmN0aW9uVGFyZ2V0U3VwcG9ydGAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9nZXRVc2VkUHJvdmlkZXJGdW5jdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3VzZWRQcm92aWRlckZ1bmN0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG9mKGNvbnN0cnVjdDogSUNvbnN0cnVjdCk6IFRlcnJhZm9ybVN0YWNrIHtcbiAgICByZXR1cm4gX2xvb2t1cChjb25zdHJ1Y3QpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgICBmdW5jdGlvbiBfbG9va3VwKGM6IElDb25zdHJ1Y3QpOiBUZXJyYWZvcm1TdGFjayB7XG4gICAgICBpZiAoVGVycmFmb3JtU3RhY2suaXNTdGFjayhjKSkge1xuICAgICAgICByZXR1cm4gYztcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9kZSA9IGMubm9kZTtcblxuICAgICAgaWYgKCFub2RlLnNjb3BlKSB7XG4gICAgICAgIGxldCBoaW50ID0gXCJcIjtcbiAgICAgICAgaWYgKGNvbnN0cnVjdC5ub2RlLnNjb3BlID09PSBjICYmIEFwcC5pc0FwcChjKSkge1xuICAgICAgICAgIC8vIHRoZSBzY29wZSBvZiB0aGUgb3JpZ2luYWxseSBwYXNzZWQgY29uc3RydWN0IGVxdWFscyB0aGUgY29uc3RydWN0IGNcbiAgICAgICAgICAvLyB3aGljaCBoYXMgbm8gc2NvcGUgKGkuZS4gaGFzIG5vIHBhcmVudCBjb25zdHJ1Y3QpIGFuZCBjIGlzIGFuIEFwcFxuICAgICAgICAgIC8vIGFuZCBvdXIgY29uc3RydWN0IGlzIGEgQmFja2VuZFxuICAgICAgICAgIGhpbnQgPSBgLiBZb3Ugc2VlbSB0byBoYXZlIHBhc3NlZCB5b3VyIHJvb3QgQXBwIGFzIHNjb3BlIHRvIGEgY29uc3RydWN0LiBQYXNzIGEgc3RhY2sgKGluaGVyaXRpbmcgZnJvbSBUZXJyYWZvcm1TdGFjaykgYXMgc2NvcGUgdG8geW91ciBjb25zdHJ1Y3QgaW5zdGVhZC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbm9TdGFja0ZvckNvbnN0cnVjdChjb25zdHJ1Y3Qubm9kZS5wYXRoLCBoaW50KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9sb29rdXAobm9kZS5zY29wZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kQWxsPFQgZXh0ZW5kcyBJQ29uc3RydWN0PihcbiAgICBwcmVkaWNhdGU6IChub2RlOiB1bmtub3duKSA9PiBub2RlIGlzIFQsXG4gICk6IFRbXSB7XG4gICAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuXG4gICAgY29uc3QgdmlzaXQgPSBhc3luYyAobm9kZTogSUNvbnN0cnVjdCkgPT4ge1xuICAgICAgaWYgKHByZWRpY2F0ZShub2RlKSkge1xuICAgICAgICBpdGVtcy5wdXNoKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUubm9kZS5jaGlsZHJlbikge1xuICAgICAgICB2aXNpdChjaGlsZCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZpc2l0KHRoaXMpO1xuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVTdGFjaygpIHtcbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSBhIGJhY2tlbmQgY29uZmlndXJlZFxuICAgIHRoaXMuZW5zdXJlQmFja2VuZEV4aXN0cygpO1xuICAgIHRoaXMuX3J1blByZXBhcmluZ1Jlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZS1kaXNjb3ZlcnkgaGFsZiBvZiBgcHJlcGFyZVN0YWNrKClgLCBzcGxpdCBvdXQgc28gZW50cnlcbiAgICogcG9pbnRzIHRoYXQgbXVzdCBOT1QgaW5qZWN0IGEgYmFja2VuZCAoYFRlc3Rpbmcuc3ludGhgL2BzeW50aEhjbGAgLVxuICAgKiBkb2luZyBzbyB3b3VsZCBhZGQgYW4gaW1wbGljaXQgbG9jYWwgYmFja2VuZCB0byBzbmFwc2hvdHMgdGhhdCBuZXZlclxuICAgKiBhc2tlZCBmb3Igb25lKSBjYW4gc3RpbGwgcnVuIHRoZSBwYXJ0IHRoYXQgZGlzY292ZXJzIGN1cnJlbnQtcGFzc1xuICAgKiBwcm92aWRlci1mZWF0dXJlIGFuZCBUZXJyYWZvcm0tZnVuY3Rpb24gdXNhZ2UuXG4gICAqXG4gICAqIENsZWFycyB0aGlzIHN0YWNrJ3Mgb3duIGBfdXNlZEZ1bmN0aW9uc2AvYF91c2VkUHJvdmlkZXJGdW5jdGlvbnNgIHNldHNcbiAgICogZmlyc3QgLSB0aGlzIHN0YWNrJ3MgcGVyLXBhc3MgZXBvY2ggZm9yIFRlcnJhZm9ybS1mdW5jdGlvbiB1c2FnZS5cbiAgICogQmVjYXVzZSB0aGUgcmVzZXQgbGl2ZXMgaGVyZSwgb25jZSBwZXIgc3RhY2ssIGV2ZXJ5IHZhbGlkYXRpb24tZW5hYmxlZFxuICAgKiBlbnRyeSBwb2ludCAoYEFwcC5zeW50aGAsIGBUZXN0aW5nLnN5bnRoYC9gc3ludGhIY2xgLFxuICAgKiBgU3RhY2tTeW50aGVzaXplci5zeW50aGVzaXplYCkgZ2V0cyBpdCBmb3IgZnJlZSBqdXN0IGJ5IGNhbGxpbmdcbiAgICogYHByZXBhcmVTdGFjaygpYC9gX3J1blByZXBhcmluZ1Jlc29sdmUoKWAgLSBzZWUgYF91c2VkRnVuY3Rpb25zYCBmb3Igd2h5XG4gICAqIHVzYWdlIGlzIGtleWVkIGJ5IHN0YWNrLlxuICAgKlxuICAgKiBUaGVuIGRlYWN0aXZhdGVzIGV2ZXJ5IGVsZW1lbnQncyBzdGFsZSBgcmVzb2x2ZS1kaXNjb3ZlcmVkYFxuICAgKiBwcm92aWRlci1mZWF0dXJlIHJlZ2lzdHJhdGlvbnMgKHNlZVxuICAgKiBgVGVycmFmb3JtRWxlbWVudC5fcmVzZXRSZXNvbHZlRGlzY292ZXJlZFByb3ZpZGVyRmVhdHVyZVVzYWdlYCkgLSBzb1xuICAgKiB1c2FnZSBmcm9tIGFuIGVhcmxpZXIgc3ludGhlc2lzIHBhc3Mgb3ZlciB0aGlzIHNhbWUgc3RhY2sgY2FuJ3Qgc3Vydml2ZVxuICAgKiBpbnRvIHRoaXMgb25lIC0gdGhlbiByZXNvbHZlcyBldmVyeSBlbGVtZW50J3MgYHRvVGVycmFmb3JtKClgLCB3aGljaCBpc1xuICAgKiB3aGF0IHJlLWRpc2NvdmVycyB0aGlzIHBhc3MncyBhY3R1YWwgdXNhZ2UgKGJvdGggcHJvdmlkZXItZmVhdHVyZSB1c2FnZVxuICAgKiB2aWEgYG1hcmtXcml0ZU9ubHlBdHRyaWJ1dGVgLCBhbmQgVGVycmFmb3JtLWZ1bmN0aW9uIHVzYWdlIHZpYVxuICAgKiBgRnVuY3Rpb25DYWxsLnJlc29sdmUoKWAsIHdoaWNoIHJlY29yZHMgaW50byBgX3JlY29yZEZ1bmN0aW9uVXNhZ2VgL1xuICAgKiBgX3JlY29yZFByb3ZpZGVyRnVuY3Rpb25Vc2FnZWAgYWJvdmUpLiBBIHByZXBhcmluZyByZXNvbHZlIHJ1biBtaWdodFxuICAgKiBhbHNvIGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSBzdGFjaywgZS5nLiBmb3IgY3Jvc3Mgc3RhY2sgcmVmZXJlbmNlcy5cbiAgICogQ3Jvc3Mtc3RhY2sgcmVmZXJlbmNlcyBzdGF5IHNvdW5kIGV2ZW4gdGhvdWdoIHRoaXMgbWV0aG9kIHNraXBzIFRISVNcbiAgICogc3RhY2sncyBgZW5zdXJlQmFja2VuZEV4aXN0cygpYDogcmVzb2x2aW5nIG9uZSBtYXRlcmlhbGl6ZXMgdGhlIE9SSUdJTlxuICAgKiBzdGFjaydzIGJhY2tlbmQgb24gZGVtYW5kIChgcmVnaXN0ZXJJbmNvbWluZ0Nyb3NzU3RhY2tSZWZlcmVuY2VgIGNhbGxzXG4gICAqIGBmcm9tU3RhY2suZW5zdXJlQmFja2VuZEV4aXN0cygpYCBpdHNlbGYpLCBzbyBvbmx5IHRoZSBzeW50aGVzaXppbmdcbiAgICogc3RhY2sncyBvd24gYmFja2VuZCBibG9jayBpcyBsZWZ0IHVuaW5qZWN0ZWQgLSB3aGljaCBpcyBleGFjdGx5IHdoYXRcbiAgICogdGhlIGBUZXN0aW5nLnN5bnRoYC9gc3ludGhIY2xgIGNhbGxlcnMgd2FudC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3J1blByZXBhcmluZ1Jlc29sdmUoKSB7XG4gICAgdGhpcy5fdXNlZEZ1bmN0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuX3VzZWRQcm92aWRlckZ1bmN0aW9ucy5jbGVhcigpO1xuICAgIHRlcnJhZm9ybUVsZW1lbnRzKHRoaXMpLmZvckVhY2goKGUpID0+XG4gICAgICBlLl9yZXNldFJlc29sdmVEaXNjb3ZlcmVkUHJvdmlkZXJGZWF0dXJlVXNhZ2UoKSxcbiAgICApO1xuICAgIHRlcnJhZm9ybUVsZW1lbnRzKHRoaXMpLmZvckVhY2goKGUpID0+XG4gICAgICByZXNvbHZlKHRoaXMsIGUudG9UZXJyYWZvcm0oKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRPdmVycmlkZShwYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgIGxldCBjdXJyOiBhbnkgPSB0aGlzLnJhd092ZXJyaWRlcztcblxuICAgIHdoaWxlIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgICBjb25zdCBrZXkgPSBwYXJ0cy5zaGlmdCgpITtcblxuICAgICAgLy8gaWYgd2UgY2FuJ3QgcmVjdXJzZSBmdXJ0aGVyIG9yIHRoZSBwcmV2aW91cyB2YWx1ZSBpcyBub3QgYW5cbiAgICAgIC8vIG9iamVjdCBvdmVyd3JpdGUgaXQgd2l0aCBhbiBvYmplY3QuXG4gICAgICBjb25zdCBpc09iamVjdCA9XG4gICAgICAgIGN1cnJba2V5XSAhPSBudWxsICYmXG4gICAgICAgIHR5cGVvZiBjdXJyW2tleV0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoY3VycltrZXldKTtcbiAgICAgIGlmICghaXNPYmplY3QpIHtcbiAgICAgICAgY3VycltrZXldID0ge307XG4gICAgICB9XG5cbiAgICAgIGN1cnIgPSBjdXJyW2tleV07XG4gICAgfVxuXG4gICAgY29uc3QgbGFzdEtleSA9IHBhcnRzLnNoaWZ0KCkhO1xuICAgIGN1cnJbbGFzdEtleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsSWQodGZFbGVtZW50OiBUZXJyYWZvcm1FbGVtZW50IHwgTm9kZSk6IHN0cmluZyB7XG4gICAgLy8gd3JhcCB0aGUgYWxsb2NhdGlvbiBmb3IgZnV0dXJlIHJlbmFtaW5nIHN1cHBvcnRcbiAgICByZXR1cm4gdGhpcy5hbGxvY2F0ZUxvZ2ljYWxJZCh0ZkVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5hbWluZyBzY2hlbWUgdXNlZCB0byBhbGxvY2F0ZSBsb2dpY2FsIElEcy4gQnkgZGVmYXVsdCwgdXNlc1xuICAgKiB0aGUgYEhhc2hlZEFkZHJlc3NpbmdTY2hlbWVgIGJ1dCB0aGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemVcbiAgICogdGhpcyBiZWhhdmlvci5cbiAgICpcbiAgICogQHBhcmFtIHRmRWxlbWVudCBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdGhlIGxvZ2ljYWwgSUQgaXMgYWxsb2NhdGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFsbG9jYXRlTG9naWNhbElkKHRmRWxlbWVudDogVGVycmFmb3JtRWxlbWVudCB8IE5vZGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGUgPSBUZXJyYWZvcm1FbGVtZW50LmlzVGVycmFmb3JtRWxlbWVudCh0ZkVsZW1lbnQpXG4gICAgICA/IHRmRWxlbWVudC5ub2RlXG4gICAgICA6IHRmRWxlbWVudDtcbiAgICBjb25zdCBzdGFjayA9IFRlcnJhZm9ybUVsZW1lbnQuaXNUZXJyYWZvcm1FbGVtZW50KHRmRWxlbWVudClcbiAgICAgID8gdGZFbGVtZW50LmNka3RmU3RhY2tcbiAgICAgIDogdGhpcztcblxuICAgIGNvbnN0IHN0YWNrSW5kZXggPSBub2RlLnNjb3Blcy5pbmRleE9mKHN0YWNrKTtcblxuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBub2RlLnNjb3Blcy5zbGljZShzdGFja0luZGV4ICsgMSkubWFwKChjKSA9PiBjLm5vZGUuaWQpO1xuICAgIHJldHVybiBjb21wb25lbnRzLmxlbmd0aCA+IDAgPyBtYWtlVW5pcXVlSWQoY29tcG9uZW50cykgOiBcIlwiO1xuICB9XG5cbiAgcHVibGljIGFsbFByb3ZpZGVycygpOiBUZXJyYWZvcm1Qcm92aWRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maW5kQWxsKFRlcnJhZm9ybVByb3ZpZGVyLmlzVGVycmFmb3JtUHJvdmlkZXIpO1xuICB9XG5cbiAgcHVibGljIGVuc3VyZUJhY2tlbmRFeGlzdHMoKTogVGVycmFmb3JtQmFja2VuZCB7XG4gICAgY29uc3QgYmFja2VuZHMgPSB0aGlzLmZpbmRBbGwoVGVycmFmb3JtQmFja2VuZC5pc0JhY2tlbmQpO1xuICAgIHJldHVybiBiYWNrZW5kc1swXSB8fCBuZXcgTG9jYWxCYWNrZW5kKHRoaXMsIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyB0b0hjbFRlcnJhZm9ybSgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVGVycmFmb3JtU3RhY2tNZXRhZGF0YSA9IHtcbiAgICAgIHZlcnNpb246IHRoaXMuY2RrdGZWZXJzaW9uLFxuICAgICAgc3RhY2tOYW1lOiB0aGlzLm5vZGUuaWQsXG4gICAgICBiYWNrZW5kOiBcImxvY2FsXCIsIC8vIG92ZXJ3cml0dGVuIGJ5IGJhY2tlbmQgaW1wbGVtZW50YXRpb25zIGlmIHVzZWRcbiAgICAgIGNsb3VkOiB1bmRlZmluZWQsIC8vIG92ZXJ3cml0dGVuIGJ5IGNsb3VkIGFuZCByZW1vdGUgYmFja2VuZCBpbXBsZW1lbnRhdGlvbnNcbiAgICAgIC4uLihPYmplY3Qua2V5cyh0aGlzLnJhd092ZXJyaWRlcykubGVuZ3RoID4gMFxuICAgICAgICA/IHsgb3ZlcnJpZGVzOiB7IHN0YWNrOiBPYmplY3Qua2V5cyh0aGlzLnJhd092ZXJyaWRlcykgfSB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHRlcnJhZm9ybUVsZW1lbnRzKHRoaXMpO1xuXG4gICAgY29uc3QgbWV0YWRhdGFzID0gZWxlbWVudHMubWFwKChlKSA9PiByZXNvbHZlKHRoaXMsIGUudG9NZXRhZGF0YSgpKSk7XG4gICAgZm9yIChjb25zdCBtZXRhIG9mIG1ldGFkYXRhcykge1xuICAgICAgZGVlcE1lcmdlKG1ldGFkYXRhLCBtZXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRzOiBPdXRwdXRJZE1hcCA9IGVsZW1lbnRzLnJlZHVjZSgoY2FycnksIGl0ZW0pID0+IHtcbiAgICAgIGlmICghVGVycmFmb3JtT3V0cHV0LmlzVGVycmFmb3JtT3V0cHV0KGl0ZW0pKSB7XG4gICAgICAgIHJldHVybiBjYXJyeTtcbiAgICAgIH1cblxuICAgICAgZGVlcE1lcmdlKFxuICAgICAgICBjYXJyeSxcbiAgICAgICAgaXRlbS5ub2RlLnBhdGguc3BsaXQoXCIvXCIpLnJlZHVjZVJpZ2h0KChpbm5lckNhcnJ5LCBwYXJ0KSA9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGlubmVyQ2FycnkpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgW3BhcnRdOiBpdGVtLmZyaWVuZGx5VW5pcXVlSWQgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgW3BhcnRdOiBpbm5lckNhcnJ5IH07XG4gICAgICAgIH0sIHt9KSxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBjYXJyeTtcbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCB0ZiA9IHt9O1xuICAgIGNvbnN0IGZyYWdtZW50cyA9IGVsZW1lbnRzLm1hcCgoZSkgPT4gcmVzb2x2ZSh0aGlzLCBlLnRvSGNsVGVycmFmb3JtKCkpKTtcbiAgICBjb25zdCBsb2NhbHM6IHsgbG9jYWxzPzogYW55IH0gPSB7fTtcblxuICAgIGNvbnN0IHRmTWV0YSA9IHtcbiAgICAgIFwiLy9cIjoge1xuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgb3V0cHV0cyxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBoY2xGcmFnbWVudHMgPSBmcmFnbWVudHNcbiAgICAgIC5tYXAoKGZyYWcpID0+IHtcbiAgICAgICAgbGV0IHJlcyA9IFwiXCI7XG4gICAgICAgIGlmIChmcmFnLnJlc291cmNlKSB7XG4gICAgICAgICAgY29uc3QgeyBoY2wsIG1ldGFkYXRhIH0gPSByZW5kZXJSZXNvdXJjZShmcmFnLnJlc291cmNlKTtcbiAgICAgICAgICBkZWVwTWVyZ2UodGZNZXRhLCBtZXRhZGF0YSk7XG4gICAgICAgICAgcmVzID0gW3JlcywgaGNsXS5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcuZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHsgaGNsLCBtZXRhZGF0YSB9ID0gcmVuZGVyRGF0YXNvdXJjZShmcmFnLmRhdGEpO1xuICAgICAgICAgIGRlZXBNZXJnZSh0Zk1ldGEsIG1ldGFkYXRhKTtcbiAgICAgICAgICByZXMgPSBbcmVzLCBoY2xdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICBjb25zdCB7IGhjbCwgbWV0YWRhdGEgfSA9IHJlbmRlckVwaGVtZXJhbChmcmFnLmVwaGVtZXJhbCk7XG4gICAgICAgICAgZGVlcE1lcmdlKHRmTWV0YSwgbWV0YWRhdGEpO1xuICAgICAgICAgIHJlcyA9IFtyZXMsIGhjbF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLnByb3ZpZGVyKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRmLCBmcmFnKTtcbiAgICAgICAgICByZXMgPSBbcmVzLCByZW5kZXJQcm92aWRlcihmcmFnLnByb3ZpZGVyKV0uam9pbihcIlxcblxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLnRlcnJhZm9ybSkge1xuICAgICAgICAgIGRlZXBNZXJnZSh0ZiwgZnJhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy5tb2R1bGUpIHtcbiAgICAgICAgICBjb25zdCB7IGhjbCwgbWV0YWRhdGEgfSA9IHJlbmRlck1vZHVsZShmcmFnLm1vZHVsZSk7XG4gICAgICAgICAgZGVlcE1lcmdlKHRmTWV0YSwgbWV0YWRhdGEpO1xuICAgICAgICAgIHJlcyA9IFtyZXMsIGhjbF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLm91dHB1dCkge1xuICAgICAgICAgIHJlcyA9IFtyZXMsIHJlbmRlck91dHB1dChmcmFnLm91dHB1dCldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy5tb3ZlZCkge1xuICAgICAgICAgIHJlcyA9IFtyZXMsIHJlbmRlck1vdmVkKGZyYWcubW92ZWQpXS5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcuaW1wb3J0KSB7XG4gICAgICAgICAgcmVzID0gW3JlcywgcmVuZGVySW1wb3J0KGZyYWcuaW1wb3J0KV0uam9pbihcIlxcblxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLmxvY2Fscykge1xuICAgICAgICAgIGRlZXBNZXJnZShsb2NhbHMsIGZyYWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcudmFyaWFibGUpIHtcbiAgICAgICAgICByZXMgPSBbcmVzLCByZW5kZXJWYXJpYWJsZShmcmFnLnZhcmlhYmxlKV0uam9pbihcIlxcblxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZnJhZykgPT4gZnJhZyAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGRlZXBNZXJnZSh0ZiwgdGhpcy5yYXdPdmVycmlkZXMpO1xuICAgIGNvbnN0IHRlcnJhZm9ybUJsb2NrID0gKHRmIGFzIGFueSk/LnRlcnJhZm9ybTtcblxuICAgIGxldCB0ZXJyYWZvcm1CbG9ja0hjbCA9IFwiXCI7XG4gICAgaWYgKHRlcnJhZm9ybUJsb2NrKSB7XG4gICAgICB0ZXJyYWZvcm1CbG9ja0hjbCA9IHJlbmRlclRlcnJhZm9ybSh0ZXJyYWZvcm1CbG9jayk7XG4gICAgICBkZWVwTWVyZ2UodGZNZXRhLCB7IHRlcnJhZm9ybTogY2xlYW5Gb3JNZXRhZGF0YSh0ZXJyYWZvcm1CbG9jaykgfSk7XG4gICAgfVxuXG4gICAgbGV0IGxvY2Fsc0hjbCA9IFwiXCI7XG4gICAgaWYgKGxvY2Fscykge1xuICAgICAgbG9jYWxzSGNsID0gcmVuZGVyTG9jYWxzKGxvY2Fscy5sb2NhbHMpO1xuXG4gICAgICBpZiAobG9jYWxzSGNsKSB7XG4gICAgICAgIC8vIEhhY2t5IHdheSB0byBhZGQgYSBuZXdsaW5lIGJldHdlZW4gdGhlIHRlcnJhZm9ybSBibG9jayBhbmQgdGhlIGxvY2FscyBibG9ja1xuICAgICAgICBsb2NhbHNIY2wgPSBcIlxcblxcblwiICsgbG9jYWxzSGNsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoY2w6IHJlc29sdmUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIFt0ZXJyYWZvcm1CbG9ja0hjbCwgbG9jYWxzSGNsLCAuLi5oY2xGcmFnbWVudHNdLmpvaW4oXCJcIiksXG4gICAgICApLFxuICAgICAgbWV0YWRhdGE6IHJlc29sdmUodGhpcywgdGZNZXRhKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHRvVGVycmFmb3JtKCk6IGFueSB7XG4gICAgY29uc3QgdGYgPSB7fTtcblxuICAgIGNvbnN0IG1ldGFkYXRhOiBUZXJyYWZvcm1TdGFja01ldGFkYXRhID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5jZGt0ZlZlcnNpb24sXG4gICAgICBzdGFja05hbWU6IHRoaXMubm9kZS5pZCxcbiAgICAgIGJhY2tlbmQ6IFwibG9jYWxcIiwgLy8gb3ZlcndyaXR0ZW4gYnkgYmFja2VuZCBpbXBsZW1lbnRhdGlvbnMgaWYgdXNlZFxuICAgICAgY2xvdWQ6IHVuZGVmaW5lZCwgLy8gb3ZlcndyaXR0ZW4gYnkgY2xvdWQgYW5kIHJlbW90ZSBiYWNrZW5kIGltcGxlbWVudGF0aW9uc1xuICAgICAgLi4uKE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKS5sZW5ndGggPiAwXG4gICAgICAgID8geyBvdmVycmlkZXM6IHsgc3RhY2s6IE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKSB9IH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGVycmFmb3JtRWxlbWVudHModGhpcyk7XG5cbiAgICBjb25zdCBtZXRhZGF0YXMgPSBlbGVtZW50cy5tYXAoKGUpID0+IHJlc29sdmUodGhpcywgZS50b01ldGFkYXRhKCkpKTtcbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YWRhdGFzKSB7XG4gICAgICBkZWVwTWVyZ2UobWV0YWRhdGEsIG1ldGEpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dElkTWFwID0gZWxlbWVudHMucmVkdWNlKChjYXJyeSwgaXRlbSkgPT4ge1xuICAgICAgaWYgKCFUZXJyYWZvcm1PdXRwdXQuaXNUZXJyYWZvcm1PdXRwdXQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UoXG4gICAgICAgIGNhcnJ5LFxuICAgICAgICBpdGVtLm5vZGUucGF0aC5zcGxpdChcIi9cIikucmVkdWNlUmlnaHQoKGlubmVyQ2FycnksIHBhcnQpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaW5uZXJDYXJyeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBbcGFydF06IGl0ZW0uZnJpZW5kbHlVbmlxdWVJZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBbcGFydF06IGlubmVyQ2FycnkgfTtcbiAgICAgICAgfSwge30pLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgIH0sIHt9KTtcblxuICAgICh0ZiBhcyBhbnkpW1wiLy9cIl0gPSB7IG1ldGFkYXRhLCBvdXRwdXRzIH07XG5cbiAgICBjb25zdCBmcmFnbWVudHMgPSBlbGVtZW50cy5tYXAoKGUpID0+IHJlc29sdmUodGhpcywgZS50b1RlcnJhZm9ybSgpKSk7XG4gICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBmcmFnbWVudHMpIHtcbiAgICAgIGRlZXBNZXJnZSh0ZiwgZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGRlZXBNZXJnZSh0ZiwgdGhpcy5yYXdPdmVycmlkZXMpO1xuXG4gICAgcmV0dXJuIHJlc29sdmUodGhpcywgdGYpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT3V0Z29pbmdDcm9zc1N0YWNrUmVmZXJlbmNlKGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNyb3NzU3RhY2tPdXRwdXRzW2lkZW50aWZpZXJdKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcm9zc1N0YWNrT3V0cHV0c1tpZGVudGlmaWVyXTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVGVycmFmb3JtT3V0cHV0KFxuICAgICAgdGhpcyxcbiAgICAgIGBjcm9zcy1zdGFjay1vdXRwdXQtJHtpZGVudGlmaWVyfWAsXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiByZWYoaWRlbnRpZmllciwgdGhpcyksXG4gICAgICAgIHNlbnNpdGl2ZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuY3Jvc3NTdGFja091dHB1dHNbaWRlbnRpZmllcl0gPSBvdXRwdXQ7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlckluY29taW5nQ3Jvc3NTdGFja1JlZmVyZW5jZShmcm9tU3RhY2s6IFRlcnJhZm9ybVN0YWNrKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NTdGFja0RhdGFTb3VyY2VzW1N0cmluZyhmcm9tU3RhY2spXSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3Jvc3NTdGFja0RhdGFTb3VyY2VzW1N0cmluZyhmcm9tU3RhY2spXTtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luQmFja2VuZCA9IGZyb21TdGFjay5lbnN1cmVCYWNrZW5kRXhpc3RzKCk7XG4gICAgY29uc3Qgb3JpZ2luUGF0aCA9IGZyb21TdGFjay5ub2RlLnBhdGg7XG5cbiAgICBjb25zdCByZW1vdGVTdGF0ZSA9IG9yaWdpbkJhY2tlbmQuZ2V0UmVtb3RlU3RhdGVEYXRhU291cmNlKFxuICAgICAgdGhpcyxcbiAgICAgIGBjcm9zcy1zdGFjay1yZWZlcmVuY2UtaW5wdXQtJHtvcmlnaW5QYXRofWAsXG4gICAgICBvcmlnaW5QYXRoLFxuICAgICk7XG5cbiAgICB0aGlzLmNyb3NzU3RhY2tEYXRhU291cmNlc1tvcmlnaW5QYXRoXSA9IHJlbW90ZVN0YXRlO1xuICAgIHJldHVybiByZW1vdGVTdGF0ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGhlcmUgZm9yIGxvb3BzIGluIHRoZSBkZXBlbmRlbmN5IGdyYXBoXG4gIHB1YmxpYyBkZXBlbmRzT24oc3RhY2s6IFRlcnJhZm9ybVN0YWNrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKHN0YWNrKSB8fFxuICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuc29tZSgoZCkgPT4gZC5kZXBlbmRzT24oc3RhY2spKVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWRkRGVwZW5kZW5jeShkZXBlbmRlbmN5OiBUZXJyYWZvcm1TdGFjaykge1xuICAgIGlmIChkZXBlbmRlbmN5LmRlcGVuZHNPbih0aGlzKSkge1xuICAgICAgdGhyb3cgc3RhY2tIYXNDaXJjdWxhckRlcGVuZGVuY3kodGhpcywgZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwZW5kZW5jaWVzLmluY2x1ZGVzKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kZXBlbmRlbmNpZXMucHVzaChkZXBlbmRlbmN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYWxsIHZhbGlkYXRpb25zIG9uIHRoZSBzdGFjay5cbiAgICovXG4gIHB1YmxpYyBydW5BbGxWYWxpZGF0aW9ucygpIHtcbiAgICBjb25zdCBlcnJvcnM6IHsgbWVzc2FnZTogc3RyaW5nOyBzb3VyY2U6IElDb25zdHJ1Y3QgfVtdID0gdGhpcy5ub2RlXG4gICAgICAuZmluZEFsbCgpXG4gICAgICAubWFwKChub2RlKSA9PlxuICAgICAgICBub2RlLm5vZGUudmFsaWRhdGUoKS5tYXAoKGVycm9yKSA9PiAoeyBtZXNzYWdlOiBlcnJvciwgc291cmNlOiBub2RlIH0pKSxcbiAgICAgIClcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IFsuLi5wcmV2LCAuLi5jdXJyXSwgW10pO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXJyb3JMaXN0ID0gZXJyb3JzXG4gICAgICAgIC5tYXAoKGUpID0+IGBbJHtlLnNvdXJjZS5ub2RlLnBhdGh9XSAke2UubWVzc2FnZX1gKVxuICAgICAgICAuam9pbihcIlxcbiAgXCIpO1xuICAgICAgdGhyb3cgc3RhY2tWYWxpZGF0aW9uRmFpbHVyZShlcnJvckxpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBoYXNSZXNvdXJjZU1vdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRlcnJhZm9ybUVsZW1lbnRzKHRoaXMpLnNvbWUoKGUpID0+IHtcbiAgICAgIGlmIChUZXJyYWZvcm1SZXNvdXJjZS5pc1RlcnJhZm9ybVJlc291cmNlKGUpICYmIGUuaGFzUmVzb3VyY2VNb3ZlKCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIHRlcnJhZm9ybUVsZW1lbnRzKFxuICBub2RlOiBJQ29uc3RydWN0LFxuICBpbnRvOiBUZXJyYWZvcm1FbGVtZW50W10gPSBbXSxcbik6IFRlcnJhZm9ybUVsZW1lbnRbXSB7XG4gIGlmIChUZXJyYWZvcm1FbGVtZW50LmlzVGVycmFmb3JtRWxlbWVudChub2RlKSkge1xuICAgIGludG8ucHVzaChub2RlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5ub2RlLmNoaWxkcmVuKSB7XG4gICAgLy8gRG9uJ3QgcmVjdXJzZSBpbnRvIGEgc3Vic3RhY2tcbiAgICBpZiAoVGVycmFmb3JtU3RhY2suaXNTdGFjayhjaGlsZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRlcnJhZm9ybUVsZW1lbnRzKGNoaWxkLCBpbnRvKTtcbiAgfVxuXG4gIHJldHVybiBpbnRvO1xufVxuIl19
475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVycmFmb3JtLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlcnJhZm9ybS1zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQywyQ0FBeUQ7QUFDekQsdUNBQW9DO0FBRXBDLDJEQUF1RDtBQUN2RCxpQ0FBbUM7QUFDbkMsNkRBQXlEO0FBQ3pELDREQUF3RDtBQUN4RCxpREFBcUM7QUFDckMseURBQXFEO0FBRXJELDZDQUFnRDtBQUVoRCwwREFBNEQ7QUFFNUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBQ3hELCtDQUl1QjtBQUN2QiwrQkFBNEI7QUFDNUIsMkRBQXVEO0FBQ3ZELDZFQUF3RTtBQUN4RSw2REFBeUQ7QUFDekQseUNBYXNCO0FBQ3RCLHFDQU1rQjtBQWNsQiwrQ0FBK0M7QUFDL0MsU0FBUyx3QkFBd0IsQ0FBQyxHQUFXO0lBQzNDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDbkQsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFBLG9DQUEyQixFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsMkJBQTJCLENBQUMsR0FBVztJQUM5QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUEsa0NBQXlCLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztBQUNILENBQUM7QUFFRCwrQ0FBK0M7QUFD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LENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLHNDQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUNwRSxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFsaEJILHdDQW1oQkM7QUFFRCwrQ0FBK0M7QUFDL0MsU0FBUyxpQkFBaUIsQ0FDeEIsSUFBZ0IsRUFDaEIsT0FBMkIsRUFBRTtJQUU3QixJQUFJLG9DQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLGdDQUFnQztRQUNoQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxTQUFTO1FBQ1gsQ0FBQztRQUVELGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCwgTm9kZSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcIi4vX3Rva2Vuc1wiO1xuXG5pbXBvcnQgeyBUZXJyYWZvcm1FbGVtZW50IH0gZnJvbSBcIi4vdGVycmFmb3JtLWVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gXCIuL3V0aWxcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVByb3ZpZGVyIH0gZnJvbSBcIi4vdGVycmFmb3JtLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBMb2NhbEJhY2tlbmQgfSBmcm9tIFwiLi9iYWNrZW5kcy9sb2NhbC1iYWNrZW5kXCI7XG5pbXBvcnQgeyByZWYgfSBmcm9tIFwiLi90ZkV4cHJlc3Npb25cIjtcbmltcG9ydCB7IFRlcnJhZm9ybU91dHB1dCB9IGZyb20gXCIuL3RlcnJhZm9ybS1vdXRwdXRcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVJlbW90ZVN0YXRlIH0gZnJvbSBcIi4vdGVycmFmb3JtLXJlbW90ZS1zdGF0ZVwiO1xuaW1wb3J0IHsgbWFrZVVuaXF1ZUlkIH0gZnJvbSBcIi4vcHJpdmF0ZS91bmlxdWVcIjtcbmltcG9ydCB7IElTdGFja1N5bnRoZXNpemVyIH0gZnJvbSBcIi4vc3ludGhlc2l6ZS90eXBlc1wiO1xuaW1wb3J0IHsgU3RhY2tTeW50aGVzaXplciB9IGZyb20gXCIuL3N5bnRoZXNpemUvc3ludGhlc2l6ZXJcIjtcblxuY29uc3QgU1RBQ0tfU1lNQk9MID0gU3ltYm9sLmZvcihcImNka3RmL1RlcnJhZm9ybVN0YWNrXCIpO1xuaW1wb3J0IHtcbiAgVmFsaWRhdGVGdW5jdGlvblZlcnNpb25TdXBwb3J0LFxuICBWYWxpZGF0ZVByb3ZpZGVyRnVuY3Rpb25UYXJnZXRTdXBwb3J0LFxuICBWYWxpZGF0ZVByb3ZpZGVyUHJlc2VuY2UsXG59IGZyb20gXCIuL3ZhbGlkYXRpb25zXCI7XG5pbXBvcnQgeyBBcHAgfSBmcm9tIFwiLi9hcHBcIjtcbmltcG9ydCB7IFRlcnJhZm9ybUJhY2tlbmQgfSBmcm9tIFwiLi90ZXJyYWZvcm0tYmFja2VuZFwiO1xuaW1wb3J0IHsgVGVycmFmb3JtUmVzb3VyY2VUYXJnZXRzIH0gZnJvbSBcIi4vdGVycmFmb3JtLXJlc291cmNlLXRhcmdldHNcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVJlc291cmNlIH0gZnJvbSBcIi4vdGVycmFmb3JtLXJlc291cmNlXCI7XG5pbXBvcnQge1xuICByZW5kZXJEYXRhc291cmNlLFxuICByZW5kZXJFcGhlbWVyYWwsXG4gIHJlbmRlck1vZHVsZSxcbiAgcmVuZGVyTW92ZWQsXG4gIHJlbmRlck91dHB1dCxcbiAgcmVuZGVyUHJvdmlkZXIsXG4gIHJlbmRlclJlc291cmNlLFxuICByZW5kZXJUZXJyYWZvcm0sXG4gIHJlbmRlckxvY2FscyxcbiAgcmVuZGVyVmFyaWFibGUsXG4gIHJlbmRlckltcG9ydCxcbiAgY2xlYW5Gb3JNZXRhZGF0YSxcbn0gZnJvbSBcIi4vaGNsL3JlbmRlclwiO1xuaW1wb3J0IHtcbiAgbm9TdGFja0ZvckNvbnN0cnVjdCxcbiAgc3RhY2tDb250YWluc0Rpc2FsbG93ZWRDaGFyLFxuICBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSxcbiAgc3RhY2tJZENvbnRhaW5zV2hpdGVzcGFjZSxcbiAgc3RhY2tWYWxpZGF0aW9uRmFpbHVyZSxcbn0gZnJvbSBcIi4vZXJyb3JzXCI7XG5cbnR5cGUgU3RhY2tJZGVudGlmaWVyID0gc3RyaW5nO1xudHlwZSBPdXRwdXRJZE1hcCA9XG4gIHwgeyBbY29uc3RydWN0SWQ6IHN0cmluZ106IHN0cmluZyB9XG4gIHwgeyBbc3RhY2tPckNvbnN0cnVjdElkOiBzdHJpbmddOiBPdXRwdXRJZE1hcCB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlcnJhZm9ybVN0YWNrTWV0YWRhdGEge1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuICByZWFkb25seSBiYWNrZW5kOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsb3VkPzogc3RyaW5nO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gdGhyb3dJZklkSXNHbG9iQ2hhcmFjdGVyKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gIFtcIipcIiwgXCI/XCIsIFwiW1wiLCBcIl1cIiwgXCJ7XCIsIFwifVwiLCBcIiFcIl0uZm9yRWFjaCgoY2hhcikgPT4ge1xuICAgIGlmIChzdHIuaW5jbHVkZXMoY2hhcikpIHtcbiAgICAgIHRocm93IHN0YWNrQ29udGFpbnNEaXNhbGxvd2VkQ2hhcihzdHIsIGNoYXIpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiB0aHJvd0lmSWRDb250YWluc1doaXRlc3BhY2Uoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKC9cXHMvLnRlc3Qoc3RyKSkge1xuICAgIHRocm93IHN0YWNrSWRDb250YWluc1doaXRlc3BhY2Uoc3RyKTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGNsYXNzIFRlcnJhZm9ybVN0YWNrIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdPdmVycmlkZXM6IGFueSA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IGNka3RmVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIGNyb3NzU3RhY2tPdXRwdXRzOiBSZWNvcmQ8U3RhY2tJZGVudGlmaWVyLCBUZXJyYWZvcm1PdXRwdXQ+ID0ge307XG4gIHByaXZhdGUgY3Jvc3NTdGFja0RhdGFTb3VyY2VzOiBSZWNvcmQ8U3RhY2tJZGVudGlmaWVyLCBUZXJyYWZvcm1SZW1vdGVTdGF0ZT4gPVxuICAgIHt9O1xuICBwdWJsaWMgc3ludGhlc2l6ZXI6IElTdGFja1N5bnRoZXNpemVyO1xuICBwdWJsaWMgZGVwZW5kZW5jaWVzOiBUZXJyYWZvcm1TdGFja1tdID0gW107XG4gIHB1YmxpYyBtb3ZlVGFyZ2V0czogVGVycmFmb3JtUmVzb3VyY2VUYXJnZXRzID0gbmV3IFRlcnJhZm9ybVJlc291cmNlVGFyZ2V0cygpO1xuXG4gIC8qKlxuICAgKiBUZXJyYWZvcm0gZnVuY3Rpb25zIChgRm4uKmApIGFuZCBwcm92aWRlci1kZWZpbmVkXG4gICAqIChgcHJvdmlkZXI6OjxuYW1lPjo6PGZ1bmN0aW9uPmApIGZ1bmN0aW9ucyBhY3R1YWxseSByZW5kZXJlZCB3aGlsZVxuICAgKiByZXNvbHZpbmcgVEhJUyBzdGFjaydzIG93biBlbGVtZW50cyBkdXJpbmcgdGhlIGN1cnJlbnQgc3ludGhlc2lzIHBhc3MuXG4gICAqXG4gICAqIFVzYWdlIGlzIHN0YWNrLW93bmVkIHJhdGhlciB0aGFuIEFwcC1vd25lZDogYFZhbGlkYXRlRnVuY3Rpb25WZXJzaW9uU3VwcG9ydGBcbiAgICogLyBgVmFsaWRhdGVQcm92aWRlckZ1bmN0aW9uVGFyZ2V0U3VwcG9ydGAgYXJlIHJlZ2lzdGVyZWQgaW4gdGhpc1xuICAgKiBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzdGFjayBpdHNlbGYgYXMgc2NvcGUsIGFuZCBgcmVzb2x2ZVRhcmdldFZlcnNpb25zYFxuICAgKiB3YWxrcyBjb250ZXh0IHVwIEZST00gdGhhdCBzY29wZSAtIGkuZS4gZnJvbSB0aGUgc3RhY2ssIG5vdCB0aGUgQXBwIHJvb3QuXG4gICAqIFNpYmxpbmcgc3RhY2tzIGNhbiB0aGVyZWZvcmUgZGVjbGFyZSBkaWZmZXJlbnQgYHRhcmdldFZlcnNpb25zYCB2aWFcbiAgICogc3RhY2stbGV2ZWwgYG5vZGUuc2V0Q29udGV4dGAsIGFuZCBhIHBlci1BcHAtcm9vdCB1c2FnZSByZWNvcmQgd291bGQgbGV0XG4gICAqIG9uZSBzdGFjaydzIHVzYWdlIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IGEgRElGRkVSRU5UIHN0YWNrJ3MgdGFyZ2V0c1xuICAgKiAoZmFsc2UgcG9zaXRpdmVzL25lZ2F0aXZlcyBkZXBlbmRpbmcgb24gd2hpY2ggc2libGluZyBoYXBwZW5zIHRvIGJlXG4gICAqIHN0cmljdGVyKS4gS2V5aW5nIHVzYWdlIGJ5IHRoZSBzdGFjayB0aGF0IGFjdHVhbGx5IHJlbmRlcmVkIGl0IG1ha2VzXG4gICAqIGVhY2ggc3RhY2sncyB2YWxpZGF0aW9uIHNlZSBvbmx5IGl0cyBvd24gdXNhZ2UsIGNoZWNrZWQgYWdhaW5zdCBpdHMgb3duXG4gICAqIHRhcmdldHMuXG4gICAqXG4gICAqIFJlcHJlc2VudHMgdGhlIENVUlJFTlQgc3ludGhlc2lzIHBhc3Mgb25seSwgbm90IHRoZSBzdGFjaydzIHdob2xlXG4gICAqIGxpZmV0aW1lOiBgX3J1blByZXBhcmluZ1Jlc29sdmVgIGNsZWFycyBib3RoIHNldHMgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5XG4gICAqIHBhc3MsIGJlZm9yZSByZS1kaXNjb3ZlcmluZyB3aGF0IHRoYXQgcGFzcyBhY3R1YWxseSByZW5kZXJzIChzZWVcbiAgICogYF9yZWNvcmRGdW5jdGlvblVzYWdlYC9gX3JlY29yZFByb3ZpZGVyRnVuY3Rpb25Vc2FnZWAsIGNhbGxlZCBmcm9tXG4gICAqIGBGdW5jdGlvbkNhbGwucmVzb2x2ZSgpYCBpbiBgdGZFeHByZXNzaW9uLnRzYCkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VkRnVuY3Rpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFNlZSBgX3VzZWRGdW5jdGlvbnNgIC0gc2FtZSBwZXItc3RhY2ssIHBlci1wYXNzIHNlbWFudGljcywgZm9yXG4gICAqIHByb3ZpZGVyLWRlZmluZWQgKGBwcm92aWRlcjo6PG5hbWU+Ojo8ZnVuY3Rpb24+YCkgZnVuY3Rpb24gY2FsbHMuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VkUHJvdmlkZXJGdW5jdGlvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRocm93SWZJZElzR2xvYkNoYXJhY3RlcihpZCk7XG4gICAgdGhyb3dJZklkQ29udGFpbnNXaGl0ZXNwYWNlKGlkKTtcbiAgICB0aGlzLmNka3RmVmVyc2lvbiA9IHRoaXMubm9kZS50cnlHZXRDb250ZXh0KFwiY2RrdGZWZXJzaW9uXCIpO1xuICAgIHRoaXMuc3ludGhlc2l6ZXIgPSBuZXcgU3RhY2tTeW50aGVzaXplcihcbiAgICAgIHRoaXMsXG4gICAgICBwcm9jZXNzLmVudi5DREtURl9DT05USU5VRV9TWU5USF9PTl9FUlJPUl9BTk5PVEFUSU9OUyAhPT0gdW5kZWZpbmVkLFxuICAgICAgcHJvY2Vzcy5lbnYuU1lOVEhfSENMX09VVFBVVCA9PT0gXCJ0cnVlXCIgfHxcbiAgICAgICAgcHJvY2Vzcy5lbnYuU1lOVEhfSENMX09VVFBVVCA9PT0gXCIxXCIsXG4gICAgKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgU1RBQ0tfU1lNQk9MLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKG5ldyBWYWxpZGF0ZVByb3ZpZGVyUHJlc2VuY2UodGhpcykpO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKG5ldyBWYWxpZGF0ZUZ1bmN0aW9uVmVyc2lvblN1cHBvcnQodGhpcykpO1xuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKG5ldyBWYWxpZGF0ZVByb3ZpZGVyRnVuY3Rpb25UYXJnZXRTdXBwb3J0KHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNTdGFjayh4OiBhbnkpOiB4IGlzIFRlcnJhZm9ybVN0YWNrIHtcbiAgICByZXR1cm4geCAhPT0gbnVsbCAmJiB0eXBlb2YgeCA9PT0gXCJvYmplY3RcIiAmJiBTVEFDS19TWU1CT0wgaW4geDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoYXQgYGZ1bmN0aW9uTmFtZWAgKGEgYEZuLipgIFRlcnJhZm9ybSBmdW5jdGlvbikgd2FzIHJlbmRlcmVkXG4gICAqIHdoaWxlIHJlc29sdmluZyBvbmUgb2YgdGhpcyBzdGFjaydzIGVsZW1lbnRzIGR1cmluZyB0aGUgY3VycmVudFxuICAgKiBzeW50aGVzaXMgcGFzcy4gQ2FsbGVkIGZyb20gYEZ1bmN0aW9uQ2FsbC5yZXNvbHZlKClgIGluIGB0ZkV4cHJlc3Npb24udHNgXG4gICAqIC0gc2VlIGBfdXNlZEZ1bmN0aW9uc2AgZm9yIHdoeSB1c2FnZSBpcyBzdGFjay1vd25lZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlY29yZEZ1bmN0aW9uVXNhZ2UoZnVuY3Rpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl91c2VkRnVuY3Rpb25zLmFkZChmdW5jdGlvbk5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgdGhhdCBgZnVsbE5hbWVgIChhIGBwcm92aWRlcjo6PG5hbWU+Ojo8ZnVuY3Rpb24+YCBjYWxsKSB3YXNcbiAgICogcmVuZGVyZWQgd2hpbGUgcmVzb2x2aW5nIG9uZSBvZiB0aGlzIHN0YWNrJ3MgZWxlbWVudHMgZHVyaW5nIHRoZVxuICAgKiBjdXJyZW50IHN5bnRoZXNpcyBwYXNzLiBDYWxsZWQgZnJvbSBgRnVuY3Rpb25DYWxsLnJlc29sdmUoKWAgaW5cbiAgICogYHRmRXhwcmVzc2lvbi50c2AgLSBzZWUgYF91c2VkRnVuY3Rpb25zYCBmb3Igd2h5IHVzYWdlIGlzIHN0YWNrLW93bmVkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcmVjb3JkUHJvdmlkZXJGdW5jdGlvblVzYWdlKGZ1bGxOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl91c2VkUHJvdmlkZXJGdW5jdGlvbnMuYWRkKGZ1bGxOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBgRm4uKmAgVGVycmFmb3JtIGZ1bmN0aW9uIG5hbWVzIHJlbmRlcmVkIHdoaWxlIHJlc29sdmluZ1xuICAgKiB0aGlzIHN0YWNrJ3MgZWxlbWVudHMgZHVyaW5nIHRoZSBjdXJyZW50IHN5bnRoZXNpcyBwYXNzLiBSZWFkIGJ5XG4gICAqIGBWYWxpZGF0ZUZ1bmN0aW9uVmVyc2lvblN1cHBvcnRgLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfZ2V0VXNlZEZ1bmN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fdXNlZEZ1bmN0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYHByb3ZpZGVyOjo8bmFtZT46OjxmdW5jdGlvbj5gIGNhbGxzIHJlbmRlcmVkIHdoaWxlXG4gICAqIHJlc29sdmluZyB0aGlzIHN0YWNrJ3MgZWxlbWVudHMgZHVyaW5nIHRoZSBjdXJyZW50IHN5bnRoZXNpcyBwYXNzLiBSZWFkXG4gICAqIGJ5IGBWYWxpZGF0ZVByb3ZpZGVyRnVuY3Rpb25UYXJnZXRTdXBwb3J0YC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2dldFVzZWRQcm92aWRlckZ1bmN0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fdXNlZFByb3ZpZGVyRnVuY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgb2YoY29uc3RydWN0OiBJQ29uc3RydWN0KTogVGVycmFmb3JtU3RhY2sge1xuICAgIHJldHVybiBfbG9va3VwKGNvbnN0cnVjdCk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICAgIGZ1bmN0aW9uIF9sb29rdXAoYzogSUNvbnN0cnVjdCk6IFRlcnJhZm9ybVN0YWNrIHtcbiAgICAgIGlmIChUZXJyYWZvcm1TdGFjay5pc1N0YWNrKGMpKSB7XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBub2RlID0gYy5ub2RlO1xuXG4gICAgICBpZiAoIW5vZGUuc2NvcGUpIHtcbiAgICAgICAgbGV0IGhpbnQgPSBcIlwiO1xuICAgICAgICBpZiAoY29uc3RydWN0Lm5vZGUuc2NvcGUgPT09IGMgJiYgQXBwLmlzQXBwKGMpKSB7XG4gICAgICAgICAgLy8gdGhlIHNjb3BlIG9mIHRoZSBvcmlnaW5hbGx5IHBhc3NlZCBjb25zdHJ1Y3QgZXF1YWxzIHRoZSBjb25zdHJ1Y3QgY1xuICAgICAgICAgIC8vIHdoaWNoIGhhcyBubyBzY29wZSAoaS5lLiBoYXMgbm8gcGFyZW50IGNvbnN0cnVjdCkgYW5kIGMgaXMgYW4gQXBwXG4gICAgICAgICAgLy8gYW5kIG91ciBjb25zdHJ1Y3QgaXMgYSBCYWNrZW5kXG4gICAgICAgICAgaGludCA9IGAuIFlvdSBzZWVtIHRvIGhhdmUgcGFzc2VkIHlvdXIgcm9vdCBBcHAgYXMgc2NvcGUgdG8gYSBjb25zdHJ1Y3QuIFBhc3MgYSBzdGFjayAoaW5oZXJpdGluZyBmcm9tIFRlcnJhZm9ybVN0YWNrKSBhcyBzY29wZSB0byB5b3VyIGNvbnN0cnVjdCBpbnN0ZWFkLmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBub1N0YWNrRm9yQ29uc3RydWN0KGNvbnN0cnVjdC5ub2RlLnBhdGgsIGhpbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2xvb2t1cChub2RlLnNjb3BlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbGw8VCBleHRlbmRzIElDb25zdHJ1Y3Q+KFxuICAgIHByZWRpY2F0ZTogKG5vZGU6IHVua25vd24pID0+IG5vZGUgaXMgVCxcbiAgKTogVFtdIHtcbiAgICBjb25zdCBpdGVtczogVFtdID0gW107XG5cbiAgICBjb25zdCB2aXNpdCA9IGFzeW5jIChub2RlOiBJQ29uc3RydWN0KSA9PiB7XG4gICAgICBpZiAocHJlZGljYXRlKG5vZGUpKSB7XG4gICAgICAgIGl0ZW1zLnB1c2gobm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIHZpc2l0KGNoaWxkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmlzaXQodGhpcyk7XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZVN0YWNrKCkge1xuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGEgYmFja2VuZCBjb25maWd1cmVkXG4gICAgdGhpcy5lbnN1cmVCYWNrZW5kRXhpc3RzKCk7XG4gICAgdGhpcy5fcnVuUHJlcGFyaW5nUmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlLWRpc2NvdmVyeSBoYWxmIG9mIGBwcmVwYXJlU3RhY2soKWAsIHNwbGl0IG91dCBzbyBlbnRyeVxuICAgKiBwb2ludHMgdGhhdCBtdXN0IE5PVCBpbmplY3QgYSBiYWNrZW5kIChgVGVzdGluZy5zeW50aGAvYHN5bnRoSGNsYCAtXG4gICAqIGRvaW5nIHNvIHdvdWxkIGFkZCBhbiBpbXBsaWNpdCBsb2NhbCBiYWNrZW5kIHRvIHNuYXBzaG90cyB0aGF0IG5ldmVyXG4gICAqIGFza2VkIGZvciBvbmUpIGNhbiBzdGlsbCBydW4gdGhlIHBhcnQgdGhhdCBkaXNjb3ZlcnMgY3VycmVudC1wYXNzXG4gICAqIHByb3ZpZGVyLWZlYXR1cmUgYW5kIFRlcnJhZm9ybS1mdW5jdGlvbiB1c2FnZS5cbiAgICpcbiAgICogQ2xlYXJzIHRoaXMgc3RhY2sncyBvd24gYF91c2VkRnVuY3Rpb25zYC9gX3VzZWRQcm92aWRlckZ1bmN0aW9uc2Agc2V0c1xuICAgKiBmaXJzdCAtIHRoaXMgc3RhY2sncyBwZXItcGFzcyBlcG9jaCBmb3IgVGVycmFmb3JtLWZ1bmN0aW9uIHVzYWdlLlxuICAgKiBCZWNhdXNlIHRoZSByZXNldCBsaXZlcyBoZXJlLCBvbmNlIHBlciBzdGFjaywgZXZlcnkgdmFsaWRhdGlvbi1lbmFibGVkXG4gICAqIGVudHJ5IHBvaW50IChgQXBwLnN5bnRoYCwgYFRlc3Rpbmcuc3ludGhgL2BzeW50aEhjbGAsXG4gICAqIGBTdGFja1N5bnRoZXNpemVyLnN5bnRoZXNpemVgKSBnZXRzIGl0IGZvciBmcmVlIGp1c3QgYnkgY2FsbGluZ1xuICAgKiBgcHJlcGFyZVN0YWNrKClgL2BfcnVuUHJlcGFyaW5nUmVzb2x2ZSgpYCAtIHNlZSBgX3VzZWRGdW5jdGlvbnNgIGZvciB3aHlcbiAgICogdXNhZ2UgaXMga2V5ZWQgYnkgc3RhY2suXG4gICAqXG4gICAqIFRoZW4gZGVhY3RpdmF0ZXMgZXZlcnkgZWxlbWVudCdzIHN0YWxlIGByZXNvbHZlLWRpc2NvdmVyZWRgXG4gICAqIHByb3ZpZGVyLWZlYXR1cmUgcmVnaXN0cmF0aW9ucyAoc2VlXG4gICAqIGBUZXJyYWZvcm1FbGVtZW50Ll9yZXNldFJlc29sdmVEaXNjb3ZlcmVkUHJvdmlkZXJGZWF0dXJlVXNhZ2VgKSAtIHNvXG4gICAqIHVzYWdlIGZyb20gYW4gZWFybGllciBzeW50aGVzaXMgcGFzcyBvdmVyIHRoaXMgc2FtZSBzdGFjayBjYW4ndCBzdXJ2aXZlXG4gICAqIGludG8gdGhpcyBvbmUgLSB0aGVuIHJlc29sdmVzIGV2ZXJ5IGVsZW1lbnQncyBgdG9UZXJyYWZvcm0oKWAsIHdoaWNoIGlzXG4gICAqIHdoYXQgcmUtZGlzY292ZXJzIHRoaXMgcGFzcydzIGFjdHVhbCB1c2FnZSAoYm90aCBwcm92aWRlci1mZWF0dXJlIHVzYWdlXG4gICAqIHZpYSBgbWFya1dyaXRlT25seUF0dHJpYnV0ZWAsIGFuZCBUZXJyYWZvcm0tZnVuY3Rpb24gdXNhZ2UgdmlhXG4gICAqIGBGdW5jdGlvbkNhbGwucmVzb2x2ZSgpYCwgd2hpY2ggcmVjb3JkcyBpbnRvIGBfcmVjb3JkRnVuY3Rpb25Vc2FnZWAvXG4gICAqIGBfcmVjb3JkUHJvdmlkZXJGdW5jdGlvblVzYWdlYCBhYm92ZSkuIEEgcHJlcGFyaW5nIHJlc29sdmUgcnVuIG1pZ2h0XG4gICAqIGFsc28gYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHN0YWNrLCBlLmcuIGZvciBjcm9zcyBzdGFjayByZWZlcmVuY2VzLlxuICAgKiBDcm9zcy1zdGFjayByZWZlcmVuY2VzIHN0YXkgc291bmQgZXZlbiB0aG91Z2ggdGhpcyBtZXRob2Qgc2tpcHMgVEhJU1xuICAgKiBzdGFjaydzIGBlbnN1cmVCYWNrZW5kRXhpc3RzKClgOiByZXNvbHZpbmcgb25lIG1hdGVyaWFsaXplcyB0aGUgT1JJR0lOXG4gICAqIHN0YWNrJ3MgYmFja2VuZCBvbiBkZW1hbmQgKGByZWdpc3RlckluY29taW5nQ3Jvc3NTdGFja1JlZmVyZW5jZWAgY2FsbHNcbiAgICogYGZyb21TdGFjay5lbnN1cmVCYWNrZW5kRXhpc3RzKClgIGl0c2VsZiksIHNvIG9ubHkgdGhlIHN5bnRoZXNpemluZ1xuICAgKiBzdGFjaydzIG93biBiYWNrZW5kIGJsb2NrIGlzIGxlZnQgdW5pbmplY3RlZCAtIHdoaWNoIGlzIGV4YWN0bHkgd2hhdFxuICAgKiB0aGUgYFRlc3Rpbmcuc3ludGhgL2BzeW50aEhjbGAgY2FsbGVycyB3YW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfcnVuUHJlcGFyaW5nUmVzb2x2ZSgpIHtcbiAgICB0aGlzLl91c2VkRnVuY3Rpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5fdXNlZFByb3ZpZGVyRnVuY3Rpb25zLmNsZWFyKCk7XG4gICAgdGVycmFmb3JtRWxlbWVudHModGhpcykuZm9yRWFjaCgoZSkgPT5cbiAgICAgIGUuX3Jlc2V0UmVzb2x2ZURpc2NvdmVyZWRQcm92aWRlckZlYXR1cmVVc2FnZSgpLFxuICAgICk7XG4gICAgdGVycmFmb3JtRWxlbWVudHModGhpcykuZm9yRWFjaCgoZSkgPT5cbiAgICAgIHJlc29sdmUodGhpcywgZS50b1RlcnJhZm9ybSgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFkZE92ZXJyaWRlKHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGN1cnI6IGFueSA9IHRoaXMucmF3T3ZlcnJpZGVzO1xuXG4gICAgd2hpbGUgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IHBhcnRzLnNoaWZ0KCkhO1xuXG4gICAgICAvLyBpZiB3ZSBjYW4ndCByZWN1cnNlIGZ1cnRoZXIgb3IgdGhlIHByZXZpb3VzIHZhbHVlIGlzIG5vdCBhblxuICAgICAgLy8gb2JqZWN0IG92ZXJ3cml0ZSBpdCB3aXRoIGFuIG9iamVjdC5cbiAgICAgIGNvbnN0IGlzT2JqZWN0ID1cbiAgICAgICAgY3VycltrZXldICE9IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGN1cnJba2V5XSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheShjdXJyW2tleV0pO1xuICAgICAgaWYgKCFpc09iamVjdCkge1xuICAgICAgICBjdXJyW2tleV0gPSB7fTtcbiAgICAgIH1cblxuICAgICAgY3VyciA9IGN1cnJba2V5XTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0S2V5ID0gcGFydHMuc2hpZnQoKSE7XG4gICAgY3VycltsYXN0S2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxJZCh0ZkVsZW1lbnQ6IFRlcnJhZm9ybUVsZW1lbnQgfCBOb2RlKTogc3RyaW5nIHtcbiAgICAvLyB3cmFwIHRoZSBhbGxvY2F0aW9uIGZvciBmdXR1cmUgcmVuYW1pbmcgc3VwcG9ydFxuICAgIHJldHVybiB0aGlzLmFsbG9jYXRlTG9naWNhbElkKHRmRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbmFtaW5nIHNjaGVtZSB1c2VkIHRvIGFsbG9jYXRlIGxvZ2ljYWwgSURzLiBCeSBkZWZhdWx0LCB1c2VzXG4gICAqIHRoZSBgSGFzaGVkQWRkcmVzc2luZ1NjaGVtZWAgYnV0IHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZVxuICAgKiB0aGlzIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAcGFyYW0gdGZFbGVtZW50IFRoZSBlbGVtZW50IGZvciB3aGljaCB0aGUgbG9naWNhbCBJRCBpcyBhbGxvY2F0ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWxsb2NhdGVMb2dpY2FsSWQodGZFbGVtZW50OiBUZXJyYWZvcm1FbGVtZW50IHwgTm9kZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9kZSA9IFRlcnJhZm9ybUVsZW1lbnQuaXNUZXJyYWZvcm1FbGVtZW50KHRmRWxlbWVudClcbiAgICAgID8gdGZFbGVtZW50Lm5vZGVcbiAgICAgIDogdGZFbGVtZW50O1xuICAgIGNvbnN0IHN0YWNrID0gVGVycmFmb3JtRWxlbWVudC5pc1RlcnJhZm9ybUVsZW1lbnQodGZFbGVtZW50KVxuICAgICAgPyB0ZkVsZW1lbnQuY2RrdGZTdGFja1xuICAgICAgOiB0aGlzO1xuXG4gICAgY29uc3Qgc3RhY2tJbmRleCA9IG5vZGUuc2NvcGVzLmluZGV4T2Yoc3RhY2spO1xuXG4gICAgY29uc3QgY29tcG9uZW50cyA9IG5vZGUuc2NvcGVzLnNsaWNlKHN0YWNrSW5kZXggKyAxKS5tYXAoKGMpID0+IGMubm9kZS5pZCk7XG4gICAgcmV0dXJuIGNvbXBvbmVudHMubGVuZ3RoID4gMCA/IG1ha2VVbmlxdWVJZChjb21wb25lbnRzKSA6IFwiXCI7XG4gIH1cblxuICBwdWJsaWMgYWxsUHJvdmlkZXJzKCk6IFRlcnJhZm9ybVByb3ZpZGVyW10ge1xuICAgIHJldHVybiB0aGlzLmZpbmRBbGwoVGVycmFmb3JtUHJvdmlkZXIuaXNUZXJyYWZvcm1Qcm92aWRlcik7XG4gIH1cblxuICBwdWJsaWMgZW5zdXJlQmFja2VuZEV4aXN0cygpOiBUZXJyYWZvcm1CYWNrZW5kIHtcbiAgICBjb25zdCBiYWNrZW5kcyA9IHRoaXMuZmluZEFsbChUZXJyYWZvcm1CYWNrZW5kLmlzQmFja2VuZCk7XG4gICAgcmV0dXJuIGJhY2tlbmRzWzBdIHx8IG5ldyBMb2NhbEJhY2tlbmQodGhpcywge30pO1xuICB9XG5cbiAgcHVibGljIHRvSGNsVGVycmFmb3JtKCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBUZXJyYWZvcm1TdGFja01ldGFkYXRhID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5jZGt0ZlZlcnNpb24sXG4gICAgICBzdGFja05hbWU6IHRoaXMubm9kZS5pZCxcbiAgICAgIGJhY2tlbmQ6IFwibG9jYWxcIiwgLy8gb3ZlcndyaXR0ZW4gYnkgYmFja2VuZCBpbXBsZW1lbnRhdGlvbnMgaWYgdXNlZFxuICAgICAgY2xvdWQ6IHVuZGVmaW5lZCwgLy8gb3ZlcndyaXR0ZW4gYnkgY2xvdWQgYW5kIHJlbW90ZSBiYWNrZW5kIGltcGxlbWVudGF0aW9uc1xuICAgICAgLi4uKE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKS5sZW5ndGggPiAwXG4gICAgICAgID8geyBvdmVycmlkZXM6IHsgc3RhY2s6IE9iamVjdC5rZXlzKHRoaXMucmF3T3ZlcnJpZGVzKSB9IH1cbiAgICAgICAgOiB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IGVsZW1lbnRzID0gdGVycmFmb3JtRWxlbWVudHModGhpcyk7XG5cbiAgICBjb25zdCBtZXRhZGF0YXMgPSBlbGVtZW50cy5tYXAoKGUpID0+IHJlc29sdmUodGhpcywgZS50b01ldGFkYXRhKCkpKTtcbiAgICBmb3IgKGNvbnN0IG1ldGEgb2YgbWV0YWRhdGFzKSB7XG4gICAgICBkZWVwTWVyZ2UobWV0YWRhdGEsIG1ldGEpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dElkTWFwID0gZWxlbWVudHMucmVkdWNlKChjYXJyeSwgaXRlbSkgPT4ge1xuICAgICAgaWYgKCFUZXJyYWZvcm1PdXRwdXQuaXNUZXJyYWZvcm1PdXRwdXQoaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgICAgfVxuXG4gICAgICBkZWVwTWVyZ2UoXG4gICAgICAgIGNhcnJ5LFxuICAgICAgICBpdGVtLm5vZGUucGF0aC5zcGxpdChcIi9cIikucmVkdWNlUmlnaHQoKGlubmVyQ2FycnksIHBhcnQpID0+IHtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaW5uZXJDYXJyeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4geyBbcGFydF06IGl0ZW0uZnJpZW5kbHlVbmlxdWVJZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBbcGFydF06IGlubmVyQ2FycnkgfTtcbiAgICAgICAgfSwge30pLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGNhcnJ5O1xuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHRmID0ge307XG4gICAgY29uc3QgZnJhZ21lbnRzID0gZWxlbWVudHMubWFwKChlKSA9PiByZXNvbHZlKHRoaXMsIGUudG9IY2xUZXJyYWZvcm0oKSkpO1xuICAgIGNvbnN0IGxvY2FsczogeyBsb2NhbHM/OiBhbnkgfSA9IHt9O1xuXG4gICAgY29uc3QgdGZNZXRhID0ge1xuICAgICAgXCIvL1wiOiB7XG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBvdXRwdXRzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGhjbEZyYWdtZW50cyA9IGZyYWdtZW50c1xuICAgICAgLm1hcCgoZnJhZykgPT4ge1xuICAgICAgICBsZXQgcmVzID0gXCJcIjtcbiAgICAgICAgaWYgKGZyYWcucmVzb3VyY2UpIHtcbiAgICAgICAgICBjb25zdCB7IGhjbCwgbWV0YWRhdGEgfSA9IHJlbmRlclJlc291cmNlKGZyYWcucmVzb3VyY2UpO1xuICAgICAgICAgIGRlZXBNZXJnZSh0Zk1ldGEsIG1ldGFkYXRhKTtcbiAgICAgICAgICByZXMgPSBbcmVzLCBoY2xdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgeyBoY2wsIG1ldGFkYXRhIH0gPSByZW5kZXJEYXRhc291cmNlKGZyYWcuZGF0YSk7XG4gICAgICAgICAgZGVlcE1lcmdlKHRmTWV0YSwgbWV0YWRhdGEpO1xuICAgICAgICAgIHJlcyA9IFtyZXMsIGhjbF0uam9pbihcIlxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLmVwaGVtZXJhbCkge1xuICAgICAgICAgIGNvbnN0IHsgaGNsLCBtZXRhZGF0YSB9ID0gcmVuZGVyRXBoZW1lcmFsKGZyYWcuZXBoZW1lcmFsKTtcbiAgICAgICAgICBkZWVwTWVyZ2UodGZNZXRhLCBtZXRhZGF0YSk7XG4gICAgICAgICAgcmVzID0gW3JlcywgaGNsXS5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcucHJvdmlkZXIpIHtcbiAgICAgICAgICBkZWVwTWVyZ2UodGYsIGZyYWcpO1xuICAgICAgICAgIHJlcyA9IFtyZXMsIHJlbmRlclByb3ZpZGVyKGZyYWcucHJvdmlkZXIpXS5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcudGVycmFmb3JtKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKHRmLCBmcmFnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLm1vZHVsZSkge1xuICAgICAgICAgIGNvbnN0IHsgaGNsLCBtZXRhZGF0YSB9ID0gcmVuZGVyTW9kdWxlKGZyYWcubW9kdWxlKTtcbiAgICAgICAgICBkZWVwTWVyZ2UodGZNZXRhLCBtZXRhZGF0YSk7XG4gICAgICAgICAgcmVzID0gW3JlcywgaGNsXS5qb2luKFwiXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcub3V0cHV0KSB7XG4gICAgICAgICAgcmVzID0gW3JlcywgcmVuZGVyT3V0cHV0KGZyYWcub3V0cHV0KV0uam9pbihcIlxcblxcblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcmFnLm1vdmVkKSB7XG4gICAgICAgICAgcmVzID0gW3JlcywgcmVuZGVyTW92ZWQoZnJhZy5tb3ZlZCldLmpvaW4oXCJcXG5cXG5cIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy5pbXBvcnQpIHtcbiAgICAgICAgICByZXMgPSBbcmVzLCByZW5kZXJJbXBvcnQoZnJhZy5pbXBvcnQpXS5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWcubG9jYWxzKSB7XG4gICAgICAgICAgZGVlcE1lcmdlKGxvY2FscywgZnJhZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZnJhZy52YXJpYWJsZSkge1xuICAgICAgICAgIHJlcyA9IFtyZXMsIHJlbmRlclZhcmlhYmxlKGZyYWcudmFyaWFibGUpXS5qb2luKFwiXFxuXFxuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmcmFnKSA9PiBmcmFnICE9PSB1bmRlZmluZWQpO1xuXG4gICAgZGVlcE1lcmdlKHRmLCB0aGlzLnJhd092ZXJyaWRlcyk7XG4gICAgY29uc3QgdGVycmFmb3JtQmxvY2sgPSAodGYgYXMgYW55KT8udGVycmFmb3JtO1xuXG4gICAgbGV0IHRlcnJhZm9ybUJsb2NrSGNsID0gXCJcIjtcbiAgICBpZiAodGVycmFmb3JtQmxvY2spIHtcbiAgICAgIHRlcnJhZm9ybUJsb2NrSGNsID0gcmVuZGVyVGVycmFmb3JtKHRlcnJhZm9ybUJsb2NrKTtcbiAgICAgIGRlZXBNZXJnZSh0Zk1ldGEsIHsgdGVycmFmb3JtOiBjbGVhbkZvck1ldGFkYXRhKHRlcnJhZm9ybUJsb2NrKSB9KTtcbiAgICB9XG5cbiAgICBsZXQgbG9jYWxzSGNsID0gXCJcIjtcbiAgICBpZiAobG9jYWxzKSB7XG4gICAgICBsb2NhbHNIY2wgPSByZW5kZXJMb2NhbHMobG9jYWxzLmxvY2Fscyk7XG5cbiAgICAgIGlmIChsb2NhbHNIY2wpIHtcbiAgICAgICAgLy8gSGFja3kgd2F5IHRvIGFkZCBhIG5ld2xpbmUgYmV0d2VlbiB0aGUgdGVycmFmb3JtIGJsb2NrIGFuZCB0aGUgbG9jYWxzIGJsb2NrXG4gICAgICAgIGxvY2Fsc0hjbCA9IFwiXFxuXFxuXCIgKyBsb2NhbHNIY2w7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhjbDogcmVzb2x2ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgW3RlcnJhZm9ybUJsb2NrSGNsLCBsb2NhbHNIY2wsIC4uLmhjbEZyYWdtZW50c10uam9pbihcIlwiKSxcbiAgICAgICksXG4gICAgICBtZXRhZGF0YTogcmVzb2x2ZSh0aGlzLCB0Zk1ldGEpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdG9UZXJyYWZvcm0oKTogYW55IHtcbiAgICBjb25zdCB0ZiA9IHt9O1xuXG4gICAgY29uc3QgbWV0YWRhdGE6IFRlcnJhZm9ybVN0YWNrTWV0YWRhdGEgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLmNka3RmVmVyc2lvbixcbiAgICAgIHN0YWNrTmFtZTogdGhpcy5ub2RlLmlkLFxuICAgICAgYmFja2VuZDogXCJsb2NhbFwiLCAvLyBvdmVyd3JpdHRlbiBieSBiYWNrZW5kIGltcGxlbWVudGF0aW9ucyBpZiB1c2VkXG4gICAgICBjbG91ZDogdW5kZWZpbmVkLCAvLyBvdmVyd3JpdHRlbiBieSBjbG91ZCBhbmQgcmVtb3RlIGJhY2tlbmQgaW1wbGVtZW50YXRpb25zXG4gICAgICAuLi4oT2JqZWN0LmtleXModGhpcy5yYXdPdmVycmlkZXMpLmxlbmd0aCA+IDBcbiAgICAgICAgPyB7IG92ZXJyaWRlczogeyBzdGFjazogT2JqZWN0LmtleXModGhpcy5yYXdPdmVycmlkZXMpIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSB0ZXJyYWZvcm1FbGVtZW50cyh0aGlzKTtcblxuICAgIGNvbnN0IG1ldGFkYXRhcyA9IGVsZW1lbnRzLm1hcCgoZSkgPT4gcmVzb2x2ZSh0aGlzLCBlLnRvTWV0YWRhdGEoKSkpO1xuICAgIGZvciAoY29uc3QgbWV0YSBvZiBtZXRhZGF0YXMpIHtcbiAgICAgIGRlZXBNZXJnZShtZXRhZGF0YSwgbWV0YSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0czogT3V0cHV0SWRNYXAgPSBlbGVtZW50cy5yZWR1Y2UoKGNhcnJ5LCBpdGVtKSA9PiB7XG4gICAgICBpZiAoIVRlcnJhZm9ybU91dHB1dC5pc1RlcnJhZm9ybU91dHB1dChpdGVtKSkge1xuICAgICAgICByZXR1cm4gY2Fycnk7XG4gICAgICB9XG5cbiAgICAgIGRlZXBNZXJnZShcbiAgICAgICAgY2FycnksXG4gICAgICAgIGl0ZW0ubm9kZS5wYXRoLnNwbGl0KFwiL1wiKS5yZWR1Y2VSaWdodCgoaW5uZXJDYXJyeSwgcGFydCkgPT4ge1xuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhpbm5lckNhcnJ5KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7IFtwYXJ0XTogaXRlbS5mcmllbmRseVVuaXF1ZUlkIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IFtwYXJ0XTogaW5uZXJDYXJyeSB9O1xuICAgICAgICB9LCB7fSksXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gY2Fycnk7XG4gICAgfSwge30pO1xuXG4gICAgKHRmIGFzIGFueSlbXCIvL1wiXSA9IHsgbWV0YWRhdGEsIG91dHB1dHMgfTtcblxuICAgIGNvbnN0IGZyYWdtZW50cyA9IGVsZW1lbnRzLm1hcCgoZSkgPT4gcmVzb2x2ZSh0aGlzLCBlLnRvVGVycmFmb3JtKCkpKTtcbiAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuICAgICAgZGVlcE1lcmdlKHRmLCBmcmFnbWVudCk7XG4gICAgfVxuXG4gICAgZGVlcE1lcmdlKHRmLCB0aGlzLnJhd092ZXJyaWRlcyk7XG5cbiAgICByZXR1cm4gcmVzb2x2ZSh0aGlzLCB0Zik7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPdXRnb2luZ0Nyb3NzU3RhY2tSZWZlcmVuY2UoaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY3Jvc3NTdGFja091dHB1dHNbaWRlbnRpZmllcl0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNyb3NzU3RhY2tPdXRwdXRzW2lkZW50aWZpZXJdO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBUZXJyYWZvcm1PdXRwdXQoXG4gICAgICB0aGlzLFxuICAgICAgYGNyb3NzLXN0YWNrLW91dHB1dC0ke2lkZW50aWZpZXJ9YCxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IHJlZihpZGVudGlmaWVyLCB0aGlzKSxcbiAgICAgICAgc2Vuc2l0aXZlOiB0cnVlLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgdGhpcy5jcm9zc1N0YWNrT3V0cHV0c1tpZGVudGlmaWVyXSA9IG91dHB1dDtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySW5jb21pbmdDcm9zc1N0YWNrUmVmZXJlbmNlKGZyb21TdGFjazogVGVycmFmb3JtU3RhY2spIHtcbiAgICBpZiAodGhpcy5jcm9zc1N0YWNrRGF0YVNvdXJjZXNbU3RyaW5nKGZyb21TdGFjayldKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcm9zc1N0YWNrRGF0YVNvdXJjZXNbU3RyaW5nKGZyb21TdGFjayldO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5CYWNrZW5kID0gZnJvbVN0YWNrLmVuc3VyZUJhY2tlbmRFeGlzdHMoKTtcbiAgICBjb25zdCBvcmlnaW5QYXRoID0gZnJvbVN0YWNrLm5vZGUucGF0aDtcblxuICAgIGNvbnN0IHJlbW90ZVN0YXRlID0gb3JpZ2luQmFja2VuZC5nZXRSZW1vdGVTdGF0ZURhdGFTb3VyY2UoXG4gICAgICB0aGlzLFxuICAgICAgYGNyb3NzLXN0YWNrLXJlZmVyZW5jZS1pbnB1dC0ke29yaWdpblBhdGh9YCxcbiAgICAgIG9yaWdpblBhdGgsXG4gICAgKTtcblxuICAgIHRoaXMuY3Jvc3NTdGFja0RhdGFTb3VyY2VzW29yaWdpblBhdGhdID0gcmVtb3RlU3RhdGU7XG4gICAgcmV0dXJuIHJlbW90ZVN0YXRlO1xuICB9XG5cbiAgLy8gQ2hlY2sgaGVyZSBmb3IgbG9vcHMgaW4gdGhlIGRlcGVuZGVuY3kgZ3JhcGhcbiAgcHVibGljIGRlcGVuZHNPbihzdGFjazogVGVycmFmb3JtU3RhY2spOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuaW5jbHVkZXMoc3RhY2spIHx8XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcy5zb21lKChkKSA9PiBkLmRlcGVuZHNPbihzdGFjaykpXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGREZXBlbmRlbmN5KGRlcGVuZGVuY3k6IFRlcnJhZm9ybVN0YWNrKSB7XG4gICAgaWYgKGRlcGVuZGVuY3kuZGVwZW5kc09uKHRoaXMpKSB7XG4gICAgICB0aHJvdyBzdGFja0hhc0NpcmN1bGFyRGVwZW5kZW5jeSh0aGlzLCBkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBlbmRlbmNpZXMuaW5jbHVkZXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlcGVuZGVuY2llcy5wdXNoKGRlcGVuZGVuY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhbGwgdmFsaWRhdGlvbnMgb24gdGhlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIHJ1bkFsbFZhbGlkYXRpb25zKCkge1xuICAgIGNvbnN0IGVycm9yczogeyBtZXNzYWdlOiBzdHJpbmc7IHNvdXJjZTogSUNvbnN0cnVjdCB9W10gPSB0aGlzLm5vZGVcbiAgICAgIC5maW5kQWxsKClcbiAgICAgIC5tYXAoKG5vZGUpID0+XG4gICAgICAgIG5vZGUubm9kZS52YWxpZGF0ZSgpLm1hcCgoZXJyb3IpID0+ICh7IG1lc3NhZ2U6IGVycm9yLCBzb3VyY2U6IG5vZGUgfSkpLFxuICAgICAgKVxuICAgICAgLnJlZHVjZSgocHJldiwgY3VycikgPT4gWy4uLnByZXYsIC4uLmN1cnJdLCBbXSk7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBlcnJvckxpc3QgPSBlcnJvcnNcbiAgICAgICAgLm1hcCgoZSkgPT4gYFske2Uuc291cmNlLm5vZGUucGF0aH1dICR7ZS5tZXNzYWdlfWApXG4gICAgICAgIC5qb2luKFwiXFxuICBcIik7XG4gICAgICB0aHJvdyBzdGFja1ZhbGlkYXRpb25GYWlsdXJlKGVycm9yTGlzdCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc1Jlc291cmNlTW92ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGVycmFmb3JtRWxlbWVudHModGhpcykuc29tZSgoZSkgPT4ge1xuICAgICAgaWYgKFRlcnJhZm9ybVJlc291cmNlLmlzVGVycmFmb3JtUmVzb3VyY2UoZSkgJiYgZS5oYXNSZXNvdXJjZU1vdmUoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gdGVycmFmb3JtRWxlbWVudHMoXG4gIG5vZGU6IElDb25zdHJ1Y3QsXG4gIGludG86IFRlcnJhZm9ybUVsZW1lbnRbXSA9IFtdLFxuKTogVGVycmFmb3JtRWxlbWVudFtdIHtcbiAgaWYgKFRlcnJhZm9ybUVsZW1lbnQuaXNUZXJyYWZvcm1FbGVtZW50KG5vZGUpKSB7XG4gICAgaW50by5wdXNoKG5vZGUpO1xuICB9XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLm5vZGUuY2hpbGRyZW4pIHtcbiAgICAvLyBEb24ndCByZWN1cnNlIGludG8gYSBzdWJzdGFja1xuICAgIGlmIChUZXJyYWZvcm1TdGFjay5pc1N0YWNrKGNoaWxkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdGVycmFmb3JtRWxlbWVudHMoY2hpbGQsIGludG8pO1xuICB9XG5cbiAgcmV0dXJuIGludG87XG59XG4iXX0=