cdk-nextjs 0.7.7 → 0.7.8

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 (53) hide show
  1. package/.jsii +2 -2
  2. package/docs/adapter-runtime.md +1 -1
  3. package/docs/harness-coverage.md +153 -73
  4. package/lib/adapter/adapter.mjs +12 -3
  5. package/lib/adapter/aws-cache-store.d.ts +7 -0
  6. package/lib/adapter/aws-cache-store.js +12 -1
  7. package/lib/adapter/aws-cache-store.test.js +32 -1
  8. package/lib/adapter/cache-handler.d.ts +5 -3
  9. package/lib/adapter/cache-handler.js +16 -10
  10. package/lib/adapter/cache-handler.mjs +103 -26
  11. package/lib/adapter/cache-handler.test.js +44 -1
  12. package/lib/adapter/cache-utils.d.ts +22 -0
  13. package/lib/adapter/cache-utils.js +44 -1
  14. package/lib/adapter/function-groups.js +17 -4
  15. package/lib/adapter/function-groups.test.js +33 -1
  16. package/lib/adapter/memory-cache-handler.d.ts +5 -1
  17. package/lib/adapter/memory-cache-handler.js +6 -2
  18. package/lib/adapter/s3-cache-handler.d.ts +12 -1
  19. package/lib/adapter/s3-cache-handler.js +30 -8
  20. package/lib/adapter/s3-cache-handler.test.js +84 -2
  21. package/lib/adapter/use-cache-common.d.ts +13 -0
  22. package/lib/adapter/use-cache-common.js +22 -6
  23. package/lib/adapter/use-cache-common.test.js +37 -1
  24. package/lib/adapter/use-cache-default-handler.mjs +33 -10
  25. package/lib/adapter/use-cache-remote-handler.mjs +33 -12
  26. package/lib/nextjs-api.js +1 -1
  27. package/lib/nextjs-build/nextjs-build.js +1 -1
  28. package/lib/nextjs-cache.js +1 -1
  29. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  30. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  31. package/lib/nextjs-distribution.js +1 -1
  32. package/lib/nextjs-post-deploy.js +1 -1
  33. package/lib/nextjs-static-assets.js +1 -1
  34. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  35. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  36. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  37. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  38. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  39. package/lib/runtime/core.js +3 -1
  40. package/lib/runtime/image-utils.d.ts +8 -9
  41. package/lib/runtime/image-utils.js +16 -1
  42. package/lib/runtime/image-utils.test.js +13 -1
  43. package/lib/runtime/image.js +9 -3
  44. package/lib/runtime/lambda.mjs +50 -15
  45. package/lib/runtime/server.mjs +50 -15
  46. package/lib/runtime/tag-manifest.d.ts +25 -0
  47. package/lib/runtime/tag-manifest.js +37 -2
  48. package/lib/runtime/tag-manifest.test.js +27 -1
  49. package/package.json +3 -3
  50. package/scripts/e2e-deploy.sh +7 -2
  51. package/scripts/e2e-harness/README.md +72 -35
  52. package/scripts/e2e-harness/screen.mjs +148 -7
  53. package/scripts/playwright-install-deps.sh +40 -0
@@ -122,10 +122,23 @@ export interface TagMethodsOptions {
122
122
  * `default` and `remote` handlers.
123
123
  */
124
124
  export declare function tagMethods(tags: TrackedTagMarkers, options?: TagMethodsOptions): Pick<CacheHandler, "refreshTags" | "updateTags">;
125
+ /**
126
+ * Run a cache handler method's work outside the request that called it
127
+ * ({@link TrackedTagMarkers.outsideRender}). Next.js awaits these methods
128
+ * inside a staged render, and 16.4 ends the render's static stage on any
129
+ * `Date.now()`, `new Date()`, `Math.random()` or `crypto` random call made in
130
+ * the request's context during it: ours, the AWS SDK's (request signing,
131
+ * invocation ids) and `debug`'s alike. A draft mode page, rendered whole at
132
+ * request time, lost its static stage that way to `refreshTags`, so the client
133
+ * cached nothing from its HTML. Creating the manifest is in here too: the
134
+ * first handler call of a process does it, inside a render.
135
+ */
136
+ export declare function outsideRender<T>(fn: () => T): T;
125
137
  /**
126
138
  * A handler built by `create` on first use rather than on import, so loading
127
139
  * the module - which jest, and Next.js's config validation, do without using
128
140
  * it - neither constructs AWS clients nor warns about missing configuration.
141
+ * Every method runs {@link outsideRender}.
129
142
  */
130
143
  export declare function lazyHandler(create: () => CacheHandler): CacheHandler;
131
144
  /**
@@ -13,6 +13,7 @@ exports.isDynamicEntry = isDynamicEntry;
13
13
  exports.isPastRevalidate = isPastRevalidate;
14
14
  exports.awaitIf = awaitIf;
15
15
  exports.tagMethods = tagMethods;
16
+ exports.outsideRender = outsideRender;
16
17
  exports.lazyHandler = lazyHandler;
17
18
  exports.sharedTagManifest = sharedTagManifest;
18
19
  /*
@@ -290,20 +291,35 @@ function tagMethods(tags, options = {}) {
290
291
  },
291
292
  };
292
293
  }
294
+ /**
295
+ * Run a cache handler method's work outside the request that called it
296
+ * ({@link TrackedTagMarkers.outsideRender}). Next.js awaits these methods
297
+ * inside a staged render, and 16.4 ends the render's static stage on any
298
+ * `Date.now()`, `new Date()`, `Math.random()` or `crypto` random call made in
299
+ * the request's context during it: ours, the AWS SDK's (request signing,
300
+ * invocation ids) and `debug`'s alike. A draft mode page, rendered whole at
301
+ * request time, lost its static stage that way to `refreshTags`, so the client
302
+ * cached nothing from its HTML. Creating the manifest is in here too: the
303
+ * first handler call of a process does it, inside a render.
304
+ */
305
+ function outsideRender(fn) {
306
+ return (0, tag_manifest_1.outsideRequest)(sharedTagManifest).outsideRender(fn);
307
+ }
293
308
  /**
294
309
  * A handler built by `create` on first use rather than on import, so loading
295
310
  * the module - which jest, and Next.js's config validation, do without using
296
311
  * it - neither constructs AWS clients nor warns about missing configuration.
312
+ * Every method runs {@link outsideRender}.
297
313
  */
298
314
  function lazyHandler(create) {
299
315
  let handler;
300
316
  const instance = () => (handler ??= create());
301
317
  return {
302
- get: (cacheKey, softTags) => instance().get(cacheKey, softTags),
303
- set: (cacheKey, pendingEntry) => instance().set(cacheKey, pendingEntry),
304
- refreshTags: () => instance().refreshTags(),
305
- getExpiration: (tags) => instance().getExpiration(tags),
306
- updateTags: (tags, durations) => instance().updateTags(tags, durations),
318
+ get: (cacheKey, softTags) => outsideRender(() => instance().get(cacheKey, softTags)),
319
+ set: (cacheKey, pendingEntry) => outsideRender(() => instance().set(cacheKey, pendingEntry)),
320
+ refreshTags: () => outsideRender(() => instance().refreshTags()),
321
+ getExpiration: (tags) => outsideRender(() => instance().getExpiration(tags)),
322
+ updateTags: (tags, durations) => outsideRender(() => instance().updateTags(tags, durations)),
307
323
  };
308
324
  }
309
325
  /**
@@ -354,4 +370,4 @@ function sharedTagManifest() {
354
370
  }
355
371
  return global[tag_manifest_1.TAG_MANIFEST_SYMBOL];
356
372
  }
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWNvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3VzZS1jYWNoZS1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBMEJBLG9DQUVDO0FBR0Qsc0NBSUM7QUFrQkQsZ0NBcUJDO0FBR0Qsc0NBS0M7QUFHRCxvQ0FnQkM7QUFPRCx3Q0FFQztBQXlKRCw0Q0FFQztBQW1CRCwwQkFXQztBQWVELGdDQTRCQztBQU9ELGtDQVVDO0FBYUQsOENBd0NDO0FBeFpEOzs7Ozs7RUFNRTtBQUNGLHNEQUFzRDtBQUN0RCw4REFBMEQ7QUFDMUQsa0RBQTZCO0FBSzdCLHVEQU0yQjtBQUMzQiwwREFBOEQ7QUFFOUQscURBQXVEO0FBQTlDLHNHQUFBLFdBQVcsT0FBTztBQUUzQiwwRUFBMEU7QUFDMUUsU0FBZ0IsWUFBWTtJQUMxQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLHdCQUF3QixDQUFDO0FBQzdELENBQUM7QUFFRCw4REFBOEQ7QUFDOUQsU0FBZ0IsYUFBYSxDQUFDLElBQVksRUFBRSxRQUFnQjtJQUMxRCxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ2pFLENBQUM7QUFVRDs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLFVBQVUsQ0FDOUIsTUFBa0M7SUFFbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7SUFDaEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsU0FBUyxDQUFDO1FBQ1IsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTTtRQUNSLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQzNCLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCwyRUFBMkU7QUFDcEUsS0FBSyxVQUFVLGFBQWEsQ0FDakMsWUFBaUM7SUFFakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7SUFDakMsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM1RCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQWdCLFlBQVksQ0FDMUIsTUFBbUIsRUFDbkIsYUFBcUIsTUFBTSxDQUFDLFVBQVU7SUFFdEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUMzQixPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsVUFBVTtRQUNWLEtBQUssRUFBRSxJQUFJLGNBQWMsQ0FBYTtZQUNwQyxLQUFLLENBQUMsVUFBVTtnQkFDZCxxRUFBcUU7Z0JBQ3JFLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ2xDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNyQixDQUFDO1NBQ0YsQ0FBQztLQUNILENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxLQUFpQztJQUM5RCxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQWEsV0FBVztJQUNMLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUU1RCxxREFBcUQ7SUFDckQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFXO1FBQ3BCLEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pFLE1BQU0sQ0FBQyxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsR0FBVztRQUNmLElBQUksT0FBTyxHQUFlLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQUNuQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDL0IsT0FBTyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzQixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF6QkQsa0NBeUJDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFFBQVE7SUFVVTtJQVRaLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztJQUNsRCxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCOzs7O09BSUc7SUFDSyxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBRTFCLFlBQTZCLFFBQWdCO1FBQWhCLGFBQVEsR0FBUixRQUFRLENBQVE7SUFBRyxDQUFDO0lBRWpELEdBQUcsQ0FBQyxHQUFXO1FBQ2IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLDZDQUE2QztZQUM3QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBa0I7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6QixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZSxDQUFDLEVBQUUsR0FBRyxDQUFDLFFBQVE7UUFDNUIsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUTtRQUN4QixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTTtZQUNSLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEVBQVU7UUFDbEIsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUF6R0QsNEJBeUdDO0FBRUQsU0FBUyxNQUFNLENBQUMsR0FBVyxFQUFFLEtBQWtCO0lBQzdDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUM3QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELFNBQWdCLGdCQUFnQixDQUFDLE1BQW1CLEVBQUUsRUFBVTtJQUM5RCxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQzFELENBQUM7QUFFRCw2RUFBNkU7QUFDaEUsUUFBQSxvQkFBb0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUVyRDs7Ozs7OztHQU9HO0FBQ1UsUUFBQSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFFakQ7OztHQUdHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FDM0IsSUFBYSxFQUNiLElBQW1CLEVBQ25CLE9BQWU7SUFFZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ1QsTUFBTSxNQUFNLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQVdEOzs7R0FHRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsSUFBdUIsRUFDdkIsVUFBNkIsRUFBRTtJQUUvQixPQUFPO1FBQ0wsd0VBQXdFO1FBQ3hFLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UscUVBQXFFO1FBQ3JFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UscUVBQXFFO1FBQ3JFLHFFQUFxRTtRQUNyRSx5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSx3RUFBd0U7UUFDeEUsd0VBQXdFO1FBQ3hFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FDaEIsT0FBTyxDQUNMLE9BQU8sQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQ3ZFLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFDZCw4QkFBOEIsQ0FDL0I7UUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxTQUFTO1lBQ3pDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEQsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxNQUEwQjtJQUNwRCxJQUFJLE9BQWlDLENBQUM7SUFDdEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxPQUFPO1FBQ0wsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7UUFDL0QsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUM7UUFDdkUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRTtRQUMzQyxhQUFhLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFDdkQsVUFBVSxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7S0FDeEUsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsaUJBQWlCO0lBQy9CLE1BQU0sTUFBTSxHQUFHLFVBQTJELENBQUM7SUFDM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBQSx1Q0FBcUIsR0FBRSxDQUFDO1FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUNyQywyQkFBMkIsRUFDM0Isd0NBQXNCLENBQ3ZCLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksZ0NBQWMsQ0FBQztnQkFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNyQixzRUFBc0U7Z0JBQ3RFLDZEQUE2RDtnQkFDN0QsbUVBQW1FO2dCQUNuRSxjQUFjLEVBQUU7b0JBQ2QsY0FBYyxFQUFFLG9DQUE0QjtvQkFDNUMscUJBQXFCLEVBQUUsSUFBSTtvQkFDM0IsYUFBYSxFQUFFLG9DQUE0QjtpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsa0NBQW1CLENBQUMsR0FBRyxJQUFJLG1DQUFpQixDQUFDO2dCQUNsRCxPQUFPLEVBQUUsSUFBSSxnQ0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ3JFLEdBQUcsRUFBRSxJQUFJLGlDQUFlLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDbEUsaUJBQWlCO2dCQUNqQixLQUFLLEVBQUUsSUFBQSxlQUFRLEVBQUMsK0JBQStCLENBQUM7Z0JBQ2hELDREQUE0RDtnQkFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssU0FBUzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsSUFBSSxDQUNWLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQjthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLGtDQUFtQixDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFdoYXQgdGhlIHR3byBgY2FjaGVIYW5kbGVyc2AgKGAndXNlIGNhY2hlJ2AgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCkgc2hhcmU6XG4gIHRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmUsIHRoZSBwZW5kaW5nLWBzZXRgIGJvb2trZWVwaW5nIE5leHQuanMgcmVxdWlyZXMgb2ZcbiAgZXZlcnkgaGFuZGxlciwgYW5kIHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdCAoYFRyYWNrZWRUYWdNYXJrZXJzYCksXG4gIHdoaWNoIG1ha2VzIGByZXZhbGlkYXRlVGFnYCByZWFjaCBldmVyeSBpbnN0YW5jZSB0aHJvdWdoIHRoZSByZXZhbGlkYXRpb25cbiAgdGFibGUncyBtYXJrZXIgcm93cy5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhhbmRsZXIsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1oYW5kbGVycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQgeyBUQUdfTUFOSUZFU1RfU1lNQk9MIH0gZnJvbSBcIi4uL3J1bnRpbWUvdGFnLW1hbmlmZXN0XCI7XG5cbmV4cG9ydCB7IG1hcmtlckNsb2NrIGFzIG5vdyB9IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogV2hldGhlciB0aGlzIHByb2Nlc3MgaXMgYG5leHQgYnVpbGRgIHJhdGhlciB0aGFuIGEgZGVwbG95ZWQgc2VydmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbGRQaGFzZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPT09IFwicGhhc2UtcHJvZHVjdGlvbi1idWlsZFwiO1xufVxuXG4vKiogQSBwb3NpdGl2ZSBpbnRlZ2VyIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBgZmFsbGJhY2tgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZyb21FbnYobmFtZTogc3RyaW5nLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGNvbnN0IHZhbHVlID0gcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBcIlwiID8gTmFOIDogTnVtYmVyKHJhdyk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDAgPyB2YWx1ZSA6IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIEEgYENhY2hlRW50cnlgIHdpdGggaXRzIHZhbHVlIHJlYWQgdG8gdGhlIGVuZDogdGhlIGJ5dGVzIGFyZSB3aGF0IGlzIGtlcHQsXG4gKiBhbmQgZXZlcnkgYGdldGAgaGFuZHMgb3V0IGEgZnJlc2ggc3RyZWFtIG92ZXIgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRFbnRyeSBleHRlbmRzIE9taXQ8Q2FjaGVFbnRyeSwgXCJ2YWx1ZVwiPiB7XG4gIHZhbHVlOiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIFJlYWQgYHN0cmVhbWAgdG8gdGhlIGVuZCwgb3IgdGhyb3cgaWYgaXQgZXJyb3JzLlxuICpcbiAqIGBDYWNoZUVudHJ5LnZhbHVlYCBcImNhbiBlcnJvciBhbmQgb25seSBoYXZlIHBhcnRpYWwgZGF0YVwiIChOZXh0LmpzJ3NcbiAqIGBjYWNoZS1oYW5kbGVycy90eXBlcy5kLnRzYCkuIFRocm93aW5nIGlzIGhvdyBhIHBhcnRpYWwgZW50cnkgaXMga2VwdCBvdXQ6XG4gKiBib3RoIGhhbmRsZXJzIHN0b3JlIG5vdGhpbmcgd2hlbiB0aGlzIHJlamVjdHMsIHdoaWNoIGlzIHdoYXQgTmV4dC5qcydzIG93blxuICogZGVmYXVsdCBoYW5kbGVyIGRvZXMgdG9vLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbShcbiAgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pixcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBzaXplID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgc2l6ZSArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICB9XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGJ5dGVzLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKiBgcGVuZGluZ0VudHJ5YCByZXNvbHZlZCBhbmQgcmVhZCB0byB0aGUgZW5kLiBTZWUge0BsaW5rIHJlYWRTdHJlYW19LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3JlZEVudHJ5T2YoXG4gIHBlbmRpbmdFbnRyeTogUHJvbWlzZTxDYWNoZUVudHJ5Pixcbik6IFByb21pc2U8U3RvcmVkRW50cnk+IHtcbiAgY29uc3QgZW50cnkgPSBhd2FpdCBwZW5kaW5nRW50cnk7XG4gIHJldHVybiB7IC4uLmVudHJ5LCB2YWx1ZTogYXdhaXQgcmVhZFN0cmVhbShlbnRyeS52YWx1ZSkgfTtcbn1cblxuLyoqIGBzdG9yZWRgIGFzIHRoZSBgQ2FjaGVFbnRyeWAgYSBgZ2V0YCByZXR1cm5zLCB3aXRoIGl0cyBvd24gc3RyZWFtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlRW50cnlPZihcbiAgc3RvcmVkOiBTdG9yZWRFbnRyeSxcbiAgcmV2YWxpZGF0ZTogbnVtYmVyID0gc3RvcmVkLnJldmFsaWRhdGUsXG4pOiBDYWNoZUVudHJ5IHtcbiAgY29uc3QgYnl0ZXMgPSBzdG9yZWQudmFsdWU7XG4gIHJldHVybiB7XG4gICAgLi4uc3RvcmVkLFxuICAgIHJldmFsaWRhdGUsXG4gICAgdmFsdWU6IG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIC8vIEEgY29weTogd2hvZXZlciByZWFkcyB0aGUgc3RyZWFtIG1heSB0cmFuc2ZlciBvciBtdXRhdGUgdGhlIGNodW5rLlxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnl0ZXMuc2xpY2UoKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBOZXh0LmpzIHdvdWxkIHJlZ2VuZXJhdGUgYGVudHJ5YCBvbiBldmVyeSByZWFkIGFueXdheSwgc28gc3RvcmluZyBpdFxuICogaXMgYSB3cml0ZSBub3RoaW5nIHJlYWRzIGJhY2suIE5leHQuanMncyBkZWZhdWx0IGhhbmRsZXIgc2tpcHMgdGhlc2UgdGhlIHNhbWVcbiAqIHdheSwgb3V0c2lkZSB0aGUgZGV2IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY0VudHJ5KGVudHJ5OiBQaWNrPENhY2hlRW50cnksIFwiZXhwaXJlXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiBlbnRyeS5leHBpcmUgPT09IDA7XG59XG5cbi8qKlxuICogVGhlIGluLWZsaWdodCBgc2V0YHMsIGJ5IGNhY2hlIGtleS4gYENhY2hlSGFuZGxlci5zZXRgIHJlY2VpdmVzIGFuIGVudHJ5IHRoYXRcbiAqIG1heSBzdGlsbCBiZSBzdHJlYW1pbmcsIGFuZCBcImlmIGEgYGdldGAgZm9yIHRoZSBzYW1lIGNhY2hlIGtleSBpcyBjYWxsZWRcbiAqIGJlZm9yZSB0aGUgcGVuZGluZyBlbnRyeSBpcyBjb21wbGV0ZSwgdGhlIGNhY2hlIGhhbmRsZXIgbXVzdCB3YWl0IGZvciB0aGVcbiAqIGBzZXRgIG9wZXJhdGlvbiB0byBmaW5pc2hcIiAoYGNhY2hlLWhhbmRsZXJzL3R5cGVzLmQudHNgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRpbmdTZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbiAgLyoqIFJlc29sdmVzIG9uY2Ugbm8gYHNldGAgZm9yIGBrZXlgIGlzIGluIGZsaWdodC4gKi9cbiAgYXN5bmMgd2FpdChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHAgPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSk7IHA7IHAgPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSkpIHtcbiAgICAgIGF3YWl0IHA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgYHNldGAgZm9yIGBrZXlgIGFuZCByZXR1cm4gdGhlIGZ1bmN0aW9uIHRoYXQgZW5kcyBpdC4gU2FmZSB0b1xuICAgKiBjYWxsIG1vcmUgdGhhbiBvbmNlOiBvbmx5IHRoZSByZWdpc3RyYXRpb24gaXQgbWFkZSBpcyByZW1vdmVkLlxuICAgKi9cbiAgYmVnaW4oa2V5OiBzdHJpbmcpOiAoKSA9PiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gKHJlc29sdmUgPSByKSk7XG4gICAgdGhpcy5wZW5kaW5nLnNldChrZXksIHByb21pc2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChrZXkpID09PSBwcm9taXNlKSB7XG4gICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3RvcmVkIGVudHJpZXMgYnkgY2FjaGUga2V5LCBsZWFzdCByZWNlbnRseSB1c2VkIGV2aWN0ZWQgZmlyc3Qgb25jZSB0aGVpclxuICogYnl0ZXMgcGFzcyBgbWF4Qnl0ZXNgLiBTaXplZCBieSBieXRlcyByYXRoZXIgdGhhbiBlbnRyaWVzLCBsaWtlIE5leHQuanMnc1xuICogZGVmYXVsdCBoYW5kbGVyIChgY2FjaGVNYXhNZW1vcnlTaXplYCwgNTAgTUIpLCBzaW5jZSBhIGAndXNlIGNhY2hlJ2AgZW50cnkgaXNcbiAqIGFuIFJTQyBwYXlsb2FkIG9mIGFueSBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgRW50cnlMcnUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgU3RvcmVkRW50cnk+KCk7XG4gIHByaXZhdGUgYnl0ZXMgPSAwO1xuICAvKipcbiAgICogTm8gbGF0ZXIgdGhhbiB0aGUgb2xkZXN0IGVudHJ5J3MgYHRpbWVzdGFtcGA6IHRoZSBsYXN0IHNjYW4ncyBhbnN3ZXIsIGxlc3NcbiAgICogd2hhdGV2ZXIgd2FzIHNldCBzaW5jZS4gRW50cmllcyBkcm9wcGVkIHNpbmNlIG9ubHkgbWFrZSBpdCBlYXJseS4gU2VlXG4gICAqIHtAbGluayBvbGRlc3RCb3VuZH0uXG4gICAqL1xuICBwcml2YXRlIGxvd2VzdCA9IEluZmluaXR5O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWF4Qnl0ZXM6IG51bWJlcikge31cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBTdG9yZWRFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICAvLyBSZS1pbnNlcnRlZCB0byBtYXJrIGl0IG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgZW50cnk6IFN0b3JlZEVudHJ5KTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICBjb25zdCBzaXplID0gc2l6ZU9mKGtleSwgZW50cnkpO1xuICAgIGlmIChzaXplID4gdGhpcy5tYXhCeXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgZW50cnkpO1xuICAgIHRoaXMuYnl0ZXMgKz0gc2l6ZTtcbiAgICB0aGlzLmxvd2VzdCA9IE1hdGgubWluKHRoaXMubG93ZXN0LCBlbnRyeS50aW1lc3RhbXApO1xuICAgIGZvciAoY29uc3QgW29sZGVzdEtleSwgb2xkZXN0XSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmICh0aGlzLmJ5dGVzIDw9IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKG9sZGVzdEtleSk7XG4gICAgICB0aGlzLmJ5dGVzIC09IHNpemVPZihvbGRlc3RLZXksIG9sZGVzdCk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmJ5dGVzIC09IHNpemVPZihrZXksIGV4aXN0aW5nKTtcbiAgICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmxvd2VzdCA9IEluZmluaXR5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYHRpbWVzdGFtcGAgb2YgdGhlIG9sZGVzdCBlbnRyeSBoZWxkLCBgSW5maW5pdHlgIHdpdGggbm9uZSwgZHJvcHBpbmdcbiAgICogb24gdGhlIHdheSB0aGUgZW50cmllcyBwYXN0IGByZXZhbGlkYXRlYCBhdCBgYXRgIChgbm93KClgKTogYSBoYW5kbGVyXG4gICAqIHRoYXQgZHJvcHMgdGhlbSB3aGVuIG5leHQgcmVhZCB3b3VsZCBvdGhlcndpc2UgaG9sZCB0aGVtIHVudGlsIHRoZW4sIGFuZFxuICAgKiB0aGV5IHdvdWxkIGNvdW50IGhlcmUgbWVhbndoaWxlLiBBIHNjYW4sIHNvIGFza2VkIG9uY2UgaW4gYSB3aGlsZTogaW5cbiAgICogYmV0d2Vlbiwge0BsaW5rIG9sZGVzdEJvdW5kfSBhbnN3ZXJzLlxuICAgKi9cbiAgb2xkZXN0VGltZXN0YW1wKGF0ID0gLUluZmluaXR5KTogbnVtYmVyIHtcbiAgICBsZXQgb2xkZXN0ID0gSW5maW5pdHk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAoaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRlc3QgPSBNYXRoLm1pbihvbGRlc3QsIGVudHJ5LnRpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG93ZXN0ID0gb2xkZXN0O1xuICAgIHJldHVybiBvbGRlc3Q7XG4gIH1cblxuICAvKipcbiAgICogTm8gbGF0ZXIgdGhhbiB7QGxpbmsgb2xkZXN0VGltZXN0YW1wfSwgd2l0aG91dCBpdHMgc2NhbjogYXMgb2YgdGhlIGxhc3RcbiAgICogb25lLCBsZXNzIHRoZSBlbnRyaWVzIHNldCBzaW5jZS4gYEluZmluaXR5YCB3aXRoIG5vbmUgaGVsZC4gRHJvcHMgdGhlXG4gICAqIGVudHJpZXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCBmcm9tIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGVuZCwgdXAgdG9cbiAgICogdGhlIGZpcnN0IHRoYXQgaXNuJ3QsIHNvIHtAbGluayBob2xkc0xpdmV9IGRvZXNuJ3Qgd2FsayBwYXN0IHRoZW0gb24gZXZlcnlcbiAgICogcmVxdWVzdCB1bnRpbCB0aGUgbmV4dCBzY2FuLlxuICAgKi9cbiAgb2xkZXN0Qm91bmQoYXQgPSAtSW5maW5pdHkpOiBudW1iZXIge1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKCFpc1Bhc3RSZXZhbGlkYXRlKGVudHJ5LCBhdCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLnNpemUgPT09IDAgPyBJbmZpbml0eSA6IHRoaXMubG93ZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gZW50cnkgbm90IHBhc3QgYHJldmFsaWRhdGVgIGF0IGBhdGAgaXMgaGVsZC4gVXN1YWxseSB0aGUgZmlyc3RcbiAgICogZW50cnkgYW5zd2VyczsgdGhlIGV4cGlyZWQgb25lcyBpdCBwYXNzZXMgYXJlIGRyb3BwZWQgYnkgdGhlIHNjYW5cbiAgICoge0BsaW5rIG9sZGVzdFRpbWVzdGFtcH0gbWFrZXMsIG5vdCBoZXJlLCBzbyBhc2tpbmcgY2hhbmdlcyBub3RoaW5nLlxuICAgKi9cbiAgaG9sZHNMaXZlKGF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFpc1Bhc3RSZXZhbGlkYXRlKGVudHJ5LCBhdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldCBzaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5zaXplO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNpemVPZihrZXk6IHN0cmluZywgZW50cnk6IFN0b3JlZEVudHJ5KTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudHJ5LnZhbHVlLmJ5dGVMZW5ndGggKyBrZXkubGVuZ3RoO1xufVxuXG4vKiogV2hldGhlciBgc3RvcmVkYCBpcyBwYXN0IGByZXZhbGlkYXRlYCBhdCBgYXRgIChgbm93KClgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Bhc3RSZXZhbGlkYXRlKHN0b3JlZDogU3RvcmVkRW50cnksIGF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGF0ID4gc3RvcmVkLnRpbWVzdGFtcCArIHN0b3JlZC5yZXZhbGlkYXRlICogMTAwMDtcbn1cblxuLyoqIERlZmF1bHQgc2l6ZSBvZiBlYWNoIGhhbmRsZXIncyBtZW1vcnkgc3RvcmU6IE5leHQuanMncyBkZWZhdWx0LCA1MCBNQi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01FTU9SWV9CWVRFUyA9IDUwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogSG93IGxvbmcgb25lIHJldmFsaWRhdGlvbiB0YWJsZSByZXF1ZXN0IG1heSB0YWtlLCBwZXIgYXR0ZW1wdC4gVGhlIFNESyBzZXRzXG4gKiBubyBsaW1pdCwgYW5kIGEgcmVmcmVzaCBsZWZ0IGluIGZsaWdodCBhY3Jvc3MgYSBMYW1iZGEgZnJlZXplIGNhbiBzaXQgb24gYVxuICogY29ubmVjdGlvbiB0aGF0IGRpZWQgbWVhbndoaWxlIHdpdGhvdXQgYSByZXNldDogZXZlcnkgcmVxdWVzdCB0aGF0IHdhaXRzXG4gKiBmb3IgdGhlIHJlZnJlc2ggKGFuIGluc3RhbmNlIGBiZWhpbmRgLCBJU1IpIHdvdWxkIHdhaXQgd2l0aCBpdC4gVGhlIFNES1xuICogcmV0cmllcyBhIHRpbWVkLW91dCBhdHRlbXB0LCBzbyBhIGRlYWQgY29ubmVjdGlvbiBjb3N0cyB1cCB0byBpdHMgYXR0ZW1wdHNcbiAqIHRpbWVzIHRoaXMuXG4gKi9cbmV4cG9ydCBjb25zdCBUQUdfVEFCTEVfUkVRVUVTVF9USU1FT1VUX01TID0gMzAwMDtcblxuLyoqXG4gKiBXYWl0IGZvciBgd29ya2AgaWYgYHdhaXRgLCBvciBlbHNlIGxldCBpdCBydW4gb246IGVpdGhlciB3YXkgYSByZWplY3Rpb24gaXNcbiAqIGxvZ2dlZCB3aXRoIGBmYWlsdXJlYCByYXRoZXIgdGhhbiB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdElmKFxuICB3YWl0OiBib29sZWFuLFxuICB3b3JrOiBQcm9taXNlPHZvaWQ+LFxuICBmYWlsdXJlOiBzdHJpbmcsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9nZ2VkID0gd29yay5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGZhaWx1cmUsIGVycm9yKTtcbiAgfSk7XG4gIGlmICh3YWl0KSB7XG4gICAgYXdhaXQgbG9nZ2VkO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFnTWV0aG9kc09wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBgcmVmcmVzaFRhZ3NgIGFsd2F5cyB3YWl0cyBmb3IgdGhlIHJldmFsaWRhdGlvbiBsb2cgcXVlcnksIHJhdGhlclxuICAgKiB0aGFuIG9ubHkgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYGJlaGluZGAuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBibG9ja2luZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIGBjYWNoZUhhbmRsZXJzYCBtZXRob2RzIHRoYXQgb25seSBnbyB0aHJvdWdoIGB0YWdzYCwgdGhlIHNhbWUgZm9yIHRoZVxuICogYGRlZmF1bHRgIGFuZCBgcmVtb3RlYCBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRhZ01ldGhvZHMoXG4gIHRhZ3M6IFRyYWNrZWRUYWdNYXJrZXJzLFxuICBvcHRpb25zOiBUYWdNZXRob2RzT3B0aW9ucyA9IHt9LFxuKTogUGljazxDYWNoZUhhbmRsZXIsIFwicmVmcmVzaFRhZ3NcIiB8IFwidXBkYXRlVGFnc1wiPiB7XG4gIHJldHVybiB7XG4gICAgLy8gU3RhcnRlZCwgbm90IGF3YWl0ZWQsIHdoaWxlIHRoZSBpbnN0YW5jZSBrZWVwcyB1cCwgdW5sZXNzIGBibG9ja2luZ2AuXG4gICAgLy8gTmV4dC5qcyBhd2FpdHMgYHJlZnJlc2hUYWdzYCBpbnNpZGUgdGhlIGZpcnN0IGAndXNlIGNhY2hlJ2AgbG9va3VwIG9mIGFcbiAgICAvLyByZXF1ZXN0IChgdXNlLWNhY2hlLXdyYXBwZXJgKSwgYW5kIGEgc3RhZ2VkIHJlbmRlciBlbmRzIGl0cyBzdGF0aWMgc3RhZ2VcbiAgICAvLyBvbiBhIHRpbWVyOiBhIGxvZyBgUXVlcnlgIHRoZXJlIHB1c2hlZCB0aGUgZW50cnkgb3V0IG9mIHRoZSBzdGF0aWNcbiAgICAvLyBzdGFnZSwgc28gYSBjYWNoZWQgbmF2aWdhdGlvbiBzdG9yZWQgdGhlIHBhZ2Ugc2VnbWVudCB3aXRob3V0IGl0LiBXaGF0XG4gICAgLy8gdGhlIHF1ZXJ5IGZpbmRzIGFwcGxpZXMgZnJvbSB0aGUgbmV4dCByZXF1ZXN0LiBBd2FpdGVkIG9uY2UgdGhlIGluc3RhbmNlXG4gICAgLy8gaXMgYGJlaGluZGAsIHdoaWNoIHRoZSBydW50aW1lIHNldHRsZXMgYmVmb3JlIGEgcGFnZSByZW5kZXIgc3RhcnRzXG4gICAgLy8gKGBjYXRjaFVwYCk6IHRoZSBmaXJzdCByZXF1ZXN0IGFmdGVyIGFuIGlkbGUgb3IgZnJvemVuIHNwZWxsIHdvdWxkXG4gICAgLy8gb3RoZXJ3aXNlIHNlcnZlIHdoYXRldmVyIHdhcyByZXZhbGlkYXRlZCBlbHNld2hlcmUgbWVhbndoaWxlLiBBIHBhZ2Unc1xuICAgIC8vIHJlbmRlciBqdXN0IGFmdGVyIGBjYXRjaFVwYCBnZXRzIGEgZ3JhY2UgbW9yZSAoYGJlaGluZEluUmVuZGVyYCksIHNvIGFcbiAgICAvLyByZXF1ZXN0IHRoYXQgY2FtZSBpbiBqdXN0IHNob3J0IG9mIHRoZSBsaW5lIGRvZXNuJ3QgY3Jvc3MgaXQgaW5zaWRlXG4gICAgLy8gdGhlIHJlbmRlci4gTm90IGV2ZW4gdGhlbiB3aGlsZSB0aGUgaW5zdGFuY2UgaG9sZHMgbm8gZW50cnkgdGhlIHF1ZXJ5XG4gICAgLy8gY291bGQgZXhwaXJlIChgaG9sZHNFbnRyaWVzYCksIHdpdGggYSBgcmVmcmVzaEludGVydmFsTXNgIG9mIGAwYCB0b28uXG4gICAgcmVmcmVzaFRhZ3M6ICgpID0+XG4gICAgICBhd2FpdElmKFxuICAgICAgICBvcHRpb25zLmJsb2NraW5nID09PSB0cnVlIHx8ICh0YWdzLmJlaGluZEluUmVuZGVyICYmIHRhZ3MuaG9sZHNFbnRyaWVzKSxcbiAgICAgICAgdGFncy5yZWZyZXNoKCksXG4gICAgICAgIFwiRXJyb3IgcmVmcmVzaGluZyBjYWNoZSB0YWdzOlwiLFxuICAgICAgKSxcbiAgICBhc3luYyB1cGRhdGVUYWdzKHJldmFsaWRhdGVkVGFncywgZHVyYXRpb25zKSB7XG4gICAgICBhd2FpdCB0YWdzLnVwZGF0ZShyZXZhbGlkYXRlZFRhZ3MsIGR1cmF0aW9ucyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgYnVpbHQgYnkgYGNyZWF0ZWAgb24gZmlyc3QgdXNlIHJhdGhlciB0aGFuIG9uIGltcG9ydCwgc28gbG9hZGluZ1xuICogdGhlIG1vZHVsZSAtIHdoaWNoIGplc3QsIGFuZCBOZXh0LmpzJ3MgY29uZmlnIHZhbGlkYXRpb24sIGRvIHdpdGhvdXQgdXNpbmdcbiAqIGl0IC0gbmVpdGhlciBjb25zdHJ1Y3RzIEFXUyBjbGllbnRzIG5vciB3YXJucyBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5SGFuZGxlcihjcmVhdGU6ICgpID0+IENhY2hlSGFuZGxlcik6IENhY2hlSGFuZGxlciB7XG4gIGxldCBoYW5kbGVyOiBDYWNoZUhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGluc3RhbmNlID0gKCkgPT4gKGhhbmRsZXIgPz89IGNyZWF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQ6IChjYWNoZUtleSwgc29mdFRhZ3MpID0+IGluc3RhbmNlKCkuZ2V0KGNhY2hlS2V5LCBzb2Z0VGFncyksXG4gICAgc2V0OiAoY2FjaGVLZXksIHBlbmRpbmdFbnRyeSkgPT4gaW5zdGFuY2UoKS5zZXQoY2FjaGVLZXksIHBlbmRpbmdFbnRyeSksXG4gICAgcmVmcmVzaFRhZ3M6ICgpID0+IGluc3RhbmNlKCkucmVmcmVzaFRhZ3MoKSxcbiAgICBnZXRFeHBpcmF0aW9uOiAodGFncykgPT4gaW5zdGFuY2UoKS5nZXRFeHBpcmF0aW9uKHRhZ3MpLFxuICAgIHVwZGF0ZVRhZ3M6ICh0YWdzLCBkdXJhdGlvbnMpID0+IGluc3RhbmNlKCkudXBkYXRlVGFncyh0YWdzLCBkdXJhdGlvbnMpLFxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwcm9jZXNzJ3Mgb25lIHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30sIGZyb20gdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEtlcHQgb24gYGdsb2JhbFRoaXNgIGJlY2F1c2UgdGhlIGluY3JlbWVudGFsIGNhY2hlIGhhbmRsZXIgYW5kIHRoZSBgZGVmYXVsdGBcbiAqIGFuZCBgcmVtb3RlYCBoYW5kbGVycyBhcmUgc2VwYXJhdGUgYnVuZGxlcyAtIHNlcGFyYXRlIG1vZHVsZSBpbnN0YW5jZXMgLSBhbmRcbiAqIHNob3VsZCBzaGFyZSBvbmUgbWFuaWZlc3Q6IG9uZSByZWZyZXNoIHJlYWQgZm9yIGFsbCBvZiB0aGVtLCBhbmQgb25lIG1hcmtlclxuICogd3JpdGUgcGVyIGByZXZhbGlkYXRlVGFnYC5cbiAqXG4gKiBBdCBidWlsZCB0aW1lIHRoZXJlIGlzIG5vIHRhYmxlIHRvIHJlYWQgKGFuZCBubyBjcmVkZW50aWFscyB0byByZWFkIGl0XG4gKiB3aXRoKSwgc28gdGFncyBzdGF5IGxvY2FsIHRvIHRoZSBwcm9jZXNzIHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkVGFnTWFuaWZlc3QoKTogVHJhY2tlZFRhZ01hcmtlcnMge1xuICBjb25zdCBnbG9iYWwgPSBnbG9iYWxUaGlzIGFzIHsgW1RBR19NQU5JRkVTVF9TWU1CT0xdPzogVHJhY2tlZFRhZ01hcmtlcnMgfTtcbiAgaWYgKCFnbG9iYWxbVEFHX01BTklGRVNUX1NZTUJPTF0pIHtcbiAgICBjb25zdCBjb25maWcgPSByZXNvbHZlQXdzQ2FjaGVDb25maWcoKTtcbiAgICBjb25zdCByZWZyZXNoSW50ZXJ2YWxNcyA9IG51bWJlckZyb21FbnYoXG4gICAgICBcIkNES19ORVhUSlNfVEFHX1JFRlJFU0hfTVNcIixcbiAgICAgIERFRkFVTFRfVEFHX1JFRlJFU0hfTVMsXG4gICAgKTtcbiAgICBpZiAoY29uZmlnLnRhYmxlTmFtZSAmJiAhaXNCdWlsZFBoYXNlKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBEeW5hbW9EQkNsaWVudCh7XG4gICAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgICAgLy8gV2l0aG91dCBgdGhyb3dPblJlcXVlc3RUaW1lb3V0YCB0aGUgdGltZW91dCBvbmx5IGxvZ3MgYSB3YXJuaW5nLiBJdFxuICAgICAgICAvLyBlbmRzIG9uY2UgdGhlIHJlc3BvbnNlIGhlYWRlcnMgYXJyaXZlOiBgc29ja2V0VGltZW91dGAsIGFuXG4gICAgICAgIC8vIGluYWN0aXZpdHkgdGltZXIga2VwdCB1bnRpbCB0aGUgcmVxdWVzdCBjbG9zZXMsIGNvdmVycyB0aGUgYm9keS5cbiAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHtcbiAgICAgICAgICByZXF1ZXN0VGltZW91dDogVEFHX1RBQkxFX1JFUVVFU1RfVElNRU9VVF9NUyxcbiAgICAgICAgICB0aHJvd09uUmVxdWVzdFRpbWVvdXQ6IHRydWUsXG4gICAgICAgICAgc29ja2V0VGltZW91dDogVEFHX1RBQkxFX1JFUVVFU1RfVElNRU9VVF9NUyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgbWFya2VyczogbmV3IFRhZ01hcmtlclRhYmxlKGNsaWVudCwgY29uZmlnLnRhYmxlTmFtZSwgY29uZmlnLmJ1aWxkSWQpLFxuICAgICAgICBsb2c6IG5ldyBSZXZhbGlkYXRpb25Mb2coY2xpZW50LCBjb25maWcudGFibGVOYW1lLCBjb25maWcuYnVpbGRJZCksXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zLFxuICAgICAgICBkZWJ1ZzogZ2V0RGVidWcoXCJjZGstbmV4dGpzOmNhY2hlLWhhbmRsZXI6dGFnc1wiKSxcbiAgICAgICAgLy8gU2V0IGluIGV2ZXJ5IExhbWJkYSBydW50aW1lOyBhIGNvbnRhaW5lciBpcyBuZXZlciBmcm96ZW4uXG4gICAgICAgIGNhbkZyZWV6ZTogcHJvY2Vzcy5lbnYuQVdTX0xBTUJEQV9GVU5DVElPTl9OQU1FICE9PSB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFpc0J1aWxkUGhhc2UoKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsIGNhY2hlIHRhZ3MgYXJlIGxvY2FsIHRvIGVhY2ggaW5zdGFuY2VcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXSA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBnbG9iYWxbVEFHX01BTklGRVNUX1NZTUJPTF07XG59XG4iXX0=
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWNvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3VzZS1jYWNoZS1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBMEJBLG9DQUVDO0FBR0Qsc0NBSUM7QUFrQkQsZ0NBcUJDO0FBR0Qsc0NBS0M7QUFHRCxvQ0FnQkM7QUFPRCx3Q0FFQztBQXlKRCw0Q0FFQztBQW1CRCwwQkFXQztBQWVELGdDQTRCQztBQWFELHNDQUVDO0FBUUQsa0NBY0M7QUFhRCw4Q0F3Q0M7QUE1YUQ7Ozs7OztFQU1FO0FBQ0Ysc0RBQXNEO0FBQ3RELDhEQUEwRDtBQUMxRCxrREFBNkI7QUFLN0IsdURBTTJCO0FBQzNCLDBEQUE4RTtBQUU5RSxxREFBdUQ7QUFBOUMsc0dBQUEsV0FBVyxPQUFPO0FBRTNCLDBFQUEwRTtBQUMxRSxTQUFnQixZQUFZO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssd0JBQXdCLENBQUM7QUFDN0QsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFnQixhQUFhLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDakUsQ0FBQztBQVVEOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFrQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFN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Q0FBQztnQkFDbEUsaUJBQWlCO2dCQUNqQixLQUFLLEVBQUUsSUFBQSxlQUFRLEVBQUMsK0JBQStCLENBQUM7Z0JBQ2hELDREQUE0RDtnQkFDNUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEtBQUssU0FBUzthQUM5RCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsSUFBSSxDQUNWLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sQ0FBQyxrQ0FBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQjthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLGtDQUFtQixDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFdoYXQgdGhlIHR3byBgY2FjaGVIYW5kbGVyc2AgKGAndXNlIGNhY2hlJ2AgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCkgc2hhcmU6XG4gIHRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmUsIHRoZSBwZW5kaW5nLWBzZXRgIGJvb2trZWVwaW5nIE5leHQuanMgcmVxdWlyZXMgb2ZcbiAgZXZlcnkgaGFuZGxlciwgYW5kIHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdCAoYFRyYWNrZWRUYWdNYXJrZXJzYCksXG4gIHdoaWNoIG1ha2VzIGByZXZhbGlkYXRlVGFnYCByZWFjaCBldmVyeSBpbnN0YW5jZSB0aHJvdWdoIHRoZSByZXZhbGlkYXRpb25cbiAgdGFibGUncyBtYXJrZXIgcm93cy5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhhbmRsZXIsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1oYW5kbGVycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5pbXBvcnQgeyBvdXRzaWRlUmVxdWVzdCwgVEFHX01BTklGRVNUX1NZTUJPTCB9IGZyb20gXCIuLi9ydW50aW1lL3RhZy1tYW5pZmVzdFwiO1xuXG5leHBvcnQgeyBtYXJrZXJDbG9jayBhcyBub3cgfSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcblxuLyoqIFdoZXRoZXIgdGhpcyBwcm9jZXNzIGlzIGBuZXh0IGJ1aWxkYCByYXRoZXIgdGhhbiBhIGRlcGxveWVkIHNlcnZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J1aWxkUGhhc2UoKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5ORVhUX1BIQVNFID09PSBcInBoYXNlLXByb2R1Y3Rpb24tYnVpbGRcIjtcbn1cblxuLyoqIEEgcG9zaXRpdmUgaW50ZWdlciBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgYGZhbGxiYWNrYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGcm9tRW52KG5hbWU6IHN0cmluZywgZmFsbGJhY2s6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBjb25zdCB2YWx1ZSA9IHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gXCJcIiA/IE5hTiA6IE51bWJlcihyYXcpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHZhbHVlKSAmJiB2YWx1ZSA+PSAwID8gdmFsdWUgOiBmYWxsYmFjaztcbn1cblxuLyoqXG4gKiBBIGBDYWNoZUVudHJ5YCB3aXRoIGl0cyB2YWx1ZSByZWFkIHRvIHRoZSBlbmQ6IHRoZSBieXRlcyBhcmUgd2hhdCBpcyBrZXB0LFxuICogYW5kIGV2ZXJ5IGBnZXRgIGhhbmRzIG91dCBhIGZyZXNoIHN0cmVhbSBvdmVyIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmVkRW50cnkgZXh0ZW5kcyBPbWl0PENhY2hlRW50cnksIFwidmFsdWVcIj4ge1xuICB2YWx1ZTogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZWFkIGBzdHJlYW1gIHRvIHRoZSBlbmQsIG9yIHRocm93IGlmIGl0IGVycm9ycy5cbiAqXG4gKiBgQ2FjaGVFbnRyeS52YWx1ZWAgXCJjYW4gZXJyb3IgYW5kIG9ubHkgaGF2ZSBwYXJ0aWFsIGRhdGFcIiAoTmV4dC5qcydzXG4gKiBgY2FjaGUtaGFuZGxlcnMvdHlwZXMuZC50c2ApLiBUaHJvd2luZyBpcyBob3cgYSBwYXJ0aWFsIGVudHJ5IGlzIGtlcHQgb3V0OlxuICogYm90aCBoYW5kbGVycyBzdG9yZSBub3RoaW5nIHdoZW4gdGhpcyByZWplY3RzLCB3aGljaCBpcyB3aGF0IE5leHQuanMncyBvd25cbiAqIGRlZmF1bHQgaGFuZGxlciBkb2VzIHRvby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRTdHJlYW0oXG4gIHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgc2l6ZSA9IDA7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgIHNpemUgKz0gdmFsdWUuYnl0ZUxlbmd0aDtcbiAgfVxuICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBieXRlcy5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmJ5dGVMZW5ndGg7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiogYHBlbmRpbmdFbnRyeWAgcmVzb2x2ZWQgYW5kIHJlYWQgdG8gdGhlIGVuZC4gU2VlIHtAbGluayByZWFkU3RyZWFtfS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdG9yZWRFbnRyeU9mKFxuICBwZW5kaW5nRW50cnk6IFByb21pc2U8Q2FjaGVFbnRyeT4sXG4pOiBQcm9taXNlPFN0b3JlZEVudHJ5PiB7XG4gIGNvbnN0IGVudHJ5ID0gYXdhaXQgcGVuZGluZ0VudHJ5O1xuICByZXR1cm4geyAuLi5lbnRyeSwgdmFsdWU6IGF3YWl0IHJlYWRTdHJlYW0oZW50cnkudmFsdWUpIH07XG59XG5cbi8qKiBgc3RvcmVkYCBhcyB0aGUgYENhY2hlRW50cnlgIGEgYGdldGAgcmV0dXJucywgd2l0aCBpdHMgb3duIHN0cmVhbS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUVudHJ5T2YoXG4gIHN0b3JlZDogU3RvcmVkRW50cnksXG4gIHJldmFsaWRhdGU6IG51bWJlciA9IHN0b3JlZC5yZXZhbGlkYXRlLFxuKTogQ2FjaGVFbnRyeSB7XG4gIGNvbnN0IGJ5dGVzID0gc3RvcmVkLnZhbHVlO1xuICByZXR1cm4ge1xuICAgIC4uLnN0b3JlZCxcbiAgICByZXZhbGlkYXRlLFxuICAgIHZhbHVlOiBuZXcgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4oe1xuICAgICAgc3RhcnQoY29udHJvbGxlcikge1xuICAgICAgICAvLyBBIGNvcHk6IHdob2V2ZXIgcmVhZHMgdGhlIHN0cmVhbSBtYXkgdHJhbnNmZXIgb3IgbXV0YXRlIHRoZSBjaHVuay5cbiAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGJ5dGVzLnNsaWNlKCkpO1xuICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICB9LFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgTmV4dC5qcyB3b3VsZCByZWdlbmVyYXRlIGBlbnRyeWAgb24gZXZlcnkgcmVhZCBhbnl3YXksIHNvIHN0b3JpbmcgaXRcbiAqIGlzIGEgd3JpdGUgbm90aGluZyByZWFkcyBiYWNrLiBOZXh0LmpzJ3MgZGVmYXVsdCBoYW5kbGVyIHNraXBzIHRoZXNlIHRoZSBzYW1lXG4gKiB3YXksIG91dHNpZGUgdGhlIGRldiBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0R5bmFtaWNFbnRyeShlbnRyeTogUGljazxDYWNoZUVudHJ5LCBcImV4cGlyZVwiPik6IGJvb2xlYW4ge1xuICByZXR1cm4gZW50cnkuZXhwaXJlID09PSAwO1xufVxuXG4vKipcbiAqIFRoZSBpbi1mbGlnaHQgYHNldGBzLCBieSBjYWNoZSBrZXkuIGBDYWNoZUhhbmRsZXIuc2V0YCByZWNlaXZlcyBhbiBlbnRyeSB0aGF0XG4gKiBtYXkgc3RpbGwgYmUgc3RyZWFtaW5nLCBhbmQgXCJpZiBhIGBnZXRgIGZvciB0aGUgc2FtZSBjYWNoZSBrZXkgaXMgY2FsbGVkXG4gKiBiZWZvcmUgdGhlIHBlbmRpbmcgZW50cnkgaXMgY29tcGxldGUsIHRoZSBjYWNoZSBoYW5kbGVyIG11c3Qgd2FpdCBmb3IgdGhlXG4gKiBgc2V0YCBvcGVyYXRpb24gdG8gZmluaXNoXCIgKGBjYWNoZS1oYW5kbGVycy90eXBlcy5kLnRzYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQZW5kaW5nU2V0cyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXG4gIC8qKiBSZXNvbHZlcyBvbmNlIG5vIGBzZXRgIGZvciBga2V5YCBpcyBpbiBmbGlnaHQuICovXG4gIGFzeW5jIHdhaXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpOyBwOyBwID0gdGhpcy5wZW5kaW5nLmdldChrZXkpKSB7XG4gICAgICBhd2FpdCBwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGBzZXRgIGZvciBga2V5YCBhbmQgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGVuZHMgaXQuIFNhZmUgdG9cbiAgICogY2FsbCBtb3JlIHRoYW4gb25jZTogb25seSB0aGUgcmVnaXN0cmF0aW9uIGl0IG1hZGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGJlZ2luKGtleTogc3RyaW5nKTogKCkgPT4gdm9pZCB7XG4gICAgbGV0IHJlc29sdmU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHIpID0+IChyZXNvbHZlID0gcikpO1xuICAgIHRoaXMucGVuZGluZy5zZXQoa2V5LCBwcm9taXNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucGVuZGluZy5nZXQoa2V5KSA9PT0gcHJvbWlzZSkge1xuICAgICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFN0b3JlZCBlbnRyaWVzIGJ5IGNhY2hlIGtleSwgbGVhc3QgcmVjZW50bHkgdXNlZCBldmljdGVkIGZpcnN0IG9uY2UgdGhlaXJcbiAqIGJ5dGVzIHBhc3MgYG1heEJ5dGVzYC4gU2l6ZWQgYnkgYnl0ZXMgcmF0aGVyIHRoYW4gZW50cmllcywgbGlrZSBOZXh0LmpzJ3NcbiAqIGRlZmF1bHQgaGFuZGxlciAoYGNhY2hlTWF4TWVtb3J5U2l6ZWAsIDUwIE1CKSwgc2luY2UgYSBgJ3VzZSBjYWNoZSdgIGVudHJ5IGlzXG4gKiBhbiBSU0MgcGF5bG9hZCBvZiBhbnkgc2l6ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudHJ5THJ1IHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVudHJ5PigpO1xuICBwcml2YXRlIGJ5dGVzID0gMDtcbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4gdGhlIG9sZGVzdCBlbnRyeSdzIGB0aW1lc3RhbXBgOiB0aGUgbGFzdCBzY2FuJ3MgYW5zd2VyLCBsZXNzXG4gICAqIHdoYXRldmVyIHdhcyBzZXQgc2luY2UuIEVudHJpZXMgZHJvcHBlZCBzaW5jZSBvbmx5IG1ha2UgaXQgZWFybHkuIFNlZVxuICAgKiB7QGxpbmsgb2xkZXN0Qm91bmR9LlxuICAgKi9cbiAgcHJpdmF0ZSBsb3dlc3QgPSBJbmZpbml0eTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heEJ5dGVzOiBudW1iZXIpIHt9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogU3RvcmVkRW50cnkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChlbnRyeSkge1xuICAgICAgLy8gUmUtaW5zZXJ0ZWQgdG8gbWFyayBpdCBtb3N0IHJlY2VudGx5IHVzZWQuXG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGtleSk7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlKGtleSk7XG4gICAgY29uc3Qgc2l6ZSA9IHNpemVPZihrZXksIGVudHJ5KTtcbiAgICBpZiAoc2l6ZSA+IHRoaXMubWF4Qnl0ZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnRyaWVzLnNldChrZXksIGVudHJ5KTtcbiAgICB0aGlzLmJ5dGVzICs9IHNpemU7XG4gICAgdGhpcy5sb3dlc3QgPSBNYXRoLm1pbih0aGlzLmxvd2VzdCwgZW50cnkudGltZXN0YW1wKTtcbiAgICBmb3IgKGNvbnN0IFtvbGRlc3RLZXksIG9sZGVzdF0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAodGhpcy5ieXRlcyA8PSB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yob2xkZXN0S2V5LCBvbGRlc3QpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yoa2V5LCBleGlzdGluZyk7XG4gICAgICBpZiAodGhpcy5lbnRyaWVzLnNpemUgPT09IDApIHtcbiAgICAgICAgdGhpcy5sb3dlc3QgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB0aW1lc3RhbXBgIG9mIHRoZSBvbGRlc3QgZW50cnkgaGVsZCwgYEluZmluaXR5YCB3aXRoIG5vbmUsIGRyb3BwaW5nXG4gICAqIG9uIHRoZSB3YXkgdGhlIGVudHJpZXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCk6IGEgaGFuZGxlclxuICAgKiB0aGF0IGRyb3BzIHRoZW0gd2hlbiBuZXh0IHJlYWQgd291bGQgb3RoZXJ3aXNlIGhvbGQgdGhlbSB1bnRpbCB0aGVuLCBhbmRcbiAgICogdGhleSB3b3VsZCBjb3VudCBoZXJlIG1lYW53aGlsZS4gQSBzY2FuLCBzbyBhc2tlZCBvbmNlIGluIGEgd2hpbGU6IGluXG4gICAqIGJldHdlZW4sIHtAbGluayBvbGRlc3RCb3VuZH0gYW5zd2Vycy5cbiAgICovXG4gIG9sZGVzdFRpbWVzdGFtcChhdCA9IC1JbmZpbml0eSk6IG51bWJlciB7XG4gICAgbGV0IG9sZGVzdCA9IEluZmluaXR5O1xuICAgIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKGlzUGFzdFJldmFsaWRhdGUoZW50cnksIGF0KSkge1xuICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2xkZXN0ID0gTWF0aC5taW4ob2xkZXN0LCBlbnRyeS50aW1lc3RhbXApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvd2VzdCA9IG9sZGVzdDtcbiAgICByZXR1cm4gb2xkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vIGxhdGVyIHRoYW4ge0BsaW5rIG9sZGVzdFRpbWVzdGFtcH0sIHdpdGhvdXQgaXRzIHNjYW46IGFzIG9mIHRoZSBsYXN0XG4gICAqIG9uZSwgbGVzcyB0aGUgZW50cmllcyBzZXQgc2luY2UuIGBJbmZpbml0eWAgd2l0aCBub25lIGhlbGQuIERyb3BzIHRoZVxuICAgKiBlbnRyaWVzIHBhc3QgYHJldmFsaWRhdGVgIGF0IGBhdGAgZnJvbSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBlbmQsIHVwIHRvXG4gICAqIHRoZSBmaXJzdCB0aGF0IGlzbid0LCBzbyB7QGxpbmsgaG9sZHNMaXZlfSBkb2Vzbid0IHdhbGsgcGFzdCB0aGVtIG9uIGV2ZXJ5XG4gICAqIHJlcXVlc3QgdW50aWwgdGhlIG5leHQgc2Nhbi5cbiAgICovXG4gIG9sZGVzdEJvdW5kKGF0ID0gLUluZmluaXR5KTogbnVtYmVyIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5zaXplID09PSAwID8gSW5maW5pdHkgOiB0aGlzLmxvd2VzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGVudHJ5IG5vdCBwYXN0IGByZXZhbGlkYXRlYCBhdCBgYXRgIGlzIGhlbGQuIFVzdWFsbHkgdGhlIGZpcnN0XG4gICAqIGVudHJ5IGFuc3dlcnM7IHRoZSBleHBpcmVkIG9uZXMgaXQgcGFzc2VzIGFyZSBkcm9wcGVkIGJ5IHRoZSBzY2FuXG4gICAqIHtAbGluayBvbGRlc3RUaW1lc3RhbXB9IG1ha2VzLCBub3QgaGVyZSwgc28gYXNraW5nIGNoYW5nZXMgbm90aGluZy5cbiAgICovXG4gIGhvbGRzTGl2ZShhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIGlmICghaXNQYXN0UmV2YWxpZGF0ZShlbnRyeSwgYXQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuc2l6ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaXplT2Yoa2V5OiBzdHJpbmcsIGVudHJ5OiBTdG9yZWRFbnRyeSk6IG51bWJlciB7XG4gIHJldHVybiBlbnRyeS52YWx1ZS5ieXRlTGVuZ3RoICsga2V5Lmxlbmd0aDtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgcmV2YWxpZGF0ZWAgYXQgYGF0YCAoYG5vdygpYCkuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQYXN0UmV2YWxpZGF0ZShzdG9yZWQ6IFN0b3JlZEVudHJ5LCBhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdCA+IHN0b3JlZC50aW1lc3RhbXAgKyBzdG9yZWQucmV2YWxpZGF0ZSAqIDEwMDA7XG59XG5cbi8qKiBEZWZhdWx0IHNpemUgb2YgZWFjaCBoYW5kbGVyJ3MgbWVtb3J5IHN0b3JlOiBOZXh0LmpzJ3MgZGVmYXVsdCwgNTAgTUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU1PUllfQllURVMgPSA1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIEhvdyBsb25nIG9uZSByZXZhbGlkYXRpb24gdGFibGUgcmVxdWVzdCBtYXkgdGFrZSwgcGVyIGF0dGVtcHQuIFRoZSBTREsgc2V0c1xuICogbm8gbGltaXQsIGFuZCBhIHJlZnJlc2ggbGVmdCBpbiBmbGlnaHQgYWNyb3NzIGEgTGFtYmRhIGZyZWV6ZSBjYW4gc2l0IG9uIGFcbiAqIGNvbm5lY3Rpb24gdGhhdCBkaWVkIG1lYW53aGlsZSB3aXRob3V0IGEgcmVzZXQ6IGV2ZXJ5IHJlcXVlc3QgdGhhdCB3YWl0c1xuICogZm9yIHRoZSByZWZyZXNoIChhbiBpbnN0YW5jZSBgYmVoaW5kYCwgSVNSKSB3b3VsZCB3YWl0IHdpdGggaXQuIFRoZSBTREtcbiAqIHJldHJpZXMgYSB0aW1lZC1vdXQgYXR0ZW1wdCwgc28gYSBkZWFkIGNvbm5lY3Rpb24gY29zdHMgdXAgdG8gaXRzIGF0dGVtcHRzXG4gKiB0aW1lcyB0aGlzLlxuICovXG5leHBvcnQgY29uc3QgVEFHX1RBQkxFX1JFUVVFU1RfVElNRU9VVF9NUyA9IDMwMDA7XG5cbi8qKlxuICogV2FpdCBmb3IgYHdvcmtgIGlmIGB3YWl0YCwgb3IgZWxzZSBsZXQgaXQgcnVuIG9uOiBlaXRoZXIgd2F5IGEgcmVqZWN0aW9uIGlzXG4gKiBsb2dnZWQgd2l0aCBgZmFpbHVyZWAgcmF0aGVyIHRoYW4gdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXdhaXRJZihcbiAgd2FpdDogYm9vbGVhbixcbiAgd29yazogUHJvbWlzZTx2b2lkPixcbiAgZmFpbHVyZTogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxvZ2dlZCA9IHdvcmsuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihmYWlsdXJlLCBlcnJvcik7XG4gIH0pO1xuICBpZiAod2FpdCkge1xuICAgIGF3YWl0IGxvZ2dlZDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhZ01ldGhvZHNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgYHJlZnJlc2hUYWdzYCBhbHdheXMgd2FpdHMgZm9yIHRoZSByZXZhbGlkYXRpb24gbG9nIHF1ZXJ5LCByYXRoZXJcbiAgICogdGhhbiBvbmx5IHdoZW4gdGhlIGluc3RhbmNlIGlzIGBiZWhpbmRgLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYmxvY2tpbmc/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBgY2FjaGVIYW5kbGVyc2AgbWV0aG9kcyB0aGF0IG9ubHkgZ28gdGhyb3VnaCBgdGFnc2AsIHRoZSBzYW1lIGZvciB0aGVcbiAqIGBkZWZhdWx0YCBhbmQgYHJlbW90ZWAgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdNZXRob2RzKFxuICB0YWdzOiBUcmFja2VkVGFnTWFya2VycyxcbiAgb3B0aW9uczogVGFnTWV0aG9kc09wdGlvbnMgPSB7fSxcbik6IFBpY2s8Q2FjaGVIYW5kbGVyLCBcInJlZnJlc2hUYWdzXCIgfCBcInVwZGF0ZVRhZ3NcIj4ge1xuICByZXR1cm4ge1xuICAgIC8vIFN0YXJ0ZWQsIG5vdCBhd2FpdGVkLCB3aGlsZSB0aGUgaW5zdGFuY2Uga2VlcHMgdXAsIHVubGVzcyBgYmxvY2tpbmdgLlxuICAgIC8vIE5leHQuanMgYXdhaXRzIGByZWZyZXNoVGFnc2AgaW5zaWRlIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgIGxvb2t1cCBvZiBhXG4gICAgLy8gcmVxdWVzdCAoYHVzZS1jYWNoZS13cmFwcGVyYCksIGFuZCBhIHN0YWdlZCByZW5kZXIgZW5kcyBpdHMgc3RhdGljIHN0YWdlXG4gICAgLy8gb24gYSB0aW1lcjogYSBsb2cgYFF1ZXJ5YCB0aGVyZSBwdXNoZWQgdGhlIGVudHJ5IG91dCBvZiB0aGUgc3RhdGljXG4gICAgLy8gc3RhZ2UsIHNvIGEgY2FjaGVkIG5hdmlnYXRpb24gc3RvcmVkIHRoZSBwYWdlIHNlZ21lbnQgd2l0aG91dCBpdC4gV2hhdFxuICAgIC8vIHRoZSBxdWVyeSBmaW5kcyBhcHBsaWVzIGZyb20gdGhlIG5leHQgcmVxdWVzdC4gQXdhaXRlZCBvbmNlIHRoZSBpbnN0YW5jZVxuICAgIC8vIGlzIGBiZWhpbmRgLCB3aGljaCB0aGUgcnVudGltZSBzZXR0bGVzIGJlZm9yZSBhIHBhZ2UgcmVuZGVyIHN0YXJ0c1xuICAgIC8vIChgY2F0Y2hVcGApOiB0aGUgZmlyc3QgcmVxdWVzdCBhZnRlciBhbiBpZGxlIG9yIGZyb3plbiBzcGVsbCB3b3VsZFxuICAgIC8vIG90aGVyd2lzZSBzZXJ2ZSB3aGF0ZXZlciB3YXMgcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIG1lYW53aGlsZS4gQSBwYWdlJ3NcbiAgICAvLyByZW5kZXIganVzdCBhZnRlciBgY2F0Y2hVcGAgZ2V0cyBhIGdyYWNlIG1vcmUgKGBiZWhpbmRJblJlbmRlcmApLCBzbyBhXG4gICAgLy8gcmVxdWVzdCB0aGF0IGNhbWUgaW4ganVzdCBzaG9ydCBvZiB0aGUgbGluZSBkb2Vzbid0IGNyb3NzIGl0IGluc2lkZVxuICAgIC8vIHRoZSByZW5kZXIuIE5vdCBldmVuIHRoZW4gd2hpbGUgdGhlIGluc3RhbmNlIGhvbGRzIG5vIGVudHJ5IHRoZSBxdWVyeVxuICAgIC8vIGNvdWxkIGV4cGlyZSAoYGhvbGRzRW50cmllc2ApLCB3aXRoIGEgYHJlZnJlc2hJbnRlcnZhbE1zYCBvZiBgMGAgdG9vLlxuICAgIHJlZnJlc2hUYWdzOiAoKSA9PlxuICAgICAgYXdhaXRJZihcbiAgICAgICAgb3B0aW9ucy5ibG9ja2luZyA9PT0gdHJ1ZSB8fCAodGFncy5iZWhpbmRJblJlbmRlciAmJiB0YWdzLmhvbGRzRW50cmllcyksXG4gICAgICAgIHRhZ3MucmVmcmVzaCgpLFxuICAgICAgICBcIkVycm9yIHJlZnJlc2hpbmcgY2FjaGUgdGFnczpcIixcbiAgICAgICksXG4gICAgYXN5bmMgdXBkYXRlVGFncyhyZXZhbGlkYXRlZFRhZ3MsIGR1cmF0aW9ucykge1xuICAgICAgYXdhaXQgdGFncy51cGRhdGUocmV2YWxpZGF0ZWRUYWdzLCBkdXJhdGlvbnMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUnVuIGEgY2FjaGUgaGFuZGxlciBtZXRob2QncyB3b3JrIG91dHNpZGUgdGhlIHJlcXVlc3QgdGhhdCBjYWxsZWQgaXRcbiAqICh7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMub3V0c2lkZVJlbmRlcn0pLiBOZXh0LmpzIGF3YWl0cyB0aGVzZSBtZXRob2RzXG4gKiBpbnNpZGUgYSBzdGFnZWQgcmVuZGVyLCBhbmQgMTYuNCBlbmRzIHRoZSByZW5kZXIncyBzdGF0aWMgc3RhZ2Ugb24gYW55XG4gKiBgRGF0ZS5ub3coKWAsIGBuZXcgRGF0ZSgpYCwgYE1hdGgucmFuZG9tKClgIG9yIGBjcnlwdG9gIHJhbmRvbSBjYWxsIG1hZGUgaW5cbiAqIHRoZSByZXF1ZXN0J3MgY29udGV4dCBkdXJpbmcgaXQ6IG91cnMsIHRoZSBBV1MgU0RLJ3MgKHJlcXVlc3Qgc2lnbmluZyxcbiAqIGludm9jYXRpb24gaWRzKSBhbmQgYGRlYnVnYCdzIGFsaWtlLiBBIGRyYWZ0IG1vZGUgcGFnZSwgcmVuZGVyZWQgd2hvbGUgYXRcbiAqIHJlcXVlc3QgdGltZSwgbG9zdCBpdHMgc3RhdGljIHN0YWdlIHRoYXQgd2F5IHRvIGByZWZyZXNoVGFnc2AsIHNvIHRoZSBjbGllbnRcbiAqIGNhY2hlZCBub3RoaW5nIGZyb20gaXRzIEhUTUwuIENyZWF0aW5nIHRoZSBtYW5pZmVzdCBpcyBpbiBoZXJlIHRvbzogdGhlXG4gKiBmaXJzdCBoYW5kbGVyIGNhbGwgb2YgYSBwcm9jZXNzIGRvZXMgaXQsIGluc2lkZSBhIHJlbmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHNpZGVSZW5kZXI8VD4oZm46ICgpID0+IFQpOiBUIHtcbiAgcmV0dXJuIG91dHNpZGVSZXF1ZXN0KHNoYXJlZFRhZ01hbmlmZXN0KS5vdXRzaWRlUmVuZGVyKGZuKTtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgYnVpbHQgYnkgYGNyZWF0ZWAgb24gZmlyc3QgdXNlIHJhdGhlciB0aGFuIG9uIGltcG9ydCwgc28gbG9hZGluZ1xuICogdGhlIG1vZHVsZSAtIHdoaWNoIGplc3QsIGFuZCBOZXh0LmpzJ3MgY29uZmlnIHZhbGlkYXRpb24sIGRvIHdpdGhvdXQgdXNpbmdcbiAqIGl0IC0gbmVpdGhlciBjb25zdHJ1Y3RzIEFXUyBjbGllbnRzIG5vciB3YXJucyBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBFdmVyeSBtZXRob2QgcnVucyB7QGxpbmsgb3V0c2lkZVJlbmRlcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXp5SGFuZGxlcihjcmVhdGU6ICgpID0+IENhY2hlSGFuZGxlcik6IENhY2hlSGFuZGxlciB7XG4gIGxldCBoYW5kbGVyOiBDYWNoZUhhbmRsZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGluc3RhbmNlID0gKCkgPT4gKGhhbmRsZXIgPz89IGNyZWF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQ6IChjYWNoZUtleSwgc29mdFRhZ3MpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuZ2V0KGNhY2hlS2V5LCBzb2Z0VGFncykpLFxuICAgIHNldDogKGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkuc2V0KGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpKSxcbiAgICByZWZyZXNoVGFnczogKCkgPT4gb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLnJlZnJlc2hUYWdzKCkpLFxuICAgIGdldEV4cGlyYXRpb246ICh0YWdzKSA9PlxuICAgICAgb3V0c2lkZVJlbmRlcigoKSA9PiBpbnN0YW5jZSgpLmdldEV4cGlyYXRpb24odGFncykpLFxuICAgIHVwZGF0ZVRhZ3M6ICh0YWdzLCBkdXJhdGlvbnMpID0+XG4gICAgICBvdXRzaWRlUmVuZGVyKCgpID0+IGluc3RhbmNlKCkudXBkYXRlVGFncyh0YWdzLCBkdXJhdGlvbnMpKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvY2VzcydzIG9uZSB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9LCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBLZXB0IG9uIGBnbG9iYWxUaGlzYCBiZWNhdXNlIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBoYW5kbGVyIGFuZCB0aGUgYGRlZmF1bHRgXG4gKiBhbmQgYHJlbW90ZWAgaGFuZGxlcnMgYXJlIHNlcGFyYXRlIGJ1bmRsZXMgLSBzZXBhcmF0ZSBtb2R1bGUgaW5zdGFuY2VzIC0gYW5kXG4gKiBzaG91bGQgc2hhcmUgb25lIG1hbmlmZXN0OiBvbmUgcmVmcmVzaCByZWFkIGZvciBhbGwgb2YgdGhlbSwgYW5kIG9uZSBtYXJrZXJcbiAqIHdyaXRlIHBlciBgcmV2YWxpZGF0ZVRhZ2AuXG4gKlxuICogQXQgYnVpbGQgdGltZSB0aGVyZSBpcyBubyB0YWJsZSB0byByZWFkIChhbmQgbm8gY3JlZGVudGlhbHMgdG8gcmVhZCBpdFxuICogd2l0aCksIHNvIHRhZ3Mgc3RheSBsb2NhbCB0byB0aGUgcHJvY2VzcyB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXJlZFRhZ01hbmlmZXN0KCk6IFRyYWNrZWRUYWdNYXJrZXJzIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2xvYmFsVGhpcyBhcyB7IFtUQUdfTUFOSUZFU1RfU1lNQk9MXT86IFRyYWNrZWRUYWdNYXJrZXJzIH07XG4gIGlmICghZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdKSB7XG4gICAgY29uc3QgY29uZmlnID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gICAgY29uc3QgcmVmcmVzaEludGVydmFsTXMgPSBudW1iZXJGcm9tRW52KFxuICAgICAgXCJDREtfTkVYVEpTX1RBR19SRUZSRVNIX01TXCIsXG4gICAgICBERUZBVUxUX1RBR19SRUZSRVNIX01TLFxuICAgICk7XG4gICAgaWYgKGNvbmZpZy50YWJsZU5hbWUgJiYgIWlzQnVpbGRQaGFzZSgpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBuZXcgRHluYW1vREJDbGllbnQoe1xuICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgIC8vIFdpdGhvdXQgYHRocm93T25SZXF1ZXN0VGltZW91dGAgdGhlIHRpbWVvdXQgb25seSBsb2dzIGEgd2FybmluZy4gSXRcbiAgICAgICAgLy8gZW5kcyBvbmNlIHRoZSByZXNwb25zZSBoZWFkZXJzIGFycml2ZTogYHNvY2tldFRpbWVvdXRgLCBhblxuICAgICAgICAvLyBpbmFjdGl2aXR5IHRpbWVyIGtlcHQgdW50aWwgdGhlIHJlcXVlc3QgY2xvc2VzLCBjb3ZlcnMgdGhlIGJvZHkuXG4gICAgICAgIHJlcXVlc3RIYW5kbGVyOiB7XG4gICAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgdGhyb3dPblJlcXVlc3RUaW1lb3V0OiB0cnVlLFxuICAgICAgICAgIHNvY2tldFRpbWVvdXQ6IFRBR19UQUJMRV9SRVFVRVNUX1RJTUVPVVRfTVMsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXSA9IG5ldyBUcmFja2VkVGFnTWFya2Vycyh7XG4gICAgICAgIG1hcmtlcnM6IG5ldyBUYWdNYXJrZXJUYWJsZShjbGllbnQsIGNvbmZpZy50YWJsZU5hbWUsIGNvbmZpZy5idWlsZElkKSxcbiAgICAgICAgbG9nOiBuZXcgUmV2YWxpZGF0aW9uTG9nKGNsaWVudCwgY29uZmlnLnRhYmxlTmFtZSwgY29uZmlnLmJ1aWxkSWQpLFxuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgICAgZGVidWc6IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnRhZ3NcIiksXG4gICAgICAgIC8vIFNldCBpbiBldmVyeSBMYW1iZGEgcnVudGltZTsgYSBjb250YWluZXIgaXMgbmV2ZXIgZnJvemVuLlxuICAgICAgICBjYW5GcmVlemU6IHByb2Nlc3MuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSAhPT0gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghaXNCdWlsZFBoYXNlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCBjYWNoZSB0YWdzIGFyZSBsb2NhbCB0byBlYWNoIGluc3RhbmNlXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBnbG9iYWxbVEFHX01BTklGRVNUX1NZTUJPTF0gPSBuZXcgVHJhY2tlZFRhZ01hcmtlcnMoe1xuICAgICAgICByZWZyZXNoSW50ZXJ2YWxNcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdO1xufVxuIl19