cdk-nextjs 0.7.5 → 0.7.7

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 (69) hide show
  1. package/.jsii +38 -38
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/adapter-runtime.md +1 -1
  6. package/docs/caching-guide.md +11 -1
  7. package/docs/harness-coverage.md +11 -9
  8. package/lib/adapter/adapter.mjs +220 -149
  9. package/lib/adapter/aws-cache-store.d.ts +242 -7
  10. package/lib/adapter/aws-cache-store.js +520 -54
  11. package/lib/adapter/aws-cache-store.test.js +710 -3
  12. package/lib/adapter/build-outputs.js +23 -1
  13. package/lib/adapter/build-outputs.test.js +18 -1
  14. package/lib/adapter/cache-handler.d.ts +4 -3
  15. package/lib/adapter/cache-handler.js +1 -1
  16. package/lib/adapter/cache-handler.mjs +552 -91
  17. package/lib/adapter/cache-handler.test.js +31 -1
  18. package/lib/adapter/cache-utils.d.ts +68 -2
  19. package/lib/adapter/cache-utils.js +108 -2
  20. package/lib/adapter/cache-utils.test.js +45 -1
  21. package/lib/adapter/init-cache.d.ts +1 -1
  22. package/lib/adapter/init-cache.js +60 -37
  23. package/lib/adapter/init-cache.test.js +55 -2
  24. package/lib/adapter/local-file-cache-handler.d.ts +2 -2
  25. package/lib/adapter/local-file-cache-handler.js +4 -5
  26. package/lib/adapter/s3-cache-handler.d.ts +23 -7
  27. package/lib/adapter/s3-cache-handler.js +63 -27
  28. package/lib/adapter/s3-cache-handler.test.js +168 -1
  29. package/lib/adapter/use-cache-common.d.ts +53 -1
  30. package/lib/adapter/use-cache-common.js +121 -14
  31. package/lib/adapter/use-cache-common.test.js +138 -1
  32. package/lib/adapter/use-cache-default-handler.js +36 -6
  33. package/lib/adapter/use-cache-default-handler.mjs +557 -51
  34. package/lib/adapter/use-cache-handlers.test.js +247 -7
  35. package/lib/adapter/use-cache-remote-handler.js +10 -9
  36. package/lib/adapter/use-cache-remote-handler.mjs +597 -101
  37. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  38. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  39. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  40. package/lib/nextjs-api.js +1 -1
  41. package/lib/nextjs-build/nextjs-build.d.ts +0 -7
  42. package/lib/nextjs-build/nextjs-build.js +4 -11
  43. package/lib/nextjs-build/nextjs-build.test.js +4 -3
  44. package/lib/nextjs-cache.js +1 -1
  45. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  46. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  47. package/lib/nextjs-distribution.js +1 -1
  48. package/lib/nextjs-post-deploy.js +1 -1
  49. package/lib/nextjs-static-assets.js +1 -1
  50. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  51. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  52. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  53. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  54. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  55. package/lib/runtime/core.js +18 -4
  56. package/lib/runtime/core.test.js +17 -1
  57. package/lib/runtime/image.d.ts +19 -0
  58. package/lib/runtime/image.js +28 -2
  59. package/lib/runtime/image.test.js +43 -1
  60. package/lib/runtime/lambda.mjs +30 -6
  61. package/lib/runtime/server.mjs +30 -6
  62. package/lib/runtime/tag-manifest.d.ts +15 -0
  63. package/lib/runtime/tag-manifest.js +24 -0
  64. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  65. package/lib/runtime/tag-manifest.test.js +21 -0
  66. package/lib/utils/deployment-build-id.d.ts +11 -0
  67. package/lib/utils/deployment-build-id.js +15 -0
  68. package/package.json +3 -3
  69. package/scripts/e2e-harness/README.md +1 -1
@@ -16,7 +16,6 @@ exports.createRemoteUseCacheHandler = createRemoteUseCacheHandler;
16
16
  `'use cache'`.
17
17
  */
18
18
  /* eslint-disable import/no-extraneous-dependencies */
19
- const node_crypto_1 = require("node:crypto");
20
19
  const client_s3_1 = require("@aws-sdk/client-s3");
21
20
  const debug_1 = __importDefault(require("debug"));
22
21
  const aws_cache_store_1 = require("./aws-cache-store");
@@ -35,10 +34,6 @@ function bucketFromEnv() {
35
34
  }
36
35
  return new aws_cache_store_1.CacheBucket(new client_s3_1.S3Client({ region }), bucketName);
37
36
  }
38
- /** Whether `stored` is past `revalidate`, so a fresher copy may exist. */
39
- function isPastRevalidate(stored, at) {
40
- return at > stored.timestamp + stored.revalidate * 1000;
41
- }
42
37
  /** Whether `stored` is past `expire`, and may no longer be served at all. */
43
38
  function isPastExpire(stored, at) {
44
39
  return at > stored.timestamp + stored.expire * 1000;
@@ -60,7 +55,7 @@ function createRemoteUseCacheHandler(options = {}) {
60
55
  const memory = new use_cache_common_1.EntryLru((0, use_cache_common_1.numberFromEnv)("CDK_NEXTJS_USE_CACHE_MEMORY_BYTES", use_cache_common_1.DEFAULT_MEMORY_BYTES));
61
56
  const pending = new use_cache_common_1.PendingSets();
62
57
  const debug = (0, debug_1.default)("cdk-nextjs:cache-handler:use-cache:remote");
63
- const s3Key = (cacheKey) => (0, aws_cache_store_1.useCacheS3Key)(buildId, (0, node_crypto_1.createHash)("sha256").update(cacheKey).digest("hex"));
58
+ const s3Key = (cacheKey) => (0, aws_cache_store_1.useCacheS3Key)(buildId, (0, cache_utils_1.sha256Hex)(cacheKey));
64
59
  async function readFromS3(cacheKey) {
65
60
  if (!bucket) {
66
61
  return undefined;
@@ -124,7 +119,7 @@ function createRemoteUseCacheHandler(options = {}) {
124
119
  // regenerating it here too. An expired entry S3 has nothing newer for is
125
120
  // dropped below.
126
121
  if (!stored ||
127
- isPastRevalidate(stored, at) ||
122
+ (0, use_cache_common_1.isPastRevalidate)(stored, at) ||
128
123
  tags.state(stored.tags, stored.timestamp) !== "fresh") {
129
124
  const fromS3 = await readFromS3(cacheKey);
130
125
  if (fromS3 && (!stored || fromS3.timestamp > stored.timestamp)) {
@@ -179,8 +174,14 @@ function createRemoteUseCacheHandler(options = {}) {
179
174
  done();
180
175
  await writeToS3(cacheKey, stored);
181
176
  },
182
- ...(0, use_cache_common_1.tagMethods)(tags),
177
+ // Waits for the log query on every request: an entry read from S3 may
178
+ // predate this instance, so what the query says applies to it at once.
179
+ ...(0, use_cache_common_1.tagMethods)(tags, { blocking: true }),
180
+ async getExpiration(implicitTags) {
181
+ await tags.ensure(implicitTags);
182
+ return tags.expiration(implicitTags);
183
+ },
183
184
  };
184
185
  }
185
186
  exports.default = (0, use_cache_common_1.lazyHandler)(() => createRemoteUseCacheHandler());
186
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvdXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBaUdBLGtFQXlKQztBQTFQRDs7Ozs7Ozs7OztFQVVFO0FBQ0Ysc0RBQXNEO0FBQ3RELDZDQUF5QztBQUN6QyxrREFBOEM7QUFDOUMsa0RBQTZCO0FBSzdCLHVEQUsyQjtBQUMzQiwrQ0FBcUU7QUFDckUseURBYzRCO0FBcUI1QixTQUFTLGFBQWE7SUFDcEIsSUFBSSxJQUFBLCtCQUFZLEdBQUUsRUFBRSxDQUFDO1FBQ25CLHdFQUF3RTtRQUN4RSxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLHVDQUFxQixHQUFFLENBQUM7SUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsbUhBQW1ILENBQ3BILENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLElBQUksNkJBQVcsQ0FBQyxJQUFJLG9CQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFtQixFQUFFLEVBQVU7SUFDdkQsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsWUFBWSxDQUFDLE1BQW1CLEVBQUUsRUFBVTtJQUNuRCxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQiwyQkFBMkIsQ0FDekMsVUFBd0MsRUFBRTtJQUUxQyxNQUFNLE1BQU0sR0FDVixPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDbEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFBLHVDQUFxQixHQUFFLENBQUMsT0FBTyxDQUFDO0lBQ25FLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBQSxvQ0FBaUIsR0FBRSxDQUFDO0lBQ2pELE1BQU0sTUFBTSxHQUFHLElBQUksMkJBQVEsQ0FDekIsSUFBQSxnQ0FBYSxFQUFDLG1DQUFtQyxFQUFFLHVDQUFvQixDQUFDLENBQ3pFLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxJQUFJLDhCQUFXLEVBQUUsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBZ0IsRUFBRSxFQUFFLENBQ2pDLElBQUEsK0JBQWEsRUFBQyxPQUFPLEVBQUUsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUU5RSxLQUFLLFVBQVUsVUFBVSxDQUN2QixRQUFnQjtRQUVoQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osS0FBSyxDQUFDLFdBQVcsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDN0IsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE1BQU0sTUFBTSxHQUFHLElBQUEsNkJBQWUsRUFBQyxNQUFNLENBQW9CLENBQUM7WUFDMUQsSUFBSSxNQUFNLENBQUMsR0FBRyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixtRUFBbUU7Z0JBQ25FLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcscUJBQXFCLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUNELE9BQU87Z0JBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDM0IsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNyQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ3BDLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQ1gsMkNBQTJDLEdBQUcsV0FBVyxFQUN6RCxLQUFLLENBQ04sQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLE1BQW1CO1FBQzVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sVUFBVSxHQUFvQjtZQUNsQyxHQUFHLE1BQU07WUFDVCxHQUFHLEVBQUUsUUFBUTtZQUNiLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDakMsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBQSxpQ0FBbUIsRUFBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzNELEtBQUssQ0FBQyxVQUFVLFFBQVEsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZ0VBQWdFO1lBQ2hFLE9BQU8sQ0FBQyxLQUFLLENBQ1gsMkNBQTJDLEdBQUcsU0FBUyxFQUN2RCxLQUFLLENBQ04sQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0I7WUFDeEIsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUEsc0JBQUcsR0FBRSxDQUFDO1lBRWpCLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUM7WUFFRCxzRUFBc0U7WUFDdEUscUVBQXFFO1lBQ3JFLHlFQUF5RTtZQUN6RSxpQkFBaUI7WUFDakIsSUFDRSxDQUFDLE1BQU07Z0JBQ1AsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxPQUFPLEVBQ3JELENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDaEIsK0RBQStEO29CQUMvRCxxRUFBcUU7b0JBQ3JFLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDWixLQUFLLENBQUMsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEtBQUssQ0FBQyxXQUFXLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsa0JBQWtCLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFDRCxLQUFLLENBQUMsT0FBTyxRQUFRLEdBQUcsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLDBFQUEwRTtZQUMxRSxnRUFBZ0U7WUFDaEUsT0FBTyxJQUFBLCtCQUFZLEVBQUMsTUFBTSxFQUFFLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUVELEtBQUssQ0FBQyxHQUFHLENBQ1AsUUFBZ0IsRUFDaEIsWUFBaUM7WUFFakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQW1CLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxNQUFNLElBQUEsZ0NBQWEsRUFBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixpRUFBaUU7Z0JBQ2pFLEtBQUssQ0FBQyxjQUFjLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsQ0FBQztnQkFDUCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBQSxpQ0FBYyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxzQkFBc0IsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixzRUFBc0U7WUFDdEUsb0NBQW9DO1lBQ3BDLElBQUksRUFBRSxDQUFDO1lBQ1AsTUFBTSxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxHQUFHLElBQUEsNkJBQVUsRUFBQyxJQUFJLENBQUM7S0FDcEIsQ0FBQztBQUNKLENBQUM7QUFFRCxrQkFBZSxJQUFBLDhCQUFXLEVBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIGBjYWNoZUhhbmRsZXJzLnJlbW90ZWAgaGFuZGxlciwgZm9yIGAndXNlIGNhY2hlOiByZW1vdGUnYC5cbiAgU2VlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9jb25maWcvbmV4dC1jb25maWctanMvY2FjaGVIYW5kbGVyc1xuXG4gIEVudHJpZXMgYXJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgYnVja2V0LCBzbyBldmVyeSBpbnN0YW5jZSByZWFkcyB3aGF0IGFueVxuICBpbnN0YW5jZSB3cm90ZSwgd2l0aCBhIGJvdW5kZWQgaW4tbWVtb3J5IHRpZXIgaW4gZnJvbnQuIFRhZ3MgZ28gdGhyb3VnaCB0aGVcbiAgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MsIHNoYXJlZCB3aXRoIHBsYWluIGAndXNlIGNhY2hlJ2AgYW5kIHdpdGggdGhlXG4gIGluY3JlbWVudGFsIGNhY2hlLiBXaXRob3V0IHRoaXMsIE5leHQuanMgbWFwcyBgcmVtb3RlYCB0byBpdHMgaW4tbWVtb3J5XG4gIGRlZmF1bHQgaGFuZGxlciwgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCBpcyBubyBtb3JlIHNoYXJlZCB0aGFuXG4gIGAndXNlIGNhY2hlJ2AuXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIYW5kbGVyLFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvY2FjaGUtaGFuZGxlcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENhY2hlQnVja2V0LFxuICByZXNvbHZlQXdzQ2FjaGVDb25maWcsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxuICB1c2VDYWNoZVMzS2V5LFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7IHBhcnNlQ2FjaGVWYWx1ZSwgc2VyaWFsaXplQ2FjaGVWYWx1ZSB9IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQge1xuICBjYWNoZUVudHJ5T2YsXG4gIERFRkFVTFRfTUVNT1JZX0JZVEVTLFxuICBFbnRyeUxydSxcbiAgaXNCdWlsZFBoYXNlLFxuICBpc0R5bmFtaWNFbnRyeSxcbiAgbGF6eUhhbmRsZXIsXG4gIG5vdyxcbiAgbnVtYmVyRnJvbUVudixcbiAgUGVuZGluZ1NldHMsXG4gIHNoYXJlZFRhZ01hbmlmZXN0LFxuICBTdG9yZWRFbnRyeSxcbiAgc3RvcmVkRW50cnlPZixcbiAgdGFnTWV0aG9kcyxcbn0gZnJvbSBcIi4vdXNlLWNhY2hlLWNvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVVzZUNhY2hlSGFuZGxlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCBlbnRyaWVzIGFyZSBzdG9yZWQgaW4sIG9yIGBudWxsYCBmb3IgbWVtb3J5IG9ubHkuIEZyb21cbiAgICogYENES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUVgIGJ5IGRlZmF1bHQsIGFuZCBuZXZlciBhdCBidWlsZCB0aW1lLlxuICAgKi9cbiAgYnVja2V0PzogQ2FjaGVCdWNrZXQgfCBudWxsO1xuICAvKiogUHJlZml4ZXMgZXZlcnkgUzMga2V5OyBgQ0RLX05FWFRKU19CVUlMRF9JRGAgYnkgZGVmYXVsdC4gKi9cbiAgYnVpbGRJZD86IHN0cmluZztcbiAgLyoqIFRhZyBzdGF0ZTsgdGhlIHByb2Nlc3Mtd2lkZSBvbmUgZnJvbSB0aGUgZW52aXJvbm1lbnQgYnkgZGVmYXVsdC4gKi9cbiAgdGFncz86IFRyYWNrZWRUYWdNYXJrZXJzO1xufVxuXG4vKiogV2hhdCBpcyB3cml0dGVuIHRvIFMzIGZvciBvbmUgZW50cnkuICovXG5pbnRlcmZhY2UgU2VyaWFsaXplZEVudHJ5IGV4dGVuZHMgT21pdDxTdG9yZWRFbnRyeSwgXCJ2YWx1ZVwiPiB7XG4gIC8qKiBUaGUgZnVsbCBjYWNoZSBrZXksIGNoZWNrZWQgb24gcmVhZDsgdGhlIG9iamVjdCBrZXkgaXMgb25seSBpdHMgaGFzaC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIGJ1Y2tldEZyb21FbnYoKTogQ2FjaGVCdWNrZXQgfCBudWxsIHtcbiAgaWYgKGlzQnVpbGRQaGFzZSgpKSB7XG4gICAgLy8gTm8gY3JlZGVudGlhbHMsIGFuZCBub3RoaW5nIGEgYnVpbGQtdGltZSBlbnRyeSBjb3VsZCBiZSByZWFkIGJhY2sgYnk6XG4gICAgLy8gcHJlcmVuZGVycyBrZWVwIHdoYXQgdGhleSBuZWVkIGluIHRoZWlyIG93biByZXN1bWUgZGF0YSBjYWNoZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7IGJ1Y2tldE5hbWUsIHJlZ2lvbiB9ID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gIGlmICghYnVja2V0TmFtZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJpZXMgYXJlIGxvY2FsIHRvIGVhY2ggaW5zdGFuY2VcIixcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQ2FjaGVCdWNrZXQobmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pLCBidWNrZXROYW1lKTtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgcmV2YWxpZGF0ZWAsIHNvIGEgZnJlc2hlciBjb3B5IG1heSBleGlzdC4gKi9cbmZ1bmN0aW9uIGlzUGFzdFJldmFsaWRhdGUoc3RvcmVkOiBTdG9yZWRFbnRyeSwgYXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXQgPiBzdG9yZWQudGltZXN0YW1wICsgc3RvcmVkLnJldmFsaWRhdGUgKiAxMDAwO1xufVxuXG4vKiogV2hldGhlciBgc3RvcmVkYCBpcyBwYXN0IGBleHBpcmVgLCBhbmQgbWF5IG5vIGxvbmdlciBiZSBzZXJ2ZWQgYXQgYWxsLiAqL1xuZnVuY3Rpb24gaXNQYXN0RXhwaXJlKHN0b3JlZDogU3RvcmVkRW50cnksIGF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGF0ID4gc3RvcmVkLnRpbWVzdGFtcCArIHN0b3JlZC5leHBpcmUgKiAxMDAwO1xufVxuXG4vKipcbiAqIEEgYCd1c2UgY2FjaGU6IHJlbW90ZSdgIGhhbmRsZXI6IFMzIGZvciBzdG9yYWdlLCBtZW1vcnkgaW4gZnJvbnQsIGFuZCB0aGVcbiAqIHJldmFsaWRhdGlvbiB0YWJsZSBmb3IgdGFncy5cbiAqXG4gKiBVbmxpa2UgdGhlIGRlZmF1bHQgaGFuZGxlciBhbiBlbnRyeSBpcyBzZXJ2ZWQgdW50aWwgYGV4cGlyZWAsIG5vdCBkcm9wcGVkIGF0XG4gKiBgcmV2YWxpZGF0ZWA6IGEgcmVtb3RlIHJlYWQgaXMgd29ydGggc2VydmluZyBzdGFsZSB3aGlsZSBOZXh0LmpzJ3Mgd3JhcHBlclxuICogcmVnZW5lcmF0ZXMgaXQgaW4gdGhlIGJhY2tncm91bmQsIHdoaWNoIGlzIHdoYXQgYHJldmFsaWRhdGVgIGlzIGZvci4gQSBtZW1vcnlcbiAqIGNvcHkgcGFzdCBgcmV2YWxpZGF0ZWAgaXMgY2hlY2tlZCBhZ2FpbnN0IFMzIGZpcnN0LCBzaW5jZSBhbm90aGVyIGluc3RhbmNlIG1heVxuICogYWxyZWFkeSBoYXZlIHdyaXR0ZW4gdGhlIHJlZ2VuZXJhdGVkIGVudHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlVXNlQ2FjaGVIYW5kbGVyKFxuICBvcHRpb25zOiBSZW1vdGVVc2VDYWNoZUhhbmRsZXJPcHRpb25zID0ge30sXG4pOiBDYWNoZUhhbmRsZXIge1xuICBjb25zdCBidWNrZXQgPVxuICAgIG9wdGlvbnMuYnVja2V0ID09PSB1bmRlZmluZWQgPyBidWNrZXRGcm9tRW52KCkgOiBvcHRpb25zLmJ1Y2tldDtcbiAgY29uc3QgYnVpbGRJZCA9IG9wdGlvbnMuYnVpbGRJZCA/PyByZXNvbHZlQXdzQ2FjaGVDb25maWcoKS5idWlsZElkO1xuICBjb25zdCB0YWdzID0gb3B0aW9ucy50YWdzID8/IHNoYXJlZFRhZ01hbmlmZXN0KCk7XG4gIGNvbnN0IG1lbW9yeSA9IG5ldyBFbnRyeUxydShcbiAgICBudW1iZXJGcm9tRW52KFwiQ0RLX05FWFRKU19VU0VfQ0FDSEVfTUVNT1JZX0JZVEVTXCIsIERFRkFVTFRfTUVNT1JZX0JZVEVTKSxcbiAgKTtcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBQZW5kaW5nU2V0cygpO1xuICBjb25zdCBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnVzZS1jYWNoZTpyZW1vdGVcIik7XG5cbiAgY29uc3QgczNLZXkgPSAoY2FjaGVLZXk6IHN0cmluZykgPT5cbiAgICB1c2VDYWNoZVMzS2V5KGJ1aWxkSWQsIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGNhY2hlS2V5KS5kaWdlc3QoXCJoZXhcIikpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRGcm9tUzMoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBzM0tleShjYWNoZUtleSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IGF3YWl0IGJ1Y2tldC5nZXQoa2V5KTtcbiAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIGRlYnVnKGBTMyBNSVNTICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUNhY2hlVmFsdWUob2JqZWN0KSBhcyBTZXJpYWxpemVkRW50cnk7XG4gICAgICBpZiAocGFyc2VkLmtleSAhPT0gY2FjaGVLZXkpIHtcbiAgICAgICAgLy8gQSBoYXNoIGNvbGxpc2lvbiwgb3IgYW4gb2JqZWN0IHRoYXQgaXMgbm90IG91cnM6IG5ldmVyIHNlcnZlIGl0LlxuICAgICAgICBjb25zb2xlLndhcm4oYCd1c2UgY2FjaGU6IHJlbW90ZScgZW50cnkgJHtrZXl9IGlzIGZvciBhbm90aGVyIGtleWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgIHN0YWxlOiBwYXJzZWQuc3RhbGUsXG4gICAgICAgIHRpbWVzdGFtcDogcGFyc2VkLnRpbWVzdGFtcCxcbiAgICAgICAgZXhwaXJlOiBwYXJzZWQuZXhwaXJlLFxuICAgICAgICByZXZhbGlkYXRlOiBwYXJzZWQucmV2YWxpZGF0ZSxcbiAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KHBhcnNlZC52YWx1ZSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3IgcmVhZGluZyAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJ5ICR7a2V5fSBmcm9tIFMzOmAsXG4gICAgICAgIGVycm9yLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVUb1MzKGNhY2hlS2V5OiBzdHJpbmcsIHN0b3JlZDogU3RvcmVkRW50cnkpIHtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBzM0tleShjYWNoZUtleSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZDogU2VyaWFsaXplZEVudHJ5ID0ge1xuICAgICAgLi4uc3RvcmVkLFxuICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgIHZhbHVlOiBCdWZmZXIuZnJvbShzdG9yZWQudmFsdWUpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKGtleSwgc2VyaWFsaXplQ2FjaGVWYWx1ZShzZXJpYWxpemVkKSk7XG4gICAgICBkZWJ1ZyhgUzMgU0VUICR7Y2FjaGVLZXl9ICgke2tleX0pYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRoZSBlbnRyeSBpcyBzdGlsbCBpbiBtZW1vcnkgaGVyZTsgb3RoZXIgaW5zdGFuY2VzIGp1c3QgbWlzcy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvciB3cml0aW5nICd1c2UgY2FjaGU6IHJlbW90ZScgZW50cnkgJHtrZXl9IHRvIFMzOmAsXG4gICAgICAgIGVycm9yLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChjYWNoZUtleTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgICBhd2FpdCBwZW5kaW5nLndhaXQoY2FjaGVLZXkpO1xuICAgICAgY29uc3QgYXQgPSBub3coKTtcblxuICAgICAgbGV0IHN0b3JlZCA9IG1lbW9yeS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKHN0b3JlZCkge1xuICAgICAgICBhd2FpdCB0YWdzLmVuc3VyZShzdG9yZWQudGFncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3QgYHJldmFsaWRhdGVgLCBvciBzdGFsZSBvciBleHBpcmVkIGJ5IHRhZzogYW5vdGhlciBpbnN0YW5jZSBtYXlcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSB3cml0dGVuIHRoZSByZWdlbmVyYXRlZCBlbnRyeSwgYW5kIHNlcnZpbmcgdGhhdCBiZWF0c1xuICAgICAgLy8gcmVnZW5lcmF0aW5nIGl0IGhlcmUgdG9vLiBBbiBleHBpcmVkIGVudHJ5IFMzIGhhcyBub3RoaW5nIG5ld2VyIGZvciBpc1xuICAgICAgLy8gZHJvcHBlZCBiZWxvdy5cbiAgICAgIGlmIChcbiAgICAgICAgIXN0b3JlZCB8fFxuICAgICAgICBpc1Bhc3RSZXZhbGlkYXRlKHN0b3JlZCwgYXQpIHx8XG4gICAgICAgIHRhZ3Muc3RhdGUoc3RvcmVkLnRhZ3MsIHN0b3JlZC50aW1lc3RhbXApICE9PSBcImZyZXNoXCJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmcm9tUzMgPSBhd2FpdCByZWFkRnJvbVMzKGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGZyb21TMyAmJiAoIXN0b3JlZCB8fCBmcm9tUzMudGltZXN0YW1wID4gc3RvcmVkLnRpbWVzdGFtcCkpIHtcbiAgICAgICAgICBzdG9yZWQgPSBmcm9tUzM7XG4gICAgICAgICAgLy8gQW4gZW50cnkgd3JpdHRlbiBieSBhbm90aGVyIGluc3RhbmNlOiBpdHMgdGFncyBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgLy8gcmV2YWxpZGF0ZWQgYXQgYW55IHRpbWUgc2luY2UsIHNvIHRoZXkgYXJlIHJlYWQgYmVmb3JlIGp1ZGdpbmcgaXQuXG4gICAgICAgICAgYXdhaXQgdGFncy5lbnN1cmUoc3RvcmVkLnRhZ3MpO1xuICAgICAgICAgIG1lbW9yeS5zZXQoY2FjaGVLZXksIHN0b3JlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzdG9yZWQpIHtcbiAgICAgICAgZGVidWcoYE1JU1MgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Bhc3RFeHBpcmUoc3RvcmVkLCBhdCkpIHtcbiAgICAgICAgZGVidWcoYEVYUElSRUQgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgbWVtb3J5LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRhZ3Muc3RhdGUoc3RvcmVkLnRhZ3MsIHN0b3JlZC50aW1lc3RhbXApO1xuICAgICAgaWYgKHN0YXRlID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICBkZWJ1ZyhgRVhQSVJFRCBCWSBUQUcgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgbWVtb3J5LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBkZWJ1ZyhgSElUICR7Y2FjaGVLZXl9JHtzdGF0ZSA9PT0gXCJzdGFsZVwiID8gXCIgKHN0YWxlIHRhZylcIiA6IFwiXCJ9YCk7XG4gICAgICAvLyBgcmV2YWxpZGF0ZTogLTFgIG1ha2VzIHRoZSB3cmFwcGVyIHNlcnZlIHRoZSBlbnRyeSBhbmQgcmVnZW5lcmF0ZSBpdCBpblxuICAgICAgLy8gdGhlIGJhY2tncm91bmQsIHRoZSBidWlsdC1pbiBoYW5kbGVyJ3MgYW5zd2VyIHRvIGEgc3RhbGUgdGFnLlxuICAgICAgcmV0dXJuIGNhY2hlRW50cnlPZihzdG9yZWQsIHN0YXRlID09PSBcInN0YWxlXCIgPyAtMSA6IHN0b3JlZC5yZXZhbGlkYXRlKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0KFxuICAgICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICAgIHBlbmRpbmdFbnRyeTogUHJvbWlzZTxDYWNoZUVudHJ5PixcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRvbmUgPSBwZW5kaW5nLmJlZ2luKGNhY2hlS2V5KTtcbiAgICAgIGxldCBzdG9yZWQ6IFN0b3JlZEVudHJ5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmVkID0gYXdhaXQgc3RvcmVkRW50cnlPZihwZW5kaW5nRW50cnkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIHN0cmVhbSBlcnJvcmVkOiBzdG9yZSBub3RoaW5nIHJhdGhlciB0aGFuIGEgcGFydGlhbCBlbnRyeS5cbiAgICAgICAgZGVidWcoYFNFVCBGQUlMRUQgJHtjYWNoZUtleX1gLCBlcnJvcik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRHluYW1pY0VudHJ5KHN0b3JlZCkpIHtcbiAgICAgICAgZGVidWcoYFNLSVAgZHluYW1pYyBlbnRyeSAke2NhY2hlS2V5fWApO1xuICAgICAgICBkb25lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG1lbW9yeS5zZXQoY2FjaGVLZXksIHN0b3JlZCk7XG4gICAgICB0YWdzLnRyYWNrKHN0b3JlZC50YWdzKTtcbiAgICAgIC8vIEEgYGdldGAgd2FpdGluZyBvbiB0aGlzIGBzZXRgIGNhbiBiZSBhbnN3ZXJlZCBmcm9tIG1lbW9yeSBub3c7IG9ubHlcbiAgICAgIC8vIG90aGVyIGluc3RhbmNlcyBuZWVkIHRoZSBTMyBjb3B5LlxuICAgICAgZG9uZSgpO1xuICAgICAgYXdhaXQgd3JpdGVUb1MzKGNhY2hlS2V5LCBzdG9yZWQpO1xuICAgIH0sXG5cbiAgICAuLi50YWdNZXRob2RzKHRhZ3MpLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBsYXp5SGFuZGxlcigoKSA9PiBjcmVhdGVSZW1vdGVVc2VDYWNoZUhhbmRsZXIoKSk7XG4iXX0=
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvdXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEZBLGtFQWdLQztBQTVQRDs7Ozs7Ozs7OztFQVVFO0FBQ0Ysc0RBQXNEO0FBQ3RELGtEQUE4QztBQUM5QyxrREFBNkI7QUFLN0IsdURBSzJCO0FBQzNCLCtDQUFnRjtBQUNoRix5REFlNEI7QUFxQjVCLFNBQVMsYUFBYTtJQUNwQixJQUFJLElBQUEsK0JBQVksR0FBRSxFQUFFLENBQUM7UUFDbkIsd0VBQXdFO1FBQ3hFLGlFQUFpRTtRQUNqRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUEsdUNBQXFCLEdBQUUsQ0FBQztJQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FDVixtSEFBbUgsQ0FDcEgsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sSUFBSSw2QkFBVyxDQUFDLElBQUksb0JBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxTQUFTLFlBQVksQ0FBQyxNQUFtQixFQUFFLEVBQVU7SUFDbkQsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsMkJBQTJCLENBQ3pDLFVBQXdDLEVBQUU7SUFFMUMsTUFBTSxNQUFNLEdBQ1YsT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMs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IGZvciBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AuXG4gIFNlZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2FwaS1yZWZlcmVuY2UvY29uZmlnL25leHQtY29uZmlnLWpzL2NhY2hlSGFuZGxlcnNcblxuICBFbnRyaWVzIGFyZSBzdG9yZWQgaW4gdGhlIGNhY2hlIGJ1Y2tldCwgc28gZXZlcnkgaW5zdGFuY2UgcmVhZHMgd2hhdCBhbnlcbiAgaW5zdGFuY2Ugd3JvdGUsIHdpdGggYSBib3VuZGVkIGluLW1lbW9yeSB0aWVyIGluIGZyb250LiBUYWdzIGdvIHRocm91Z2ggdGhlXG4gIHJldmFsaWRhdGlvbiB0YWJsZSdzIG1hcmtlciByb3dzLCBzaGFyZWQgd2l0aCBwbGFpbiBgJ3VzZSBjYWNoZSdgIGFuZCB3aXRoIHRoZVxuICBpbmNyZW1lbnRhbCBjYWNoZS4gV2l0aG91dCB0aGlzLCBOZXh0LmpzIG1hcHMgYHJlbW90ZWAgdG8gaXRzIGluLW1lbW9yeVxuICBkZWZhdWx0IGhhbmRsZXIsIGFuZCBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AgaXMgbm8gbW9yZSBzaGFyZWQgdGhhblxuICBgJ3VzZSBjYWNoZSdgLlxuKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgUzNDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgdHlwZSB7XG4gIENhY2hlRW50cnksXG4gIENhY2hlSGFuZGxlcixcbn0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvbGliL2NhY2hlLWhhbmRsZXJzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBDYWNoZUJ1Y2tldCxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBUcmFja2VkVGFnTWFya2VycyxcbiAgdXNlQ2FjaGVTM0tleSxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQgeyBwYXJzZUNhY2hlVmFsdWUsIHNlcmlhbGl6ZUNhY2hlVmFsdWUsIHNoYTI1NkhleCB9IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQge1xuICBjYWNoZUVudHJ5T2YsXG4gIERFRkFVTFRfTUVNT1JZX0JZVEVTLFxuICBFbnRyeUxydSxcbiAgaXNCdWlsZFBoYXNlLFxuICBpc0R5bmFtaWNFbnRyeSxcbiAgaXNQYXN0UmV2YWxpZGF0ZSxcbiAgbGF6eUhhbmRsZXIsXG4gIG5vdyxcbiAgbnVtYmVyRnJvbUVudixcbiAgUGVuZGluZ1NldHMsXG4gIHNoYXJlZFRhZ01hbmlmZXN0LFxuICBTdG9yZWRFbnRyeSxcbiAgc3RvcmVkRW50cnlPZixcbiAgdGFnTWV0aG9kcyxcbn0gZnJvbSBcIi4vdXNlLWNhY2hlLWNvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVVzZUNhY2hlSGFuZGxlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCBlbnRyaWVzIGFyZSBzdG9yZWQgaW4sIG9yIGBudWxsYCBmb3IgbWVtb3J5IG9ubHkuIEZyb21cbiAgICogYENES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUVgIGJ5IGRlZmF1bHQsIGFuZCBuZXZlciBhdCBidWlsZCB0aW1lLlxuICAgKi9cbiAgYnVja2V0PzogQ2FjaGVCdWNrZXQgfCBudWxsO1xuICAvKiogUHJlZml4ZXMgZXZlcnkgUzMga2V5OyBgQ0RLX05FWFRKU19CVUlMRF9JRGAgYnkgZGVmYXVsdC4gKi9cbiAgYnVpbGRJZD86IHN0cmluZztcbiAgLyoqIFRhZyBzdGF0ZTsgdGhlIHByb2Nlc3Mtd2lkZSBvbmUgZnJvbSB0aGUgZW52aXJvbm1lbnQgYnkgZGVmYXVsdC4gKi9cbiAgdGFncz86IFRyYWNrZWRUYWdNYXJrZXJzO1xufVxuXG4vKiogV2hhdCBpcyB3cml0dGVuIHRvIFMzIGZvciBvbmUgZW50cnkuICovXG5pbnRlcmZhY2UgU2VyaWFsaXplZEVudHJ5IGV4dGVuZHMgT21pdDxTdG9yZWRFbnRyeSwgXCJ2YWx1ZVwiPiB7XG4gIC8qKiBUaGUgZnVsbCBjYWNoZSBrZXksIGNoZWNrZWQgb24gcmVhZDsgdGhlIG9iamVjdCBrZXkgaXMgb25seSBpdHMgaGFzaC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIGJ1Y2tldEZyb21FbnYoKTogQ2FjaGVCdWNrZXQgfCBudWxsIHtcbiAgaWYgKGlzQnVpbGRQaGFzZSgpKSB7XG4gICAgLy8gTm8gY3JlZGVudGlhbHMsIGFuZCBub3RoaW5nIGEgYnVpbGQtdGltZSBlbnRyeSBjb3VsZCBiZSByZWFkIGJhY2sgYnk6XG4gICAgLy8gcHJlcmVuZGVycyBrZWVwIHdoYXQgdGhleSBuZWVkIGluIHRoZWlyIG93biByZXN1bWUgZGF0YSBjYWNoZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7IGJ1Y2tldE5hbWUsIHJlZ2lvbiB9ID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gIGlmICghYnVja2V0TmFtZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJpZXMgYXJlIGxvY2FsIHRvIGVhY2ggaW5zdGFuY2VcIixcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQ2FjaGVCdWNrZXQobmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pLCBidWNrZXROYW1lKTtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgZXhwaXJlYCwgYW5kIG1heSBubyBsb25nZXIgYmUgc2VydmVkIGF0IGFsbC4gKi9cbmZ1bmN0aW9uIGlzUGFzdEV4cGlyZShzdG9yZWQ6IFN0b3JlZEVudHJ5LCBhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdCA+IHN0b3JlZC50aW1lc3RhbXAgKyBzdG9yZWQuZXhwaXJlICogMTAwMDtcbn1cblxuLyoqXG4gKiBBIGAndXNlIGNhY2hlOiByZW1vdGUnYCBoYW5kbGVyOiBTMyBmb3Igc3RvcmFnZSwgbWVtb3J5IGluIGZyb250LCBhbmQgdGhlXG4gKiByZXZhbGlkYXRpb24gdGFibGUgZm9yIHRhZ3MuXG4gKlxuICogVW5saWtlIHRoZSBkZWZhdWx0IGhhbmRsZXIgYW4gZW50cnkgaXMgc2VydmVkIHVudGlsIGBleHBpcmVgLCBub3QgZHJvcHBlZCBhdFxuICogYHJldmFsaWRhdGVgOiBhIHJlbW90ZSByZWFkIGlzIHdvcnRoIHNlcnZpbmcgc3RhbGUgd2hpbGUgTmV4dC5qcydzIHdyYXBwZXJcbiAqIHJlZ2VuZXJhdGVzIGl0IGluIHRoZSBiYWNrZ3JvdW5kLCB3aGljaCBpcyB3aGF0IGByZXZhbGlkYXRlYCBpcyBmb3IuIEEgbWVtb3J5XG4gKiBjb3B5IHBhc3QgYHJldmFsaWRhdGVgIGlzIGNoZWNrZWQgYWdhaW5zdCBTMyBmaXJzdCwgc2luY2UgYW5vdGhlciBpbnN0YW5jZSBtYXlcbiAqIGFscmVhZHkgaGF2ZSB3cml0dGVuIHRoZSByZWdlbmVyYXRlZCBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbW90ZVVzZUNhY2hlSGFuZGxlcihcbiAgb3B0aW9uczogUmVtb3RlVXNlQ2FjaGVIYW5kbGVyT3B0aW9ucyA9IHt9LFxuKTogQ2FjaGVIYW5kbGVyIHtcbiAgY29uc3QgYnVja2V0ID1cbiAgICBvcHRpb25zLmJ1Y2tldCA9PT0gdW5kZWZpbmVkID8gYnVja2V0RnJvbUVudigpIDogb3B0aW9ucy5idWNrZXQ7XG4gIGNvbnN0IGJ1aWxkSWQgPSBvcHRpb25zLmJ1aWxkSWQgPz8gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCkuYnVpbGRJZDtcbiAgY29uc3QgdGFncyA9IG9wdGlvbnMudGFncyA/PyBzaGFyZWRUYWdNYW5pZmVzdCgpO1xuICBjb25zdCBtZW1vcnkgPSBuZXcgRW50cnlMcnUoXG4gICAgbnVtYmVyRnJvbUVudihcIkNES19ORVhUSlNfVVNFX0NBQ0hFX01FTU9SWV9CWVRFU1wiLCBERUZBVUxUX01FTU9SWV9CWVRFUyksXG4gICk7XG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgUGVuZGluZ1NldHMoKTtcbiAgY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6Y2FjaGUtaGFuZGxlcjp1c2UtY2FjaGU6cmVtb3RlXCIpO1xuXG4gIGNvbnN0IHMzS2V5ID0gKGNhY2hlS2V5OiBzdHJpbmcpID0+XG4gICAgdXNlQ2FjaGVTM0tleShidWlsZElkLCBzaGEyNTZIZXgoY2FjaGVLZXkpKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWFkRnJvbVMzKFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICk6IFByb21pc2U8U3RvcmVkRW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gczNLZXkoY2FjaGVLZXkpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvYmplY3QgPSBhd2FpdCBidWNrZXQuZ2V0KGtleSk7XG4gICAgICBpZiAoIW9iamVjdCkge1xuICAgICAgICBkZWJ1ZyhgUzMgTUlTUyAke2NhY2hlS2V5fWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VDYWNoZVZhbHVlKG9iamVjdCkgYXMgU2VyaWFsaXplZEVudHJ5O1xuICAgICAgaWYgKHBhcnNlZC5rZXkgIT09IGNhY2hlS2V5KSB7XG4gICAgICAgIC8vIEEgaGFzaCBjb2xsaXNpb24sIG9yIGFuIG9iamVjdCB0aGF0IGlzIG5vdCBvdXJzOiBuZXZlciBzZXJ2ZSBpdC5cbiAgICAgICAgY29uc29sZS53YXJuKGAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJ5ICR7a2V5fSBpcyBmb3IgYW5vdGhlciBrZXlgKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhZ3M6IHBhcnNlZC50YWdzLFxuICAgICAgICBzdGFsZTogcGFyc2VkLnN0YWxlLFxuICAgICAgICB0aW1lc3RhbXA6IHBhcnNlZC50aW1lc3RhbXAsXG4gICAgICAgIGV4cGlyZTogcGFyc2VkLmV4cGlyZSxcbiAgICAgICAgcmV2YWxpZGF0ZTogcGFyc2VkLnJldmFsaWRhdGUsXG4gICAgICAgIHZhbHVlOiBuZXcgVWludDhBcnJheShwYXJzZWQudmFsdWUpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yIHJlYWRpbmcgJ3VzZSBjYWNoZTogcmVtb3RlJyBlbnRyeSAke2tleX0gZnJvbSBTMzpgLFxuICAgICAgICBlcnJvcixcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdyaXRlVG9TMyhjYWNoZUtleTogc3RyaW5nLCBzdG9yZWQ6IFN0b3JlZEVudHJ5KSB7XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gczNLZXkoY2FjaGVLZXkpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQ6IFNlcmlhbGl6ZWRFbnRyeSA9IHtcbiAgICAgIC4uLnN0b3JlZCxcbiAgICAgIGtleTogY2FjaGVLZXksXG4gICAgICB2YWx1ZTogQnVmZmVyLmZyb20oc3RvcmVkLnZhbHVlKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBidWNrZXQucHV0SnNvbihrZXksIHNlcmlhbGl6ZUNhY2hlVmFsdWUoc2VyaWFsaXplZCkpO1xuICAgICAgZGVidWcoYFMzIFNFVCAke2NhY2hlS2V5fSAoJHtrZXl9KWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUaGUgZW50cnkgaXMgc3RpbGwgaW4gbWVtb3J5IGhlcmU7IG90aGVyIGluc3RhbmNlcyBqdXN0IG1pc3MuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3Igd3JpdGluZyAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJ5ICR7a2V5fSB0byBTMzpgLFxuICAgICAgICBlcnJvcixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoY2FjaGVLZXk6IHN0cmluZyk6IFByb21pc2U8Q2FjaGVFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgICAgYXdhaXQgcGVuZGluZy53YWl0KGNhY2hlS2V5KTtcbiAgICAgIGNvbnN0IGF0ID0gbm93KCk7XG5cbiAgICAgIGxldCBzdG9yZWQgPSBtZW1vcnkuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgYXdhaXQgdGFncy5lbnN1cmUoc3RvcmVkLnRhZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXN0IGByZXZhbGlkYXRlYCwgb3Igc3RhbGUgb3IgZXhwaXJlZCBieSB0YWc6IGFub3RoZXIgaW5zdGFuY2UgbWF5XG4gICAgICAvLyBhbHJlYWR5IGhhdmUgd3JpdHRlbiB0aGUgcmVnZW5lcmF0ZWQgZW50cnksIGFuZCBzZXJ2aW5nIHRoYXQgYmVhdHNcbiAgICAgIC8vIHJlZ2VuZXJhdGluZyBpdCBoZXJlIHRvby4gQW4gZXhwaXJlZCBlbnRyeSBTMyBoYXMgbm90aGluZyBuZXdlciBmb3IgaXNcbiAgICAgIC8vIGRyb3BwZWQgYmVsb3cuXG4gICAgICBpZiAoXG4gICAgICAgICFzdG9yZWQgfHxcbiAgICAgICAgaXNQYXN0UmV2YWxpZGF0ZShzdG9yZWQsIGF0KSB8fFxuICAgICAgICB0YWdzLnN0YXRlKHN0b3JlZC50YWdzLCBzdG9yZWQudGltZXN0YW1wKSAhPT0gXCJmcmVzaFwiXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgZnJvbVMzID0gYXdhaXQgcmVhZEZyb21TMyhjYWNoZUtleSk7XG4gICAgICAgIGlmIChmcm9tUzMgJiYgKCFzdG9yZWQgfHwgZnJvbVMzLnRpbWVzdGFtcCA+IHN0b3JlZC50aW1lc3RhbXApKSB7XG4gICAgICAgICAgc3RvcmVkID0gZnJvbVMzO1xuICAgICAgICAgIC8vIEFuIGVudHJ5IHdyaXR0ZW4gYnkgYW5vdGhlciBpbnN0YW5jZTogaXRzIHRhZ3MgbWF5IGhhdmUgYmVlblxuICAgICAgICAgIC8vIHJldmFsaWRhdGVkIGF0IGFueSB0aW1lIHNpbmNlLCBzbyB0aGV5IGFyZSByZWFkIGJlZm9yZSBqdWRnaW5nIGl0LlxuICAgICAgICAgIGF3YWl0IHRhZ3MuZW5zdXJlKHN0b3JlZC50YWdzKTtcbiAgICAgICAgICBtZW1vcnkuc2V0KGNhY2hlS2V5LCBzdG9yZWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RvcmVkKSB7XG4gICAgICAgIGRlYnVnKGBNSVNTICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoaXNQYXN0RXhwaXJlKHN0b3JlZCwgYXQpKSB7XG4gICAgICAgIGRlYnVnKGBFWFBJUkVEICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIG1lbW9yeS5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdGUgPSB0YWdzLnN0YXRlKHN0b3JlZC50YWdzLCBzdG9yZWQudGltZXN0YW1wKTtcbiAgICAgIGlmIChzdGF0ZSA9PT0gXCJleHBpcmVkXCIpIHtcbiAgICAgICAgZGVidWcoYEVYUElSRUQgQlkgVEFHICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIG1lbW9yeS5kZWxldGUoY2FjaGVLZXkpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgZGVidWcoYEhJVCAke2NhY2hlS2V5fSR7c3RhdGUgPT09IFwic3RhbGVcIiA/IFwiIChzdGFsZSB0YWcpXCIgOiBcIlwifWApO1xuICAgICAgLy8gYHJldmFsaWRhdGU6IC0xYCBtYWtlcyB0aGUgd3JhcHBlciBzZXJ2ZSB0aGUgZW50cnkgYW5kIHJlZ2VuZXJhdGUgaXQgaW5cbiAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kLCB0aGUgYnVpbHQtaW4gaGFuZGxlcidzIGFuc3dlciB0byBhIHN0YWxlIHRhZy5cbiAgICAgIHJldHVybiBjYWNoZUVudHJ5T2Yoc3RvcmVkLCBzdGF0ZSA9PT0gXCJzdGFsZVwiID8gLTEgOiBzdG9yZWQucmV2YWxpZGF0ZSk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNldChcbiAgICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgICBwZW5kaW5nRW50cnk6IFByb21pc2U8Q2FjaGVFbnRyeT4sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkb25lID0gcGVuZGluZy5iZWdpbihjYWNoZUtleSk7XG4gICAgICBsZXQgc3RvcmVkOiBTdG9yZWRFbnRyeTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0b3JlZCA9IGF3YWl0IHN0b3JlZEVudHJ5T2YocGVuZGluZ0VudHJ5KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFRoZSBzdHJlYW0gZXJyb3JlZDogc3RvcmUgbm90aGluZyByYXRoZXIgdGhhbiBhIHBhcnRpYWwgZW50cnkuXG4gICAgICAgIGRlYnVnKGBTRVQgRkFJTEVEICR7Y2FjaGVLZXl9YCwgZXJyb3IpO1xuICAgICAgICBkb25lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpc0R5bmFtaWNFbnRyeShzdG9yZWQpKSB7XG4gICAgICAgIGRlYnVnKGBTS0lQIGR5bmFtaWMgZW50cnkgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBtZW1vcnkuc2V0KGNhY2hlS2V5LCBzdG9yZWQpO1xuICAgICAgdGFncy50cmFjayhzdG9yZWQudGFncyk7XG4gICAgICAvLyBBIGBnZXRgIHdhaXRpbmcgb24gdGhpcyBgc2V0YCBjYW4gYmUgYW5zd2VyZWQgZnJvbSBtZW1vcnkgbm93OyBvbmx5XG4gICAgICAvLyBvdGhlciBpbnN0YW5jZXMgbmVlZCB0aGUgUzMgY29weS5cbiAgICAgIGRvbmUoKTtcbiAgICAgIGF3YWl0IHdyaXRlVG9TMyhjYWNoZUtleSwgc3RvcmVkKTtcbiAgICB9LFxuXG4gICAgLy8gV2FpdHMgZm9yIHRoZSBsb2cgcXVlcnkgb24gZXZlcnkgcmVxdWVzdDogYW4gZW50cnkgcmVhZCBmcm9tIFMzIG1heVxuICAgIC8vIHByZWRhdGUgdGhpcyBpbnN0YW5jZSwgc28gd2hhdCB0aGUgcXVlcnkgc2F5cyBhcHBsaWVzIHRvIGl0IGF0IG9uY2UuXG4gICAgLi4udGFnTWV0aG9kcyh0YWdzLCB7IGJsb2NraW5nOiB0cnVlIH0pLFxuXG4gICAgYXN5bmMgZ2V0RXhwaXJhdGlvbihpbXBsaWNpdFRhZ3MpIHtcbiAgICAgIGF3YWl0IHRhZ3MuZW5zdXJlKGltcGxpY2l0VGFncyk7XG4gICAgICByZXR1cm4gdGFncy5leHBpcmF0aW9uKGltcGxpY2l0VGFncyk7XG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbGF6eUhhbmRsZXIoKCkgPT4gY3JlYXRlUmVtb3RlVXNlQ2FjaGVIYW5kbGVyKCkpO1xuIl19