cdk-nextjs 0.7.7 → 0.7.9

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
@@ -29,6 +29,7 @@ const node_path_1 = require("node:path");
29
29
  const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
30
30
  const client_s3_1 = require("@aws-sdk/client-s3");
31
31
  const cache_utils_1 = require("./cache-utils");
32
+ const tag_manifest_1 = require("../runtime/tag-manifest");
32
33
  /** The configuration from the environment. */
33
34
  function resolveAwsCacheConfig() {
34
35
  return {
@@ -813,6 +814,16 @@ class TrackedTagMarkers {
813
814
  }
814
815
  return this.caughtUpRender.run(true, render);
815
816
  }
817
+ /**
818
+ * Run `fn` outside the request's context (`outsideRequest`), keeping only
819
+ * whether the render was {@link catchUp caught up}: a cache handler method
820
+ * called from inside a staged render, whose clock reads and AWS SDK calls
821
+ * would otherwise end its static stage.
822
+ */
823
+ outsideRender(fn) {
824
+ const caughtUp = this.caughtUpRender.getStore();
825
+ return (0, tag_manifest_1.outsideRequest)(() => caughtUp ? this.caughtUpRender.run(caughtUp, fn) : fn());
826
+ }
816
827
  /** Whether `at` is more than the interval and the grace ago. */
817
828
  overdue(at) {
818
829
  return this.clock() - at > this.refreshIntervalMs + exports.TAG_REFRESH_GRACE_MS;
@@ -1467,4 +1478,4 @@ class CacheBucket {
1467
1478
  }
1468
1479
  }
1469
1480
  exports.CacheBucket = CacheBucket;
1470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvYXdzLWNhY2hlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdEQSxzREFPQztBQVNELGdDQUVDO0FBR0Qsa0NBRUM7QUFtQkQsc0NBRUM7QUFxQ0Qsa0NBZ0JDO0FBV0Qsa0NBRUM7QUFXRCw4QkFXQztBQVFELGtDQVdDO0FBR0Qsb0NBZUM7QUFpREQsOEJBRUM7QUFZRCxnQ0FFQztBQW8yQ0Qsb0NBb0JDO0FBbHBERDs7Ozs7Ozs7O0VBU0U7QUFDRixzREFBc0Q7QUFDdEQsdURBQXFEO0FBQ3JELHlDQUFpQztBQUNqQyw4REFTa0M7QUFDbEMsa0RBSzRCO0FBQzVCLCtDQUE2RTtBQWtCN0UsOENBQThDO0FBQzlDLFNBQWdCLHFCQUFxQjtJQUNuQyxPQUFPO1FBQ0wsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLElBQUksRUFBRTtRQUMxRCxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsSUFBSSxFQUFFO1FBQy9ELE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxXQUFXO1FBQzdDLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7S0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixVQUFVLENBQUMsT0FBZSxFQUFFLFFBQWdCO0lBQzFELE9BQU8sSUFBQSxnQkFBSSxFQUFDLE9BQU8sRUFBRSxJQUFBLDhCQUFnQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixTQUFnQixXQUFXLENBQUMsT0FBZSxFQUFFLFFBQWdCO0lBQzNELE9BQU8sSUFBQSxnQkFBSSxFQUFDLE9BQU8sRUFBRSxJQUFBLDZCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUMs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QkFBZ0IsQ0FBQztZQUNuQixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsR0FBRyxFQUFFLEdBQUc7WUFDUixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7U0FDL0MsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2Q0Qsa0NBdUNDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIFMzIC8gRHluYW1vREIgcGx1bWJpbmcgc2hhcmVkIGJ5IGV2ZXJ5IGNkay1uZXh0anMgY2FjaGUgaGFuZGxlcjogdGhlXG4gIGluY3JlbWVudGFsIGBjYWNoZUhhbmRsZXJgIChgUzNDYWNoZUhhbmRsZXJgKSBhbmQgdGhlIGBjYWNoZUhhbmRsZXJzYCBmb3JcbiAgYCd1c2UgY2FjaGUnYCAvIGAndXNlIGNhY2hlOiByZW1vdGUnYC5cblxuICBXaGF0IGxpdmVzIGhlcmUgaXMgd2hhdCBoYXMgdG8gYWdyZWUgYmV0d2VlbiB0aGVtIC0gd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgY29tZXMgZnJvbSwgaG93IGEgY2FjaGUga2V5IGJlY29tZXMgYW4gUzMga2V5LCBhbmQgd2hhdCBhIHRhZydzIG1hcmtlciByb3cgaW5cbiAgdGhlIHJldmFsaWRhdGlvbiB0YWJsZSBsb29rcyBsaWtlIGFuZCBtZWFucy4gQSBgcmV2YWxpZGF0ZVRhZ2AgcmVhY2hlcyBib3RoXG4gIGtpbmRzIG9mIGhhbmRsZXIsIGFuZCB0aGV5IG11c3QgcmVhZCBlYWNoIG90aGVyJ3MgbWFya2VycyB0aGUgc2FtZSB3YXkuXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJub2RlOmFzeW5jX2hvb2tzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlVmFsdWUsXG4gIEJhdGNoR2V0SXRlbUNvbW1hbmQsXG4gIEJhdGNoR2V0SXRlbUNvbW1hbmRPdXRwdXQsXG4gIER5bmFtb0RCQ2xpZW50LFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxuICBRdWVyeUNvbW1hbmRPdXRwdXQsXG4gIFVwZGF0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQge1xuICBHZXRPYmplY3RDb21tYW5kLFxuICBOb1N1Y2hLZXksXG4gIFB1dE9iamVjdENvbW1hbmQsXG4gIFMzQ2xpZW50LFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBjYWNoZUtleUZpbGVOYW1lLCBjYWNoZU9iamVjdE5hbWUsIHNoYTI1NkhleCB9IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5cbi8qKlxuICogV2hlcmUgdGhlIGNhY2hlIGxpdmVzLCBhcyB0aGUgY29uc3RydWN0cyBwYXNzIGl0IHRvIHRoZSBjb21wdXRlIHRocm91Z2ggdGhlXG4gKiBlbnZpcm9ubWVudCAoYE5leHRqc0Z1bmN0aW9uc2AsIGBOZXh0anNDb250YWluZXJzYCkuIEVtcHR5IHN0cmluZ3MgZm9yIHdoYXQgaXNcbiAqIG5vdCBjb25maWd1cmVkLCB3aGljaCBlYWNoIGhhbmRsZXIgcmVhZHMgYXMgXCJ0aGF0IGxheWVyIGlzIGRpc2FibGVkXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXdzQ2FjaGVDb25maWcge1xuICAvKiogYENES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUVgLiAqL1xuICBidWNrZXROYW1lOiBzdHJpbmc7XG4gIC8qKiBgQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRWAuICovXG4gIHRhYmxlTmFtZTogc3RyaW5nO1xuICAvKiogYEFXU19SRUdJT05gLCBgdXMtZWFzdC0xYCB3aGVuIHVuc2V0LiAqL1xuICByZWdpb246IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX0JVSUxEX0lEYDogZXZlcnkgUzMga2V5IGFuZCBldmVyeSBtYXJrZXIgcm93IGlzIHNjb3BlZCB0byBpdC4gKi9cbiAgYnVpbGRJZDogc3RyaW5nO1xufVxuXG4vKiogVGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZW52aXJvbm1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk6IEF3c0NhY2hlQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBidWNrZXROYW1lOiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FIHx8IFwiXCIsXG4gICAgdGFibGVOYW1lOiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FIHx8IFwiXCIsXG4gICAgcmVnaW9uOiBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8IFwidXMtZWFzdC0xXCIsXG4gICAgYnVpbGRJZDogcHJvY2Vzcy5lbnYuQ0RLX05FWFRKU19CVUlMRF9JRCB8fCBcIlwiLFxuICB9O1xufVxuXG4vKipcbiAqIGB7YnVpbGRJZH0ve2NhY2hlS2V5fS5qc29uYCwgdGhlIGluY3JlbWVudGFsIGNhY2hlJ3Mga2V5IGNvbnZlbnRpb24uXG4gKlxuICogVGhlIHJvb3QgcGF0aCBiZWNvbWVzIGBpbmRleGAsIGFuZCBhIGxlYWRpbmcgc2xhc2ggaXMgZHJvcHBlZCBzbyB0aGVyZSBpcyBub1xuICogZW1wdHkgZm9sZGVyIHVuZGVyIHRoZSBidWlsZCBwcmVmaXguIEV2ZXJ5dGhpbmcgdGhpcyByZXR1cm5zIGVuZHMgaW4gYC5qc29uYCxcbiAqIHdoaWNoIGlzIHdoYXQga2VlcHMgaXQgZGlzam9pbnQgZnJvbSB7QGxpbmsgdXNlQ2FjaGVTM0tleX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFMzS2V5KGJ1aWxkSWQ6IHN0cmluZywgY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGJ1aWxkSWQsIGNhY2hlS2V5RmlsZU5hbWUoY2FjaGVLZXkpKTtcbn1cblxuLyoqIGB7YnVpbGRJZH0vYCArIHtAbGluayBjYWNoZU9iamVjdE5hbWV9OiB0aGUgUzMgb2JqZWN0IGFuIGVudHJ5IGlzIHN0b3JlZCBpbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzM09iamVjdEtleShidWlsZElkOiBzdHJpbmcsIGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihidWlsZElkLCBjYWNoZU9iamVjdE5hbWUoY2FjaGVLZXkpKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9sZGVyIHVuZGVyIHRoZSBidWlsZCBwcmVmaXggdGhhdCBgJ3VzZSBjYWNoZSdgIGVudHJpZXMgYXJlIHN0b3JlZCBpbi5cbiAqIEBzZWUgdXNlQ2FjaGVTM0tleVxuICovXG5leHBvcnQgY29uc3QgVVNFX0NBQ0hFX0tFWV9QUkVGSVggPSBcIl91c2UtY2FjaGVcIjtcblxuLyoqXG4gKiBge2J1aWxkSWR9L191c2UtY2FjaGUve2hhc2h9LmVudHJ5YCwgd2hlcmUgYSBgY2FjaGVIYW5kbGVyc2AgZW50cnkgaXMgc3RvcmVkLlxuICpcbiAqIEhhc2hlZCBiZWNhdXNlIGEgYCd1c2UgY2FjaGUnYCBrZXkgaXMgdGhlIHNlcmlhbGl6ZWQgYXJndW1lbnRzIG9mIHRoZSBjYWxsIGFuZFxuICogaGFzIG5vIGxlbmd0aCBsaW1pdCwgd2hlcmUgYW4gUzMga2V5IHN0b3BzIGF0IDEwMjQgYnl0ZXMuIFRoZSBgLmVudHJ5YCBzdWZmaXhcbiAqIHJhdGhlciB0aGFuIGAuanNvbmAgaXMgd2hhdCBtYWtlcyBhIGNvbGxpc2lvbiB3aXRoIHRoZSBpbmNyZW1lbnRhbCBjYWNoZVxuICogaW1wb3NzaWJsZSByYXRoZXIgdGhhbiB1bmxpa2VseTogZXZlcnkgb2JqZWN0IHtAbGluayBzM09iamVjdEtleX0gbmFtZXMgZW5kc1xuICogaW4gYC5qc29uYCBvciBgLmxvbmdgLCBpbmNsdWRpbmcgb25lIGZvciBhIHJvdXRlIHRoYXQgaGFwcGVucyB0byBiZSBuYW1lZFxuICogYC9fdXNlLWNhY2hlL+KApmAuXG4gKiBTdGlsbCB1bmRlciB0aGUgYnVpbGQgcHJlZml4LCBzbyBwb3N0LWRlcGxveSBwcnVuaW5nIGRyb3BzIHRoZW0gd2l0aCB0aGUgYnVpbGQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWNoZVMzS2V5KGJ1aWxkSWQ6IHN0cmluZywga2V5SGFzaDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oYnVpbGRJZCwgVVNFX0NBQ0hFX0tFWV9QUkVGSVgsIGAke2tleUhhc2h9LmVudHJ5YCk7XG59XG5cbi8qKlxuICogVGhlIGBkdXJhdGlvbnNgIE5leHQuanMgMTYgcGFzc2VzIGEgdGFnIHJldmFsaWRhdGlvbiBmb3IgYSBwcm9maWxlOlxuICogYHJldmFsaWRhdGVUYWcoXCJwb3N0c1wiLCBcIm1heFwiKWAgYXJyaXZlcyBhcyBgeyBleHBpcmU6IDx0aGUgcHJvZmlsZSdzIGV4cGlyZT4gfWAuXG4gKiBBYnNlbnQgZm9yIGB1cGRhdGVUYWdgIGFuZCBhIGJhcmUgYHJldmFsaWRhdGVUYWdgLCB3aGljaCBleHBpcmUgaW1tZWRpYXRlbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV2YWxpZGF0ZUR1cmF0aW9ucyB7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIHRhZydzIG1hcmtlciByb3csIGFzIHRpbWVzdGFtcHMgaW4gbWlsbGlzZWNvbmRzLiBXcml0dGVuIGJ5XG4gKiB7QGxpbmsgbWFya2VyVXBkYXRlfTsgZWFjaCBmaWVsZCBpcyBhYnNlbnQgdW50aWwgYSByZXZhbGlkYXRpb24gb2YgdGhhdCBzaGFwZVxuICogaGFzIGhhcHBlbmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhZ01hcmtlciB7XG4gIC8qKiBFeHBpcmVkIG91dHJpZ2h0OiBgdXBkYXRlVGFnYCwgb3IgYHJldmFsaWRhdGVUYWdgIHdpdGggbm8gcHJvZmlsZS4gKi9cbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgLyoqIFN0YWxlIGZyb20gaGVyZTogYHJldmFsaWRhdGVUYWcodGFnLCBwcm9maWxlKWAuICovXG4gIHN0YWxlQXQ/OiBudW1iZXI7XG4gIC8qKiBXaGVuIHRoZSBwcm9maWxlJ3MgYGV4cGlyZWAgcnVucyBvdXQsIHdoaWNoIG1heSBiZSBpbiB0aGUgZnV0dXJlLiAqL1xuICBleHBpcmVkQXQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hhdCB0aGUgdGFnIG1hcmtlcnMgc2F5IGFib3V0IGFuIGVudHJ5OiB1bnRvdWNoZWQsIHNlcnZlZCBzdGFsZSB3aGlsZSBhXG4gKiBiYWNrZ3JvdW5kIHJlbmRlciByZXBsYWNlcyBpdCwgb3IgZXhwaXJlZCBhbmQgcmUtcmVuZGVyZWQgYmVmb3JlIGFuc3dlcmluZy5cbiAqL1xuZXhwb3J0IHR5cGUgUmV2YWxpZGF0aW9uU3RhdGUgPSBcImZyZXNoXCIgfCBcInN0YWxlXCIgfCBcImV4cGlyZWRcIjtcblxuLyoqXG4gKiBXaGF0IGBtYXJrZXJgIG1lYW5zIGZvciBhbiBlbnRyeSBjcmVhdGVkIGF0IGBjcmVhdGVkQXRgLCBhdCBgbm93YC5cbiAqXG4gKiBgZXhwaXJlZEF0YCBpbiB0aGUgZnV0dXJlIGlzIGEgcHJvZmlsZSdzIGBleHBpcmVgIHRoYXQgaGFzIG5vdCBjb21lIHlldCxcbiAqIGNvbXBhcmVkIHRoZSB3YXkgTmV4dC5qcydzIGBhcmVUYWdzRXhwaXJlZGAgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlclN0YXRlKFxuICBtYXJrZXI6IFRhZ01hcmtlcixcbiAgY3JlYXRlZEF0OiBudW1iZXIsXG4gIG5vdzogbnVtYmVyLFxuKTogUmV2YWxpZGF0aW9uU3RhdGUge1xuICBjb25zdCB7IHJldmFsaWRhdGVkQXQsIGV4cGlyZWRBdCwgc3RhbGVBdCB9ID0gbWFya2VyO1xuICBpZiAoXG4gICAgKHJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByZXZhbGlkYXRlZEF0ID4gY3JlYXRlZEF0KSB8fFxuICAgIChleHBpcmVkQXQgIT09IHVuZGVmaW5lZCAmJiBleHBpcmVkQXQgPD0gbm93ICYmIGV4cGlyZWRBdCA+IGNyZWF0ZWRBdClcbiAgKSB7XG4gICAgcmV0dXJuIFwiZXhwaXJlZFwiO1xuICB9XG4gIGlmIChzdGFsZUF0ICE9PSB1bmRlZmluZWQgJiYgc3RhbGVBdCA+IGNyZWF0ZWRBdCkge1xuICAgIHJldHVybiBcInN0YWxlXCI7XG4gIH1cbiAgcmV0dXJuIFwiZnJlc2hcIjtcbn1cblxuLyoqXG4gKiBUaGUgY2xvY2sgZXZlcnkgdGFnIG1hcmtlciBpcyBzdGFtcGVkIHdpdGgsIGFuZCBldmVyeSBlbnRyeSB0aW1lc3RhbXAgaXQgaXNcbiAqIGNvbXBhcmVkIGFnYWluc3Q6IHRoZSBvbmUgTmV4dC5qcyBzdGFtcHMgYENhY2hlRW50cnkudGltZXN0YW1wYCB3aXRoXG4gKiAoYHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKWAsIGluIGB1c2UtY2FjaGUtd3JhcHBlci5qc2AgYW5kXG4gKiB0aGUgZGVmYXVsdCBoYW5kbGVyKSwgcmF0aGVyIHRoYW4gYERhdGUubm93KClgLiBCb3RoIGhhbmRsZXJzIHdyaXRlIHRoZSBzYW1lXG4gKiBtYXJrZXIgcm93cywgc28gYm90aCBoYXZlIHRvIHVzZSBpdDogdHdvIGNsb2NrcyBvbiBvbmUgcm93IGxldCB0aGUgbGFzdCB3cml0ZXJcbiAqIGRlY2lkZSB3aGljaCBjbG9jayB0aGUgb3RoZXJzIGNvbXBhcmUgYWdhaW5zdCwgYW5kIHRoZXkgZHJpZnQgYXBhcnQgZm9yIGFzXG4gKiBsb25nIGFzIGEgTGFtYmRhIHNhbmRib3ggb3IgRmFyZ2F0ZSB0YXNrIGxpdmVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyQ2xvY2soKTogbnVtYmVyIHtcbiAgcmV0dXJuIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKTtcbn1cblxuLyoqXG4gKiBUaGUgbWFya2VyIGZpZWxkcyBhIHRhZyByZXZhbGlkYXRlZCBhdCBgbm93YCBzZXRzLlxuICpcbiAqIFdpdGhvdXQgYGR1cmF0aW9uc2AgLSBgdXBkYXRlVGFnYCwgb3IgYHJldmFsaWRhdGVUYWdgIHdpdGggbm8gcHJvZmlsZSAtIHRoZVxuICogdGFnJ3MgZW50cmllcyBleHBpcmUgaW1tZWRpYXRlbHkgKGByZXZhbGlkYXRlZEF0YCkuIFdpdGggdGhlbSB0aGUgZW50cmllcyBnb1xuICogc3RhbGUgbm93IGFuZCBleHBpcmUgYWZ0ZXIgdGhlIHByb2ZpbGUncyBgZXhwaXJlYCwgdGhlIHNhbWUgcGFpciBvZlxuICogdGltZXN0YW1wcyBOZXh0LmpzJ3MgYEZpbGVTeXN0ZW1DYWNoZS5yZXZhbGlkYXRlVGFnYCByZWNvcmRzLiBBIHByb2ZpbGUgd2l0aFxuICogbm8gYGV4cGlyZWAgc2V0cyBvbmx5IGBzdGFsZUF0YCwgYW5kIHdoYXRldmVyIGBleHBpcmVkQXRgIHRoZSB0YWcgaGFkIHN0YXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyRm9yKFxuICBub3c6IG51bWJlcixcbiAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuKTogVGFnTWFya2VyIHtcbiAgaWYgKCFkdXJhdGlvbnMpIHtcbiAgICByZXR1cm4geyByZXZhbGlkYXRlZEF0OiBub3cgfTtcbiAgfVxuICBpZiAoZHVyYXRpb25zLmV4cGlyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgc3RhbGVBdDogbm93IH07XG4gIH1cbiAgcmV0dXJuIHsgc3RhbGVBdDogbm93LCBleHBpcmVkQXQ6IG5vdyArIGR1cmF0aW9ucy5leHBpcmUgKiAxMDAwIH07XG59XG5cbmNvbnN0IE1BUktFUl9GSUVMRFMgPSBbXCJyZXZhbGlkYXRlZEF0XCIsIFwic3RhbGVBdFwiLCBcImV4cGlyZWRBdFwiXSBhcyBjb25zdDtcblxuLyoqXG4gKiBgZXhpc3RpbmdgIHdpdGggdGhlIGZpZWxkcyBgdXBkYXRlYCBzZXRzLCBhcyBhIHtAbGluayBtYXJrZXJVcGRhdGV9IGxlYXZlc1xuICogdGhlIHJvdzogYSBmaWVsZCBgdXBkYXRlYCBkb2VzIG5vdCBzZXQga2VlcHMgaXRzIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXJrZXIoXG4gIGV4aXN0aW5nOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQsXG4gIHVwZGF0ZTogVGFnTWFya2VyLFxuKTogVGFnTWFya2VyIHtcbiAgY29uc3QgbWFya2VyID0geyAuLi5leGlzdGluZyB9O1xuICBmb3IgKGNvbnN0IGZpZWxkIG9mIE1BUktFUl9GSUVMRFMpIHtcbiAgICBpZiAodXBkYXRlW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtYXJrZXJbZmllbGRdID0gdXBkYXRlW2ZpZWxkXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hcmtlcjtcbn1cblxuLyoqIFRoZSBtYXJrZXItcm93IHVwZGF0ZSB0aGF0IHNldHMge0BsaW5rIG1hcmtlckZvcn0ncyBmaWVsZHMuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyVXBkYXRlKFxuICBub3c6IG51bWJlcixcbiAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuKTogUGljazxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBVcGRhdGVJdGVtQ29tbWFuZD5bMF0sXG4gIFwiVXBkYXRlRXhwcmVzc2lvblwiIHwgXCJFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzXCJcbj4ge1xuICBjb25zdCBtYXJrZXIgPSBtYXJrZXJGb3Iobm93LCBkdXJhdGlvbnMpO1xuICBjb25zdCBmaWVsZHMgPSBNQVJLRVJfRklFTERTLmZpbHRlcigoZmllbGQpID0+IG1hcmtlcltmaWVsZF0gIT09IHVuZGVmaW5lZCk7XG4gIHJldHVybiB7XG4gICAgVXBkYXRlRXhwcmVzc2lvbjogYFNFVCAke2ZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtmaWVsZH0gPSA6JHtmaWVsZH1gKS5qb2luKFwiLCBcIil9YCxcbiAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBmaWVsZHMubWFwKChmaWVsZCkgPT4gW2A6JHtmaWVsZH1gLCB7IE46IFN0cmluZyhtYXJrZXJbZmllbGRdKSB9XSksXG4gICAgKSxcbiAgfTtcbn1cblxuLyoqIEEgRHluYW1vREIgbnVtYmVyIGF0dHJpYnV0ZSBhcyBhIG51bWJlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuICovXG5mdW5jdGlvbiBudW1iZXJBdHRyaWJ1dGUoXG4gIHZhbHVlOiBBdHRyaWJ1dGVWYWx1ZSB8IHVuZGVmaW5lZCxcbik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZT8uTiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTnVtYmVyKHZhbHVlLk4pO1xufVxuXG4vKiogVGhlIG1hcmtlciBmaWVsZHMgb2YgYSBtYXJrZXIgb3IgbG9nIHJvdy4gKi9cbmZ1bmN0aW9uIG1hcmtlck9mKGl0ZW06IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPik6IFRhZ01hcmtlciB7XG4gIHJldHVybiB7XG4gICAgcmV2YWxpZGF0ZWRBdDogbnVtYmVyQXR0cmlidXRlKGl0ZW0ucmV2YWxpZGF0ZWRBdCksXG4gICAgc3RhbGVBdDogbnVtYmVyQXR0cmlidXRlKGl0ZW0uc3RhbGVBdCksXG4gICAgZXhwaXJlZEF0OiBudW1iZXJBdHRyaWJ1dGUoaXRlbS5leHBpcmVkQXQpLFxuICB9O1xufVxuXG4vKiogRHluYW1vREIncyBjYXAgb24ga2V5cyBpbiBvbmUgYEJhdGNoR2V0SXRlbWAuICovXG5leHBvcnQgY29uc3QgQkFUQ0hfR0VUX01BWF9LRVlTID0gMTAwO1xuXG4vKipcbiAqIEhvdyBvZnRlbiwgYXQgbW9zdCwgYW4gaW5zdGFuY2UgY2F0Y2hlcyB1cCBvbiByZXZhbGlkYXRpb25zIG90aGVyIGluc3RhbmNlc1xuICogcmFuLCB1bmxlc3MgYENES19ORVhUSlNfVEFHX1JFRlJFU0hfTVNgIHNheXMgb3RoZXJ3aXNlOiB0aGUgc3RhbGVuZXNzIHdpbmRvd1xuICogZm9yIGEgYHJldmFsaWRhdGVUYWdgIHJ1biBlbHNld2hlcmUuIEV2ZXJ5IGNhY2hlIGhpdCBjaGVja3MgaXRzIHRhZ3MnXG4gKiBtYXJrZXJzLCBhbmQgZXZlcnkgbWFya2VyIG9mIGEgZGVwbG95bWVudCBzaGFyZXMgb25lIHBhcnRpdGlvbiBrZXksIHNvXG4gKiByZWFkaW5nIHRoZW0gcGVyIHJlcXVlc3QgY2FwcGVkIGEgcm91dGUncyBjYWNoZSBoaXRzIGF0IHRoZSBwYXJ0aXRpb24ncyByZWFkXG4gKiB0aHJvdWdocHV0ICh+MSw5MDAgcmVxL3Mgb24gTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnMpLiBPbmNlIGEgc2Vjb25kLCBmcm9tIHRoZVxuICogcmV2YWxpZGF0aW9uIGxvZywgdGhlIHJlYWRzIHNjYWxlIHdpdGggaW5zdGFuY2VzIGluc3RlYWQgb2YgcmVxdWVzdHMgb3IgdGFncy5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfVEFHX1JFRlJFU0hfTVMgPSAxMDAwO1xuXG4vKipcbiAqIEhvdyBmYXIgcGFzdCBgcmVmcmVzaEludGVydmFsTXNgIHRoZSBsYXN0IHJlZnJlc2ggbWF5IGhhdmUgc2V0dGxlZCBiZWZvcmUgYVxuICogYCd1c2UgY2FjaGUnYCByZXF1ZXN0IHdhaXRzIGZvciB0aGUgbmV4dCBvbmUgKHNlZVxuICoge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzLmJlaGluZH0pLiBBbiBpbnN0YW5jZSBzZXJ2aW5nIHN0ZWFkeSB0cmFmZmljIHN0YXlzXG4gKiBpbnNpZGUgaXQ7IG9uZSB0aGF0IHNhdCBpZGxlLCBvciBmcm96ZW4gYmV0d2VlbiBMYW1iZGEgaW52b2NhdGlvbnMsIGRvZXMgbm90LlxuICovXG5leHBvcnQgY29uc3QgVEFHX1JFRlJFU0hfR1JBQ0VfTVMgPSAxMDAwO1xuXG4vKiogRHluYW1vREIncyBsaW1pdCBvbiBhIHNvcnQga2V5LCBpbiBVVEYtOCBieXRlcy4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU09SVF9LRVlfQllURVMgPSAxMDI0O1xuXG4vKipcbiAqIGAjPHNoYTI1Nih0YWcpPmAsIHN0YW5kaW5nIGluIGZvciBhIHRhZyBpbiBhIHNvcnQga2V5IGl0IHdvdWxkIHB1c2ggcGFzdFxuICoge0BsaW5rIE1BWF9TT1JUX0tFWV9CWVRFU30uIE5leHQuanMgY2FwcyB0aGUgdGFncyBhbiBhcHAgbmFtZXMsIGJ1dCBub3QgYW5cbiAqIGltcGxpY2l0IGBfTl9UXy/igKZgIHRhZywgd2hpY2ggaXMgYXMgbG9uZyBhcyBpdHMgcGF0aCwgYW5kIGEgcmVqZWN0ZWQgd3JpdGVcbiAqIGxlZnQgYHJldmFsaWRhdGVQYXRoYCBvbiBhIGxvbmcgcGF0aCByZWNvcmRlZCBub3doZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaGVkVGFnKHRhZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAjJHtzaGEyNTZIZXgodGFnKX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb25nZXN0IHRhZyBhIHNvcnQga2V5IHNwZWxscyBvdXQ7IHBhc3QgaXQsIHtAbGluayBzb3J0S2V5VGFnfSBoYXNoZXNcbiAqIGl0LiBPbmUgY2FwIGZvciBldmVyeSByb3cgdGhlIHRhZyBpcyBpbiwgc28gYSByb3cncyB3cml0ZXIgYW5kIHJlYWRlciBhZ3JlZVxuICogd2l0aG91dCBlYWNoIHdvcmtpbmcgb3V0IHdoYXQgZWxzZSBzaGFyZXMgaXRzIGtleS4gSXQgbGVhdmVzIHJvb20gZm9yIHRoZVxuICogbW9zdCBhbnkgcm93IHB1dHMgYmVzaWRlIHRoZSB0YWc6IGEgbWFwcGluZyByb3cncyBgIzxidWlsZElkPi8jPHNoYTI1Nj5gLFxuICogd2l0aCB0aGUgYnVpbGQgSUQgY2FwcGVkIGF0IGBNQVhfQlVJTERfSURfQllURVNgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1RBR19CWVRFUyA9IDc2ODtcblxuLyoqIGB0YWdgIGFzIGEgc29ydCBrZXkgc3BlbGxzIGl0OiBpdHNlbGYsIG9yIHtAbGluayBoYXNoZWRUYWd9IHBhc3Qge0BsaW5rIE1BWF9UQUdfQllURVN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRLZXlUYWcodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gQnVmZmVyLmJ5dGVMZW5ndGgodGFnKSA8PSBNQVhfVEFHX0JZVEVTID8gdGFnIDogaGFzaGVkVGFnKHRhZyk7XG59XG5cbi8qKlxuICogVGhlIGJhcmUtdGFnIG1hcmtlciByb3dzIG9mIHRoZSByZXZhbGlkYXRpb24gdGFibGUgKGBwayA9IGJ1aWxkSWRgLFxuICogYHNrID0gdGFnYCwgb3Ige0BsaW5rIGhhc2hlZFRhZ30gcGFzdCB7QGxpbmsgTUFYX1RBR19CWVRFU30pLCB3aGljaCByZWNvcmQgd2hlbiBhIHRhZ1xuICogd2FzIGxhc3QgcmV2YWxpZGF0ZWQgYW5kIGhvdy5cbiAqXG4gKiBUaGUgdGFibGUgYWxzbyBob2xkcyB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyBgdGFnI3MzS2V5YCBtYXBwaW5nIHJvd3MsIHdoaWNoXG4gKiBhcmUgaXRzIG93biBidXNpbmVzcyBhbmQgc3RheSBpbiBgUzNDYWNoZUhhbmRsZXJgOiBvbmx5IHRoZSBtYXJrZXJzIG1lYW4gdGhlXG4gKiBzYW1lIHRoaW5nIHRvIGV2ZXJ5IGhhbmRsZXIuIFdoYXQgYW4gaW5zdGFuY2Uga2VlcHMgb2YgdGhlbSBiZXR3ZWVuIHJlYWRzIGlzXG4gKiB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9LlxuICovXG5leHBvcnQgY2xhc3MgVGFnTWFya2VyVGFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogRHluYW1vREJDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1aWxkSWQ6IHN0cmluZyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYHRhZ2AncyByZXZhbGlkYXRpb24gYXQgYG5vd2AuIFNlZSB7QGxpbmsgbWFya2VyVXBkYXRlfS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgcm93IGFzIHRoaXMgd3JpdGUgbGVmdCBpdCwgc28gdGhlIGluc3RhbmNlIHRoYXQgd3JvdGUgaXQgY2FuXG4gICAqIHRyYWNrIGl0IHJhdGhlciB0aGFuIHJlYWQgaXQgYmFjazogcmVhZHMgYXJlIGV2ZW50dWFsbHkgY29uc2lzdGVudCwgYW5kIGFcbiAgICogcmVhZC1iYWNrIHJhY2luZyByZXBsaWNhdGlvbiBjb3VsZCByZXR1cm4gdGhlIG1hcmtlciBmcm9tIGJlZm9yZSB0aGUgd3JpdGUuXG4gICAqL1xuICBhc3luYyB3cml0ZShcbiAgICB0YWc6IHN0cmluZyxcbiAgICBub3c6IG51bWJlcixcbiAgICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8VGFnTWFya2VyIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgbmV3IFVwZGF0ZUl0ZW1Db21tYW5kKHtcbiAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgS2V5OiB7XG4gICAgICAgICAgcGs6IHsgUzogdGhpcy5idWlsZElkIH0sXG4gICAgICAgICAgc2s6IHsgUzogc29ydEtleVRhZyh0YWcpIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLm1hcmtlclVwZGF0ZShub3csIGR1cmF0aW9ucyksXG4gICAgICAgIFJldHVyblZhbHVlczogXCJBTExfTkVXXCIsXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiByZXNwb25zZT8uQXR0cmlidXRlcyA/IG1hcmtlck9mKHJlc3BvbnNlLkF0dHJpYnV0ZXMpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXJrZXIgcm93cyBmb3IgYHRhZ3NgIHRoYXQgZXhpc3QsIGJ5IHRhZywgaW4gb25lIGBCYXRjaEdldEl0ZW1gIHBlclxuICAgKiB7QGxpbmsgQkFUQ0hfR0VUX01BWF9LRVlTfSB0YWdzIHJhdGhlciB0aGFuIGEgYEdldEl0ZW1gIGVhY2g6IGEgcGFnZVxuICAgKiBjYXJyaWVzIGl0cyB3aG9sZSBpbXBsaWNpdCBgX05fVF8v4oCmYCBjaGFpbiBwbHVzIHRoZSBhcHAncyBvd24gdGFncywgYVxuICAgKiBwYWdlIHdpdGggYSBmZXcgZmV0Y2hlcyBjaGVja3MgZWFjaCBvZiB0aGVtIHRvbywgYW5kIGV2ZXJ5IG9uZSBpcyBvbiB0aGVcbiAgICogcmVxdWVzdCBwYXRoLiBBIHRhZyB3aXRoIG5vIHJvdyBpcyBhYnNlbnQgZnJvbSB0aGUgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgcmVhZCh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgVGFnTWFya2VyPj4ge1xuICAgIGNvbnN0IHsgdGFibGVOYW1lLCBidWlsZElkIH0gPSB0aGlzO1xuICAgIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldCh0YWdzKSk7XG4gICAgY29uc3QgbWFya2VycyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVuaXF1ZS5sZW5ndGg7IGkgKz0gQkFUQ0hfR0VUX01BWF9LRVlTKSB7XG4gICAgICAvLyBBIGhhc2hlZCBzb3J0IGtleSBuYW1lcyBubyB0YWcsIHNvIGVhY2ggcm93IGlzIG1hdGNoZWQgYmFjayBieSBrZXkuXG4gICAgICBjb25zdCB0YWdCeVNrID0gbmV3IE1hcChcbiAgICAgICAgdW5pcXVlXG4gICAgICAgICAgLnNsaWNlKGksIGkgKyBCQVRDSF9HRVRfTUFYX0tFWVMpXG4gICAgICAgICAgLm1hcCgodGFnKSA9PiBbc29ydEtleVRhZyh0YWcpLCB0YWddKSxcbiAgICAgICk7XG4gICAgICBsZXQga2V5czogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+W10gfCB1bmRlZmluZWQgPSBBcnJheS5mcm9tKFxuICAgICAgICB0YWdCeVNrLmtleXMoKSxcbiAgICAgICAgKHNrKSA9PiAoeyBwazogeyBTOiBidWlsZElkIH0sIHNrOiB7IFM6IHNrIH0gfSksXG4gICAgICApO1xuICAgICAgLy8gYFVucHJvY2Vzc2VkS2V5c2AgaXMgRHluYW1vREIgZGVjbGluaW5nIHBhcnQgb2YgdGhlIGJhdGNoIHVuZGVyIGxvYWQ7XG4gICAgICAvLyBhIG1hcmtlciBsZWZ0IHVucmVhZCBpcyBhIHJldmFsaWRhdGlvbiBtaXNzZWQsIHNvIGl0IGlzIGFza2VkIGFnYWluLlxuICAgICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGtleXM/Lmxlbmd0aCAmJiBhdHRlbXB0IDwgMzsgYXR0ZW1wdCsrKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBCYXRjaEdldEl0ZW1Db21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgQmF0Y2hHZXRJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgICBSZXF1ZXN0SXRlbXM6IHtcbiAgICAgICAgICAgICAgW3RhYmxlTmFtZV06IHtcbiAgICAgICAgICAgICAgICBLZXlzOiBrZXlzLFxuICAgICAgICAgICAgICAgIFByb2plY3Rpb25FeHByZXNzaW9uOiBcInNrLCByZXZhbGlkYXRlZEF0LCBzdGFsZUF0LCBleHBpcmVkQXRcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS5SZXNwb25zZXM/Llt0YWJsZU5hbWVdID8/IFtdKSB7XG4gICAgICAgICAgY29uc3QgdGFnID0gdGFnQnlTay5nZXQoaXRlbS5zaz8uUyA/PyBcIlwiKTtcbiAgICAgICAgICBpZiAodGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1hcmtlcnMuc2V0KHRhZywgbWFya2VyT2YoaXRlbSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBrZXlzID0gcmVzcG9uc2UuVW5wcm9jZXNzZWRLZXlzPy5bdGFibGVOYW1lXT8uS2V5cztcbiAgICAgIH1cbiAgICAgIGlmIChrZXlzPy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBEeW5hbW9EQiBsZWZ0ICR7a2V5cy5sZW5ndGh9IHRhZyBtYXJrZXJzIHVucmVhZCBhZnRlciByZXRyeWluZ2AsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXJrZXJzO1xuICB9XG59XG5cbi8qKlxuICogSG93IGxvbmcgYSByZXZhbGlkYXRpb24gbG9nIHJvdyBpcyBrZXB0IChgdHRsYCwgZXBvY2ggc2Vjb25kcykuIER5bmFtb0RCIG5ldmVyXG4gKiBkZWxldGVzIGFuIGl0ZW0gYmVmb3JlIGl0cyBUVEwsIG9ubHkgc29tZSB0aW1lIGFmdGVyLCBzbyBhIHJlYWRlciB0aGF0IGxhc3RcbiAqIHF1ZXJpZWQgbGVzcyB0aGFuIHRoaXMgbG9uZyBhZ28gKGxlc3MgYSBtYXJnaW4gZm9yIHdyaXRlcnMnIGNsb2NrcykgaXMgc3VyZVxuICogdG8gZmluZCBldmVyeSByb3cgaXQgaGFzIG5vdCBzZWVuIHlldC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfVFRMX01TID0gMTUgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgbW9zdCBgUXVlcnlgIHBhZ2VzIG9uZSB7QGxpbmsgUmV2YWxpZGF0aW9uTG9nLnF1ZXJ5fSByZWFkcy4gKi9cbmV4cG9ydCBjb25zdCBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUyA9IDU7XG5cbi8qKiBIb3cgbWFueSBzb3J0IGtleXMge0BsaW5rIFJldmFsaWRhdGlvbkxvZy5wdXR9IHRyaWVzIGJlZm9yZSBnaXZpbmcgdXAuICovXG5jb25zdCBMT0dfUFVUX0FUVEVNUFRTID0gNTtcblxuLyoqIERpZ2l0cyBhIGxvZyByb3cncyB0aW1lc3RhbXAgaXMgemVyby1wYWRkZWQgdG8sIHNvIHNvcnQga2V5cyBzb3J0IGJ5IHRpbWUuICovXG5jb25zdCBMT0dfU0tfRElHSVRTID0gMTU7XG5cbi8qKiBBIHJldmFsaWRhdGlvbiByZWFkIGJhY2sgZnJvbSB0aGUgbG9nLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZhbGlkYXRpb25Mb2dSb3cge1xuICAvKiogVGhlIHJvdydzIHNvcnQga2V5OiB1bmlxdWUgcGVyIHJldmFsaWRhdGlvbiBvZiBhIHRhZy4gKi9cbiAgc2s6IHN0cmluZztcbiAgLyoqIFdoZW4gaXQgd2FzIHdyaXR0ZW4sIG9uIHRoZSB3cml0ZXIncyBgRGF0ZS5ub3coKWAuICovXG4gIGF0OiBudW1iZXI7XG4gIHRhZzogc3RyaW5nO1xuICAvKiogVGhlIG1hcmtlciBmaWVsZHMgdGhlIHJldmFsaWRhdGlvbiBzZXQsIGFzIHtAbGluayBtYXJrZXJGb3J9IHJldHVybnMgdGhlbS4gKi9cbiAgbWFya2VyOiBUYWdNYXJrZXI7XG59XG5cbi8qKlxuICogVGhlIHJldmFsaWRhdGlvbiBsb2c6IG9uZSByb3cgcGVyIHRhZyByZXZhbGlkYXRpb24gKGBwayA9IDxidWlsZElkPiNsb2dgLFxuICogYHNrID0gPERhdGUubm93KCksIHplcm8tcGFkZGVkPiM8dGFnPmApLCB3aGljaCBleHBpcmVzIGFmdGVyXG4gKiB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19UVExfTVN9LiBBIHRhZyBwYXN0IHtAbGluayBNQVhfVEFHX0JZVEVTfSBpc1xuICoge0BsaW5rIGhhc2hlZFRhZ30gdGhlcmUsIGFuZCBzcGVsbGVkIG91dCBpbiB0aGUgcm93J3MgYGxvbmdUYWdgIGluc3RlYWQuXG4gKlxuICogVGhlIG1hcmtlciByb3dzIHN0YXkgdGhlIHNvdXJjZSBvZiB0cnV0aC4gVGhlIGxvZyBleGlzdHMgc28gYW4gaW5zdGFuY2VcbiAqIGNhbiBhc2sgXCJ3aGF0IHdhcyByZXZhbGlkYXRlZCBzaW5jZSBJIGxhc3QgbG9va2VkP1wiIGluIG9uZSBgUXVlcnlgLCBpbnN0ZWFkXG4gKiBvZiByZS1yZWFkaW5nIGV2ZXJ5IHRhZyBpdCB0cmFja3MgdG8gZmluZCBvdXQgdGhhdCBhbG1vc3Qgbm9uZSBjaGFuZ2VkLiBFdmVyeVxuICogbWFya2VyIHJvdyBvZiBhIGRlcGxveW1lbnQgc2hhcmVzIG9uZSBwYXJ0aXRpb24sIGFuZCB0aG9zZSByZS1yZWFkcyBmcm9tIGFcbiAqIGhhbmRmdWwgb2YgYnVzeSBpbnN0YW5jZXMgd2VyZSBlbm91Z2ggdG8gdGhyb3R0bGUgaXQuXG4gKlxuICogVGhlIHNvcnQga2V5J3MgdGltZXN0YW1wIGlzIHRoZSB3cml0ZXIncyB3YWxsIGNsb2NrIChgRGF0ZS5ub3coKWApLCBub3QgdGhlXG4gKiBwZXJmb3JtYW5jZSBjbG9jayAoe0BsaW5rIG1hcmtlckNsb2NrfSkgdGhlIG1hcmtlciB2YWx1ZXMgYXJlIHN0YW1wZWQgd2l0aCBieSBib3RoXG4gKiBoYW5kbGVyczogaXQgb25seSBvcmRlcnMgcm93cyBmb3IgcmVhZGVycycgY3Vyc29ycywgd2hpY2ggYXJlIG9uIHRoZWlyIG93blxuICogd2FsbCBjbG9ja3MsIGFuZCBpcyBuZXZlciBjb21wYXJlZCB3aXRoIGFuIGVudHJ5J3MgdGltZXN0YW1wLlxuICovXG5leHBvcnQgY2xhc3MgUmV2YWxpZGF0aW9uTG9nIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEeW5hbW9EQkNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGJ1aWxkSWQ6IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5wayA9IGAke2J1aWxkSWR9I2xvZ2A7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHRoYXQgYHRhZ2Agd2FzIHJldmFsaWRhdGVkIGF0IGBhdGAgKGBEYXRlLm5vdygpYCksIHNldHRpbmcgYG1hcmtlcmAuXG4gICAqXG4gICAqIFR3byByZXZhbGlkYXRpb25zIG9mIGB0YWdgIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHdvdWxkIHNoYXJlIGEgc29ydCBrZXksXG4gICAqIGFuZCB0aGUgc2Vjb25kIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZmlyc3QuIFNvIHRoZSByb3cgaXMgb25seSB3cml0dGVuIHdoZXJlXG4gICAqIGl0cyBrZXkgaXMgZnJlZSwgYW5kIG9uIGEgY29sbGlzaW9uIGl0IG1vdmVzIHRvIHRoZSBuZXh0IG1pbGxpc2Vjb25kLCB1cFxuICAgKiB0byB7QGxpbmsgTE9HX1BVVF9BVFRFTVBUU30gdGltZXMuXG4gICAqL1xuICBhc3luYyBwdXQodGFnOiBzdHJpbmcsIGF0OiBudW1iZXIsIG1hcmtlcjogVGFnTWFya2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2tUYWcgPSBzb3J0S2V5VGFnKHRhZyk7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBpdGVtOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gPSB7XG4gICAgICAgIHBrOiB7IFM6IHRoaXMucGsgfSxcbiAgICAgICAgc2s6IHsgUzogYCR7bG9nU2tQcmVmaXgoYXQpfSMke3NrVGFnfWAgfSxcbiAgICAgICAgdHRsOiB7IE46IFN0cmluZyhNYXRoLmNlaWwoKGF0ICsgUkVWQUxJREFUSU9OX0xPR19UVExfTVMpIC8gMTAwMCkpIH0sXG4gICAgICAgIC4uLihza1RhZyAhPT0gdGFnICYmIHsgbG9uZ1RhZzogeyBTOiB0YWcgfSB9KSxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIE1BUktFUl9GSUVMRFMpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtYXJrZXJbZmllbGRdO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGl0ZW1bZmllbGRdID0geyBOOiBTdHJpbmcodmFsdWUpIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICAgICAgbmV3IFB1dEl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgICAgICBJdGVtOiBpdGVtLFxuICAgICAgICAgICAgQ29uZGl0aW9uRXhwcmVzc2lvbjogXCJhdHRyaWJ1dGVfbm90X2V4aXN0cyhzaylcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChlcnJvciBhcyBFcnJvciB8IHVuZGVmaW5lZCk/Lm5hbWUgIT09XG4gICAgICAgICAgICBcIkNvbmRpdGlvbmFsQ2hlY2tGYWlsZWRFeGNlcHRpb25cIiB8fFxuICAgICAgICAgIGF0dGVtcHQgPj0gTE9HX1BVVF9BVFRFTVBUU1xuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBhdCA9IE1hdGguZmxvb3IoYXQpICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJvd3Mgd3JpdHRlbiBhdCBvciBhZnRlciBgc2luY2VgIChgRGF0ZS5ub3coKWApLCBvbGRlc3QgZmlyc3QuXG4gICAqIGB0cnVuY2F0ZWRgIHdoZW4gdGhlcmUgd2VyZSBtb3JlIHRoYW4ge0BsaW5rIFJFVkFMSURBVElPTl9MT0dfTUFYX1BBR0VTfVxuICAgKiBwYWdlcyBvZiB0aGVtLCBhbmQgYHJvd3NgIGlzIG9ubHkgdGhlIHN0YXJ0LlxuICAgKlxuICAgKiBFdmVudHVhbGx5IGNvbnNpc3RlbnQ6IGEgcm93IHdyaXR0ZW4gYSBtb21lbnQgYWdvIG1heSBub3Qgc2hvdyB5ZXQsIHdoaWNoXG4gICAqIGlzIHdoYXQgdGhlIHJlYWRlcidzIGxvb2tiYWNrIGlzIGZvci5cbiAgICovXG4gIGFzeW5jIHF1ZXJ5KFxuICAgIHNpbmNlOiBudW1iZXIsXG4gICk6IFByb21pc2U8eyByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXTsgdHJ1bmNhdGVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCByb3dzOiBSZXZhbGlkYXRpb25Mb2dSb3dbXSA9IFtdO1xuICAgIGxldCBzdGFydEtleTogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHBhZ2UgPSAwOyBwYWdlIDwgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVM7IHBhZ2UrKykge1xuICAgICAgY29uc3QgcmVzcG9uc2U6IFF1ZXJ5Q29tbWFuZE91dHB1dCA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBRdWVyeUNvbW1hbmQoe1xuICAgICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwayBBTkQgc2sgPj0gOnNpbmNlXCIsXG4gICAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgICAgXCI6cGtcIjogeyBTOiB0aGlzLnBrIH0sXG4gICAgICAgICAgICBcIjpzaW5jZVwiOiB7IFM6IGxvZ1NrUHJlZml4KE1hdGgubWF4KDAsIHNpbmNlKSkgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFByb2plY3Rpb25FeHByZXNzaW9uOlxuICAgICAgICAgICAgXCJzaywgbG9uZ1RhZywgcmV2YWxpZGF0ZWRBdCwgc3RhbGVBdCwgZXhwaXJlZEF0XCIsXG4gICAgICAgICAgRXhjbHVzaXZlU3RhcnRLZXk6IHN0YXJ0S2V5LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzcG9uc2UuSXRlbXMgPz8gW10pIHtcbiAgICAgICAgY29uc3Qgc2sgPSBpdGVtLnNrPy5TO1xuICAgICAgICAvLyBgPGRpZ2l0cz4jPHRhZz5gOiB0aGUgdGFnIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpeGVkLXdpZHRoXG4gICAgICAgIC8vIHRpbWVzdGFtcCwgYCNgcyBpbmNsdWRlZC5cbiAgICAgICAgaWYgKHNrID09PSB1bmRlZmluZWQgfHwgc2tbTE9HX1NLX0RJR0lUU10gIT09IFwiI1wiKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICBzayxcbiAgICAgICAgICBhdDogTnVtYmVyKHNrLnNsaWNlKDAsIExPR19TS19ESUdJVFMpKSxcbiAgICAgICAgICB0YWc6IGl0ZW0ubG9uZ1RhZz8uUyA/PyBzay5zbGljZShMT0dfU0tfRElHSVRTICsgMSksXG4gICAgICAgICAgbWFya2VyOiBtYXJrZXJPZihpdGVtKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBzdGFydEtleSA9IHJlc3BvbnNlLkxhc3RFdmFsdWF0ZWRLZXk7XG4gICAgICBpZiAoIXN0YXJ0S2V5KSB7XG4gICAgICAgIHJldHVybiB7IHJvd3MsIHRydW5jYXRlZDogZmFsc2UgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgcm93cywgdHJ1bmNhdGVkOiB0cnVlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9nU2tQcmVmaXgoYXQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcoTWF0aC5mbG9vcihhdCkpLnBhZFN0YXJ0KExPR19TS19ESUdJVFMsIFwiMFwiKTtcbn1cblxuLyoqXG4gKiBIb3cgZmFyIGJlaGluZCB0aGUgbGFzdCBxdWVyeSdzIHN0YXJ0IHRoZSBuZXh0IG9uZSBzdGFydHMgcmVhZGluZyB0aGUgbG9nOlxuICogdGhlIHJvb20gZm9yIHRoZSBgUXVlcnlgIGJlaW5nIGV2ZW50dWFsbHkgY29uc2lzdGVudCBhbmQgZm9yIHdyaXRlcnMnIGNsb2Nrc1xuICogcnVubmluZyBiZWhpbmQgdGhlIHJlYWRlcidzLiBSb3dzIGluc2lkZSBpdCBhcmUgcmVhZCBhZ2FpbiwgYW5kIGRyb3BwZWQgYXNcbiAqIGFscmVhZHkgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVMgPSA1MDAwO1xuXG4vKipcbiAqIFRoZSBsb25nZXN0IHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30gdHJ1c3RzIHRoZSBsb2cgYWxvbmUgZm9yIGEgdGFnIGJlZm9yZVxuICogcmVhZGluZyBpdHMgbWFya2VyIHJvdyBhZ2Fpbi4gVGhlIGxvZyBpcyB0aGUgZmFzdCBwYXRoLCBidXQgdGhlIG1hcmtlciByb3dzXG4gKiBhcmUgdGhlIHNvdXJjZSBvZiB0cnV0aDogYSBsb2cgcm93IHdob3NlIHdyaXRlIGZhaWxlZCB3b3VsZCBvdGhlcndpc2UgYmVcbiAqIG1pc3NlZCBmb3IgYXMgbG9uZyBhcyB0aGUgdGFnIHN0YXlzIHRyYWNrZWQuXG4gKlxuICogUm9sbGluZywgbm90IGFsbCBhdCBvbmNlOiBlYWNoIHJlZnJlc2ggcmUtcmVhZHMgYXQgbW9zdFxuICoge0BsaW5rIEJBVENIX0dFVF9NQVhfS0VZU30gb2YgdGhlIHRhZ3MgZHVlLCBvbGRlc3QgZmlyc3QuIFJlLXJlYWRpbmcgdGhlbSBhbGxcbiAqIHRvZ2V0aGVyIGNvc3QgfjUwMCBSQ1UgYXQgMTAwMCB0YWdzIC0gYSBmbGVldCBzdGFydGVkIGJ5IG9uZSBsb2FkIHRlc3QgZGlkIGl0XG4gKiBpbiB0aGUgc2FtZSBtaW51dGUsIDEyLDgwMCBSQ1UsIGFuZCB0aHJvdHRsZWQgLSBhbmQgd291bGQgYmUgfjUsMDAwIFJDVSBhdFxuICoge0BsaW5rIERFRkFVTFRfTUFYX1RSQUNLRURfVEFHU30sIHBhc3Qgd2hhdCB0aGUgb25lIHBhcnRpdGlvbiBzZXJ2ZXMgaW4gYVxuICogc2Vjb25kLiBTcHJlYWQgb3V0LCAxMCwwMDAgdHJhY2tlZCB0YWdzIGNvc3QgfjggUkNVIGEgc2Vjb25kIHBlciBpbnN0YW5jZS5cbiAqXG4gKiBFYWNoIHRhZyBpcyBkdWUgYXQgYSByYW5kb20gNzUtMTAwJSBvZiB0aGlzIGFmdGVyIGl0IHdhcyBsYXN0IHJlYWQsIHNvIHRhZ3NcbiAqIGZpcnN0IHJlYWQgdG9nZXRoZXIgLSBhbiBpbnN0YW5jZSB3YXJtaW5nIHVwIC0gZG8gbm90IGFsbCBjb21lIGR1ZSB0b2dldGhlclxuICogYWdhaW4gZXZlcnkgaW50ZXJ2YWw6IHRoZSBsb2FkIHRlc3QgdGhhdCBtZWFzdXJlZCB0aGUgcm9sbGluZyByZS1yZWFkIHNhd1xuICogaXRzIHdhcm0tdXAncyByZWFkcyByZXR1cm4gYXMgYSAzMC0zNiBSQ1UvcyBidW1wIHRlbiBtaW51dGVzIGxhdGVyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UQUdfUkVTWU5DX01TID0gMTAgKiA2MCAqIDEwMDA7XG5cbi8qKiBUaGUgZnJhY3Rpb24gb2Yge0BsaW5rIERFRkFVTFRfVEFHX1JFU1lOQ19NU30gYSB0YWcgbWF5IGNvbWUgZHVlIGVhcmx5IGJ5LiAqL1xuY29uc3QgVEFHX1JFU1lOQ19KSVRURVIgPSAwLjI1O1xuXG4vKipcbiAqIEhvdyBsb25nIHNpbmNlIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbG9nIHF1ZXJ5IHRoZSBsb2cgY2FuIHN0aWxsIGJlIHRydXN0ZWQgdG9cbiAqIGhvbGQgZXZlcnkgcm93IG5vdCByZWFkIHlldDogaXRzIFRUTCBsZXNzIGEgbWFyZ2luIGZvciB3cml0ZXJzJyBjbG9ja3MuIFBhc3RcbiAqIGl0IC0gYSBMYW1iZGEgZnJvemVuIGJldHdlZW4gaW52b2NhdGlvbnMsIGEgcnVuIG9mIGZhaWxlZCBxdWVyaWVzIC0gdGhlXG4gKiB0cmFja2VkIG1hcmtlcnMgYXJlIGZvcmdvdHRlbiwgdG8gYmUgcmVhZCBhZ2FpbiBhcyB0aGV5IGFyZSBuZWVkZWQsIGFuZCB0aGVcbiAqIGxvZyBpcyBmb2xsb3dlZCBmcm9tIHRoZXJlLlxuICovXG5leHBvcnQgY29uc3QgTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TID1cbiAgUkVWQUxJREFUSU9OX0xPR19UVExfTVMgLSA1ICogNjAgKiAxMDAwO1xuXG4vKipcbiAqIFRoZSBtb3N0IHRhZ3Mgb25lIGluc3RhbmNlIHRyYWNrcy4gUGFzdCBpdCB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpc1xuICogZm9yZ290dGVuLCB3aGljaCBjb3N0cyBhIHJlYWQgdGhlIG5leHQgdGltZSBpdCBpcyBuZWVkZWQ6IGFuIHVudHJhY2tlZCB0YWdcbiAqIGlzIHJlYWQgYmVmb3JlIGl0IGlzIHRydXN0ZWQuXG4gKlxuICogQSB0cmFja2VkIHRhZyBjb3N0cyBtZW1vcnkgKH4yIE1CIGF0IHRoaXMgYm91bmQpIGFuZCBpdHMgc2hhcmUgb2YgdGhlIHJvbGxpbmdcbiAqIHJlLXJlYWQsIG5vdCBhIHJlYWQgZXZlcnkgcmVmcmVzaCwgc28gdGhlIGJvdW5kIGlzIHNldCBieSBob3cgbWFueSB0YWdzIGFuXG4gKiBpbnN0YW5jZSByZWFsbHkgdXNlcy4gRXZlcnkgcGF0aCBpcyBhIHRhZyBvZiBpdHMgb3duIChgX05fVF8vPHBhdGg+YCksIGFuZCBhdFxuICogMTAwMCBhbiBhcHAgb2YgMTAwMCB0YWdnZWQgcGFnZXMga2VwdCBldmljdGluZyB3aGF0IGl0IHdhcyBhYm91dCB0byBuZWVkOlxuICogaGFsZiBpdHMgcmVxdWVzdHMgcmUtcmVhZCBhIG1hcmtlci5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX1RSQUNLRURfVEFHUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBUaGUgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MgYW5kIGl0cyBsb2csIHdoaWNoIGFyZSBvbmx5IGV2ZXIgdXNlZFxuICogdG9nZXRoZXIsIG9yIG5laXRoZXIgZm9yIHRhZ3MgbG9jYWwgdG8gdGhpcyBwcm9jZXNzLlxuICovXG5leHBvcnQgdHlwZSBUYWdUYWJsZSA9XG4gIHwgeyBtYXJrZXJzOiBUYWdNYXJrZXJUYWJsZTsgbG9nOiBSZXZhbGlkYXRpb25Mb2cgfVxuICB8IHsgbWFya2Vycz86IHVuZGVmaW5lZDsgbG9nPzogdW5kZWZpbmVkIH07XG5cbi8qKiBIb3cge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSBpcyBidWlsdC4gKi9cbmV4cG9ydCB0eXBlIFRyYWNrZWRUYWdNYXJrZXJzT3B0aW9ucyA9IFRhZ1RhYmxlICYge1xuICAvKipcbiAgICogSG93IG9mdGVuLCBhdCBtb3N0LCB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMucmVmcmVzaH0gcmVhZHMgYW55dGhpbmcuXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfVEFHX1JFRlJFU0hfTVNcbiAgICovXG4gIHJlZnJlc2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICBtYXhUcmFja2VkVGFncz86IG51bWJlcjtcbiAgLyoqIEBzZWUgREVGQVVMVF9UQUdfUkVTWU5DX01TICovXG4gIHJlc3luY0ludGVydmFsTXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgd2FsbCBjbG9jayB0aGUgbG9nJ3MgY3Vyc29yIGFuZCB0aGUgaW50ZXJ2YWxzIGFyZSBrZXB0IG9uLiAqL1xuICBjbG9jaz86ICgpID0+IG51bWJlcjtcbiAgLyoqIGBNYXRoLnJhbmRvbWAsIGZvciB3aGVuIGVhY2ggdGFnJ3MgcmUtcmVhZCBjb21lcyBkdWUuICovXG4gIHJhbmRvbT86ICgpID0+IG51bWJlcjtcbiAgZGVidWc/OiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcHJvY2VzcyBjYW4gYmUgZnJvemVuIHdpdGggYSByZWZyZXNoIGluIGZsaWdodCwgYXMgYSBMYW1iZGFcbiAgICogc2FuZGJveCBpcyBiZXR3ZWVuIGludm9jYXRpb25zOiB0aGVuIGEgdGltZXIgY2hlY2tzIGl0IGtlcHQgcnVubmluZywgYW5kXG4gICAqIG9uZSB0aGF0IHNwYW5uZWQgYSBmcmVlemUgZG9lcyBub3QgY291bnQuIEEgY29udGFpbmVyIGlzIG5ldmVyIGZyb3plbixcbiAgICogc28gaXQgc2tpcHMgdGhlIHRpbWVyIGFuZCB3YWl0cyBmb3IgdGhlIHJlZnJlc2ggaW4gZmxpZ2h0LCBob3dldmVyIHNsb3cuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBjYW5GcmVlemU/OiBib29sZWFuO1xufTtcblxuLyoqXG4gKiBPbmUgaW5zdGFuY2UncyBjb3B5IG9mIHRoZSBtYXJrZXIgcm93cyBvZiB0aGUgdGFncyBpdCBoYXMgbmVlZGVkLCBrZXB0XG4gKiBjdXJyZW50IHRocm91Z2ggdGhlIHtAbGluayBSZXZhbGlkYXRpb25Mb2d9OiB0aGUgcHJvY2VzcydzIG9uZSB0YWcgbWFuaWZlc3RcbiAqIChgc2hhcmVkVGFnTWFuaWZlc3RgKSwgZm9yIHRoZSBgJ3VzZSBjYWNoZSdgIGhhbmRsZXJzIGFuZCB0aGUgaW5jcmVtZW50YWxcbiAqIGNhY2hlIGFsaWtlLlxuICpcbiAqIE5leHQuanMncyBidWlsdC1pbiBgJ3VzZSBjYWNoZSdgIGhhbmRsZXIga2VlcHMgdGFncyBpbiBhIG1vZHVsZS1sZXZlbCBtYXBcbiAqIChgdGFncy1tYW5pZmVzdC5leHRlcm5hbC5qc2ApIHRoYXQgb25seSBpdHMgb3duIGB1cGRhdGVUYWdzYCB3cml0ZXMsIGFuZCBpdHNcbiAqIGByZWZyZXNoVGFnc2AgaXMgYSBuby1vcCwgc28gYSBgcmV2YWxpZGF0ZVRhZ2Agb24gb25lIGluc3RhbmNlIG5ldmVyIHJlYWNoZXNcbiAqIHRoZSBvdGhlcnM6IHRoZXkga2VlcCBzZXJ2aW5nIHRoZSByZXZhbGlkYXRlZCBlbnRyeSwgaW5jbHVkaW5nIGluc2lkZSBwYWdlc1xuICogdGhhdCBhcmUgYmVpbmcgcmUtcmVuZGVyZWQgKmJlY2F1c2UqIG9mIHRoYXQgcmV2YWxpZGF0aW9uLiBUaGVcbiAqIGBjYWNoZUhhbmRsZXJzYCBpbnRlcmZhY2UncyBhbnN3ZXIgaXMgYHJlZnJlc2hUYWdzYCwgXCJjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nXG4gKiBhIG5ldyByZXF1ZXN0IOKApiB0byByZWZyZXNoIHRoZSBsb2NhbCB0YWdzIG1hbmlmZXN0XCIsIGFuZCB0aGlzIGlzIHRoYXRcbiAqIG1hbmlmZXN0LCBiYWNrZWQgYnkgdGhlIHNhbWUgbWFya2VyIHJvd3MgdGhlIGluY3JlbWVudGFsIGNhY2hlJ3NcbiAqIGByZXZhbGlkYXRlVGFnYCB3cml0ZXMgKGBwayA9IGJ1aWxkSWRgLCBgc2sgPSB0YWdgKS5cbiAqXG4gKiBUaGUgY29zdCBpcyBib3VuZGVkIHBlciBpbnN0YW5jZSwgbm90IHBlciByZXF1ZXN0OlxuICogLSB7QGxpbmsgZW5zdXJlfSByZWFkcyBhIHRhZydzIG1hcmtlciB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQgYW5kIG5vdFxuICogICBhZ2FpbiB1bnRpbCBpdCBpcyBldmljdGVkLCBzbyBhIHRhZyBjb3N0cyBvbmUgcmVhZCBwZXIgaW5zdGFuY2UsIG5vdCBvbmVcbiAqICAgcGVyIHJlcXVlc3QuIEFuIGVudHJ5IGNyZWF0ZWQgc2luY2Uge0BsaW5rIGNvbXBsZXRlU2luY2V9IG5lZWRzIG5vIHJlYWRcbiAqICAgYXQgYWxsLlxuICogLSB7QGxpbmsgcmVmcmVzaH0sIGF0IG1vc3Qgb25jZSBwZXIgYHJlZnJlc2hJbnRlcnZhbE1zYCwgc2VuZHMgb25lIGBRdWVyeWBcbiAqICAgZm9yIHRoZSBsb2cgcm93cyB3cml0dGVuIHNpbmNlIHRoZSBsYXN0IG9uZSwgYW5kIGFwcGxpZXMgdGhvc2Ugb2YgdGFnc1xuICogICB0aGlzIGluc3RhbmNlIHRyYWNrcy4gQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIGl0LiBBbG9uZ3NpZGUsIGl0IHJlLXJlYWRzXG4gKiAgIHRoZSBtYXJrZXJzIG9mIHVwIHRvIHtAbGluayBCQVRDSF9HRVRfTUFYX0tFWVN9IHRhZ3Mgbm90IHJlYWQgZm9yXG4gKiAgIHtAbGluayBERUZBVUxUX1RBR19SRVNZTkNfTVN9LCBpbiBvbmUgYEJhdGNoR2V0SXRlbWAuXG4gKiBBIHJldmFsaWRhdGlvbiBvbiBhbm90aGVyIGluc3RhbmNlIGlzIHRoZXJlZm9yZSBzZWVuIHdpdGhpblxuICogYHJlZnJlc2hJbnRlcnZhbE1zYCAocGx1cyB0aGUgcXVlcnkgaXRzZWxmKSAtIGJ5IGAndXNlIGNhY2hlJ2AsIGZyb20gdGhlXG4gKiBmaXJzdCByZXF1ZXN0IGFmdGVyIHRoZSBxdWVyeSByZXR1cm5zLCBzaW5jZSBpdHMgYHJlZnJlc2hUYWdzYCBkb2VzIG5vdCB3YWl0XG4gKiBmb3IgaXQgKHNlZSBgdGFnTWV0aG9kc2ApIHVubGVzcyB0aGUgaW5zdGFuY2UgaXMge0BsaW5rIGJlaGluZH0sIHdoaWNoIHRoZVxuICogcnVudGltZSBzZXR0bGVzIGJlZm9yZSBhIHBhZ2UgcmVuZGVyIHN0YXJ0cyAoe0BsaW5rIGNhdGNoVXB9KS4gVGhlIGluc3RhbmNlXG4gKiB0aGF0IHJhbiBpdCBhcHBsaWVzIGl0IGl0c2VsZiwgYXQgb25jZSwgd2l0aCB7QGxpbmsgc2V0fS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYWNrZWRUYWdNYXJrZXJzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXJrZXJzOiBUYWdNYXJrZXJUYWJsZSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IFJldmFsaWRhdGlvbkxvZyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWZyZXNoSW50ZXJ2YWxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFRyYWNrZWRUYWdzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzeW5jSW50ZXJ2YWxNczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNsb2NrOiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmFuZG9tOiAoKSA9PiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVidWc6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBCeSB0YWcsIGxlYXN0IHJlY2VudGx5IHVzZWQgZmlyc3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGFncyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KCk7XG4gIC8qKlxuICAgKiBXaGVuIGVhY2ggdHJhY2tlZCB0YWcncyBtYXJrZXIgaXMgZHVlIHRvIGJlIHJlYWQgYWdhaW46IGEgcmFuZG9tIDc1LTEwMCVcbiAgICogb2YgYHJlc3luY0ludGVydmFsTXNgIGFmdGVyIGl0IHdhcyBsYXN0IGtub3duIGZyb20gdGhlIHRhYmxlIC0gcmVhZCxcbiAgICogd3JpdHRlbiBoZXJlLCBvciBuZXcuIEluIHRoZSBvcmRlciB0aGV5IGJlY2FtZSBrbm93biwgbGVhc3QgcmVjZW50IGZpcnN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkdWVBdCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVhZGluZyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuICAvKipcbiAgICogTG9nIHJvd3MgZm9yIHRhZ3Mgd2hvc2UgZmlyc3QgcmVhZCBpcyBpbiBmbGlnaHQsIG1lcmdlZCBieSB0YWc6IHRoZSByZWFkXG4gICAqIG1heSBoYXZlIGJlZW4gYW5zd2VyZWQgYmVmb3JlIHRoZSByZXZhbGlkYXRpb24sIHNvIHRoZXkgYXJlIGFwcGxpZWQgdG8gaXRzXG4gICAqIHJlc3VsdCByYXRoZXIgdGhhbiBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nUm93cyA9IG5ldyBNYXA8c3RyaW5nLCBUYWdNYXJrZXI+KCk7XG4gIC8qKlxuICAgKiBMb2cgcm93cyBmb3IgdGFncyBub3QgdHJhY2tlZCBhbmQgbm90IGJlaW5nIHJlYWQsIG1lcmdlZCBieSB0YWcsIG9sZGVzdFxuICAgKiBmaXJzdDogd2hhdCB0aGUgbG9nIGhhcyBzYWlkIGFib3V0IHRoZW0gc2luY2Uge0BsaW5rIGNvbXBsZXRlU2luY2V9LiBUYWtlblxuICAgKiBpbnRvIGEgdGFnJ3MgbWFya2VyIHdoZW4gaXQgaXMgcmVhZCBvciB3cml0dGVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsb2dPbmx5ID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcbiAgLyoqIFNlZSB7QGxpbmsgY29tcGxldGVTaW5jZX0uICovXG4gIHByaXZhdGUgZmxvb3I6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBmdXR1cmUgYGV4cGlyZWRBdGBzIG9mIG1hcmtlcnMgZHJvcHBlZCBzaW5jZSwgYXMgYFtmcm9tLCB0b11gLCBpblxuICAgKiBvcmRlcjogb25jZSBgZnJvbWAgaXMgcGFzdCwge0BsaW5rIGNvbXBsZXRlU2luY2V9IG1vdmVzIHRvIGB0b2AsIGFuZCBub3RcbiAgICogYmVmb3JlLCBzaW5jZSBvbmx5IHRoZW4gZG9lcyBpdCBleHBpcmUgYW55dGhpbmcuIGBmcm9tYCBhbmQgYHRvYCBhcmUgdGhlXG4gICAqIHNhbWUgdW50aWwgc3BhbnMgYXJlIG1lcmdlZCBmb3Igc3BhY2UgKHtAbGluayBsYXRlckZsb29yfSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxhdGVyRmxvb3JzOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbXTtcbiAgLyoqIFRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmVzIGp1ZGdlZCBieSB7QGxpbmsgY29tcGxldGVTaW5jZX0uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZW50cnlTdG9yZXM6IHtcbiAgICBvbGRlc3RUaW1lc3RhbXA6IChzY2FuOiBib29sZWFuKSA9PiBudW1iZXI7XG4gICAgaG9sZHNBbnk6ICgpID0+IGJvb2xlYW47XG4gIH1bXSA9IFtdO1xuICAvKiogSG93IG1hbnkgdGltZXMge0BsaW5rIGZvcmdldH0gcmFuOiBhIHJlYWQgc3RhcnRlZCBiZWZvcmUgb25lIGlzIG1hZGUgYWdhaW4uICovXG4gIHByaXZhdGUgZm9yZ290dGVuID0gMDtcbiAgLyoqIFRyYWNrZWQgdGFncyB3aG9zZSByZWFkIGZhaWxlZCwgZm9yIHRoZSBuZXh0IHJlZnJlc2ggdG8gcmVhZCBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB1bnJlYWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqXG4gICAqIFNldCBpbnNpZGUgYSBwYWdlIHJlbmRlciB7QGxpbmsgY2F0Y2hVcH0gbGV0IGdvLCBmb3IgdGhhdCByZW5kZXIgYWxvbmUuXG4gICAqIFNlZSB7QGxpbmsgYmVoaW5kSW5SZW5kZXJ9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjYXVnaHRVcFJlbmRlciA9IG5ldyBBc3luY0xvY2FsU3RvcmFnZTx0cnVlPigpO1xuICAvKiogV2hlbiBgc3luY2AgbGFzdCBzY2FubmVkIHRoZSBlbnRyeSBzdG9yZXMgKHtAbGluayBvbGRlc3RFbnRyeX0pLiAqL1xuICBwcml2YXRlIGxhc3RFbnRyeVNjYW4gPSAtSW5maW5pdHk7XG4gIC8qKlxuICAgKiBObyBgbG9nT25seWAgcm93IGlzIGtub3duIGJ5IGl0IG9yIGVhcmxpZXIsIHNvIGEge0BsaW5rIHBydW5lTG9nZ2VkfVxuICAgKiBhZ2FpbnN0IGl0IG9yIGVhcmxpZXIgZHJvcHMgbm90aGluZzogYSBtYXJrZXIgaXMgb25seSBldmVyIGtub3duIGJ5IGxhdGVyLFxuICAgKiBhcyBpdHMgYGV4cGlyZWRBdGAgcGFzc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZWRBZ2FpbnN0ID0gLUluZmluaXR5O1xuICAvKiogV2hlbiB0aGUgbGFzdCByZWZyZXNoIHN0YXJ0ZWQsIG9yIHdhcyBza2lwcGVkLiAqL1xuICBwcml2YXRlIGxhc3RSZWZyZXNoID0gLUluZmluaXR5O1xuICAvKipcbiAgICogVGhlIHJlZnJlc2ggaW4gZmxpZ2h0LiBPbmUgbGVmdCBvcGVuIGFjcm9zcyBhIGZyZWV6ZSBjb21lcyBiYWNrIGFmdGVyIHRoZVxuICAgKiB0aGF3IHdpdGggd2hhdCBpdCByZWFkIGJlZm9yZSwgc28ge0BsaW5rIHJlZnJlc2h9IHdhaXRzIGZvciBpdCBhbmQgdGhlblxuICAgKiBmb3IgYSBmcmVzaCBvbmUsIHJhdGhlciB0aGFuIHRoZSBydW50aW1lIHdhaXRpbmcgZm9yIGl0IGJlZm9yZSB0aGUgZnJlZXplOlxuICAgKiB0aGF0IHdvdWxkIGJpbGwgZXZlcnkgTGFtYmRhIGludm9jYXRpb24gZm9yIHRoZSBxdWVyeSdzIHRhaWwuXG4gICAqL1xuICBwcml2YXRlIHJlZnJlc2hpbmc6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBXaGVuIHtAbGluayByZWZyZXNoaW5nfSBsYXN0IHNob3dlZCB0aGUgcHJvY2VzcyBydW5uaW5nOiBhIHRpbWVyIHRpY2tzXG4gICAqIHdoaWxlIGl0IGlzIGluIGZsaWdodCwgYW5kIGEgdGljayB0aGF0IGNvbWVzIGxhdGUsIG9yIG5vbmUgYXQgYWxsLCBtZWFuc1xuICAgKiB0aGUgcHJvY2VzcyB3YXMgcGF1c2VkIC0gZnJvemVuIC0gc2luY2UgaXQgc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgbGFzdFRpY2sgPSAtSW5maW5pdHk7XG4gIC8qKiBXaGV0aGVyIGEgdGljayBjYW1lIGxhdGUgc2luY2Uge0BsaW5rIHJlZnJlc2hpbmd9IHN0YXJ0ZWQuICovXG4gIHByaXZhdGUgcGF1c2VkV2hpbGVSZWZyZXNoaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgdGlja2VyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FuRnJlZXplOiBib29sZWFuO1xuICAvKipcbiAgICogV2hlbiB0aGUgbGFzdCByZWZyZXNoIHNldHRsZWQsIGVpdGhlciB3YXksIHVubGVzcyBpdCBzcGFubmVkIGEgcGF1c2U6IHdoYXRcbiAgICogaXQga25vd3MgaXMgZnJvbSB0aGVuLiBTZWUge0BsaW5rIGJlaGluZH0uXG4gICAqL1xuICBwcml2YXRlIHNldHRsZWRBdDogbnVtYmVyO1xuICAvKipcbiAgICogV2hlcmUgdGhlIG5leHQgbG9nIHF1ZXJ5IHN0YXJ0cyAoYGNsb2NrKClgKTogdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBvbmUnc1xuICAgKiBzdGFydCwgbGVzcyB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NU30uXG4gICAqL1xuICBwcml2YXRlIGN1cnNvcjogbnVtYmVyO1xuICAvKiogV2hlbiB0aGUgbGFzdCBzdWNjZXNzZnVsIGxvZyBxdWVyeSBzdGFydGVkLCBvciB0aGUgbG9nIHdhcyBmaXJzdCByZWFkLiAqL1xuICBwcml2YXRlIGxhc3RMb2dSZWFkOiBudW1iZXI7XG4gIC8qKiBMb2cgcm93cyBhdCBvciBhZnRlciB0aGUgY3Vyc29yIGFscmVhZHkgYXBwbGllZCwgYnkgc29ydCBrZXkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwbGllZCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiB7QGxpbmsgdXBkYXRlfXMgb2YgdGhlIGN1cnJlbnQgdHVybiwgYnkgdGhlaXIgYXJndW1lbnRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0aW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8Ym9vbGVhbj4+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogVHJhY2tlZFRhZ01hcmtlcnNPcHRpb25zKSB7XG4gICAgdGhpcy5tYXJrZXJzID0gb3B0aW9ucy5tYXJrZXJzO1xuICAgIHRoaXMubG9nID0gb3B0aW9ucy5sb2c7XG4gICAgdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcyA9XG4gICAgICBvcHRpb25zLnJlZnJlc2hJbnRlcnZhbE1zID8/IERFRkFVTFRfVEFHX1JFRlJFU0hfTVM7XG4gICAgdGhpcy5tYXhUcmFja2VkVGFncyA9IG9wdGlvbnMubWF4VHJhY2tlZFRhZ3MgPz8gREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTO1xuICAgIHRoaXMucmVzeW5jSW50ZXJ2YWxNcyA9IG9wdGlvbnMucmVzeW5jSW50ZXJ2YWxNcyA/PyBERUZBVUxUX1RBR19SRVNZTkNfTVM7XG4gICAgLy8gTG9va2VkIHVwIG9uIGVhY2ggY2FsbCByYXRoZXIgdGhhbiBib3VuZCBoZXJlLCBzbyBhIHRlc3QncyBgRGF0ZS5ub3dgXG4gICAgLy8gc3B5IGFwcGxpZXMuXG4gICAgdGhpcy5jbG9jayA9IG9wdGlvbnMuY2xvY2sgPz8gKCgpID0+IERhdGUubm93KCkpO1xuICAgIHRoaXMucmFuZG9tID0gb3B0aW9ucy5yYW5kb20gPz8gTWF0aC5yYW5kb207XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gKCgpID0+IHt9KTtcbiAgICB0aGlzLmNhbkZyZWV6ZSA9IG9wdGlvbnMuY2FuRnJlZXplID8/IGZhbHNlO1xuICAgIC8vIE5vdGhpbmcgaXMgdHJhY2tlZCB5ZXQsIHNvIG5vdGhpbmcgYmVmb3JlIHRoaXMgY2FuIGJlIG1pc3NlZDogZXZlcnkgdGFnXG4gICAgLy8gaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkLlxuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIHRoaXMuY3Vyc29yID0gYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TO1xuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgICB0aGlzLnNldHRsZWRBdCA9IGF0O1xuICAgIHRoaXMuZmxvb3IgPSBtYXJrZXJDbG9jaygpO1xuICB9XG5cbiAgLyoqIGB0YWdgJ3MgbWFya2VyIGFzIHRoaXMgaW5zdGFuY2Uga25vd3MgaXQsIGlmIGl0IHRyYWNrcyBgdGFnYC4gKi9cbiAgZ2V0KHRhZzogc3RyaW5nKTogVGFnTWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmdldCh0YWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmNlIHdoZW4gKGBtYXJrZXJDbG9jaygpYCkgdGhpcyBpbnN0YW5jZSBrbm93cyBvZiBldmVyeSByZXZhbGlkYXRpb24gb2ZcbiAgICogZXZlcnkgdGFnLCB0cmFja2VkIG9yIG5vdDogdHJhY2tlZCBvbmVzIGZyb20gdGhlaXIgbWFya2VycyBhbmQgdGhlIGxvZyxcbiAgICogdGhlIG90aGVycyBmcm9tIHRoZSBsb2cgYWxvbmUgKGBsb2dPbmx5YCkuIFNvIGFuIGVudHJ5IGNyZWF0ZWQgYXQgb3IgYWZ0ZXJcbiAgICogaXQgY2FuIGJlIGp1ZGdlZCBieSB7QGxpbmsgc3RhdGV9IGFuZCB7QGxpbmsgZXhwaXJhdGlvbn0gd2l0aG91dFxuICAgKiB7QGxpbmsgZW5zdXJlfSByZWFkaW5nIGFueXRoaW5nIC0gd2hpY2ggbWF0dGVycyBpbnNpZGUgYSBgJ3VzZSBjYWNoZSdgXG4gICAqIGxvb2t1cCwgd2hlcmUgTmV4dC5qcyB3YWl0cyBmb3IgdGhlIGFuc3dlciBhbmQgYSByZWFkIHB1c2hlcyB0aGUgZW50cnkgb3V0XG4gICAqIG9mIHRoZSBzdGF0aWMgc3RhZ2Ugb2YgYSBzdGFnZWQgcmVuZGVyLlxuICAgKlxuICAgKiBTdGFydHMgYXQgY29uc3RydWN0aW9uOiB0aGUgbG9nIGlzIGZvbGxvd2VkIGZyb20gYmVmb3JlIGl0LiBNb3ZlcyB0byBub3dcbiAgICogd2hlbiB0aGUgdHJhY2tlZCBtYXJrZXJzIGFyZSBmb3Jnb3R0ZW4sIGFuZCBwYXN0IHRoZSByZXZhbGlkYXRpb25zIG9mXG4gICAqIHdoYXRldmVyIGVsc2UgaXQgbGV0cyBnbyBvZiAtIGEgbWFya2VyIGV2aWN0ZWQgZm9yIHNwYWNlLCBhIGxvZyByb3dcbiAgICogcHJ1bmVkIC0gd2hpY2ggYXJlIG5vIGxvbmdlciBrbm93bjogdG8gaXRzIGBleHBpcmVkQXRgIG9ubHkgb25jZSB0aGF0IGlzXG4gICAqIHBhc3QsIHNpbmNlIGEgcHJvZmlsZSdzIGBleHBpcmVgIGNhbiBiZSBhIHllYXIgb3V0LCBhbmQgbW92aW5nIHRoZXJlIGF0XG4gICAqIG9uY2Ugd291bGQgdHVybiB0aGUgcmVhZC1mcmVlIHBhdGggb2ZmIGZvciB0aGUgaW5zdGFuY2UncyBsaWZlLlxuICAgKlxuICAgKiBBIHJvdyBpcyBwcnVuZWQgb25seSBvbmNlIGl0IGlzIG5vIGxhdGVyIHRoYW4gZXZlcnkgZW50cnkgaGVsZCwgc28gdGhhdFxuICAgKiBjb3N0cyB0aG9zZSBlbnRyaWVzIG5vdGhpbmcuIEFuIGVudHJ5IHN0b3JlZCBhZnRlcndhcmRzIHdpdGggYW4gb2xkZXJcbiAgICogYHRpbWVzdGFtcGAgLSBOZXh0LmpzIHN0YW1wcyB0aGUgc3RhcnQgb2YgaXRzIGdlbmVyYXRpb24sIHdoaWNoIGNhblxuICAgKiBvdXRsYXN0IGEgbG9va2JhY2sgLSBpcyBvbGRlciB0aGFuIHRoaXMgdG9vLCBhbmQgaXMgcmVhZCBmaXJzdC5cbiAgICpcbiAgICogSXQgZG9lcyBub3QgY292ZXIgYSByZXZhbGlkYXRpb24gb2xkZXIgdGhhbiB0aGUgbG9nJ3MgZmlyc3QgbG9va2JhY2tcbiAgICogd2hvc2UgYGV4cGlyZWRBdGAgaXMgc3RpbGwgdG8gY29tZSwgd2hpY2ggd291bGQgZXhwaXJlIGFuIGVudHJ5IGNyZWF0ZWRcbiAgICogYWZ0ZXIgaXQuIFNvIHRoZSBgJ3VzZSBjYWNoZSdgIGhhbmRsZXIgcmVhZHMgYW4gZW50cnkncyB0YWdzIGluIHRoZVxuICAgKiBiYWNrZ3JvdW5kIGFzIGl0IHN0b3JlcyBpdC5cbiAgICovXG4gIGdldCBjb21wbGV0ZVNpbmNlKCk6IG51bWJlciB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIHdoaWxlICh0aGlzLmxhdGVyRmxvb3JzLmxlbmd0aCA+IDAgJiYgdGhpcy5sYXRlckZsb29yc1swXVswXSA8PSBhdCkge1xuICAgICAgdGhpcy5mbG9vciA9IE1hdGgubWF4KHRoaXMuZmxvb3IsIHRoaXMubGF0ZXJGbG9vcnMuc2hpZnQoKSFbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mbG9vcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBpbi1tZW1vcnkgc3RvcmUgd2hvc2UgZW50cmllcyBhcmUganVkZ2VkIGJ5XG4gICAqIHtAbGluayBjb21wbGV0ZVNpbmNlfSwgYnkgdGhlIGB0aW1lc3RhbXBgIG9mIHRoZSBvbGRlc3QgZW50cnkgaXQgaG9sZHM6XG4gICAqIGBsb2dPbmx5YCBrZWVwcyB0aGUgcm93cyB0aGF0IGNvdWxkIHN0aWxsIGFwcGx5IHRvIG9uZSBvZiB0aGVtLCBhbmQgbm9cbiAgICogb3RoZXJzLiBXaXRoIG5vbmUgcmVnaXN0ZXJlZCBpdCBrZWVwcyBub3RoaW5nLiBBc2tlZCB3aXRoIGBzY2FuYCBmYWxzZSxcbiAgICogYG9sZGVzdFRpbWVzdGFtcGAgbWF5IGFuc3dlciBlYXJseSwgYnV0IG5ldmVyIGxhdGUsIHdpdGhvdXQgYSBzY2FuLlxuICAgKi9cbiAganVkZ2VFbnRyaWVzT2YoXG4gICAgb2xkZXN0VGltZXN0YW1wOiAoc2NhbjogYm9vbGVhbikgPT4gbnVtYmVyLFxuICAgIGhvbGRzQW55OiAoKSA9PiBib29sZWFuID0gKCkgPT4gb2xkZXN0VGltZXN0YW1wKGZhbHNlKSA8IEluZmluaXR5LFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVudHJ5U3RvcmVzLnB1c2goeyBvbGRlc3RUaW1lc3RhbXAsIGhvbGRzQW55IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGB0YWdgIHdpdGggYG1hcmtlcmA6IHdoYXQgdGhpcyBpbnN0YW5jZSBqdXN0IHdyb3RlLCB3aGljaCBpdCBrbm93c1xuICAgKiB3aXRob3V0IHJlYWRpbmcgaXQgYmFjay5cbiAgICovXG4gIHNldCh0YWc6IHN0cmluZywgbWFya2VyOiBUYWdNYXJrZXIpOiB2b2lkIHtcbiAgICBjb25zdCBsb2dnZWQgPSB0aGlzLmxvZ09ubHkuZ2V0KHRhZyk7XG4gICAgdGhpcy5sb2dPbmx5LmRlbGV0ZSh0YWcpO1xuICAgIHRoaXMucmVtZW1iZXIodGFnLCBtZXJnZU1hcmtlcnMobWFya2VyLCBsb2dnZWQpKTtcbiAgICB0aGlzLmtub3duKHRhZywgdGhpcy5jbG9jaygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlIGEgdXNlIG9mIGB0YWdzYDogdGhvc2Ugb2YgYW4gZW50cnkgdGhpcyBpbnN0YW5jZSBqdXN0IHN0b3JlZC5cbiAgICpcbiAgICogV2l0aCB0aGUgdGFibGUsIGEgdGFnIG5vdCB0cmFja2VkIHlldCBpcyBsZWZ0IHVudHJhY2tlZCwgdG8gYmUgcmVhZCBieVxuICAgKiB7QGxpbmsgZW5zdXJlfSB0aGUgZmlyc3QgdGltZSBhbiBlbnRyeSBuZWVkcyBpdC4gTm90aGluZyByZXZhbGlkYXRlZCBiZWZvcmVcbiAgICogdGhlIG5ldyBlbnRyeSB3YXMgY3JlYXRlZCBhcHBsaWVzIHRvICppdCosIGJ1dCB0cmFja2luZyBpcyBwZXIgdGFnLCBub3QgcGVyXG4gICAqIGVudHJ5OiB0cmFja2luZyB0aGUgdGFnIHdpdGggYW4gZW1wdHkgbWFya2VyIHdvdWxkIGFsc28gdm91Y2ggZm9yIGV2ZXJ5XG4gICAqIG9sZGVyIGVudHJ5IHRoYXQgY2FycmllcyBpdCAtIG9uZSBhbm90aGVyIGluc3RhbmNlIHN0b3JlZCBpbiBTMywgb3Igb25lXG4gICAqIHRoaXMgaW5zdGFuY2Uga2VwdCBpbiBtZW1vcnkgYWNyb3NzIGEge0BsaW5rIGZvcmdldH0gLSBhbmQgYSByZXZhbGlkYXRpb25cbiAgICogZnJvbSBiZWZvcmUgdGhlIGxvZydzIGN1cnNvciB3b3VsZCBnbyB1bnNlZW4gdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICpcbiAgICogV2l0aG91dCB0aGUgdGFibGUgZXZlcnkgcmV2YWxpZGF0aW9uIGlzIHRoaXMgcHJvY2VzcydzIG93biwgYXBwbGllZCB3aXRoXG4gICAqIHtAbGluayBzZXR9LCBzbyBhIHRhZyBpcyB0cmFja2VkIGF0IG9uY2UuXG4gICAqL1xuICB0cmFjayh0YWdzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tYXJrZXJzKSB7XG4gICAgICB0aGlzLnRyYWNrVW5yZWFkKHRhZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICB0aGlzLnRvdWNoKHRhZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrIGB0YWdzYCBhcyB0aGV5IGFyZSBrbm93biBub3csIHdpdGhvdXQgcmVhZGluZyB0aGVtLCB3aXRoIGFuIGVtcHR5XG4gICAqIG1hcmtlciBmb3IgYW55IG5vdCB0cmFja2VkIHlldC5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tVbnJlYWQodGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBpZiAoIXRoaXMudGFncy5oYXModGFnKSkge1xuICAgICAgICB0aGlzLmtub3duKHRhZywgYXQpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZW1lbWJlcih0YWcsIHRoaXMudGFncy5nZXQodGFnKSA/PyB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIG1hcmtlcnMgb2Ygd2hpY2hldmVyIG9mIGB0YWdzYCB0aGlzIGluc3RhbmNlIGRvZXMgbm90IHRyYWNrIHlldC5cbiAgICogTmVlZGVkIGJlZm9yZSBqdWRnaW5nIGFuIGVudHJ5IHRoaXMgaW5zdGFuY2UgZGlkIG5vdCBjcmVhdGUsIHNpbmNlIGl0c1xuICAgKiB0YWdzIG1heSBoYXZlIGJlZW4gcmV2YWxpZGF0ZWQgYXQgYW55IHRpbWUgYmVmb3JlLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLm1hcmtlcnMpIHtcbiAgICAgIHRoaXMudHJhY2tVbnJlYWQodGFncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHdhaXRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgICBjb25zdCB1bnJlYWQ6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbmV3IFNldCh0YWdzKSkge1xuICAgICAgLy8gVHJhY2tlZCBmaXJzdDogYSB0cmFja2VkIHRhZyBpbiBgcmVhZGluZ2AgaXMgb25seSBiZWluZyByZS1yZWFkIGluXG4gICAgICAvLyB0aGUgYmFja2dyb3VuZCAoYHN5bmNgKSwgd2hpY2ggbm90aGluZyBuZWVkcyB0byB3YWl0IGZvci5cbiAgICAgIGNvbnN0IGluRmxpZ2h0ID0gdGhpcy5yZWFkaW5nLmdldCh0YWcpO1xuICAgICAgaWYgKHRoaXMudGFncy5oYXModGFnKSkge1xuICAgICAgICB0aGlzLnRvdWNoKHRhZyk7XG4gICAgICB9IGVsc2UgaWYgKGluRmxpZ2h0KSB7XG4gICAgICAgIHdhaXRzLnB1c2goaW5GbGlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5yZWFkLnB1c2godGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHVucmVhZC5sZW5ndGggPiAwKSB7XG4gICAgICB3YWl0cy5wdXNoKHRoaXMuc3RhcnRSZWFkKHVucmVhZCkpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0cyk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIHJlYWRJbnRvfSBgdGFnc2AsIGFzIHRoZSByZWFkIG9mIGVhY2ggdGhhdCB3aG9ldmVyIG5lZWRzIG9uZSBvZlxuICAgKiB0aGVtIG5leHQgd2FpdHMgb24gKHtAbGluayByZWFkaW5nfSkuIE5ldmVyIHJlamVjdHM6IGEgZmFpbGVkIHJlYWQgbGVhdmVzXG4gICAqIHRoZSB0YWdzIHRyYWNrZWQuXG4gICAqL1xuICBwcml2YXRlIHN0YXJ0UmVhZCh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlYWQgPSB0aGlzLnJlYWRJbnRvKHRhZ3MpLnRoZW4oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICB0aGlzLnJlYWRpbmcuZGVsZXRlKHRhZyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgdGhpcy5yZWFkaW5nLnNldCh0YWcsIHJlYWQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsYXN0IHJlZnJlc2ggc2V0dGxlZCBtb3JlIHRoYW4gYHJlZnJlc2hJbnRlcnZhbE1zYCBwbHVzXG4gICAqIHtAbGluayBUQUdfUkVGUkVTSF9HUkFDRV9NU30gYWdvIC0gb25lIHRoYXQgc3Bhbm5lZCBhIGZyZWV6ZSBjb3VudHMgZnJvbVxuICAgKiB3aGVuIGl0IHN0YXJ0ZWQ6IGFmdGVyIHRoZSBpbnN0YW5jZSBzYXQgaWRsZSBvciBmcm96ZW4gLSBvciBhbHdheXMsIHdpdGhcbiAgICogYSBgcmVmcmVzaEludGVydmFsTXNgIG9mIGAwYC4gQW5zd2VyaW5nIGZyb20gd2hhdCBpdCBrbm93cyB0aGVuIGNvdWxkXG4gICAqIHNlcnZlIGFuIGVudHJ5IHJldmFsaWRhdGVkIGVsc2V3aGVyZSBzaW5jZSwgaG93ZXZlciBsb25nIGFnbyB0aGF0IHdhcywgc29cbiAgICogYHJlZnJlc2hUYWdzYCB3YWl0cyBmb3IgdGhlIHJlZnJlc2gsIGFuZCB0aGUgcnVudGltZSB3YWl0cyBmb3IgaXQgYmVmb3JlXG4gICAqIGEgcGFnZSByZW5kZXIgc3RhcnRzICh7QGxpbmsgY2F0Y2hVcH0pLlxuICAgKlxuICAgKiBGcm9tIHdoZW4gaXQgc2V0dGxlZCwgbm90IHdoZW4gaXQgc3RhcnRlZCwgc28gYSBzbG93IHF1ZXJ5IHRoZSBydW50aW1lXG4gICAqIHdhaXRlZCBmb3IgYmVmb3JlIHRoZSByZW5kZXIgZG9lcyBub3QgbGVhdmUgdGhlIGluc3RhbmNlIGJlaGluZCBpbnNpZGVcbiAgICogaXQuIEEgZmFpbGVkIG9uZSBjb3VudHMgdG9vLCBzbyBvbmUgcmVxdWVzdCBkb2VzIG5vdCB3YWl0IGZvciB0d286IHRoZVxuICAgKiBzYW1lIFwiYXNzdW1lIHRoZSBlbnRyeSBpcyB2YWxpZFwiIGEgZmFpbGVkIHJlYWQgYW5zd2VycyB3aXRoLCB1bnRpbCB0aGVcbiAgICogbmV4dCByZWZyZXNoLCBhdCBtb3N0IHRoZSBpbnRlcnZhbCBhbmQgdGhlIGdyYWNlIGxhdGVyLlxuICAgKi9cbiAgZ2V0IGJlaGluZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5sb2cgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgLy8gYDBgIGFza3MgYmVmb3JlIGV2ZXJ5IGNoZWNrLCBzbyBldmVyeSBjaGVjayB3YWl0cyBmb3IgdGhlIGFuc3dlci5cbiAgICAgICh0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID09PSAwIHx8IHRoaXMub3ZlcmR1ZSh0aGlzLnNldHRsZWRBdCkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgYmVoaW5kfSwgYXMgYHJlZnJlc2hUYWdzYCBhc2tzIGl0OiBuZXZlciBpbnNpZGUgYSBwYWdlJ3MgcmVuZGVyXG4gICAqIHtAbGluayBjYXRjaFVwfSBjYXVnaHQgdXAsIHNpbmNlIHRoZSBydW50aW1lIHNldHRsZWQgaXQgZm9yIHRoYXQgcmVxdWVzdFxuICAgKiBiZWZvcmUgdGhlIHJlbmRlciBzdGFydGVkLCBhbmQgYSB3YWl0IGluc2lkZSBhIGAndXNlIGNhY2hlJ2AgbG9va3VwIGlzXG4gICAqIHdoYXQgaXQgc2V0dGxlZCBpdCB0byBhdm9pZCAtIGEgcmVuZGVyIGNyb3NzaW5nIHRoZSBsaW5lIHBhcnR3YXkgdGhyb3VnaFxuICAgKiB3b3VsZCBvdGhlcndpc2Ugd2FpdCBhZnRlciBhbGwuIFNvIGEgcmV2YWxpZGF0aW9uIGVsc2V3aGVyZSBjYW4gZ28gdW5zZWVuXG4gICAqIGZvciBhIHJlbmRlcidzIGR1cmF0aW9uIG9uIHRvcCBvZiB0aGUgdXN1YWwgd2luZG93LlxuICAgKlxuICAgKiBBIHJvdXRlIGhhbmRsZXIsIHdoaWNoIG5vIGNhdGNoLXVwIHByZWNlZGVzLCB3YWl0cyBhdCB0aGUgcGxhaW4gbGluZS5cbiAgICovXG4gIGdldCBiZWhpbmRJblJlbmRlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcyAhPT0gMCAmJiB0aGlzLmNhdWdodFVwUmVuZGVyLmdldFN0b3JlKClcbiAgICAgID8gZmFsc2VcbiAgICAgIDogdGhpcy5iZWhpbmQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIHJlZ2lzdGVyZWQgc3RvcmUgKHtAbGluayBqdWRnZUVudHJpZXNPZn0pIGhvbGRzIGFueSBlbnRyeTogb25lXG4gICAqIGEgcmVmcmVzaCBjb3VsZCBleHBpcmUuIFdpdGggbm9uZSB0aGVyZSBpcyBub3RoaW5nIHRvIHdhaXQgZm9yIGV2ZW4gd2hlblxuICAgKiB0aGUgaW5zdGFuY2UgaXMge0BsaW5rIGJlaGluZH0sIHNpbmNlIHdoYXRldmVyIGlzIHN0b3JlZCBmcm9tIGhlcmUgb24gaXNcbiAgICogbmV3ZXIgdGhhbiB3aGF0IHRoZSBsb2cgd291bGQgc2F5IC0gd2hpY2ggY292ZXJzIHRoZSBmaXJzdCBgJ3VzZSBjYWNoZSdgXG4gICAqIGNhbGwgb2YgYSBwcm9jZXNzLCB3aGljaCBjcmVhdGVzIHRoZSBoYW5kbGVyIGluc2lkZSB0aGUgcmVuZGVyLlxuICAgKi9cbiAgZ2V0IGhvbGRzRW50cmllcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyeVN0b3Jlcy5zb21lKChzdG9yZSkgPT4gc3RvcmUuaG9sZHNBbnkoKSk7XG4gIH1cblxuICAvKipcbiAgICoge0BsaW5rIHJlZnJlc2h9LCB3YWl0ZWQgZm9yIHdoZW4gdGhlIGluc3RhbmNlIGlzIHtAbGluayBiZWhpbmR9LiBUaGVcbiAgICogcnVudGltZSBjYWxscyBpdCBiZWZvcmUgaGFuZGluZyBhIHBhZ2UgcmVxdWVzdCB0byBOZXh0LmpzLCBvdXRzaWRlIHRoZVxuICAgKiBzdGFnZWQgcmVuZGVyIHdob3NlIHN0YXRpYyBzdGFnZSBhIHdhaXQgaW5zaWRlIGEgYCd1c2UgY2FjaGUnYCBsb29rdXBcbiAgICogd291bGQgY3V0IHNob3J0LiBPbmx5IGZvciB0aGUgYCd1c2UgY2FjaGUnYCBoYW5kbGVyJ3MgZW50cmllc1xuICAgKiAoe0BsaW5rIGp1ZGdlRW50cmllc09mfSk6IHRoZSBvdGhlciBjYWNoZXMgd2FpdCBmb3IgdGhlIHJlZnJlc2ggd2hlcmUgdGhleVxuICAgKiByZWFkIGFueXdheS4gTm90IHdpdGggYSBgcmVmcmVzaEludGVydmFsTXNgIG9mIGAwYCBlaXRoZXIsIHdoZXJlXG4gICAqIGByZWZyZXNoVGFnc2AgYXNrcyBhZ2FpbiByZWdhcmRsZXNzLiBUaGVuIGByZW5kZXJgLCBtYXJrZWQgYXMgY2F1Z2h0IHVwXG4gICAqIGZvciAoe0BsaW5rIGJlaGluZEluUmVuZGVyfSkuIFJlamVjdHMgb25seSBhcyBgcmVuZGVyYCBkb2VzLlxuICAgKi9cbiAgYXN5bmMgY2F0Y2hVcDxUPihyZW5kZXI6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2cgPSAoZXJyb3I6IHVua25vd24pID0+XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVmcmVzaGluZyBjYWNoZSB0YWdzOlwiLCBlcnJvcik7XG4gICAgaWYgKHRoaXMucmVmcmVzaEludGVydmFsTXMgPiAwICYmIHRoaXMuYmVoaW5kKSB7XG4gICAgICBpZiAoIXRoaXMuaG9sZHNFbnRyaWVzKSB7XG4gICAgICAgIC8vIE5vdCBjYXVnaHQgdXAsIHNvIG5vIGdyYWNlOiBhbiBlbnRyeSBzdG9yZWQgbWVhbndoaWxlLCBieSBhbm90aGVyXG4gICAgICAgIC8vIHJlcXVlc3QsIG1ha2VzIHRoZSByZW5kZXIncyBsb29rdXBzIHdhaXQgYXQgdGhlIHBsYWluIGxpbmUuXG4gICAgICAgIHJldHVybiByZW5kZXIoKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpLmNhdGNoKGxvZyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID4gMCkge1xuICAgICAgLy8gU3RhcnRlZCwgbm90IHdhaXRlZCBmb3IsIGFzIGByZWZyZXNoVGFnc2Agd291bGQ6IGEgcGFnZSB0aGF0IHJlYWRzXG4gICAgICAvLyBubyBjYWNoZSBrZWVwcyB0aGUgaW5zdGFuY2UgY3VycmVudCB0b28sIHJhdGhlciB0aGFuIGZhbGxpbmcgYmVoaW5kXG4gICAgICAvLyBhbmQgbWFraW5nIGEgbGF0ZXIgcmVxdWVzdCB3YWl0LlxuICAgICAgdm9pZCB0aGlzLnJlZnJlc2goKS5jYXRjaChsb2cpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYXVnaHRVcFJlbmRlci5ydW4odHJ1ZSwgcmVuZGVyKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGBhdGAgaXMgbW9yZSB0aGFuIHRoZSBpbnRlcnZhbCBhbmQgdGhlIGdyYWNlIGFnby4gKi9cbiAgcHJpdmF0ZSBvdmVyZHVlKGF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbG9jaygpIC0gYXQgPiB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zICsgVEFHX1JFRlJFU0hfR1JBQ0VfTVM7XG4gIH1cblxuICAvKipcbiAgICogQ2F0Y2ggdXAgb24gcmV2YWxpZGF0aW9ucyBvdGhlciBpbnN0YW5jZXMgcmFuLCBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIGByZWZyZXNoSW50ZXJ2YWxNc2AuIFNlZSB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9IGZvciB0aGUgY29zdC5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2c7XG4gICAgaWYgKCFsb2cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVmcmVzaGluZykge1xuICAgICAgLy8gT25lIHN0YXJ0ZWQgYmVmb3JlIGEgZnJlZXplIHJlYWQgdGhlIGxvZyBhcyBpdCB3YXMgdGhlbiwgYW5kIHNheXNcbiAgICAgIC8vIG5vdGhpbmcgb2Ygd2hhdCByYW4gbWVhbndoaWxlOiBhbiBpbnN0YW5jZSBiZWhpbmQgd2FpdHMgZm9yIGEgZnJlc2hcbiAgICAgIC8vIG9uZSwgYWZ0ZXIgaXQuIE9uZSB0aGF0IGlzIG1lcmVseSBzbG93IGlzIGFzIGZyZXNoIGFzIGFueS5cbiAgICAgIGlmICh0aGlzLmJlaGluZCAmJiB0aGlzLnBhdXNlZFNpbmNlUmVmcmVzaFN0YXJ0ZWQoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoaW5nLnRoZW4oKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZztcbiAgICB9XG4gICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgaWYgKGF0IC0gdGhpcy5sYXN0UmVmcmVzaCA8IHRoaXMucmVmcmVzaEludGVydmFsTXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVmcmVzaCA9IGF0O1xuICAgIC8vIFdoYXRldmVyIGdldHMgdHJhY2tlZCBiZWZvcmUgdGhlIG5leHQgcmVmcmVzaCBpcyByZWFkIGZyb20gaXRzIG1hcmtlcixcbiAgICAvLyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhdGNoIHVwIG9uIHlldCAtIHVubGVzcyBhbiBlbnRyeSBpcyBqdWRnZWQgYnlcbiAgICAvLyBgY29tcGxldGVTaW5jZWAsIHdoaWNoIHJlbGllcyBvbiB0aGUgbG9nIGZvciBldmVyeSB0YWcuIEV2ZW4gd2l0aCBub25lXG4gICAgLy8gaGVsZDogYSByb3cgbGV0IGdvIG9mIHRoZW4gbW92ZXMgYGNvbXBsZXRlU2luY2VgIHBhc3QgaXQsIGZvciBhbiBlbnRyeVxuICAgIC8vIHdob3NlIGdlbmVyYXRpb24gc3RhcnRlZCBiZWZvcmUgdGhhdCByZXZhbGlkYXRpb24gYW5kIHRoYXQgaXMgc3RvcmVkXG4gICAgLy8gYWZ0ZXIgaXQuXG4gICAgaWYgKHRoaXMudGFncy5zaXplID09PSAwICYmIHRoaXMuZW50cnlTdG9yZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3RhcnRUaWNraW5nKCk7XG4gICAgdGhpcy5yZWZyZXNoaW5nID0gdGhpcy5zeW5jKGF0LCBsb2cpLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgLy8gT25lIHRoYXQgc3Bhbm5lZCBhIHBhdXNlIGtub3dzIHRoZSBsb2cgYXMgb2YgaXRzIHN0YXJ0IGF0IGJlc3QuIFNvXG4gICAgICAvLyBkb2VzIG9uZSB0aGF0IG9ubHkgbG9va2VkIHBhdXNlZCwgaXRzIGV2ZW50IGxvb3AgaGVsZCB1cDogaXQgY291bnRzXG4gICAgICAvLyBhcyBubyBvbGRlciB0aGFuIGl0cyBzdGFydCwgYXMgaWYgaXQgaGFkIG5vdCBzZXR0bGVkIHNpbmNlLlxuICAgICAgdGhpcy5zZXR0bGVkQXQgPSBNYXRoLm1heChcbiAgICAgICAgdGhpcy5zZXR0bGVkQXQsXG4gICAgICAgIHRoaXMucGF1c2VkU2luY2VSZWZyZXNoU3RhcnRlZCgpID8gdGhpcy5sYXN0UmVmcmVzaCA6IHRoaXMuY2xvY2soKSxcbiAgICAgICk7XG4gICAgICB0aGlzLnN0b3BUaWNraW5nKCk7XG4gICAgICB0aGlzLnJlZnJlc2hpbmcgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZztcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUaWNraW5nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jYW5GcmVlemUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sYXN0VGljayA9IHRoaXMuY2xvY2soKTtcbiAgICB0aGlzLnBhdXNlZFdoaWxlUmVmcmVzaGluZyA9IGZhbHNlO1xuICAgIHRoaXMudGlja2VyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgICBpZiAoYXQgLSB0aGlzLmxhc3RUaWNrID4gUkVGUkVTSF9QQVVTRV9NUykge1xuICAgICAgICB0aGlzLnBhdXNlZFdoaWxlUmVmcmVzaGluZyA9IHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLmxhc3RUaWNrID0gYXQ7XG4gICAgfSwgUkVGUkVTSF9USUNLX01TKTtcbiAgICAvLyBOZXZlciB3aGF0IGtlZXBzIGEgcHJvY2VzcyBhbGl2ZS5cbiAgICB0aGlzLnRpY2tlci51bnJlZj8uKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaWNraW5nKCk6IHZvaWQge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aWNrZXIpO1xuICAgIHRoaXMudGlja2VyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHByb2Nlc3Mgd2FzIHBhdXNlZCBzaW5jZSB7QGxpbmsgcmVmcmVzaGluZ30gc3RhcnRlZDogYSB0aWNrXG4gICAqIGNhbWUgbGF0ZSwgb3IgdGhlIG5leHQgb25lIGlzIG92ZXJkdWUgKGFmdGVyIGEgdGhhdywgYSByZXF1ZXN0IGNhbiBydW5cbiAgICogYmVmb3JlIHRoZSB0aW1lciBkb2VzKS5cbiAgICovXG4gIHByaXZhdGUgcGF1c2VkU2luY2VSZWZyZXNoU3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jYW5GcmVlemUgJiZcbiAgICAgICh0aGlzLnBhdXNlZFdoaWxlUmVmcmVzaGluZyB8fFxuICAgICAgICB0aGlzLmNsb2NrKCkgLSB0aGlzLmxhc3RUaWNrID4gUkVGUkVTSF9QQVVTRV9NUylcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHJldmFsaWRhdGlvbiBvZiBgdGFnc2A6IGhlcmUgYXQgb25jZSwgYW5kIGluIHRoZSByZXZhbGlkYXRpb25cbiAgICogdGFibGUgZm9yIGV2ZXJ5IG90aGVyIGluc3RhbmNlIC0gdGhlIG1hcmtlciByb3cgcGx1cyBhIGxvZyByb3cgcGVyIHRhZy5cbiAgICpcbiAgICogTmV4dC5qcyBjYWxscyBgcmV2YWxpZGF0ZVRhZ2Agb24gdGhlIGluY3JlbWVudGFsIGNhY2hlIGFuZCBgdXBkYXRlVGFnc2Agb25cbiAgICogZXZlcnkgZGlzdGluY3QgYGNhY2hlSGFuZGxlcnNgIGVudHJ5LCBhbGwgaW4gb25lIHN5bmNocm9ub3VzIGxvb3BcbiAgICogKGByZXZhbGlkYXRpb24tdXRpbHNgKSwgYW5kIGFsbCBvZiB0aGVtIHNoYXJlIHRoaXMgbWFuaWZlc3QuIFNvIGFuXG4gICAqIGlkZW50aWNhbCBjYWxsIGluIHRoZSBzYW1lIHR1cm4gam9pbnMgdGhlIGZpcnN0IGluc3RlYWQgb2Ygd3JpdGluZyB0aGVcbiAgICogcm93cyBhZ2Fpbi4gT25lIGluIGEgbGF0ZXIgdHVybiBpcyBhIHJldmFsaWRhdGlvbiBvZiBpdHMgb3duLCBldmVuIHdoaWxlXG4gICAqIHRoZSBmaXJzdCBvbmUncyB3cml0ZXMgYXJlIGluIGZsaWdodCwgYW5kIGdldHMgaXRzIG93biwgbGF0ZXIsIG1hcmtlci5cbiAgICogTmV2ZXIgcmVqZWN0czogcmVzb2x2ZXMgYGZhbHNlYCB3aGVuIGEgcm93IGZhaWxlZCB0byB3cml0ZSAodGhlIGVycm9yIGlzXG4gICAqIGxvZ2dlZCksIHNvIG90aGVyIGluc3RhbmNlcyBtYXkgbm90IHNlZSBpdC5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZShcbiAgICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KFt0YWdzLCBkdXJhdGlvbnMgPz8gbnVsbF0pO1xuICAgIGNvbnN0IGluRmxpZ2h0ID0gdGhpcy51cGRhdGluZy5nZXQoa2V5KTtcbiAgICBpZiAoaW5GbGlnaHQpIHtcbiAgICAgIHJldHVybiBpbkZsaWdodDtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlID0gdGhpcy53cml0ZSh0YWdzLCBkdXJhdGlvbnMpO1xuICAgIHRoaXMudXBkYXRpbmcuc2V0KGtleSwgdXBkYXRlKTtcbiAgICAvLyBGb3Jnb3R0ZW4gYXMgc29vbiBhcyB0aGUgY3VycmVudCB0dXJuJ3MgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuXG4gICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMudXBkYXRpbmcuZGVsZXRlKGtleSkpO1xuICAgIHJldHVybiB1cGRhdGU7XG4gIH1cblxuICAvKipcbiAgICogV2hhdCB0aGUgdHJhY2tlZCBtYXJrZXJzIHNheSBhYm91dCBhbiBlbnRyeSBjYXJyeWluZyBgdGFnc2AsIGNyZWF0ZWQgYXRcbiAgICogYGNyZWF0ZWRBdGA6IHRoZSBtb3N0IHNldmVyZSBhbnN3ZXIgb2YgYW55IG9mIHRoZW0uXG4gICAqL1xuICBzdGF0ZSh0YWdzOiByZWFkb25seSBzdHJpbmdbXSwgY3JlYXRlZEF0OiBudW1iZXIpOiBSZXZhbGlkYXRpb25TdGF0ZSB7XG4gICAgLy8gYG1hcmtlckNsb2NrKClgLCBub3QgYERhdGUubm93KClgLCBoZXJlIGFuZCB3aGVyZXZlciBhIG1hcmtlciBpcyBzdGFtcGVkOlxuICAgIC8vIGBjcmVhdGVkQXRgIGlzIG9uIE5leHQuanMncyBjbG9jaywgYW5kIGEgbWFya2VyIG9uIHRoZSB3YWxsIGNsb2NrIHdvdWxkIGJlXG4gICAgLy8gY29tcGFyZWQgYWNyb3NzIHRoZSB0d28sIHNvIGFuIGVudHJ5IHJlZ2VuZXJhdGVkIGp1c3QgYWZ0ZXIgYVxuICAgIC8vIHJldmFsaWRhdGlvbiBjb3VsZCBzdGlsbCByZWFkIGFzIG9sZGVyIHRoYW4gaXQgd2hlcmV2ZXIgdGhleSBkcmlmdC5cbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgbGV0IHN0YXRlOiBSZXZhbGlkYXRpb25TdGF0ZSA9IFwiZnJlc2hcIjtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICBjb25zdCBtYXJrZXIgPSB0aGlzLmtub3duTWFya2VyKHRhZyk7XG4gICAgICBpZiAoIW1hcmtlcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhZ1N0YXRlID0gbWFya2VyU3RhdGUobWFya2VyLCBjcmVhdGVkQXQsIGF0KTtcbiAgICAgIGlmICh0YWdTdGF0ZSA9PT0gXCJleHBpcmVkXCIpIHtcbiAgICAgICAgcmV0dXJuIFwiZXhwaXJlZFwiO1xuICAgICAgfVxuICAgICAgaWYgKHRhZ1N0YXRlID09PSBcInN0YWxlXCIpIHtcbiAgICAgICAgc3RhdGUgPSBcInN0YWxlXCI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgZ2V0RXhwaXJhdGlvbmAncyBhbnN3ZXI6IHRoZSBsYXRlc3QgdGltZSBhbnkgb2YgYHRhZ3NgIGV4cGlyZWQsIGAwYCBpZlxuICAgKiBub25lIGhhcy4gT25seSBleHBpcmF0aW9ucyBhbHJlYWR5IHBhc3QgY291bnQgLSBhIHByb2ZpbGUncyBmdXR1cmVcbiAgICogYGV4cGlyZWAgaXMgbm90IGFuIGV4cGlyYXRpb24geWV0IC0gYW5kIGEgc3RhbGUgbWFyayBkb2VzIG5vdCwgbWF0Y2hpbmdcbiAgICogTmV4dC5qcydzIGRlZmF1bHQgaGFuZGxlciwgd2hpY2ggcmVhZHMgb25seSBgZXhwaXJlZGAgZm9yIGltcGxpY2l0IHRhZ3MuXG4gICAqL1xuICBleHBpcmF0aW9uKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogbnVtYmVyIHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgbGV0IGxhdGVzdCA9IDA7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5rbm93bk1hcmtlcih0YWcpO1xuICAgICAgaWYgKCFtYXJrZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAobWFya2VyLnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3QgPSBNYXRoLm1heChsYXRlc3QsIG1hcmtlci5yZXZhbGlkYXRlZEF0KTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXJrZXIuZXhwaXJlZEF0ICE9PSB1bmRlZmluZWQgJiYgbWFya2VyLmV4cGlyZWRBdCA8PSBhdCkge1xuICAgICAgICBsYXRlc3QgPSBNYXRoLm1heChsYXRlc3QsIG1hcmtlci5leHBpcmVkQXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF0ZXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZShcbiAgICB0YWdzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBjb25zdCBtYXJrZXIgPSBtYXJrZXJGb3IoYXQsIGR1cmF0aW9ucyk7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgdGhpcy5zZXQodGFnLCBhcHBseU1hcmtlcih0aGlzLmdldCh0YWcpLCBtYXJrZXIpKTtcbiAgICB9XG4gICAgY29uc3QgeyBtYXJrZXJzLCBsb2cgfSA9IHRoaXM7XG4gICAgaWYgKCFtYXJrZXJzIHx8ICFsb2cpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB3cml0ZXM6IFtzdHJpbmcsIFByb21pc2U8dW5rbm93bj5dW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBuZXcgU2V0KHRhZ3MpKSB7XG4gICAgICB3cml0ZXMucHVzaChbXG4gICAgICAgIFwiRXJyb3Igd3JpdGluZyB0YWcgcmV2YWxpZGF0aW9uIG1hcmtlcjpcIixcbiAgICAgICAgLy8gVGhlIHJvdyBhcyBpdCBpcyBub3csIHdoaWNoIGNhcnJpZXMgYW55IGVhcmxpZXIgYHJldmFsaWRhdGVkQXRgXG4gICAgICAgIC8vIGFub3RoZXIgaW5zdGFuY2Ugd3JvdGU6IHRyYWNraW5nIG9ubHkgd2hhdCB0aGlzIGNhbGwgc2V0IHdvdWxkXG4gICAgICAgIC8vIGhpZGUgdGhhdCBvbmUgdW50aWwgdGhlIHJvbGxpbmcgcmUtcmVhZCwgYW5kIGFuIGVudHJ5IG9sZGVyIHRoYW4gaXRcbiAgICAgICAgLy8gd291bGQgcmVhZCBhcyBtZXJlbHkgc3RhbGUuXG4gICAgICAgIG1hcmtlcnMud3JpdGUodGFnLCBhdCwgZHVyYXRpb25zKS50aGVuKChyb3cpID0+IHtcbiAgICAgICAgICBpZiAocm93KSB7XG4gICAgICAgICAgICB0aGlzLnNldCh0YWcsIG1lcmdlTWFya2Vycyh0aGlzLmdldCh0YWcpLCByb3cpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgXSk7XG4gICAgICB3cml0ZXMucHVzaChbXG4gICAgICAgIFwiRXJyb3Igd3JpdGluZyB0YWcgcmV2YWxpZGF0aW9uIGxvZyByb3c6XCIsXG4gICAgICAgIHRoaXMucHV0TG9nUm93KGxvZywgdGFnLCBtYXJrZXIpLFxuICAgICAgXSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQod3JpdGVzLm1hcCgoWywgd3JpdGVdKSA9PiB3cml0ZSkpO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3Iod3JpdGVzW2ldWzBdLCByZXN1bHQucmVhc29uKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cy5ldmVyeSgocmVzdWx0KSA9PiByZXN1bHQuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgYHRhZ2AncyBsb2cgcm93LCBzdGFtcGVkIG9uIHRoZSB3YWxsIGNsb2NrICh0aGUgbWFya2VyIHZhbHVlcyBhcmUgb25cbiAgICogTmV4dC5qcydzOiBzZWUge0BsaW5rIFJldmFsaWRhdGlvbkxvZ30pLlxuICAgKlxuICAgKiBSZWFkZXJzIG9ubHkgbG9vayB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NU30gYmVoaW5kIHRoZWlyIGxhc3RcbiAgICogcXVlcnksIHNvIGEgcm93IHRoYXQgc2hvd3MgdXAgbXVjaCBsYXRlciB0aGFuIGl0cyB0aW1lc3RhbXAgLSBhIHNsb3dcbiAgICogY29ubmVjdGlvbiwgcmV0cmllcyB1bmRlciB0aHJvdHRsaW5nIC0gaXMgYmVoaW5kIGV2ZXJ5IGN1cnNvciBhbmQgbmV2ZXJcbiAgICogcmVhZC4gQSBzbG93IHB1dCBpcyB0aGVyZWZvcmUgbWFkZSBhZ2FpbiB1bmRlciBhIGZyZXNoIHRpbWVzdGFtcCwgd2hpY2hcbiAgICogcmVhZGVycyB3aWxsIHNlZTsgb25lIHNsb3cgdHdpY2UgaXMgcmVwb3J0ZWQgYXMgYSBmYWlsdXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXRMb2dSb3coXG4gICAgbG9nOiBSZXZhbGlkYXRpb25Mb2csXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgbWFya2VyOiBUYWdNYXJrZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgMjsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICAgIGF3YWl0IGxvZy5wdXQodGFnLCBhdCwgbWFya2VyKTtcbiAgICAgIGlmICh0aGlzLmNsb2NrKCkgLSBhdCA8PSBNQVhfTE9HX1BVVF9NUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgcmV2YWxpZGF0aW9uIGxvZyByb3cgZm9yICR7dGFnfSB0b29rIGxvbmdlciB0aGFuIHJlYWRlcnMgbG9vayBiYWNrYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uZSByZWZyZXNoIHN0YXJ0ZWQgYXQgYGF0YDogdGhlIGxvZyByb3dzIHNpbmNlIHRoZSBjdXJzb3IsIGFuZCB0aGUgbmV4dFxuICAgKiBzbGljZSBvZiB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgKlxuICAgKiBBIGZhaWxlZCBxdWVyeSBjaGFuZ2VzIG5vdGhpbmcgYnV0IHRoZSBsb2c6IHRoZSB0YWdzIHN0YXkgdHJhY2tlZCBhcyB0aGV5XG4gICAqIHdlcmUsIGFuZCB0aGUgbmV4dCByZWZyZXNoIGFza3MgYWdhaW4gZnJvbSB0aGUgc2FtZSBjdXJzb3IuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN5bmMoYXQ6IG51bWJlciwgbG9nOiBSZXZhbGlkYXRpb25Mb2cpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoYXQgLSB0aGlzLmxhc3RMb2dSZWFkID4gTUFYX1JFVkFMSURBVElPTl9MT0dfR0FQX01TKSB7XG4gICAgICB0aGlzLmZvcmdldChcbiAgICAgICAgYXQsXG4gICAgICAgIFwidGhlIHJldmFsaWRhdGlvbiBsb2cgbWF5IG5vdCBjb3ZlciB0aGUgZ2FwIHNpbmNlIGl0IHdhcyBsYXN0IHJlYWRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRoZSByb2xsaW5nIHJlLXJlYWQgcnVucyBhbG9uZ3NpZGUsIG5vdCB3YWl0ZWQgZm9yOiBjYXRjaGluZyB1cCBuZWVkc1xuICAgIC8vIG9ubHkgdGhlIGxvZywgYW5kIGEgdGhyb3R0bGVkIGBCYXRjaEdldEl0ZW1gIHNob3VsZCBub3QgaG9sZCB0aGVcbiAgICAvLyByZXF1ZXN0IGBjYXRjaFVwYCBtYWtlcyB3YWl0LiBBIGZvcmdldCBtZWFud2hpbGUgcmVhZHMgaXQgYWdhaW4uXG4gICAgY29uc3QgZHVlID0gdGhpcy5kdWUoYXQpO1xuICAgIGlmIChkdWUubGVuZ3RoID4gMCkge1xuICAgICAgdm9pZCB0aGlzLnN0YXJ0UmVhZChkdWUpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBsb2cucXVlcnkodGhpcy5jdXJzb3IpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgdGFnIHJldmFsaWRhdGlvbiBsb2c6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC50cnVuY2F0ZWQpIHtcbiAgICAgIHRoaXMuZm9yZ2V0KFxuICAgICAgICBhdCxcbiAgICAgICAgXCJ0aGUgcmV2YWxpZGF0aW9uIGxvZyBoYXMgbW9yZSByb3dzIHRoYW4gb25lIHF1ZXJ5IHJlYWRzXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIHNjYW4gb2YgZXZlcnkgZW50cnkgaGVsZCwgd2hpY2ggYWxzbyBkcm9wcyB0aGUgZXhwaXJlZCBvbmVzLCBvbmNlIGluXG4gICAgLy8gYSB3aGlsZTogc28gZXhwaXJlZCBlbnRyaWVzIG5ldmVyIHJlYWQgYWdhaW4gZG9uJ3QgcGlsZSB1cCBhaGVhZCBvZlxuICAgIC8vIGxpdmUgb25lcy4gSW4gYmV0d2VlbiwgdGhlIHN0b3JlcyBhbnN3ZXIgZWFybHkgd2l0aG91dCBvbmUsIHdoaWNoIG9ubHlcbiAgICAvLyBrZWVwcyByb3dzIGluIGBsb2dPbmx5YCBhIGxpdHRsZSBsb25nZXIuXG4gICAgY29uc3Qgc2NhbiA9IGF0IC0gdGhpcy5sYXN0RW50cnlTY2FuID4gRU5UUllfU0NBTl9JTlRFUlZBTF9NUztcbiAgICBpZiAoc2Nhbikge1xuICAgICAgdGhpcy5sYXN0RW50cnlTY2FuID0gYXQ7XG4gICAgfVxuICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMub2xkZXN0RW50cnkoc2Nhbik7XG4gICAgbGV0IGFwcGxpZWQgPSAwO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3VsdC5yb3dzKSB7XG4gICAgICBpZiAodGhpcy5hcHBsaWVkLmhhcyhyb3cuc2spKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy50YWdzLmdldChyb3cudGFnKTtcbiAgICAgIGlmIChtYXJrZXIpIHtcbiAgICAgICAgLy8gYHNldGAgb24gYSBrZXkgYWxyZWFkeSB0aGVyZSBrZWVwcyBpdHMgcGxhY2UgaW4gdGhlIExSVSBvcmRlcjogYmVpbmdcbiAgICAgICAgLy8gcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIGlzIG5vdCBhIHVzZS5cbiAgICAgICAgdGhpcy50YWdzLnNldChyb3cudGFnLCBtZXJnZU1hcmtlcnMobWFya2VyLCByb3cubWFya2VyKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVhZGluZy5oYXMocm93LnRhZykpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUm93cy5zZXQoXG4gICAgICAgICAgcm93LnRhZyxcbiAgICAgICAgICBtZXJnZU1hcmtlcnModGhpcy5wZW5kaW5nUm93cy5nZXQocm93LnRhZyksIHJvdy5tYXJrZXIpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQSB0YWcgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdCB0cmFjayBpcyByZWFkIGZyb20gaXRzIG1hcmtlciB3aGVuIGl0XG4gICAgICAgIC8vIGlzIG5leHQgbmVlZGVkIC0gYnV0IG5vdCB5ZXQgbWFya2VkIGFwcGxpZWQsIGJlY2F1c2UgdGhhdCByZWFkIG1heVxuICAgICAgICAvLyBtaXNzIHRoaXMgdmVyeSByZXZhbGlkYXRpb246IHRoZSB3cml0ZXIgcHV0cyB0aGUgbG9nIHJvdyBhbmQgdGhlXG4gICAgICAgIC8vIG1hcmtlciBhdCB0aGUgc2FtZSB0aW1lLCBhbmQgdGhlIHJlYWQgaXMgYW4gZXZlbnR1YWxseSBjb25zaXN0ZW50XG4gICAgICAgIC8vIGBCYXRjaEdldEl0ZW1gIHRoYXQgY2FuIGxhbmQgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSByb3cgc2hvd2VkIGhlcmUuXG4gICAgICAgIC8vIE1hcmtlZCBhcHBsaWVkLCB0aGUgcm93IHdhcyBza2lwcGVkIGJ5IGV2ZXJ5IHF1ZXJ5IHRoZSBsb29rYmFja1xuICAgICAgICAvLyByZXR1cm5lZCBpdCB0bywgYW5kIHRoZSBwcmUtcmV2YWxpZGF0aW9uIG1hcmtlciBzdG9vZCB1bnRpbCB0aGVcbiAgICAgICAgLy8gcm9sbGluZyByZS1yZWFkLiBMZWZ0IHVubWFya2VkLCB0aGUgbmV4dCByZWZyZXNoIGFwcGxpZXMgaXQgdG9cbiAgICAgICAgLy8gd2hhdGV2ZXIgdGhhdCByZWFkIGZvdW5kOyBpdCBjb3N0cyBubyByZWFkLCBvbmx5IHRoZSByb3cgYmVpbmdcbiAgICAgICAgLy8gbG9va2VkIGF0IGFnYWluIHdoaWxlIGl0IGlzIGluc2lkZSB0aGUgbG9va2JhY2suXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEtlcHQgbWVhbndoaWxlIGluIGBsb2dPbmx5YCwgd2hpY2ggaXMgYWxsIGBjb21wbGV0ZVNpbmNlYCBuZWVkcy5cbiAgICAgICAgdGhpcy5yZW1lbWJlckxvZ2dlZChcbiAgICAgICAgICByb3cudGFnLFxuICAgICAgICAgIG1lcmdlTWFya2Vycyh0aGlzLmxvZ09ubHkuZ2V0KHJvdy50YWcpLCByb3cubWFya2VyKSxcbiAgICAgICAgICBvbGRlc3QsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hcHBsaWVkLnNldChyb3cuc2ssIHJvdy5hdCk7XG4gICAgICBhcHBsaWVkKys7XG4gICAgfVxuICAgIGlmIChvbGRlc3QgPiB0aGlzLnBydW5lZEFnYWluc3QpIHtcbiAgICAgIHRoaXMucHJ1bmVMb2dnZWQob2xkZXN0KTtcbiAgICB9XG4gICAgLy8gVGhlIHJvd3MganVzdCBrZXB0IGFyZSBrbm93biBieSBsYXRlciB0aGFuIGBvbGRlc3RgIHRvby5cbiAgICB0aGlzLnBydW5lZEFnYWluc3QgPSBvbGRlc3Q7XG4gICAgdGhpcy5sYXN0TG9nUmVhZCA9IGF0O1xuICAgIHRoaXMuYWR2YW5jZShhdCAtIFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVMpO1xuICAgIHRoaXMuZGVidWcoXG4gICAgICBgcmVhZCAke3Jlc3VsdC5yb3dzLmxlbmd0aH0gcmV2YWxpZGF0aW9uIGxvZyByb3dzICgke2FwcGxpZWR9IGFwcGxpZWQpYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIHRvIHJlYWQgb24gdGhpcyByZWZyZXNoLCBhdCBtb3N0IG9uZSBgQmF0Y2hHZXRJdGVtYCdzIHdvcnRoOlxuICAgKiB0aG9zZSB3aG9zZSByZWFkIGZhaWxlZCwgdGhlbiB0aG9zZSB3aG9zZSByZS1yZWFkIGhhcyBjb21lIGR1ZSwgaW4gdGhlXG4gICAqIG9yZGVyIHRoZXkgd2VyZSBsYXN0IHJlYWQuXG4gICAqL1xuICBwcml2YXRlIGR1ZShhdDogbnVtYmVyKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGR1ZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnVucmVhZCkge1xuICAgICAgaWYgKGR1ZS5sZW5ndGggPj0gQkFUQ0hfR0VUX01BWF9LRVlTKSByZXR1cm4gZHVlO1xuICAgICAgaWYgKCF0aGlzLnJlYWRpbmcuaGFzKHRhZykpIHtcbiAgICAgICAgZHVlLnB1c2godGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gS25vd24gaW4gdGltZSBvcmRlciwgYW5kIGVhY2ggZHVlIGF0IG1vc3QgYGppdHRlcmAgZWFybGllciB0aGFuIHRoZVxuICAgIC8vIHRhZ3MgYWZ0ZXIgaXQ6IHBhc3QgYSB0YWcgZHVlIG1vcmUgdGhhbiB0aGF0IGZyb20gbm93LCBub25lIGlzIGR1ZS5cbiAgICBjb25zdCBqaXR0ZXIgPSB0aGlzLnJlc3luY0ludGVydmFsTXMgKiBUQUdfUkVTWU5DX0pJVFRFUjtcbiAgICBmb3IgKGNvbnN0IFt0YWcsIGR1ZUF0XSBvZiB0aGlzLmR1ZUF0KSB7XG4gICAgICBpZiAoZHVlLmxlbmd0aCA+PSBCQVRDSF9HRVRfTUFYX0tFWVMgfHwgZHVlQXQgLSBqaXR0ZXIgPiBhdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChkdWVBdCA8PSBhdCAmJiAhdGhpcy51bnJlYWQuaGFzKHRhZykgJiYgIXRoaXMucmVhZGluZy5oYXModGFnKSkge1xuICAgICAgICBkdWUucHVzaCh0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmdldCBldmVyeSB0cmFja2VkIG1hcmtlciwgYW5kIGZvbGxvdyB0aGUgbG9nIGZyb20gYGF0YDogd2hhdCBpcyBuZWVkZWRcbiAgICogbmV4dCBpcyByZWFkIGZyb20gaXRzIG1hcmtlciBhcyBpdCBpcyBuZWVkZWQsIHNwcmVhZCBvdmVyIHRoZSByZXF1ZXN0c1xuICAgKiB0aGF0IG5lZWQgaXQsIHJhdGhlciB0aGFuIGV2ZXJ5IHRyYWNrZWQgdGFnIHJlLXJlYWQgYXQgb25jZS5cbiAgICovXG4gIHByaXZhdGUgZm9yZ2V0KGF0OiBudW1iZXIsIHdoeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZWJ1ZyhgZm9yZ2V0dGluZyAke3RoaXMudGFncy5zaXplfSB0cmFja2VkIHRhZ3M6ICR7d2h5fWApO1xuICAgIHRoaXMuZm9yZ290dGVuKys7XG4gICAgLy8gV2hhdCB0aGUgbWFya2VycyBleHBpcmUgbGF0ZXIgaXMgc3RpbGwgdG8gYXBwbHkgb25jZSBpdCBpcyBwYXN0LlxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIHRoaXMudGFncy52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5yYWlzZUZsb29yKG1hcmtlcik7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIHRoaXMubG9nT25seS52YWx1ZXMoKSkge1xuICAgICAgdGhpcy5yYWlzZUZsb29yKG1hcmtlcik7XG4gICAgfVxuICAgIHRoaXMudGFncy5jbGVhcigpO1xuICAgIHRoaXMuZHVlQXQuY2xlYXIoKTtcbiAgICB0aGlzLnVucmVhZC5jbGVhcigpO1xuICAgIHRoaXMuYXBwbGllZC5jbGVhcigpO1xuICAgIHRoaXMubG9nT25seS5jbGVhcigpO1xuICAgIC8vIE5ldmVyIGJhY2s6IGEgbWFya2VyIGRyb3BwZWQgZWFybGllciBtYXkgaGF2ZSBleHBpcmVkIGVudHJpZXMgbGF0ZXIuXG4gICAgdGhpcy5mbG9vciA9IE1hdGgubWF4KHRoaXMuZmxvb3IsIG1hcmtlckNsb2NrKCkpO1xuICAgIHRoaXMuY3Vyc29yID0gYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TO1xuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZCB0byBgY3Vyc29yYCwgZm9yZ2V0dGluZyBhcHBsaWVkIHJvd3MgYmVmb3JlIGl0OlxuICAgKiBubyBxdWVyeSByZXR1cm5zIHRoZW0gYWdhaW4uXG4gICAqL1xuICBwcml2YXRlIGFkdmFuY2UoY3Vyc29yOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoY3Vyc29yIDw9IHRoaXMuY3Vyc29yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY3Vyc29yID0gY3Vyc29yO1xuICAgIGZvciAoY29uc3QgW3NrLCBhdF0gb2YgdGhpcy5hcHBsaWVkKSB7XG4gICAgICBpZiAoYXQgPCBjdXJzb3IpIHtcbiAgICAgICAgdGhpcy5hcHBsaWVkLmRlbGV0ZShzayk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYHRhZ3NgIGZyb20gdGhlIHRhYmxlLCBhbmQgcmVwb3J0IHdoZXRoZXIgdGhhdCB3b3JrZWQuIEEgcmVhZCB0aGF0XG4gICAqIGZhaWxzIGxlYXZlcyB0aGVtIHRyYWNrZWQgYXMgdGhleSB3ZXJlLCBhbmQgdGhlIG5leHQgcmVmcmVzaCByZWFkcyB0aGVtXG4gICAqIGFnYWluOiB0aGUgc2FtZSBcImFzc3VtZSB0aGUgZW50cnkgaXMgdmFsaWRcIiB0aGUgaW5jcmVtZW50YWwgY2FjaGUgaGFzXG4gICAqIGFsd2F5cyBhbnN3ZXJlZCB3aXRoLCByYXRoZXIgdGhhbiBhIHJlYWQgb24gZXZlcnkgcmVxdWVzdCB3aGlsZSBEeW5hbW9EQlxuICAgKiBpcyB1bmF2YWlsYWJsZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZEludG8odGFnczogc3RyaW5nW10sIGFnYWluID0gZmFsc2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhdCA9IHRoaXMuY2xvY2soKTtcbiAgICBjb25zdCBmb3Jnb3R0ZW4gPSB0aGlzLmZvcmdvdHRlbjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHRoaXMubWFya2VycyEucmVhZCh0YWdzKTtcbiAgICAgIGlmICh0aGlzLmZvcmdvdHRlbiAhPT0gZm9yZ290dGVuICYmICFhZ2Fpbikge1xuICAgICAgICAvLyBSZWFkIGJlZm9yZSBhIGZvcmdldCAtIGFjcm9zcyBhIGZyZWV6ZSwgYXMgbGlrZSBhcyBub3QgLSBzbyBhc1xuICAgICAgICAvLyBzdGFsZSBhcyB3aGF0IGl0IGZvcmdvdC4gUmVhZCBhZ2FpbiByYXRoZXIgdGhhbiBsZWF2ZSB0aGUgdGFnc1xuICAgICAgICAvLyB1bnRyYWNrZWQ6IHdob2V2ZXIgd2FpdHMgb24gdGhpcyByZWFkIChgcmVhZGluZ2ApIGp1ZGdlcyBlbnRyaWVzXG4gICAgICAgIC8vIGJ5IGl0IG5leHQsIGFuZCBhbiB1bnRyYWNrZWQgdGFnIGNvdW50cyBmb3Igbm90aGluZy4gT25jZTogYSBydW5cbiAgICAgICAgLy8gb2YgZm9yZ2V0cyAoYSB0cnVuY2F0ZWQgbG9nLCBxdWVyeSBhZnRlciBxdWVyeSkgd291bGQgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGtlZXAgdGhlbSB3YWl0aW5nLCBhbmQgdGhlIHNlY29uZCByZWFkIGJlZ2FuIGFmdGVyIHRoZSBmaXJzdC5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVhZEludG8odGFncywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgIHRoaXMudW5yZWFkLmRlbGV0ZSh0YWcpO1xuICAgICAgICB0aGlzLnJlbWVtYmVyKFxuICAgICAgICAgIHRhZyxcbiAgICAgICAgICBtZXJnZU1hcmtlcnMoXG4gICAgICAgICAgICBtZXJnZU1hcmtlcnModGhpcy50YWdzLmdldCh0YWcpLCByZWFkLmdldCh0YWcpKSxcbiAgICAgICAgICAgIHRoaXMudGFrZVBlbmRpbmdSb3dzKHRhZyksXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5rbm93bih0YWcsIGF0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGVidWcoYHJlYWQgJHt0YWdzLmxlbmd0aH0gdGFnIG1hcmtlcnMgKCR7cmVhZC5zaXplfSBzZXQpYCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlYWRpbmcgdGFnIG1hcmtlcnM6XCIsIGVycm9yKTtcbiAgICAgIGlmICh0aGlzLmZvcmdvdHRlbiAhPT0gZm9yZ290dGVuICYmICFhZ2Fpbikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkSW50byh0YWdzLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudHJhY2tVbnJlYWQodGFncyk7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgIHRoaXMudW5yZWFkLmFkZCh0YWcpO1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy50YWtlUGVuZGluZ1Jvd3ModGFnKTtcbiAgICAgICAgaWYgKHBlbmRpbmcpIHtcbiAgICAgICAgICB0aGlzLnJlbWVtYmVyKHRhZywgbWVyZ2VNYXJrZXJzKHRoaXMudGFncy5nZXQodGFnKSwgcGVuZGluZykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0YWtlUGVuZGluZ1Jvd3ModGFnOiBzdHJpbmcpOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSb3dzLmdldCh0YWcpO1xuICAgIGNvbnN0IGxvZ2dlZCA9IHRoaXMubG9nT25seS5nZXQodGFnKTtcbiAgICB0aGlzLnBlbmRpbmdSb3dzLmRlbGV0ZSh0YWcpO1xuICAgIHRoaXMubG9nT25seS5kZWxldGUodGFnKTtcbiAgICByZXR1cm4gbG9nZ2VkID8gbWVyZ2VNYXJrZXJzKGxvZ2dlZCwgcGVuZGluZykgOiBwZW5kaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBpbnN0YW5jZSBrbm93cyBvZiBgdGFnYDogdHJhY2tlZCwgb3IgZnJvbSB0aGUgbG9nIGFsb25lIC1cbiAgICogaW5jbHVkaW5nIHJvd3MgdGhhdCBhcnJpdmVkIHdoaWxlIGl0cyBmaXJzdCByZWFkIGlzIGluIGZsaWdodC5cbiAgICovXG4gIHByaXZhdGUga25vd25NYXJrZXIodGFnOiBzdHJpbmcpOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHRyYWNrZWQgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgaWYgKHRyYWNrZWQpIHtcbiAgICAgIHJldHVybiB0cmFja2VkO1xuICAgIH1cbiAgICBjb25zdCBsb2dnZWQgPSB0aGlzLmxvZ09ubHkuZ2V0KHRhZyk7XG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1Jvd3MuZ2V0KHRhZyk7XG4gICAgcmV0dXJuIGxvZ2dlZCB8fCBwZW5kaW5nID8gbWVyZ2VNYXJrZXJzKGxvZ2dlZCwgcGVuZGluZykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogS2VlcCBgdGFnYCdzIGxvZyByb3dzIGluIGBsb2dPbmx5YCwgdW5sZXNzIHRoZXkgY2Fubm90IGFwcGx5IHRvIGFuIGVudHJ5XG4gICAqIGhlbGQsIGBvbGRlc3RgIG9yIG5ld2VyIChzZWUge0BsaW5rIHBydW5lTG9nZ2VkfSksIGFzIGJvdW5kZWQgYXMgdGhlXG4gICAqIHRyYWNrZWQgdGFncy4gRWl0aGVyIHdheSBhIHJvdyBsZXQgZ28gb2YgdGFrZXMgd2hhdCBpdCBrbmV3IHdpdGggaXQsIHNvXG4gICAqIGBjb21wbGV0ZVNpbmNlYCBtb3ZlcyBwYXN0IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW1lbWJlckxvZ2dlZCh0YWc6IHN0cmluZywgbWFya2VyOiBUYWdNYXJrZXIsIG9sZGVzdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5sb2dPbmx5LmRlbGV0ZSh0YWcpO1xuICAgIGlmIChrbm93bkJ5KG1hcmtlciwgbWFya2VyQ2xvY2soKSkgPD0gb2xkZXN0KSB7XG4gICAgICB0aGlzLnJhaXNlRmxvb3IobWFya2VyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2dPbmx5LnNldCh0YWcsIG1hcmtlcik7XG4gICAgZm9yIChjb25zdCBbZmlyc3QsIGRyb3BwZWRdIG9mIHRoaXMubG9nT25seSkge1xuICAgICAgaWYgKHRoaXMubG9nT25seS5zaXplIDw9IHRoaXMubWF4VHJhY2tlZFRhZ3MpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ09ubHkuZGVsZXRlKGZpcnN0KTtcbiAgICAgIHRoaXMucmFpc2VGbG9vcihkcm9wcGVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHJvcCB0aGUgYGxvZ09ubHlgIHJvd3MgdGhhdCBjYW5ub3QgYXBwbHkgdG8gYW4gZW50cnkgaGVsZCwgYG9sZGVzdGAgb3JcbiAgICogbmV3ZXI6IGV2ZXJ5IHJldmFsaWRhdGlvbiB0aGV5IG5hbWUgc28gZmFyIGlzIG5vIGxhdGVyIHRoYW4gaXQuIFRoYXRcbiAgICogbW92ZXMgYGNvbXBsZXRlU2luY2VgIG5vIGZ1cnRoZXIgdGhhbiBgb2xkZXN0YCwgd2hpY2ggY29zdHMgdGhlIGVudHJpZXNcbiAgICogaGVsZCBub3RoaW5nLCBhbmQgYSBwcm9maWxlJ3MgYGV4cGlyZWRBdGAgc3RpbGwgdG8gY29tZSB3YWl0cyBpblxuICAgKiBgbGF0ZXJGbG9vcnNgLiBXaXRob3V0IHRoaXMsIGEgZGVwbG95bWVudCByZXZhbGlkYXRpbmcgbWFueSBkaXN0aW5jdCB0YWdzXG4gICAqIGZpbGxlZCBgbG9nT25seWAgd2l0aCB0YWdzIG5vIGVudHJ5IGhlcmUgY2FycmllcywgYW5kIHRoZSBldmljdGlvbnMgcGFzdFxuICAgKiBpdHMgYm91bmQga2VwdCBtb3ZpbmcgYGNvbXBsZXRlU2luY2VgIHVwIHRvIHRoZSBwcmVzZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBwcnVuZUxvZ2dlZChvbGRlc3Q6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGF0ID0gbWFya2VyQ2xvY2soKTtcbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1hcmtlcl0gb2YgdGhpcy5sb2dPbmx5KSB7XG4gICAgICBpZiAoa25vd25CeShtYXJrZXIsIGF0KSA8PSBvbGRlc3QpIHtcbiAgICAgICAgdGhpcy5sb2dPbmx5LmRlbGV0ZSh0YWcpO1xuICAgICAgICB0aGlzLnJhaXNlRmxvb3IobWFya2VyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9sZGVzdCBlbnRyeSB0aW1lc3RhbXAgb2YgYW55IHJlZ2lzdGVyZWQgc3RvcmUsIGBJbmZpbml0eWAgd2l0aCBub25lOlxuICAgKiBlYXJseSwgbmV2ZXIgbGF0ZSwgdW5sZXNzIGBzY2FuYC5cbiAgICovXG4gIHByaXZhdGUgb2xkZXN0RW50cnkoc2NhbjogYm9vbGVhbik6IG51bWJlciB7XG4gICAgbGV0IG9sZGVzdCA9IEluZmluaXR5O1xuICAgIGZvciAoY29uc3QgeyBvbGRlc3RUaW1lc3RhbXAgfSBvZiB0aGlzLmVudHJ5U3RvcmVzKSB7XG4gICAgICBvbGRlc3QgPSBNYXRoLm1pbihvbGRlc3QsIG9sZGVzdFRpbWVzdGFtcChzY2FuKSk7XG4gICAgfVxuICAgIHJldHVybiBvbGRlc3Q7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBgY29tcGxldGVTaW5jZWAgcGFzdCBgbWFya2VyYCdzIHJldmFsaWRhdGlvbnM6IHdoYXQgaXMgbm8gbG9uZ2VyXG4gICAqIGtub3duIGFib3V0IGEgdGFnIG9uY2UgaXRzIG1hcmtlciBpcyBkcm9wcGVkLiBBIGZ1dHVyZSBgZXhwaXJlZEF0YCB3YWl0c1xuICAgKiBpbiBgbGF0ZXJGbG9vcnNgIHVudGlsIGl0IGlzIHBhc3QuXG4gICAqL1xuICBwcml2YXRlIHJhaXNlRmxvb3IobWFya2VyOiBUYWdNYXJrZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgdGhpcy5mbG9vciA9IE1hdGgubWF4KHRoaXMuZmxvb3IsIGtub3duQnkobWFya2VyLCBhdCkpO1xuICAgIGNvbnN0IHsgZXhwaXJlZEF0IH0gPSBtYXJrZXI7XG4gICAgaWYgKGV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIGV4cGlyZWRBdCA+IE1hdGgubWF4KGF0LCB0aGlzLmZsb29yKSkge1xuICAgICAgdGhpcy5sYXRlckZsb29yKGV4cGlyZWRBdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBgdGltZWAgdG8gYGxhdGVyRmxvb3JzYCwgaW4gb3JkZXIuIFBhc3QgdGhlIHRyYWNrZWQtdGFnIGJvdW5kIHRoZSB0d29cbiAgICogc3BhbnMgY2xvc2VzdCB0b2dldGhlciBhcmUgbWVyZ2VkOiBmcm9tIHRoZSBmaXJzdCdzIHN0YXJ0LFxuICAgKiBgY29tcGxldGVTaW5jZWAgaXMgdGhlIHNlY29uZCdzIGVuZCwgZWFybHkgLSB3aGljaCBvbmx5IGNvc3RzIHJlYWRzLCBhbmRcbiAgICogZm9yIGFzIHNob3J0IGEgdGltZSBhcyBhbnkgbWVyZ2UgYWxsb3dzLiBOZXZlciBsYXRlciB0aGFuIGl0cyB0aW1lLCB3aGljaFxuICAgKiB3b3VsZCBsZXQgYW4gZW50cnkgZXhwaXJlIHVuc2Vlbi5cbiAgICovXG4gIHByaXZhdGUgbGF0ZXJGbG9vcih0aW1lOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBmbG9vcnMgPSB0aGlzLmxhdGVyRmxvb3JzO1xuICAgIGxldCBsb3cgPSAwO1xuICAgIGxldCBoaWdoID0gZmxvb3JzLmxlbmd0aDtcbiAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgY29uc3QgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgIGlmIChmbG9vcnNbbWlkXVswXSA8IHRpbWUpIHtcbiAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEluc2lkZSBhIG1lcmdlZCBzcGFuIGFscmVhZHk6IGJ5IGl0cyBzdGFydCwgYGNvbXBsZXRlU2luY2VgIGlzIHBhc3QgaXQuXG4gICAgLy8gT3IgYWxyZWFkeSB0aGVyZTogYSBsb2cgcm93IGZvciBhbiB1bnRyYWNrZWQgdGFnIGlzIGFwcGxpZWQgYWdhaW4gYnlcbiAgICAvLyBldmVyeSBxdWVyeSBpdHMgbG9va2JhY2sgcmV0dXJucyBpdCB0by5cbiAgICBpZiAoKGxvdyA+IDAgJiYgZmxvb3JzW2xvdyAtIDFdWzFdID49IHRpbWUpIHx8IGZsb29yc1tsb3ddPy5bMF0gPT09IHRpbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZmxvb3JzLnNwbGljZShsb3csIDAsIFt0aW1lLCB0aW1lXSk7XG4gICAgLy8gQSBzY2FuLCBidXQgb25seSBvbmNlIHBhc3QgdGhlIGJvdW5kLiBNZXJnaW5nIHRoZSBuZXcgdGltZSBpbnRvIGFcbiAgICAvLyBuZWlnaGJvdXIgaW5zdGVhZCBjb3VsZCBqb2luIGFuIGhvdXItb3V0IHNwYW4gd2l0aCBhIHllYXItb3V0IG9uZSwgYW5kXG4gICAgLy8gaG9sZCBgY29tcGxldGVTaW5jZWAgYSB5ZWFyIGVhcmx5LlxuICAgIGlmIChmbG9vcnMubGVuZ3RoID4gdGhpcy5tYXhUcmFja2VkVGFncykge1xuICAgICAgbGV0IG1lcmdlID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZmxvb3JzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmxvb3JzW2kgKyAxXVsxXSAtIGZsb29yc1tpXVswXSA8XG4gICAgICAgICAgZmxvb3JzW21lcmdlICsgMV1bMV0gLSBmbG9vcnNbbWVyZ2VdWzBdXG4gICAgICAgICkge1xuICAgICAgICAgIG1lcmdlID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmxvb3JzLnNwbGljZShtZXJnZSwgMiwgW2Zsb29yc1ttZXJnZV1bMF0sIGZsb29yc1ttZXJnZSArIDFdWzFdXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlY29yZCB0aGF0IGB0YWdgJ3MgbWFya2VyIHdhcyBrbm93biBmcm9tIHRoZSB0YWJsZSBhdCBgYXRgLiAqL1xuICBwcml2YXRlIGtub3duKHRhZzogc3RyaW5nLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kdWVBdC5kZWxldGUodGFnKTtcbiAgICB0aGlzLmR1ZUF0LnNldChcbiAgICAgIHRhZyxcbiAgICAgIGF0ICsgdGhpcy5yZXN5bmNJbnRlcnZhbE1zICogKDEgLSBUQUdfUkVTWU5DX0pJVFRFUiAqIHRoaXMucmFuZG9tKCkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbWVtYmVyKHRhZzogc3RyaW5nLCBtYXJrZXI6IFRhZ01hcmtlcik6IHZvaWQge1xuICAgIHRoaXMudGFncy5kZWxldGUodGFnKTtcbiAgICB0aGlzLnRhZ3Muc2V0KHRhZywgbWFya2VyKTtcbiAgICBmb3IgKGNvbnN0IG9sZGVzdCBvZiB0aGlzLnRhZ3Mua2V5cygpKSB7XG4gICAgICBpZiAodGhpcy50YWdzLnNpemUgPD0gdGhpcy5tYXhUcmFja2VkVGFncykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRoaXMucmFpc2VGbG9vcih0aGlzLnRhZ3MuZ2V0KG9sZGVzdCkhKTtcbiAgICAgIHRoaXMudGFncy5kZWxldGUob2xkZXN0KTtcbiAgICAgIHRoaXMuZHVlQXQuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB0aGlzLnVucmVhZC5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvdWNoKHRhZzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgIGlmIChtYXJrZXIpIHtcbiAgICAgIHRoaXMucmVtZW1iZXIodGFnLCBtYXJrZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBsYXRlc3QgcmV2YWxpZGF0aW9uIGBtYXJrZXJgIGhhcyBtYWRlIGtub3duIGJ5IGBhdGAsIGAtSW5maW5pdHlgIHdpdGhcbiAqIG5vbmU6IGEgZnV0dXJlIGBleHBpcmVkQXRgIGlzIHN0aWxsIHRvIGNvbWUuXG4gKi9cbmZ1bmN0aW9uIGtub3duQnkobWFya2VyOiBUYWdNYXJrZXIsIGF0OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCB7IHJldmFsaWRhdGVkQXQsIHN0YWxlQXQsIGV4cGlyZWRBdCB9ID0gbWFya2VyO1xuICByZXR1cm4gTWF0aC5tYXgoXG4gICAgcmV2YWxpZGF0ZWRBdCA/PyAtSW5maW5pdHksXG4gICAgc3RhbGVBdCA/PyAtSW5maW5pdHksXG4gICAgZXhwaXJlZEF0ICE9PSB1bmRlZmluZWQgJiYgZXhwaXJlZEF0IDw9IGF0ID8gZXhwaXJlZEF0IDogLUluZmluaXR5LFxuICApO1xufVxuXG4vKipcbiAqIFRoZSBsb25nZXN0IGEgbG9nIHJvdydzIHB1dCBtYXkgdGFrZSBhbmQgc3RpbGwgYmUgc2VlbiBieSBldmVyeSByZWFkZXI6IGhhbGZcbiAqIHRoZSBsb29rYmFjaywgbGVhdmluZyB0aGUgcmVzdCBmb3Igd3JpdGVycycgY2xvY2tzIGFuZCBldmVudHVhbGx5IGNvbnNpc3RlbnRcbiAqIHF1ZXJpZXMuXG4gKi9cbmNvbnN0IE1BWF9MT0dfUFVUX01TID0gUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUyAvIDI7XG5cbi8qKlxuICogSG93IG9mdGVuIGEgcmVmcmVzaCBzY2FucyB0aGUgZW50cnkgc3RvcmVzIGZvciB0aGVpciBvbGRlc3QgZW50cnksIGRyb3BwaW5nXG4gKiB0aGUgZXhwaXJlZCBvbmVzIG5vIHJlcXVlc3QgcmVhZHMgYWdhaW4uXG4gKi9cbmNvbnN0IEVOVFJZX1NDQU5fSU5URVJWQUxfTVMgPSA2MF8wMDA7XG5cbi8qKiBIb3cgb2Z0ZW4gYSByZWZyZXNoIGluIGZsaWdodCBjaGVja3MgdGhlIHByb2Nlc3MgaXMgcnVubmluZy4gKi9cbmNvbnN0IFJFRlJFU0hfVElDS19NUyA9IDI1MDtcblxuLyoqXG4gKiBIb3cgbGF0ZSBhIHRpY2sgbWF5IGNvbWUgYmVmb3JlIHRoZSBwcm9jZXNzIGNvdW50cyBhcyBwYXVzZWQgKGZyb3plbilcbiAqIHNpbmNlIHRoZSByZWZyZXNoIGluIGZsaWdodCBzdGFydGVkLiBBIGJ1c3kgZXZlbnQgbG9vcCBjYW4gZGVsYXkgb25lIHRvbzpcbiAqIHRoZSByZWZyZXNoIHRoZW4gY291bnRzIGFzIG5vIGZyZXNoZXIgdGhhbiBpdHMgc3RhcnQsIGFzIGJlZm9yZSB0aGUgcGF1c2VcbiAqIGNoZWNrLCBzbyBhIHJlcXVlc3Qgd2FpdHMgZm9yIHRoZSBuZXh0IG9uZSBvbmNlIHRoYXQgaXMgcGFzdCB0aGUgZ3JhY2UuXG4gKi9cbmNvbnN0IFJFRlJFU0hfUEFVU0VfTVMgPSAxMDAwO1xuXG4vKipcbiAqIEEgbWFya2VyIGFzIHJlYWQgZnJvbSB0aGUgdGFibGUgb3IgdGhlIGxvZywga2VlcGluZyB3aGF0ZXZlciB0aGlzIGluc3RhbmNlXG4gKiBhbHJlYWR5IGtub3dzIHRoYXQgdGhlIHJlYWQgZG9lcyBub3Qgc2hvdyB5ZXQ6IHJlYWRzIGFyZSBldmVudHVhbGx5XG4gKiBjb25zaXN0ZW50LCBhbmQgYSByZWFkIHN0cmFpZ2h0IGFmdGVyIHRoaXMgaW5zdGFuY2UncyBvd24gcmV2YWxpZGF0aW9uIGNvdWxkXG4gKiBvdGhlcndpc2UgdGFrZSBpdCBiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VNYXJrZXJzKFxuICBsb2NhbDogVGFnTWFya2VyIHwgdW5kZWZpbmVkLFxuICByZW1vdGU6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCxcbik6IFRhZ01hcmtlciB7XG4gIGlmICghbG9jYWwpIHtcbiAgICByZXR1cm4gcmVtb3RlID8/IHt9O1xuICB9XG4gIGlmICghcmVtb3RlKSB7XG4gICAgcmV0dXJuIGxvY2FsO1xuICB9XG4gIC8vIGBleHBpcmVkQXRgIGlzIHdyaXR0ZW4gd2l0aCBgc3RhbGVBdGAsIHNvIGl0IGJlbG9uZ3MgdG8gd2hpY2hldmVyIGlzXG4gIC8vIG5ld2VyIC0gdW5sZXNzIHRoYXQgcmV2YWxpZGF0aW9uJ3MgcHJvZmlsZSBoYWQgbm8gYGV4cGlyZWAgYW5kIGxlZnQgaXQuXG4gIGNvbnN0IFtvbGRlciwgbmV3ZXJdID1cbiAgICAobG9jYWwuc3RhbGVBdCA/PyAtMSkgPiAocmVtb3RlLnN0YWxlQXQgPz8gLTEpXG4gICAgICA/IFtyZW1vdGUsIGxvY2FsXVxuICAgICAgOiBbbG9jYWwsIHJlbW90ZV07XG4gIHJldHVybiB7XG4gICAgLi4uYXBwbHlNYXJrZXIob2xkZXIsIG5ld2VyKSxcbiAgICByZXZhbGlkYXRlZEF0OiBtYXhEZWZpbmVkKGxvY2FsLnJldmFsaWRhdGVkQXQsIHJlbW90ZS5yZXZhbGlkYXRlZEF0KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWF4RGVmaW5lZChhOiBudW1iZXIgfCB1bmRlZmluZWQsIGI6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gYjtcbiAgaWYgKGIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGE7XG4gIHJldHVybiBNYXRoLm1heChhLCBiKTtcbn1cblxuLyoqXG4gKiBUaGUgY2FjaGUgYnVja2V0LCBhcyB0aGUgaGFuZGxlcnMgdXNlIGl0OiB3aG9sZSBvYmplY3RzIHJlYWQgYW5kIHdyaXR0ZW4gYXNcbiAqIFVURi04IHRleHQgdW5kZXIgdGhlIGtleXMgYWJvdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWNoZUJ1Y2tldCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTM0NsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldE5hbWU6IHN0cmluZyxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBUaGUgYm9keSBvZiB0aGUgb2JqZWN0IGF0IGBrZXlgLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUgKGBOb1N1Y2hLZXlgLCBvciBhblxuICAgKiBlbXB0eSByZXNwb25zZSBib2R5KS4gQW55IG90aGVyIGVycm9yIGlzIHRocm93bjogdGhlIGhhbmRsZXJzIGRpc2FncmVlIG9uXG4gICAqIHdoZXRoZXIgb25lIGlzIHdvcnRoIGxvZ2dpbmcuXG4gICAqL1xuICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBHZXRPYmplY3RDb21tYW5kKHsgQnVja2V0OiB0aGlzLmJ1Y2tldE5hbWUsIEtleToga2V5IH0pLFxuICAgICAgKTtcbiAgICAgIGlmICghcmVzcG9uc2UuQm9keSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3BvbnNlLkJvZHkudHJhbnNmb3JtVG9TdHJpbmcoXCJ1dGYtOFwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9TdWNoS2V5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogV3JpdGUgYGJvZHlgIGFzIGEgSlNPTiBvYmplY3QgYXQgYGtleWAuICovXG4gIGFzeW5jIHB1dEpzb24oa2V5OiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICBuZXcgUHV0T2JqZWN0Q29tbWFuZCh7XG4gICAgICAgIEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLFxuICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgQm9keTogYm9keSxcbiAgICAgICAgQ29udGVudFR5cGU6IFwiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOFwiLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19
1481
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLWNhY2hlLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvYXdzLWNhY2hlLXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWlEQSxzREFPQztBQVNELGdDQUVDO0FBR0Qsa0NBRUM7QUFtQkQsc0NBRUM7QUFxQ0Qsa0NBZ0JDO0FBV0Qsa0NBRUM7QUFXRCw4QkFXQztBQVFELGtDQVdDO0FBR0Qsb0NBZUM7QUFpREQsOEJBRUM7QUFZRCxnQ0FFQztBQWkzQ0Qsb0NBb0JDO0FBaHFERDs7Ozs7Ozs7O0VBU0U7QUFDRixzREFBc0Q7QUFDdEQsdURBQXFEO0FBQ3JELHlDQUFpQztBQUNqQyw4REFTa0M7QUFDbEMsa0RBSzRCO0FBQzVCLCtDQUE2RTtBQUM3RSwwREFBeUQ7QUFrQnpELDhDQUE4QztBQUM5QyxTQUFnQixxQkFBcUI7SUFDbkMsT0FBTztRQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixJQUFJLEVBQUU7UUFDMUQsU0FBUyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLElBQUksRUFBRTtRQUMvRCxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksV0FBVztRQUM3QyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO0tBQy9DLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsVUFBVSxDQUFDLE9BQWUsRUFBRSxRQUFnQjtJQUMxRCxPQUFPLElBQUEsZ0JBQUksRUFBQyxPQUFPLEVBQUUsSUFBQSw4QkFBZ0IsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxtRkFBbUY7QUFDbkYsU0FBZ0IsV0FBVyxDQUFDLE9BQWUsRUFBRSxRQUFnQjtJQUMzRCxPQUFPLElBQUEsZ0JBQUksRUFBQyxPQUFPLEVBQUUsSUFBQSw2QkFBZSxFQUFDLFFB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LE9BQU8sQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVkscUJBQVMsRUFBRSxDQUFDO2dCQUMvQixPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBQ0QsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELDhDQUE4QztJQUM5QyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQVcsRUFBRSxJQUFZO1FBQ3JDLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3BCLElBQUksNEJBQWdCLENBQUM7WUFDbkIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3ZCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUUsaUNBQWlDO1NBQy9DLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkNELGtDQXVDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFRoZSBTMyAvIER5bmFtb0RCIHBsdW1iaW5nIHNoYXJlZCBieSBldmVyeSBjZGstbmV4dGpzIGNhY2hlIGhhbmRsZXI6IHRoZVxuICBpbmNyZW1lbnRhbCBgY2FjaGVIYW5kbGVyYCAoYFMzQ2FjaGVIYW5kbGVyYCkgYW5kIHRoZSBgY2FjaGVIYW5kbGVyc2AgZm9yXG4gIGAndXNlIGNhY2hlJ2AgLyBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AuXG5cbiAgV2hhdCBsaXZlcyBoZXJlIGlzIHdoYXQgaGFzIHRvIGFncmVlIGJldHdlZW4gdGhlbSAtIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uXG4gIGNvbWVzIGZyb20sIGhvdyBhIGNhY2hlIGtleSBiZWNvbWVzIGFuIFMzIGtleSwgYW5kIHdoYXQgYSB0YWcncyBtYXJrZXIgcm93IGluXG4gIHRoZSByZXZhbGlkYXRpb24gdGFibGUgbG9va3MgbGlrZSBhbmQgbWVhbnMuIEEgYHJldmFsaWRhdGVUYWdgIHJlYWNoZXMgYm90aFxuICBraW5kcyBvZiBoYW5kbGVyLCBhbmQgdGhleSBtdXN0IHJlYWQgZWFjaCBvdGhlcidzIG1hcmtlcnMgdGhlIHNhbWUgd2F5LlxuKi9cbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwibm9kZTphc3luY19ob29rc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZVZhbHVlLFxuICBCYXRjaEdldEl0ZW1Db21tYW5kLFxuICBCYXRjaEdldEl0ZW1Db21tYW5kT3V0cHV0LFxuICBEeW5hbW9EQkNsaWVudCxcbiAgUHV0SXRlbUNvbW1hbmQsXG4gIFF1ZXJ5Q29tbWFuZCxcbiAgUXVlcnlDb21tYW5kT3V0cHV0LFxuICBVcGRhdGVJdGVtQ29tbWFuZCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IHtcbiAgR2V0T2JqZWN0Q29tbWFuZCxcbiAgTm9TdWNoS2V5LFxuICBQdXRPYmplY3RDb21tYW5kLFxuICBTM0NsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgY2FjaGVLZXlGaWxlTmFtZSwgY2FjaGVPYmplY3ROYW1lLCBzaGEyNTZIZXggfSBmcm9tIFwiLi9jYWNoZS11dGlsc1wiO1xuaW1wb3J0IHsgb3V0c2lkZVJlcXVlc3QgfSBmcm9tIFwiLi4vcnVudGltZS90YWctbWFuaWZlc3RcIjtcblxuLyoqXG4gKiBXaGVyZSB0aGUgY2FjaGUgbGl2ZXMsIGFzIHRoZSBjb25zdHJ1Y3RzIHBhc3MgaXQgdG8gdGhlIGNvbXB1dGUgdGhyb3VnaCB0aGVcbiAqIGVudmlyb25tZW50IChgTmV4dGpzRnVuY3Rpb25zYCwgYE5leHRqc0NvbnRhaW5lcnNgKS4gRW1wdHkgc3RyaW5ncyBmb3Igd2hhdCBpc1xuICogbm90IGNvbmZpZ3VyZWQsIHdoaWNoIGVhY2ggaGFuZGxlciByZWFkcyBhcyBcInRoYXQgbGF5ZXIgaXMgZGlzYWJsZWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBd3NDYWNoZUNvbmZpZyB7XG4gIC8qKiBgQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRWAuICovXG4gIGJ1Y2tldE5hbWU6IHN0cmluZztcbiAgLyoqIGBDREtfTkVYVEpTX1JFVkFMSURBVElPTl9UQUJMRV9OQU1FYC4gKi9cbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIC8qKiBgQVdTX1JFR0lPTmAsIGB1cy1lYXN0LTFgIHdoZW4gdW5zZXQuICovXG4gIHJlZ2lvbjogc3RyaW5nO1xuICAvKiogYENES19ORVhUSlNfQlVJTERfSURgOiBldmVyeSBTMyBrZXkgYW5kIGV2ZXJ5IG1hcmtlciByb3cgaXMgc2NvcGVkIHRvIGl0LiAqL1xuICBidWlsZElkOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBlbnZpcm9ubWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXdzQ2FjaGVDb25maWcoKTogQXdzQ2FjaGVDb25maWcge1xuICByZXR1cm4ge1xuICAgIGJ1Y2tldE5hbWU6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUUgfHwgXCJcIixcbiAgICB0YWJsZU5hbWU6IHByb2Nlc3MuZW52LkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgfHwgXCJcIixcbiAgICByZWdpb246IHByb2Nlc3MuZW52LkFXU19SRUdJT04gfHwgXCJ1cy1lYXN0LTFcIixcbiAgICBidWlsZElkOiBwcm9jZXNzLmVudi5DREtfTkVYVEpTX0JVSUxEX0lEIHx8IFwiXCIsXG4gIH07XG59XG5cbi8qKlxuICogYHtidWlsZElkfS97Y2FjaGVLZXl9Lmpzb25gLCB0aGUgaW5jcmVtZW50YWwgY2FjaGUncyBrZXkgY29udmVudGlvbi5cbiAqXG4gKiBUaGUgcm9vdCBwYXRoIGJlY29tZXMgYGluZGV4YCwgYW5kIGEgbGVhZGluZyBzbGFzaCBpcyBkcm9wcGVkIHNvIHRoZXJlIGlzIG5vXG4gKiBlbXB0eSBmb2xkZXIgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeC4gRXZlcnl0aGluZyB0aGlzIHJldHVybnMgZW5kcyBpbiBgLmpzb25gLFxuICogd2hpY2ggaXMgd2hhdCBrZWVwcyBpdCBkaXNqb2ludCBmcm9tIHtAbGluayB1c2VDYWNoZVMzS2V5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUzNLZXkoYnVpbGRJZDogc3RyaW5nLCBjYWNoZUtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oYnVpbGRJZCwgY2FjaGVLZXlGaWxlTmFtZShjYWNoZUtleSkpO1xufVxuXG4vKiogYHtidWlsZElkfS9gICsge0BsaW5rIGNhY2hlT2JqZWN0TmFtZX06IHRoZSBTMyBvYmplY3QgYW4gZW50cnkgaXMgc3RvcmVkIGluLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHMzT2JqZWN0S2V5KGJ1aWxkSWQ6IHN0cmluZywgY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKGJ1aWxkSWQsIGNhY2hlT2JqZWN0TmFtZShjYWNoZUtleSkpO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkZXIgdW5kZXIgdGhlIGJ1aWxkIHByZWZpeCB0aGF0IGAndXNlIGNhY2hlJ2AgZW50cmllcyBhcmUgc3RvcmVkIGluLlxuICogQHNlZSB1c2VDYWNoZVMzS2V5XG4gKi9cbmV4cG9ydCBjb25zdCBVU0VfQ0FDSEVfS0VZX1BSRUZJWCA9IFwiX3VzZS1jYWNoZVwiO1xuXG4vKipcbiAqIGB7YnVpbGRJZH0vX3VzZS1jYWNoZS97aGFzaH0uZW50cnlgLCB3aGVyZSBhIGBjYWNoZUhhbmRsZXJzYCBlbnRyeSBpcyBzdG9yZWQuXG4gKlxuICogSGFzaGVkIGJlY2F1c2UgYSBgJ3VzZSBjYWNoZSdgIGtleSBpcyB0aGUgc2VyaWFsaXplZCBhcmd1bWVudHMgb2YgdGhlIGNhbGwgYW5kXG4gKiBoYXMgbm8gbGVuZ3RoIGxpbWl0LCB3aGVyZSBhbiBTMyBrZXkgc3RvcHMgYXQgMTAyNCBieXRlcy4gVGhlIGAuZW50cnlgIHN1ZmZpeFxuICogcmF0aGVyIHRoYW4gYC5qc29uYCBpcyB3aGF0IG1ha2VzIGEgY29sbGlzaW9uIHdpdGggdGhlIGluY3JlbWVudGFsIGNhY2hlXG4gKiBpbXBvc3NpYmxlIHJhdGhlciB0aGFuIHVubGlrZWx5OiBldmVyeSBvYmplY3Qge0BsaW5rIHMzT2JqZWN0S2V5fSBuYW1lcyBlbmRzXG4gKiBpbiBgLmpzb25gIG9yIGAubG9uZ2AsIGluY2x1ZGluZyBvbmUgZm9yIGEgcm91dGUgdGhhdCBoYXBwZW5zIHRvIGJlIG5hbWVkXG4gKiBgL191c2UtY2FjaGUv4oCmYC5cbiAqIFN0aWxsIHVuZGVyIHRoZSBidWlsZCBwcmVmaXgsIHNvIHBvc3QtZGVwbG95IHBydW5pbmcgZHJvcHMgdGhlbSB3aXRoIHRoZSBidWlsZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNhY2hlUzNLZXkoYnVpbGRJZDogc3RyaW5nLCBrZXlIYXNoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihidWlsZElkLCBVU0VfQ0FDSEVfS0VZX1BSRUZJWCwgYCR7a2V5SGFzaH0uZW50cnlgKTtcbn1cblxuLyoqXG4gKiBUaGUgYGR1cmF0aW9uc2AgTmV4dC5qcyAxNiBwYXNzZXMgYSB0YWcgcmV2YWxpZGF0aW9uIGZvciBhIHByb2ZpbGU6XG4gKiBgcmV2YWxpZGF0ZVRhZyhcInBvc3RzXCIsIFwibWF4XCIpYCBhcnJpdmVzIGFzIGB7IGV4cGlyZTogPHRoZSBwcm9maWxlJ3MgZXhwaXJlPiB9YC5cbiAqIEFic2VudCBmb3IgYHVwZGF0ZVRhZ2AgYW5kIGEgYmFyZSBgcmV2YWxpZGF0ZVRhZ2AsIHdoaWNoIGV4cGlyZSBpbW1lZGlhdGVseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZhbGlkYXRlRHVyYXRpb25zIHtcbiAgZXhwaXJlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgdGFnJ3MgbWFya2VyIHJvdywgYXMgdGltZXN0YW1wcyBpbiBtaWxsaXNlY29uZHMuIFdyaXR0ZW4gYnlcbiAqIHtAbGluayBtYXJrZXJVcGRhdGV9OyBlYWNoIGZpZWxkIGlzIGFic2VudCB1bnRpbCBhIHJldmFsaWRhdGlvbiBvZiB0aGF0IHNoYXBlXG4gKiBoYXMgaGFwcGVuZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFnTWFya2VyIHtcbiAgLyoqIEV4cGlyZWQgb3V0cmlnaHQ6IGB1cGRhdGVUYWdgLCBvciBgcmV2YWxpZGF0ZVRhZ2Agd2l0aCBubyBwcm9maWxlLiAqL1xuICByZXZhbGlkYXRlZEF0PzogbnVtYmVyO1xuICAvKiogU3RhbGUgZnJvbSBoZXJlOiBgcmV2YWxpZGF0ZVRhZyh0YWcsIHByb2ZpbGUpYC4gKi9cbiAgc3RhbGVBdD86IG51bWJlcjtcbiAgLyoqIFdoZW4gdGhlIHByb2ZpbGUncyBgZXhwaXJlYCBydW5zIG91dCwgd2hpY2ggbWF5IGJlIGluIHRoZSBmdXR1cmUuICovXG4gIGV4cGlyZWRBdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSB0YWcgbWFya2VycyBzYXkgYWJvdXQgYW4gZW50cnk6IHVudG91Y2hlZCwgc2VydmVkIHN0YWxlIHdoaWxlIGFcbiAqIGJhY2tncm91bmQgcmVuZGVyIHJlcGxhY2VzIGl0LCBvciBleHBpcmVkIGFuZCByZS1yZW5kZXJlZCBiZWZvcmUgYW5zd2VyaW5nLlxuICovXG5leHBvcnQgdHlwZSBSZXZhbGlkYXRpb25TdGF0ZSA9IFwiZnJlc2hcIiB8IFwic3RhbGVcIiB8IFwiZXhwaXJlZFwiO1xuXG4vKipcbiAqIFdoYXQgYG1hcmtlcmAgbWVhbnMgZm9yIGFuIGVudHJ5IGNyZWF0ZWQgYXQgYGNyZWF0ZWRBdGAsIGF0IGBub3dgLlxuICpcbiAqIGBleHBpcmVkQXRgIGluIHRoZSBmdXR1cmUgaXMgYSBwcm9maWxlJ3MgYGV4cGlyZWAgdGhhdCBoYXMgbm90IGNvbWUgeWV0LFxuICogY29tcGFyZWQgdGhlIHdheSBOZXh0LmpzJ3MgYGFyZVRhZ3NFeHBpcmVkYCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyU3RhdGUoXG4gIG1hcmtlcjogVGFnTWFya2VyLFxuICBjcmVhdGVkQXQ6IG51bWJlcixcbiAgbm93OiBudW1iZXIsXG4pOiBSZXZhbGlkYXRpb25TdGF0ZSB7XG4gIGNvbnN0IHsgcmV2YWxpZGF0ZWRBdCwgZXhwaXJlZEF0LCBzdGFsZUF0IH0gPSBtYXJrZXI7XG4gIGlmIChcbiAgICAocmV2YWxpZGF0ZWRBdCAhPT0gdW5kZWZpbmVkICYmIHJldmFsaWRhdGVkQXQgPiBjcmVhdGVkQXQpIHx8XG4gICAgKGV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIGV4cGlyZWRBdCA8PSBub3cgJiYgZXhwaXJlZEF0ID4gY3JlYXRlZEF0KVxuICApIHtcbiAgICByZXR1cm4gXCJleHBpcmVkXCI7XG4gIH1cbiAgaWYgKHN0YWxlQXQgIT09IHVuZGVmaW5lZCAmJiBzdGFsZUF0ID4gY3JlYXRlZEF0KSB7XG4gICAgcmV0dXJuIFwic3RhbGVcIjtcbiAgfVxuICByZXR1cm4gXCJmcmVzaFwiO1xufVxuXG4vKipcbiAqIFRoZSBjbG9jayBldmVyeSB0YWcgbWFya2VyIGlzIHN0YW1wZWQgd2l0aCwgYW5kIGV2ZXJ5IGVudHJ5IHRpbWVzdGFtcCBpdCBpc1xuICogY29tcGFyZWQgYWdhaW5zdDogdGhlIG9uZSBOZXh0LmpzIHN0YW1wcyBgQ2FjaGVFbnRyeS50aW1lc3RhbXBgIHdpdGhcbiAqIChgcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpYCwgaW4gYHVzZS1jYWNoZS13cmFwcGVyLmpzYCBhbmRcbiAqIHRoZSBkZWZhdWx0IGhhbmRsZXIpLCByYXRoZXIgdGhhbiBgRGF0ZS5ub3coKWAuIEJvdGggaGFuZGxlcnMgd3JpdGUgdGhlIHNhbWVcbiAqIG1hcmtlciByb3dzLCBzbyBib3RoIGhhdmUgdG8gdXNlIGl0OiB0d28gY2xvY2tzIG9uIG9uZSByb3cgbGV0IHRoZSBsYXN0IHdyaXRlclxuICogZGVjaWRlIHdoaWNoIGNsb2NrIHRoZSBvdGhlcnMgY29tcGFyZSBhZ2FpbnN0LCBhbmQgdGhleSBkcmlmdCBhcGFydCBmb3IgYXNcbiAqIGxvbmcgYXMgYSBMYW1iZGEgc2FuZGJveCBvciBGYXJnYXRlIHRhc2sgbGl2ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJDbG9jaygpOiBudW1iZXIge1xuICByZXR1cm4gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG4vKipcbiAqIFRoZSBtYXJrZXIgZmllbGRzIGEgdGFnIHJldmFsaWRhdGVkIGF0IGBub3dgIHNldHMuXG4gKlxuICogV2l0aG91dCBgZHVyYXRpb25zYCAtIGB1cGRhdGVUYWdgLCBvciBgcmV2YWxpZGF0ZVRhZ2Agd2l0aCBubyBwcm9maWxlIC0gdGhlXG4gKiB0YWcncyBlbnRyaWVzIGV4cGlyZSBpbW1lZGlhdGVseSAoYHJldmFsaWRhdGVkQXRgKS4gV2l0aCB0aGVtIHRoZSBlbnRyaWVzIGdvXG4gKiBzdGFsZSBub3cgYW5kIGV4cGlyZSBhZnRlciB0aGUgcHJvZmlsZSdzIGBleHBpcmVgLCB0aGUgc2FtZSBwYWlyIG9mXG4gKiB0aW1lc3RhbXBzIE5leHQuanMncyBgRmlsZVN5c3RlbUNhY2hlLnJldmFsaWRhdGVUYWdgIHJlY29yZHMuIEEgcHJvZmlsZSB3aXRoXG4gKiBubyBgZXhwaXJlYCBzZXRzIG9ubHkgYHN0YWxlQXRgLCBhbmQgd2hhdGV2ZXIgYGV4cGlyZWRBdGAgdGhlIHRhZyBoYWQgc3RheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJGb3IoXG4gIG5vdzogbnVtYmVyLFxuICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBUYWdNYXJrZXIge1xuICBpZiAoIWR1cmF0aW9ucykge1xuICAgIHJldHVybiB7IHJldmFsaWRhdGVkQXQ6IG5vdyB9O1xuICB9XG4gIGlmIChkdXJhdGlvbnMuZXhwaXJlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBzdGFsZUF0OiBub3cgfTtcbiAgfVxuICByZXR1cm4geyBzdGFsZUF0OiBub3csIGV4cGlyZWRBdDogbm93ICsgZHVyYXRpb25zLmV4cGlyZSAqIDEwMDAgfTtcbn1cblxuY29uc3QgTUFSS0VSX0ZJRUxEUyA9IFtcInJldmFsaWRhdGVkQXRcIiwgXCJzdGFsZUF0XCIsIFwiZXhwaXJlZEF0XCJdIGFzIGNvbnN0O1xuXG4vKipcbiAqIGBleGlzdGluZ2Agd2l0aCB0aGUgZmllbGRzIGB1cGRhdGVgIHNldHMsIGFzIGEge0BsaW5rIG1hcmtlclVwZGF0ZX0gbGVhdmVzXG4gKiB0aGUgcm93OiBhIGZpZWxkIGB1cGRhdGVgIGRvZXMgbm90IHNldCBrZWVwcyBpdHMgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1hcmtlcihcbiAgZXhpc3Rpbmc6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCxcbiAgdXBkYXRlOiBUYWdNYXJrZXIsXG4pOiBUYWdNYXJrZXIge1xuICBjb25zdCBtYXJrZXIgPSB7IC4uLmV4aXN0aW5nIH07XG4gIGZvciAoY29uc3QgZmllbGQgb2YgTUFSS0VSX0ZJRUxEUykge1xuICAgIGlmICh1cGRhdGVbZmllbGRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1hcmtlcltmaWVsZF0gPSB1cGRhdGVbZmllbGRdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFya2VyO1xufVxuXG4vKiogVGhlIG1hcmtlci1yb3cgdXBkYXRlIHRoYXQgc2V0cyB7QGxpbmsgbWFya2VyRm9yfSdzIGZpZWxkcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJVcGRhdGUoXG4gIG5vdzogbnVtYmVyLFxuICBkdXJhdGlvbnM6IFJldmFsaWRhdGVEdXJhdGlvbnMgfCB1bmRlZmluZWQsXG4pOiBQaWNrPFxuICBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFVwZGF0ZUl0ZW1Db21tYW5kPlswXSxcbiAgXCJVcGRhdGVFeHByZXNzaW9uXCIgfCBcIkV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXNcIlxuPiB7XG4gIGNvbnN0IG1hcmtlciA9IG1hcmtlckZvcihub3csIGR1cmF0aW9ucyk7XG4gIGNvbnN0IGZpZWxkcyA9IE1BUktFUl9GSUVMRFMuZmlsdGVyKChmaWVsZCkgPT4gbWFya2VyW2ZpZWxkXSAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIHtcbiAgICBVcGRhdGVFeHByZXNzaW9uOiBgU0VUICR7ZmllbGRzLm1hcCgoZmllbGQpID0+IGAke2ZpZWxkfSA9IDoke2ZpZWxkfWApLmpvaW4oXCIsIFwiKX1gLFxuICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVWYWx1ZXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIGZpZWxkcy5tYXAoKGZpZWxkKSA9PiBbYDoke2ZpZWxkfWAsIHsgTjogU3RyaW5nKG1hcmtlcltmaWVsZF0pIH1dKSxcbiAgICApLFxuICB9O1xufVxuXG4vKiogQSBEeW5hbW9EQiBudW1iZXIgYXR0cmlidXRlIGFzIGEgbnVtYmVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC4gKi9cbmZ1bmN0aW9uIG51bWJlckF0dHJpYnV0ZShcbiAgdmFsdWU6IEF0dHJpYnV0ZVZhbHVlIHwgdW5kZWZpbmVkLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlPy5OID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBOdW1iZXIodmFsdWUuTik7XG59XG5cbi8qKiBUaGUgbWFya2VyIGZpZWxkcyBvZiBhIG1hcmtlciBvciBsb2cgcm93LiAqL1xuZnVuY3Rpb24gbWFya2VyT2YoaXRlbTogUmVjb3JkPHN0cmluZywgQXR0cmlidXRlVmFsdWU+KTogVGFnTWFya2VyIHtcbiAgcmV0dXJuIHtcbiAgICByZXZhbGlkYXRlZEF0OiBudW1iZXJBdHRyaWJ1dGUoaXRlbS5yZXZhbGlkYXRlZEF0KSxcbiAgICBzdGFsZUF0OiBudW1iZXJBdHRyaWJ1dGUoaXRlbS5zdGFsZUF0KSxcbiAgICBleHBpcmVkQXQ6IG51bWJlckF0dHJpYnV0ZShpdGVtLmV4cGlyZWRBdCksXG4gIH07XG59XG5cbi8qKiBEeW5hbW9EQidzIGNhcCBvbiBrZXlzIGluIG9uZSBgQmF0Y2hHZXRJdGVtYC4gKi9cbmV4cG9ydCBjb25zdCBCQVRDSF9HRVRfTUFYX0tFWVMgPSAxMDA7XG5cbi8qKlxuICogSG93IG9mdGVuLCBhdCBtb3N0LCBhbiBpbnN0YW5jZSBjYXRjaGVzIHVwIG9uIHJldmFsaWRhdGlvbnMgb3RoZXIgaW5zdGFuY2VzXG4gKiByYW4sIHVubGVzcyBgQ0RLX05FWFRKU19UQUdfUkVGUkVTSF9NU2Agc2F5cyBvdGhlcndpc2U6IHRoZSBzdGFsZW5lc3Mgd2luZG93XG4gKiBmb3IgYSBgcmV2YWxpZGF0ZVRhZ2AgcnVuIGVsc2V3aGVyZS4gRXZlcnkgY2FjaGUgaGl0IGNoZWNrcyBpdHMgdGFncydcbiAqIG1hcmtlcnMsIGFuZCBldmVyeSBtYXJrZXIgb2YgYSBkZXBsb3ltZW50IHNoYXJlcyBvbmUgcGFydGl0aW9uIGtleSwgc29cbiAqIHJlYWRpbmcgdGhlbSBwZXIgcmVxdWVzdCBjYXBwZWQgYSByb3V0ZSdzIGNhY2hlIGhpdHMgYXQgdGhlIHBhcnRpdGlvbidzIHJlYWRcbiAqIHRocm91Z2hwdXQgKH4xLDkwMCByZXEvcyBvbiBOZXh0anNSZWdpb25hbEZ1bmN0aW9ucykuIE9uY2UgYSBzZWNvbmQsIGZyb20gdGhlXG4gKiByZXZhbGlkYXRpb24gbG9nLCB0aGUgcmVhZHMgc2NhbGUgd2l0aCBpbnN0YW5jZXMgaW5zdGVhZCBvZiByZXF1ZXN0cyBvciB0YWdzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyA9IDEwMDA7XG5cbi8qKlxuICogSG93IGZhciBwYXN0IGByZWZyZXNoSW50ZXJ2YWxNc2AgdGhlIGxhc3QgcmVmcmVzaCBtYXkgaGF2ZSBzZXR0bGVkIGJlZm9yZSBhXG4gKiBgJ3VzZSBjYWNoZSdgIHJlcXVlc3Qgd2FpdHMgZm9yIHRoZSBuZXh0IG9uZSAoc2VlXG4gKiB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnMuYmVoaW5kfSkuIEFuIGluc3RhbmNlIHNlcnZpbmcgc3RlYWR5IHRyYWZmaWMgc3RheXNcbiAqIGluc2lkZSBpdDsgb25lIHRoYXQgc2F0IGlkbGUsIG9yIGZyb3plbiBiZXR3ZWVuIExhbWJkYSBpbnZvY2F0aW9ucywgZG9lcyBub3QuXG4gKi9cbmV4cG9ydCBjb25zdCBUQUdfUkVGUkVTSF9HUkFDRV9NUyA9IDEwMDA7XG5cbi8qKiBEeW5hbW9EQidzIGxpbWl0IG9uIGEgc29ydCBrZXksIGluIFVURi04IGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TT1JUX0tFWV9CWVRFUyA9IDEwMjQ7XG5cbi8qKlxuICogYCM8c2hhMjU2KHRhZyk+YCwgc3RhbmRpbmcgaW4gZm9yIGEgdGFnIGluIGEgc29ydCBrZXkgaXQgd291bGQgcHVzaCBwYXN0XG4gKiB7QGxpbmsgTUFYX1NPUlRfS0VZX0JZVEVTfS4gTmV4dC5qcyBjYXBzIHRoZSB0YWdzIGFuIGFwcCBuYW1lcywgYnV0IG5vdCBhblxuICogaW1wbGljaXQgYF9OX1RfL+KApmAgdGFnLCB3aGljaCBpcyBhcyBsb25nIGFzIGl0cyBwYXRoLCBhbmQgYSByZWplY3RlZCB3cml0ZVxuICogbGVmdCBgcmV2YWxpZGF0ZVBhdGhgIG9uIGEgbG9uZyBwYXRoIHJlY29yZGVkIG5vd2hlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoZWRUYWcodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCMke3NoYTI1NkhleCh0YWcpfWA7XG59XG5cbi8qKlxuICogVGhlIGxvbmdlc3QgdGFnIGEgc29ydCBrZXkgc3BlbGxzIG91dDsgcGFzdCBpdCwge0BsaW5rIHNvcnRLZXlUYWd9IGhhc2hlc1xuICogaXQuIE9uZSBjYXAgZm9yIGV2ZXJ5IHJvdyB0aGUgdGFnIGlzIGluLCBzbyBhIHJvdydzIHdyaXRlciBhbmQgcmVhZGVyIGFncmVlXG4gKiB3aXRob3V0IGVhY2ggd29ya2luZyBvdXQgd2hhdCBlbHNlIHNoYXJlcyBpdHMga2V5LiBJdCBsZWF2ZXMgcm9vbSBmb3IgdGhlXG4gKiBtb3N0IGFueSByb3cgcHV0cyBiZXNpZGUgdGhlIHRhZzogYSBtYXBwaW5nIHJvdydzIGAjPGJ1aWxkSWQ+LyM8c2hhMjU2PmAsXG4gKiB3aXRoIHRoZSBidWlsZCBJRCBjYXBwZWQgYXQgYE1BWF9CVUlMRF9JRF9CWVRFU2AuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfVEFHX0JZVEVTID0gNzY4O1xuXG4vKiogYHRhZ2AgYXMgYSBzb3J0IGtleSBzcGVsbHMgaXQ6IGl0c2VsZiwgb3Ige0BsaW5rIGhhc2hlZFRhZ30gcGFzdCB7QGxpbmsgTUFYX1RBR19CWVRFU30uICovXG5leHBvcnQgZnVuY3Rpb24gc29ydEtleVRhZyh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aCh0YWcpIDw9IE1BWF9UQUdfQllURVMgPyB0YWcgOiBoYXNoZWRUYWcodGFnKTtcbn1cblxuLyoqXG4gKiBUaGUgYmFyZS10YWcgbWFya2VyIHJvd3Mgb2YgdGhlIHJldmFsaWRhdGlvbiB0YWJsZSAoYHBrID0gYnVpbGRJZGAsXG4gKiBgc2sgPSB0YWdgLCBvciB7QGxpbmsgaGFzaGVkVGFnfSBwYXN0IHtAbGluayBNQVhfVEFHX0JZVEVTfSksIHdoaWNoIHJlY29yZCB3aGVuIGEgdGFnXG4gKiB3YXMgbGFzdCByZXZhbGlkYXRlZCBhbmQgaG93LlxuICpcbiAqIFRoZSB0YWJsZSBhbHNvIGhvbGRzIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSdzIGB0YWcjczNLZXlgIG1hcHBpbmcgcm93cywgd2hpY2hcbiAqIGFyZSBpdHMgb3duIGJ1c2luZXNzIGFuZCBzdGF5IGluIGBTM0NhY2hlSGFuZGxlcmA6IG9ubHkgdGhlIG1hcmtlcnMgbWVhbiB0aGVcbiAqIHNhbWUgdGhpbmcgdG8gZXZlcnkgaGFuZGxlci4gV2hhdCBhbiBpbnN0YW5jZSBrZWVwcyBvZiB0aGVtIGJldHdlZW4gcmVhZHMgaXNcbiAqIHtAbGluayBUcmFja2VkVGFnTWFya2Vyc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWdNYXJrZXJUYWJsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBEeW5hbW9EQkNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBgdGFnYCdzIHJldmFsaWRhdGlvbiBhdCBgbm93YC4gU2VlIHtAbGluayBtYXJrZXJVcGRhdGV9LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSByb3cgYXMgdGhpcyB3cml0ZSBsZWZ0IGl0LCBzbyB0aGUgaW5zdGFuY2UgdGhhdCB3cm90ZSBpdCBjYW5cbiAgICogdHJhY2sgaXQgcmF0aGVyIHRoYW4gcmVhZCBpdCBiYWNrOiByZWFkcyBhcmUgZXZlbnR1YWxseSBjb25zaXN0ZW50LCBhbmQgYVxuICAgKiByZWFkLWJhY2sgcmFjaW5nIHJlcGxpY2F0aW9uIGNvdWxkIHJldHVybiB0aGUgbWFya2VyIGZyb20gYmVmb3JlIHRoZSB3cml0ZS5cbiAgICovXG4gIGFzeW5jIHdyaXRlKFxuICAgIHRhZzogc3RyaW5nLFxuICAgIG5vdzogbnVtYmVyLFxuICAgIGR1cmF0aW9uczogUmV2YWxpZGF0ZUR1cmF0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTxUYWdNYXJrZXIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LnNlbmQoXG4gICAgICBuZXcgVXBkYXRlSXRlbUNvbW1hbmQoe1xuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGVOYW1lLFxuICAgICAgICBLZXk6IHtcbiAgICAgICAgICBwazogeyBTOiB0aGlzLmJ1aWxkSWQgfSxcbiAgICAgICAgICBzazogeyBTOiBzb3J0S2V5VGFnKHRhZykgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4ubWFya2VyVXBkYXRlKG5vdywgZHVyYXRpb25zKSxcbiAgICAgICAgUmV0dXJuVmFsdWVzOiBcIkFMTF9ORVdcIixcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3BvbnNlPy5BdHRyaWJ1dGVzID8gbWFya2VyT2YocmVzcG9uc2UuQXR0cmlidXRlcykgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1hcmtlciByb3dzIGZvciBgdGFnc2AgdGhhdCBleGlzdCwgYnkgdGFnLCBpbiBvbmUgYEJhdGNoR2V0SXRlbWAgcGVyXG4gICAqIHtAbGluayBCQVRDSF9HRVRfTUFYX0tFWVN9IHRhZ3MgcmF0aGVyIHRoYW4gYSBgR2V0SXRlbWAgZWFjaDogYSBwYWdlXG4gICAqIGNhcnJpZXMgaXRzIHdob2xlIGltcGxpY2l0IGBfTl9UXy/igKZgIGNoYWluIHBsdXMgdGhlIGFwcCdzIG93biB0YWdzLCBhXG4gICAqIHBhZ2Ugd2l0aCBhIGZldyBmZXRjaGVzIGNoZWNrcyBlYWNoIG9mIHRoZW0gdG9vLCBhbmQgZXZlcnkgb25lIGlzIG9uIHRoZVxuICAgKiByZXF1ZXN0IHBhdGguIEEgdGFnIHdpdGggbm8gcm93IGlzIGFic2VudCBmcm9tIHRoZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyByZWFkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBUYWdNYXJrZXI+PiB7XG4gICAgY29uc3QgeyB0YWJsZU5hbWUsIGJ1aWxkSWQgfSA9IHRoaXM7XG4gICAgY29uc3QgdW5pcXVlID0gQXJyYXkuZnJvbShuZXcgU2V0KHRhZ3MpKTtcbiAgICBjb25zdCBtYXJrZXJzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5pcXVlLmxlbmd0aDsgaSArPSBCQVRDSF9HRVRfTUFYX0tFWVMpIHtcbiAgICAgIC8vIEEgaGFzaGVkIHNvcnQga2V5IG5hbWVzIG5vIHRhZywgc28gZWFjaCByb3cgaXMgbWF0Y2hlZCBiYWNrIGJ5IGtleS5cbiAgICAgIGNvbnN0IHRhZ0J5U2sgPSBuZXcgTWFwKFxuICAgICAgICB1bmlxdWVcbiAgICAgICAgICAuc2xpY2UoaSwgaSArIEJBVENIX0dFVF9NQVhfS0VZUylcbiAgICAgICAgICAubWFwKCh0YWcpID0+IFtzb3J0S2V5VGFnKHRhZyksIHRhZ10pLFxuICAgICAgKTtcbiAgICAgIGxldCBrZXlzOiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT5bXSB8IHVuZGVmaW5lZCA9IEFycmF5LmZyb20oXG4gICAgICAgIHRhZ0J5U2sua2V5cygpLFxuICAgICAgICAoc2spID0+ICh7IHBrOiB7IFM6IGJ1aWxkSWQgfSwgc2s6IHsgUzogc2sgfSB9KSxcbiAgICAgICk7XG4gICAgICAvLyBgVW5wcm9jZXNzZWRLZXlzYCBpcyBEeW5hbW9EQiBkZWNsaW5pbmcgcGFydCBvZiB0aGUgYmF0Y2ggdW5kZXIgbG9hZDtcbiAgICAgIC8vIGEgbWFya2VyIGxlZnQgdW5yZWFkIGlzIGEgcmV2YWxpZGF0aW9uIG1pc3NlZCwgc28gaXQgaXMgYXNrZWQgYWdhaW4uXG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsga2V5cz8ubGVuZ3RoICYmIGF0dGVtcHQgPCAzOyBhdHRlbXB0KyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IEJhdGNoR2V0SXRlbUNvbW1hbmRPdXRwdXQgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBCYXRjaEdldEl0ZW1Db21tYW5kKHtcbiAgICAgICAgICAgIFJlcXVlc3RJdGVtczoge1xuICAgICAgICAgICAgICBbdGFibGVOYW1lXToge1xuICAgICAgICAgICAgICAgIEtleXM6IGtleXMsXG4gICAgICAgICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246IFwic2ssIHJldmFsaWRhdGVkQXQsIHN0YWxlQXQsIGV4cGlyZWRBdFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJlc3BvbnNlLlJlc3BvbnNlcz8uW3RhYmxlTmFtZV0gPz8gW10pIHtcbiAgICAgICAgICBjb25zdCB0YWcgPSB0YWdCeVNrLmdldChpdGVtLnNrPy5TID8/IFwiXCIpO1xuICAgICAgICAgIGlmICh0YWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbWFya2Vycy5zZXQodGFnLCBtYXJrZXJPZihpdGVtKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGtleXMgPSByZXNwb25zZS5VbnByb2Nlc3NlZEtleXM/Llt0YWJsZU5hbWVdPy5LZXlzO1xuICAgICAgfVxuICAgICAgaWYgKGtleXM/Lmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYER5bmFtb0RCIGxlZnQgJHtrZXlzLmxlbmd0aH0gdGFnIG1hcmtlcnMgdW5yZWFkIGFmdGVyIHJldHJ5aW5nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hcmtlcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIHJldmFsaWRhdGlvbiBsb2cgcm93IGlzIGtlcHQgKGB0dGxgLCBlcG9jaCBzZWNvbmRzKS4gRHluYW1vREIgbmV2ZXJcbiAqIGRlbGV0ZXMgYW4gaXRlbSBiZWZvcmUgaXRzIFRUTCwgb25seSBzb21lIHRpbWUgYWZ0ZXIsIHNvIGEgcmVhZGVyIHRoYXQgbGFzdFxuICogcXVlcmllZCBsZXNzIHRoYW4gdGhpcyBsb25nIGFnbyAobGVzcyBhIG1hcmdpbiBmb3Igd3JpdGVycycgY2xvY2tzKSBpcyBzdXJlXG4gKiB0byBmaW5kIGV2ZXJ5IHJvdyBpdCBoYXMgbm90IHNlZW4geWV0LlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFUSU9OX0xPR19UVExfTVMgPSAxNSAqIDYwICogMTAwMDtcblxuLyoqIFRoZSBtb3N0IGBRdWVyeWAgcGFnZXMgb25lIHtAbGluayBSZXZhbGlkYXRpb25Mb2cucXVlcnl9IHJlYWRzLiAqL1xuZXhwb3J0IGNvbnN0IFJFVkFMSURBVElPTl9MT0dfTUFYX1BBR0VTID0gNTtcblxuLyoqIEhvdyBtYW55IHNvcnQga2V5cyB7QGxpbmsgUmV2YWxpZGF0aW9uTG9nLnB1dH0gdHJpZXMgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IExPR19QVVRfQVRURU1QVFMgPSA1O1xuXG4vKiogRGlnaXRzIGEgbG9nIHJvdydzIHRpbWVzdGFtcCBpcyB6ZXJvLXBhZGRlZCB0bywgc28gc29ydCBrZXlzIHNvcnQgYnkgdGltZS4gKi9cbmNvbnN0IExPR19TS19ESUdJVFMgPSAxNTtcblxuLyoqIEEgcmV2YWxpZGF0aW9uIHJlYWQgYmFjayBmcm9tIHRoZSBsb2cuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmFsaWRhdGlvbkxvZ1JvdyB7XG4gIC8qKiBUaGUgcm93J3Mgc29ydCBrZXk6IHVuaXF1ZSBwZXIgcmV2YWxpZGF0aW9uIG9mIGEgdGFnLiAqL1xuICBzazogc3RyaW5nO1xuICAvKiogV2hlbiBpdCB3YXMgd3JpdHRlbiwgb24gdGhlIHdyaXRlcidzIGBEYXRlLm5vdygpYC4gKi9cbiAgYXQ6IG51bWJlcjtcbiAgdGFnOiBzdHJpbmc7XG4gIC8qKiBUaGUgbWFya2VyIGZpZWxkcyB0aGUgcmV2YWxpZGF0aW9uIHNldCwgYXMge0BsaW5rIG1hcmtlckZvcn0gcmV0dXJucyB0aGVtLiAqL1xuICBtYXJrZXI6IFRhZ01hcmtlcjtcbn1cblxuLyoqXG4gKiBUaGUgcmV2YWxpZGF0aW9uIGxvZzogb25lIHJvdyBwZXIgdGFnIHJldmFsaWRhdGlvbiAoYHBrID0gPGJ1aWxkSWQ+I2xvZ2AsXG4gKiBgc2sgPSA8RGF0ZS5ub3coKSwgemVyby1wYWRkZWQ+Izx0YWc+YCksIHdoaWNoIGV4cGlyZXMgYWZ0ZXJcbiAqIHtAbGluayBSRVZBTElEQVRJT05fTE9HX1RUTF9NU30uIEEgdGFnIHBhc3Qge0BsaW5rIE1BWF9UQUdfQllURVN9IGlzXG4gKiB7QGxpbmsgaGFzaGVkVGFnfSB0aGVyZSwgYW5kIHNwZWxsZWQgb3V0IGluIHRoZSByb3cncyBgbG9uZ1RhZ2AgaW5zdGVhZC5cbiAqXG4gKiBUaGUgbWFya2VyIHJvd3Mgc3RheSB0aGUgc291cmNlIG9mIHRydXRoLiBUaGUgbG9nIGV4aXN0cyBzbyBhbiBpbnN0YW5jZVxuICogY2FuIGFzayBcIndoYXQgd2FzIHJldmFsaWRhdGVkIHNpbmNlIEkgbGFzdCBsb29rZWQ/XCIgaW4gb25lIGBRdWVyeWAsIGluc3RlYWRcbiAqIG9mIHJlLXJlYWRpbmcgZXZlcnkgdGFnIGl0IHRyYWNrcyB0byBmaW5kIG91dCB0aGF0IGFsbW9zdCBub25lIGNoYW5nZWQuIEV2ZXJ5XG4gKiBtYXJrZXIgcm93IG9mIGEgZGVwbG95bWVudCBzaGFyZXMgb25lIHBhcnRpdGlvbiwgYW5kIHRob3NlIHJlLXJlYWRzIGZyb20gYVxuICogaGFuZGZ1bCBvZiBidXN5IGluc3RhbmNlcyB3ZXJlIGVub3VnaCB0byB0aHJvdHRsZSBpdC5cbiAqXG4gKiBUaGUgc29ydCBrZXkncyB0aW1lc3RhbXAgaXMgdGhlIHdyaXRlcidzIHdhbGwgY2xvY2sgKGBEYXRlLm5vdygpYCksIG5vdCB0aGVcbiAqIHBlcmZvcm1hbmNlIGNsb2NrICh7QGxpbmsgbWFya2VyQ2xvY2t9KSB0aGUgbWFya2VyIHZhbHVlcyBhcmUgc3RhbXBlZCB3aXRoIGJ5IGJvdGhcbiAqIGhhbmRsZXJzOiBpdCBvbmx5IG9yZGVycyByb3dzIGZvciByZWFkZXJzJyBjdXJzb3JzLCB3aGljaCBhcmUgb24gdGhlaXIgb3duXG4gKiB3YWxsIGNsb2NrcywgYW5kIGlzIG5ldmVyIGNvbXBhcmVkIHdpdGggYW4gZW50cnkncyB0aW1lc3RhbXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXZhbGlkYXRpb25Mb2cge1xuICBwcml2YXRlIHJlYWRvbmx5IHBrOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IER5bmFtb0RCQ2xpZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgYnVpbGRJZDogc3RyaW5nLFxuICApIHtcbiAgICB0aGlzLnBrID0gYCR7YnVpbGRJZH0jbG9nYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgdGhhdCBgdGFnYCB3YXMgcmV2YWxpZGF0ZWQgYXQgYGF0YCAoYERhdGUubm93KClgKSwgc2V0dGluZyBgbWFya2VyYC5cbiAgICpcbiAgICogVHdvIHJldmFsaWRhdGlvbnMgb2YgYHRhZ2AgaW4gdGhlIHNhbWUgbWlsbGlzZWNvbmQgd291bGQgc2hhcmUgYSBzb3J0IGtleSxcbiAgICogYW5kIHRoZSBzZWNvbmQgd291bGQgb3ZlcndyaXRlIHRoZSBmaXJzdC4gU28gdGhlIHJvdyBpcyBvbmx5IHdyaXR0ZW4gd2hlcmVcbiAgICogaXRzIGtleSBpcyBmcmVlLCBhbmQgb24gYSBjb2xsaXNpb24gaXQgbW92ZXMgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQsIHVwXG4gICAqIHRvIHtAbGluayBMT0dfUFVUX0FUVEVNUFRTfSB0aW1lcy5cbiAgICovXG4gIGFzeW5jIHB1dCh0YWc6IHN0cmluZywgYXQ6IG51bWJlciwgbWFya2VyOiBUYWdNYXJrZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBza1RhZyA9IHNvcnRLZXlUYWcodGFnKTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGl0ZW06IFJlY29yZDxzdHJpbmcsIEF0dHJpYnV0ZVZhbHVlPiA9IHtcbiAgICAgICAgcGs6IHsgUzogdGhpcy5wayB9LFxuICAgICAgICBzazogeyBTOiBgJHtsb2dTa1ByZWZpeChhdCl9IyR7c2tUYWd9YCB9LFxuICAgICAgICB0dGw6IHsgTjogU3RyaW5nKE1hdGguY2VpbCgoYXQgKyBSRVZBTElEQVRJT05fTE9HX1RUTF9NUykgLyAxMDAwKSkgfSxcbiAgICAgICAgLi4uKHNrVGFnICE9PSB0YWcgJiYgeyBsb25nVGFnOiB7IFM6IHRhZyB9IH0pLFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgTUFSS0VSX0ZJRUxEUykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1hcmtlcltmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaXRlbVtmaWVsZF0gPSB7IE46IFN0cmluZyh2YWx1ZSkgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgUHV0SXRlbUNvbW1hbmQoe1xuICAgICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICAgIEl0ZW06IGl0ZW0sXG4gICAgICAgICAgICBDb25kaXRpb25FeHByZXNzaW9uOiBcImF0dHJpYnV0ZV9ub3RfZXhpc3RzKHNrKVwiLFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKGVycm9yIGFzIEVycm9yIHwgdW5kZWZpbmVkKT8ubmFtZSAhPT1cbiAgICAgICAgICAgIFwiQ29uZGl0aW9uYWxDaGVja0ZhaWxlZEV4Y2VwdGlvblwiIHx8XG4gICAgICAgICAgYXR0ZW1wdCA+PSBMT0dfUFVUX0FUVEVNUFRTXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGF0ID0gTWF0aC5mbG9vcihhdCkgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcm93cyB3cml0dGVuIGF0IG9yIGFmdGVyIGBzaW5jZWAgKGBEYXRlLm5vdygpYCksIG9sZGVzdCBmaXJzdC5cbiAgICogYHRydW5jYXRlZGAgd2hlbiB0aGVyZSB3ZXJlIG1vcmUgdGhhbiB7QGxpbmsgUkVWQUxJREFUSU9OX0xPR19NQVhfUEFHRVN9XG4gICAqIHBhZ2VzIG9mIHRoZW0sIGFuZCBgcm93c2AgaXMgb25seSB0aGUgc3RhcnQuXG4gICAqXG4gICAqIEV2ZW50dWFsbHkgY29uc2lzdGVudDogYSByb3cgd3JpdHRlbiBhIG1vbWVudCBhZ28gbWF5IG5vdCBzaG93IHlldCwgd2hpY2hcbiAgICogaXMgd2hhdCB0aGUgcmVhZGVyJ3MgbG9va2JhY2sgaXMgZm9yLlxuICAgKi9cbiAgYXN5bmMgcXVlcnkoXG4gICAgc2luY2U6IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdOyB0cnVuY2F0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHJvd3M6IFJldmFsaWRhdGlvbkxvZ1Jvd1tdID0gW107XG4gICAgbGV0IHN0YXJ0S2V5OiBSZWNvcmQ8c3RyaW5nLCBBdHRyaWJ1dGVWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcGFnZSA9IDA7IHBhZ2UgPCBSRVZBTElEQVRJT05fTE9HX01BWF9QQUdFUzsgcGFnZSsrKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogUXVlcnlDb21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5jbGllbnQuc2VuZChcbiAgICAgICAgbmV3IFF1ZXJ5Q29tbWFuZCh7XG4gICAgICAgICAgVGFibGVOYW1lOiB0aGlzLnRhYmxlTmFtZSxcbiAgICAgICAgICBLZXlDb25kaXRpb25FeHByZXNzaW9uOiBcInBrID0gOnBrIEFORCBzayA+PSA6c2luY2VcIixcbiAgICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgICBcIjpwa1wiOiB7IFM6IHRoaXMucGsgfSxcbiAgICAgICAgICAgIFwiOnNpbmNlXCI6IHsgUzogbG9nU2tQcmVmaXgoTWF0aC5tYXgoMCwgc2luY2UpKSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgUHJvamVjdGlvbkV4cHJlc3Npb246XG4gICAgICAgICAgICBcInNrLCBsb25nVGFnLCByZXZhbGlkYXRlZEF0LCBzdGFsZUF0LCBleHBpcmVkQXRcIixcbiAgICAgICAgICBFeGNsdXNpdmVTdGFydEtleTogc3RhcnRLZXksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS5JdGVtcyA/PyBbXSkge1xuICAgICAgICBjb25zdCBzayA9IGl0ZW0uc2s/LlM7XG4gICAgICAgIC8vIGA8ZGlnaXRzPiM8dGFnPmA6IHRoZSB0YWcgaXMgZXZlcnl0aGluZyBhZnRlciB0aGUgZml4ZWQtd2lkdGhcbiAgICAgICAgLy8gdGltZXN0YW1wLCBgI2BzIGluY2x1ZGVkLlxuICAgICAgICBpZiAoc2sgPT09IHVuZGVmaW5lZCB8fCBza1tMT0dfU0tfRElHSVRTXSAhPT0gXCIjXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByb3dzLnB1c2goe1xuICAgICAgICAgIHNrLFxuICAgICAgICAgIGF0OiBOdW1iZXIoc2suc2xpY2UoMCwgTE9HX1NLX0RJR0lUUykpLFxuICAgICAgICAgIHRhZzogaXRlbS5sb25nVGFnPy5TID8/IHNrLnNsaWNlKExPR19TS19ESUdJVFMgKyAxKSxcbiAgICAgICAgICBtYXJrZXI6IG1hcmtlck9mKGl0ZW0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0S2V5ID0gcmVzcG9uc2UuTGFzdEV2YWx1YXRlZEtleTtcbiAgICAgIGlmICghc3RhcnRLZXkpIHtcbiAgICAgICAgcmV0dXJuIHsgcm93cywgdHJ1bmNhdGVkOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyByb3dzLCB0cnVuY2F0ZWQ6IHRydWUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBsb2dTa1ByZWZpeChhdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZyhNYXRoLmZsb29yKGF0KSkucGFkU3RhcnQoTE9HX1NLX0RJR0lUUywgXCIwXCIpO1xufVxuXG4vKipcbiAqIEhvdyBmYXIgYmVoaW5kIHRoZSBsYXN0IHF1ZXJ5J3Mgc3RhcnQgdGhlIG5leHQgb25lIHN0YXJ0cyByZWFkaW5nIHRoZSBsb2c6XG4gKiB0aGUgcm9vbSBmb3IgdGhlIGBRdWVyeWAgYmVpbmcgZXZlbnR1YWxseSBjb25zaXN0ZW50IGFuZCBmb3Igd3JpdGVycycgY2xvY2tzXG4gKiBydW5uaW5nIGJlaGluZCB0aGUgcmVhZGVyJ3MuIFJvd3MgaW5zaWRlIGl0IGFyZSByZWFkIGFnYWluLCBhbmQgZHJvcHBlZCBhc1xuICogYWxyZWFkeSBhcHBsaWVkLlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUyA9IDUwMDA7XG5cbi8qKlxuICogVGhlIGxvbmdlc3Qge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSB0cnVzdHMgdGhlIGxvZyBhbG9uZSBmb3IgYSB0YWcgYmVmb3JlXG4gKiByZWFkaW5nIGl0cyBtYXJrZXIgcm93IGFnYWluLiBUaGUgbG9nIGlzIHRoZSBmYXN0IHBhdGgsIGJ1dCB0aGUgbWFya2VyIHJvd3NcbiAqIGFyZSB0aGUgc291cmNlIG9mIHRydXRoOiBhIGxvZyByb3cgd2hvc2Ugd3JpdGUgZmFpbGVkIHdvdWxkIG90aGVyd2lzZSBiZVxuICogbWlzc2VkIGZvciBhcyBsb25nIGFzIHRoZSB0YWcgc3RheXMgdHJhY2tlZC5cbiAqXG4gKiBSb2xsaW5nLCBub3QgYWxsIGF0IG9uY2U6IGVhY2ggcmVmcmVzaCByZS1yZWFkcyBhdCBtb3N0XG4gKiB7QGxpbmsgQkFUQ0hfR0VUX01BWF9LRVlTfSBvZiB0aGUgdGFncyBkdWUsIG9sZGVzdCBmaXJzdC4gUmUtcmVhZGluZyB0aGVtIGFsbFxuICogdG9nZXRoZXIgY29zdCB+NTAwIFJDVSBhdCAxMDAwIHRhZ3MgLSBhIGZsZWV0IHN0YXJ0ZWQgYnkgb25lIGxvYWQgdGVzdCBkaWQgaXRcbiAqIGluIHRoZSBzYW1lIG1pbnV0ZSwgMTIsODAwIFJDVSwgYW5kIHRocm90dGxlZCAtIGFuZCB3b3VsZCBiZSB+NSwwMDAgUkNVIGF0XG4gKiB7QGxpbmsgREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTfSwgcGFzdCB3aGF0IHRoZSBvbmUgcGFydGl0aW9uIHNlcnZlcyBpbiBhXG4gKiBzZWNvbmQuIFNwcmVhZCBvdXQsIDEwLDAwMCB0cmFja2VkIHRhZ3MgY29zdCB+OCBSQ1UgYSBzZWNvbmQgcGVyIGluc3RhbmNlLlxuICpcbiAqIEVhY2ggdGFnIGlzIGR1ZSBhdCBhIHJhbmRvbSA3NS0xMDAlIG9mIHRoaXMgYWZ0ZXIgaXQgd2FzIGxhc3QgcmVhZCwgc28gdGFnc1xuICogZmlyc3QgcmVhZCB0b2dldGhlciAtIGFuIGluc3RhbmNlIHdhcm1pbmcgdXAgLSBkbyBub3QgYWxsIGNvbWUgZHVlIHRvZ2V0aGVyXG4gKiBhZ2FpbiBldmVyeSBpbnRlcnZhbDogdGhlIGxvYWQgdGVzdCB0aGF0IG1lYXN1cmVkIHRoZSByb2xsaW5nIHJlLXJlYWQgc2F3XG4gKiBpdHMgd2FybS11cCdzIHJlYWRzIHJldHVybiBhcyBhIDMwLTM2IFJDVS9zIGJ1bXAgdGVuIG1pbnV0ZXMgbGF0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RBR19SRVNZTkNfTVMgPSAxMCAqIDYwICogMTAwMDtcblxuLyoqIFRoZSBmcmFjdGlvbiBvZiB7QGxpbmsgREVGQVVMVF9UQUdfUkVTWU5DX01TfSBhIHRhZyBtYXkgY29tZSBkdWUgZWFybHkgYnkuICovXG5jb25zdCBUQUdfUkVTWU5DX0pJVFRFUiA9IDAuMjU7XG5cbi8qKlxuICogSG93IGxvbmcgc2luY2UgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBsb2cgcXVlcnkgdGhlIGxvZyBjYW4gc3RpbGwgYmUgdHJ1c3RlZCB0b1xuICogaG9sZCBldmVyeSByb3cgbm90IHJlYWQgeWV0OiBpdHMgVFRMIGxlc3MgYSBtYXJnaW4gZm9yIHdyaXRlcnMnIGNsb2Nrcy4gUGFzdFxuICogaXQgLSBhIExhbWJkYSBmcm96ZW4gYmV0d2VlbiBpbnZvY2F0aW9ucywgYSBydW4gb2YgZmFpbGVkIHF1ZXJpZXMgLSB0aGVcbiAqIHRyYWNrZWQgbWFya2VycyBhcmUgZm9yZ290dGVuLCB0byBiZSByZWFkIGFnYWluIGFzIHRoZXkgYXJlIG5lZWRlZCwgYW5kIHRoZVxuICogbG9nIGlzIGZvbGxvd2VkIGZyb20gdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfUkVWQUxJREFUSU9OX0xPR19HQVBfTVMgPVxuICBSRVZBTElEQVRJT05fTE9HX1RUTF9NUyAtIDUgKiA2MCAqIDEwMDA7XG5cbi8qKlxuICogVGhlIG1vc3QgdGFncyBvbmUgaW5zdGFuY2UgdHJhY2tzLiBQYXN0IGl0IHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGlzXG4gKiBmb3Jnb3R0ZW4sIHdoaWNoIGNvc3RzIGEgcmVhZCB0aGUgbmV4dCB0aW1lIGl0IGlzIG5lZWRlZDogYW4gdW50cmFja2VkIHRhZ1xuICogaXMgcmVhZCBiZWZvcmUgaXQgaXMgdHJ1c3RlZC5cbiAqXG4gKiBBIHRyYWNrZWQgdGFnIGNvc3RzIG1lbW9yeSAofjIgTUIgYXQgdGhpcyBib3VuZCkgYW5kIGl0cyBzaGFyZSBvZiB0aGUgcm9sbGluZ1xuICogcmUtcmVhZCwgbm90IGEgcmVhZCBldmVyeSByZWZyZXNoLCBzbyB0aGUgYm91bmQgaXMgc2V0IGJ5IGhvdyBtYW55IHRhZ3MgYW5cbiAqIGluc3RhbmNlIHJlYWxseSB1c2VzLiBFdmVyeSBwYXRoIGlzIGEgdGFnIG9mIGl0cyBvd24gKGBfTl9UXy88cGF0aD5gKSwgYW5kIGF0XG4gKiAxMDAwIGFuIGFwcCBvZiAxMDAwIHRhZ2dlZCBwYWdlcyBrZXB0IGV2aWN0aW5nIHdoYXQgaXQgd2FzIGFib3V0IHRvIG5lZWQ6XG4gKiBoYWxmIGl0cyByZXF1ZXN0cyByZS1yZWFkIGEgbWFya2VyLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfVFJBQ0tFRF9UQUdTID0gMTBfMDAwO1xuXG4vKipcbiAqIFRoZSByZXZhbGlkYXRpb24gdGFibGUncyBtYXJrZXIgcm93cyBhbmQgaXRzIGxvZywgd2hpY2ggYXJlIG9ubHkgZXZlciB1c2VkXG4gKiB0b2dldGhlciwgb3IgbmVpdGhlciBmb3IgdGFncyBsb2NhbCB0byB0aGlzIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCB0eXBlIFRhZ1RhYmxlID1cbiAgfCB7IG1hcmtlcnM6IFRhZ01hcmtlclRhYmxlOyBsb2c6IFJldmFsaWRhdGlvbkxvZyB9XG4gIHwgeyBtYXJrZXJzPzogdW5kZWZpbmVkOyBsb2c/OiB1bmRlZmluZWQgfTtcblxuLyoqIEhvdyB7QGxpbmsgVHJhY2tlZFRhZ01hcmtlcnN9IGlzIGJ1aWx0LiAqL1xuZXhwb3J0IHR5cGUgVHJhY2tlZFRhZ01hcmtlcnNPcHRpb25zID0gVGFnVGFibGUgJiB7XG4gIC8qKlxuICAgKiBIb3cgb2Z0ZW4sIGF0IG1vc3QsIHtAbGluayBUcmFja2VkVGFnTWFya2Vycy5yZWZyZXNofSByZWFkcyBhbnl0aGluZy5cbiAgICogQGRlZmF1bHQgREVGQVVMVF9UQUdfUkVGUkVTSF9NU1xuICAgKi9cbiAgcmVmcmVzaEludGVydmFsTXM/OiBudW1iZXI7XG4gIG1heFRyYWNrZWRUYWdzPzogbnVtYmVyO1xuICAvKiogQHNlZSBERUZBVUxUX1RBR19SRVNZTkNfTVMgKi9cbiAgcmVzeW5jSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIFRoZSB3YWxsIGNsb2NrIHRoZSBsb2cncyBjdXJzb3IgYW5kIHRoZSBpbnRlcnZhbHMgYXJlIGtlcHQgb24uICovXG4gIGNsb2NrPzogKCkgPT4gbnVtYmVyO1xuICAvKiogYE1hdGgucmFuZG9tYCwgZm9yIHdoZW4gZWFjaCB0YWcncyByZS1yZWFkIGNvbWVzIGR1ZS4gKi9cbiAgcmFuZG9tPzogKCkgPT4gbnVtYmVyO1xuICBkZWJ1Zz86IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcm9jZXNzIGNhbiBiZSBmcm96ZW4gd2l0aCBhIHJlZnJlc2ggaW4gZmxpZ2h0LCBhcyBhIExhbWJkYVxuICAgKiBzYW5kYm94IGlzIGJldHdlZW4gaW52b2NhdGlvbnM6IHRoZW4gYSB0aW1lciBjaGVja3MgaXQga2VwdCBydW5uaW5nLCBhbmRcbiAgICogb25lIHRoYXQgc3Bhbm5lZCBhIGZyZWV6ZSBkb2VzIG5vdCBjb3VudC4gQSBjb250YWluZXIgaXMgbmV2ZXIgZnJvemVuLFxuICAgKiBzbyBpdCBza2lwcyB0aGUgdGltZXIgYW5kIHdhaXRzIGZvciB0aGUgcmVmcmVzaCBpbiBmbGlnaHQsIGhvd2V2ZXIgc2xvdy5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGNhbkZyZWV6ZT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIE9uZSBpbnN0YW5jZSdzIGNvcHkgb2YgdGhlIG1hcmtlciByb3dzIG9mIHRoZSB0YWdzIGl0IGhhcyBuZWVkZWQsIGtlcHRcbiAqIGN1cnJlbnQgdGhyb3VnaCB0aGUge0BsaW5rIFJldmFsaWRhdGlvbkxvZ306IHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdFxuICogKGBzaGFyZWRUYWdNYW5pZmVzdGApLCBmb3IgdGhlIGAndXNlIGNhY2hlJ2AgaGFuZGxlcnMgYW5kIHRoZSBpbmNyZW1lbnRhbFxuICogY2FjaGUgYWxpa2UuXG4gKlxuICogTmV4dC5qcydzIGJ1aWx0LWluIGAndXNlIGNhY2hlJ2AgaGFuZGxlciBrZWVwcyB0YWdzIGluIGEgbW9kdWxlLWxldmVsIG1hcFxuICogKGB0YWdzLW1hbmlmZXN0LmV4dGVybmFsLmpzYCkgdGhhdCBvbmx5IGl0cyBvd24gYHVwZGF0ZVRhZ3NgIHdyaXRlcywgYW5kIGl0c1xuICogYHJlZnJlc2hUYWdzYCBpcyBhIG5vLW9wLCBzbyBhIGByZXZhbGlkYXRlVGFnYCBvbiBvbmUgaW5zdGFuY2UgbmV2ZXIgcmVhY2hlc1xuICogdGhlIG90aGVyczogdGhleSBrZWVwIHNlcnZpbmcgdGhlIHJldmFsaWRhdGVkIGVudHJ5LCBpbmNsdWRpbmcgaW5zaWRlIHBhZ2VzXG4gKiB0aGF0IGFyZSBiZWluZyByZS1yZW5kZXJlZCAqYmVjYXVzZSogb2YgdGhhdCByZXZhbGlkYXRpb24uIFRoZVxuICogYGNhY2hlSGFuZGxlcnNgIGludGVyZmFjZSdzIGFuc3dlciBpcyBgcmVmcmVzaFRhZ3NgLCBcImNhbGxlZCBiZWZvcmUgc3RhcnRpbmdcbiAqIGEgbmV3IHJlcXVlc3Qg4oCmIHRvIHJlZnJlc2ggdGhlIGxvY2FsIHRhZ3MgbWFuaWZlc3RcIiwgYW5kIHRoaXMgaXMgdGhhdFxuICogbWFuaWZlc3QsIGJhY2tlZCBieSB0aGUgc2FtZSBtYXJrZXIgcm93cyB0aGUgaW5jcmVtZW50YWwgY2FjaGUnc1xuICogYHJldmFsaWRhdGVUYWdgIHdyaXRlcyAoYHBrID0gYnVpbGRJZGAsIGBzayA9IHRhZ2ApLlxuICpcbiAqIFRoZSBjb3N0IGlzIGJvdW5kZWQgcGVyIGluc3RhbmNlLCBub3QgcGVyIHJlcXVlc3Q6XG4gKiAtIHtAbGluayBlbnN1cmV9IHJlYWRzIGEgdGFnJ3MgbWFya2VyIHRoZSBmaXJzdCB0aW1lIGl0IGlzIG5lZWRlZCBhbmQgbm90XG4gKiAgIGFnYWluIHVudGlsIGl0IGlzIGV2aWN0ZWQsIHNvIGEgdGFnIGNvc3RzIG9uZSByZWFkIHBlciBpbnN0YW5jZSwgbm90IG9uZVxuICogICBwZXIgcmVxdWVzdC4gQW4gZW50cnkgY3JlYXRlZCBzaW5jZSB7QGxpbmsgY29tcGxldGVTaW5jZX0gbmVlZHMgbm8gcmVhZFxuICogICBhdCBhbGwuXG4gKiAtIHtAbGluayByZWZyZXNofSwgYXQgbW9zdCBvbmNlIHBlciBgcmVmcmVzaEludGVydmFsTXNgLCBzZW5kcyBvbmUgYFF1ZXJ5YFxuICogICBmb3IgdGhlIGxvZyByb3dzIHdyaXR0ZW4gc2luY2UgdGhlIGxhc3Qgb25lLCBhbmQgYXBwbGllcyB0aG9zZSBvZiB0YWdzXG4gKiAgIHRoaXMgaW5zdGFuY2UgdHJhY2tzLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgaXQuIEFsb25nc2lkZSwgaXQgcmUtcmVhZHNcbiAqICAgdGhlIG1hcmtlcnMgb2YgdXAgdG8ge0BsaW5rIEJBVENIX0dFVF9NQVhfS0VZU30gdGFncyBub3QgcmVhZCBmb3JcbiAqICAge0BsaW5rIERFRkFVTFRfVEFHX1JFU1lOQ19NU30sIGluIG9uZSBgQmF0Y2hHZXRJdGVtYC5cbiAqIEEgcmV2YWxpZGF0aW9uIG9uIGFub3RoZXIgaW5zdGFuY2UgaXMgdGhlcmVmb3JlIHNlZW4gd2l0aGluXG4gKiBgcmVmcmVzaEludGVydmFsTXNgIChwbHVzIHRoZSBxdWVyeSBpdHNlbGYpIC0gYnkgYCd1c2UgY2FjaGUnYCwgZnJvbSB0aGVcbiAqIGZpcnN0IHJlcXVlc3QgYWZ0ZXIgdGhlIHF1ZXJ5IHJldHVybnMsIHNpbmNlIGl0cyBgcmVmcmVzaFRhZ3NgIGRvZXMgbm90IHdhaXRcbiAqIGZvciBpdCAoc2VlIGB0YWdNZXRob2RzYCkgdW5sZXNzIHRoZSBpbnN0YW5jZSBpcyB7QGxpbmsgYmVoaW5kfSwgd2hpY2ggdGhlXG4gKiBydW50aW1lIHNldHRsZXMgYmVmb3JlIGEgcGFnZSByZW5kZXIgc3RhcnRzICh7QGxpbmsgY2F0Y2hVcH0pLiBUaGUgaW5zdGFuY2VcbiAqIHRoYXQgcmFuIGl0IGFwcGxpZXMgaXQgaXRzZWxmLCBhdCBvbmNlLCB3aXRoIHtAbGluayBzZXR9LlxuICovXG5leHBvcnQgY2xhc3MgVHJhY2tlZFRhZ01hcmtlcnMge1xuICBwcml2YXRlIHJlYWRvbmx5IG1hcmtlcnM6IFRhZ01hcmtlclRhYmxlIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogUmV2YWxpZGF0aW9uTG9nIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZnJlc2hJbnRlcnZhbE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4VHJhY2tlZFRhZ3M6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXN5bmNJbnRlcnZhbE1zOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvY2s6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByYW5kb206ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWJ1ZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcbiAgLyoqIEJ5IHRhZywgbGVhc3QgcmVjZW50bHkgdXNlZCBmaXJzdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcbiAgLyoqXG4gICAqIFdoZW4gZWFjaCB0cmFja2VkIHRhZydzIG1hcmtlciBpcyBkdWUgdG8gYmUgcmVhZCBhZ2FpbjogYSByYW5kb20gNzUtMTAwJVxuICAgKiBvZiBgcmVzeW5jSW50ZXJ2YWxNc2AgYWZ0ZXIgaXQgd2FzIGxhc3Qga25vd24gZnJvbSB0aGUgdGFibGUgLSByZWFkLFxuICAgKiB3cml0dGVuIGhlcmUsIG9yIG5ldy4gSW4gdGhlIG9yZGVyIHRoZXkgYmVjYW1lIGtub3duLCBsZWFzdCByZWNlbnQgZmlyc3QuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGR1ZUF0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWFkaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG4gIC8qKlxuICAgKiBMb2cgcm93cyBmb3IgdGFncyB3aG9zZSBmaXJzdCByZWFkIGlzIGluIGZsaWdodCwgbWVyZ2VkIGJ5IHRhZzogdGhlIHJlYWRcbiAgICogbWF5IGhhdmUgYmVlbiBhbnN3ZXJlZCBiZWZvcmUgdGhlIHJldmFsaWRhdGlvbiwgc28gdGhleSBhcmUgYXBwbGllZCB0byBpdHNcbiAgICogcmVzdWx0IHJhdGhlciB0aGFuIGRyb3BwZWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdSb3dzID0gbmV3IE1hcDxzdHJpbmcsIFRhZ01hcmtlcj4oKTtcbiAgLyoqXG4gICAqIExvZyByb3dzIGZvciB0YWdzIG5vdCB0cmFja2VkIGFuZCBub3QgYmVpbmcgcmVhZCwgbWVyZ2VkIGJ5IHRhZywgb2xkZXN0XG4gICAqIGZpcnN0OiB3aGF0IHRoZSBsb2cgaGFzIHNhaWQgYWJvdXQgdGhlbSBzaW5jZSB7QGxpbmsgY29tcGxldGVTaW5jZX0uIFRha2VuXG4gICAqIGludG8gYSB0YWcncyBtYXJrZXIgd2hlbiBpdCBpcyByZWFkIG9yIHdyaXR0ZW4uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZ09ubHkgPSBuZXcgTWFwPHN0cmluZywgVGFnTWFya2VyPigpO1xuICAvKiogU2VlIHtAbGluayBjb21wbGV0ZVNpbmNlfS4gKi9cbiAgcHJpdmF0ZSBmbG9vcjogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGZ1dHVyZSBgZXhwaXJlZEF0YHMgb2YgbWFya2VycyBkcm9wcGVkIHNpbmNlLCBhcyBgW2Zyb20sIHRvXWAsIGluXG4gICAqIG9yZGVyOiBvbmNlIGBmcm9tYCBpcyBwYXN0LCB7QGxpbmsgY29tcGxldGVTaW5jZX0gbW92ZXMgdG8gYHRvYCwgYW5kIG5vdFxuICAgKiBiZWZvcmUsIHNpbmNlIG9ubHkgdGhlbiBkb2VzIGl0IGV4cGlyZSBhbnl0aGluZy4gYGZyb21gIGFuZCBgdG9gIGFyZSB0aGVcbiAgICogc2FtZSB1bnRpbCBzcGFucyBhcmUgbWVyZ2VkIGZvciBzcGFjZSAoe0BsaW5rIGxhdGVyRmxvb3J9KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGF0ZXJGbG9vcnM6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAvKiogVGhlIGluLW1lbW9yeSBlbnRyeSBzdG9yZXMganVkZ2VkIGJ5IHtAbGluayBjb21wbGV0ZVNpbmNlfS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBlbnRyeVN0b3Jlczoge1xuICAgIG9sZGVzdFRpbWVzdGFtcDogKHNjYW46IGJvb2xlYW4pID0+IG51bWJlcjtcbiAgICBob2xkc0FueTogKCkgPT4gYm9vbGVhbjtcbiAgfVtdID0gW107XG4gIC8qKiBIb3cgbWFueSB0aW1lcyB7QGxpbmsgZm9yZ2V0fSByYW46IGEgcmVhZCBzdGFydGVkIGJlZm9yZSBvbmUgaXMgbWFkZSBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSBmb3Jnb3R0ZW4gPSAwO1xuICAvKiogVHJhY2tlZCB0YWdzIHdob3NlIHJlYWQgZmFpbGVkLCBmb3IgdGhlIG5leHQgcmVmcmVzaCB0byByZWFkIGFnYWluLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVucmVhZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAvKipcbiAgICogU2V0IGluc2lkZSBhIHBhZ2UgcmVuZGVyIHtAbGluayBjYXRjaFVwfSBsZXQgZ28sIGZvciB0aGF0IHJlbmRlciBhbG9uZS5cbiAgICogU2VlIHtAbGluayBiZWhpbmRJblJlbmRlcn0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNhdWdodFVwUmVuZGVyID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPHRydWU+KCk7XG4gIC8qKiBXaGVuIGBzeW5jYCBsYXN0IHNjYW5uZWQgdGhlIGVudHJ5IHN0b3JlcyAoe0BsaW5rIG9sZGVzdEVudHJ5fSkuICovXG4gIHByaXZhdGUgbGFzdEVudHJ5U2NhbiA9IC1JbmZpbml0eTtcbiAgLyoqXG4gICAqIE5vIGBsb2dPbmx5YCByb3cgaXMga25vd24gYnkgaXQgb3IgZWFybGllciwgc28gYSB7QGxpbmsgcHJ1bmVMb2dnZWR9XG4gICAqIGFnYWluc3QgaXQgb3IgZWFybGllciBkcm9wcyBub3RoaW5nOiBhIG1hcmtlciBpcyBvbmx5IGV2ZXIga25vd24gYnkgbGF0ZXIsXG4gICAqIGFzIGl0cyBgZXhwaXJlZEF0YCBwYXNzZXMuXG4gICAqL1xuICBwcml2YXRlIHBydW5lZEFnYWluc3QgPSAtSW5maW5pdHk7XG4gIC8qKiBXaGVuIHRoZSBsYXN0IHJlZnJlc2ggc3RhcnRlZCwgb3Igd2FzIHNraXBwZWQuICovXG4gIHByaXZhdGUgbGFzdFJlZnJlc2ggPSAtSW5maW5pdHk7XG4gIC8qKlxuICAgKiBUaGUgcmVmcmVzaCBpbiBmbGlnaHQuIE9uZSBsZWZ0IG9wZW4gYWNyb3NzIGEgZnJlZXplIGNvbWVzIGJhY2sgYWZ0ZXIgdGhlXG4gICAqIHRoYXcgd2l0aCB3aGF0IGl0IHJlYWQgYmVmb3JlLCBzbyB7QGxpbmsgcmVmcmVzaH0gd2FpdHMgZm9yIGl0IGFuZCB0aGVuXG4gICAqIGZvciBhIGZyZXNoIG9uZSwgcmF0aGVyIHRoYW4gdGhlIHJ1bnRpbWUgd2FpdGluZyBmb3IgaXQgYmVmb3JlIHRoZSBmcmVlemU6XG4gICAqIHRoYXQgd291bGQgYmlsbCBldmVyeSBMYW1iZGEgaW52b2NhdGlvbiBmb3IgdGhlIHF1ZXJ5J3MgdGFpbC5cbiAgICovXG4gIHByaXZhdGUgcmVmcmVzaGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFdoZW4ge0BsaW5rIHJlZnJlc2hpbmd9IGxhc3Qgc2hvd2VkIHRoZSBwcm9jZXNzIHJ1bm5pbmc6IGEgdGltZXIgdGlja3NcbiAgICogd2hpbGUgaXQgaXMgaW4gZmxpZ2h0LCBhbmQgYSB0aWNrIHRoYXQgY29tZXMgbGF0ZSwgb3Igbm9uZSBhdCBhbGwsIG1lYW5zXG4gICAqIHRoZSBwcm9jZXNzIHdhcyBwYXVzZWQgLSBmcm96ZW4gLSBzaW5jZSBpdCBzdGFydGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBsYXN0VGljayA9IC1JbmZpbml0eTtcbiAgLyoqIFdoZXRoZXIgYSB0aWNrIGNhbWUgbGF0ZSBzaW5jZSB7QGxpbmsgcmVmcmVzaGluZ30gc3RhcnRlZC4gKi9cbiAgcHJpdmF0ZSBwYXVzZWRXaGlsZVJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSB0aWNrZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYW5GcmVlemU6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBsYXN0IHJlZnJlc2ggc2V0dGxlZCwgZWl0aGVyIHdheSwgdW5sZXNzIGl0IHNwYW5uZWQgYSBwYXVzZTogd2hhdFxuICAgKiBpdCBrbm93cyBpcyBmcm9tIHRoZW4uIFNlZSB7QGxpbmsgYmVoaW5kfS5cbiAgICovXG4gIHByaXZhdGUgc2V0dGxlZEF0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgbmV4dCBsb2cgcXVlcnkgc3RhcnRzIChgY2xvY2soKWApOiB0aGUgbGFzdCBzdWNjZXNzZnVsIG9uZSdzXG4gICAqIHN0YXJ0LCBsZXNzIHtAbGluayBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TfS5cbiAgICovXG4gIHByaXZhdGUgY3Vyc29yOiBudW1iZXI7XG4gIC8qKiBXaGVuIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgbG9nIHF1ZXJ5IHN0YXJ0ZWQsIG9yIHRoZSBsb2cgd2FzIGZpcnN0IHJlYWQuICovXG4gIHByaXZhdGUgbGFzdExvZ1JlYWQ6IG51bWJlcjtcbiAgLyoqIExvZyByb3dzIGF0IG9yIGFmdGVyIHRoZSBjdXJzb3IgYWxyZWFkeSBhcHBsaWVkLCBieSBzb3J0IGtleS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhcHBsaWVkID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgLyoqIHtAbGluayB1cGRhdGV9cyBvZiB0aGUgY3VycmVudCB0dXJuLCBieSB0aGVpciBhcmd1bWVudHMuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRpbmcgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxib29sZWFuPj4oKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBUcmFja2VkVGFnTWFya2Vyc09wdGlvbnMpIHtcbiAgICB0aGlzLm1hcmtlcnMgPSBvcHRpb25zLm1hcmtlcnM7XG4gICAgdGhpcy5sb2cgPSBvcHRpb25zLmxvZztcbiAgICB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zID1cbiAgICAgIG9wdGlvbnMucmVmcmVzaEludGVydmFsTXMgPz8gREVGQVVMVF9UQUdfUkVGUkVTSF9NUztcbiAgICB0aGlzLm1heFRyYWNrZWRUYWdzID0gb3B0aW9ucy5tYXhUcmFja2VkVGFncyA/PyBERUZBVUxUX01BWF9UUkFDS0VEX1RBR1M7XG4gICAgdGhpcy5yZXN5bmNJbnRlcnZhbE1zID0gb3B0aW9ucy5yZXN5bmNJbnRlcnZhbE1zID8/IERFRkFVTFRfVEFHX1JFU1lOQ19NUztcbiAgICAvLyBMb29rZWQgdXAgb24gZWFjaCBjYWxsIHJhdGhlciB0aGFuIGJvdW5kIGhlcmUsIHNvIGEgdGVzdCdzIGBEYXRlLm5vd2BcbiAgICAvLyBzcHkgYXBwbGllcy5cbiAgICB0aGlzLmNsb2NrID0gb3B0aW9ucy5jbG9jayA/PyAoKCkgPT4gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5yYW5kb20gPSBvcHRpb25zLnJhbmRvbSA/PyBNYXRoLnJhbmRvbTtcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1ZyA/PyAoKCkgPT4ge30pO1xuICAgIHRoaXMuY2FuRnJlZXplID0gb3B0aW9ucy5jYW5GcmVlemUgPz8gZmFsc2U7XG4gICAgLy8gTm90aGluZyBpcyB0cmFja2VkIHlldCwgc28gbm90aGluZyBiZWZvcmUgdGhpcyBjYW4gYmUgbWlzc2VkOiBldmVyeSB0YWdcbiAgICAvLyBpcyByZWFkIGZyb20gaXRzIG1hcmtlciB0aGUgZmlyc3QgdGltZSBpdCBpcyBuZWVkZWQuXG4gICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgdGhpcy5jdXJzb3IgPSBhdCAtIFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVM7XG4gICAgdGhpcy5sYXN0TG9nUmVhZCA9IGF0O1xuICAgIHRoaXMuc2V0dGxlZEF0ID0gYXQ7XG4gICAgdGhpcy5mbG9vciA9IG1hcmtlckNsb2NrKCk7XG4gIH1cblxuICAvKiogYHRhZ2AncyBtYXJrZXIgYXMgdGhpcyBpbnN0YW5jZSBrbm93cyBpdCwgaWYgaXQgdHJhY2tzIGB0YWdgLiAqL1xuICBnZXQodGFnOiBzdHJpbmcpOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gIH1cblxuICAvKipcbiAgICogU2luY2Ugd2hlbiAoYG1hcmtlckNsb2NrKClgKSB0aGlzIGluc3RhbmNlIGtub3dzIG9mIGV2ZXJ5IHJldmFsaWRhdGlvbiBvZlxuICAgKiBldmVyeSB0YWcsIHRyYWNrZWQgb3Igbm90OiB0cmFja2VkIG9uZXMgZnJvbSB0aGVpciBtYXJrZXJzIGFuZCB0aGUgbG9nLFxuICAgKiB0aGUgb3RoZXJzIGZyb20gdGhlIGxvZyBhbG9uZSAoYGxvZ09ubHlgKS4gU28gYW4gZW50cnkgY3JlYXRlZCBhdCBvciBhZnRlclxuICAgKiBpdCBjYW4gYmUganVkZ2VkIGJ5IHtAbGluayBzdGF0ZX0gYW5kIHtAbGluayBleHBpcmF0aW9ufSB3aXRob3V0XG4gICAqIHtAbGluayBlbnN1cmV9IHJlYWRpbmcgYW55dGhpbmcgLSB3aGljaCBtYXR0ZXJzIGluc2lkZSBhIGAndXNlIGNhY2hlJ2BcbiAgICogbG9va3VwLCB3aGVyZSBOZXh0LmpzIHdhaXRzIGZvciB0aGUgYW5zd2VyIGFuZCBhIHJlYWQgcHVzaGVzIHRoZSBlbnRyeSBvdXRcbiAgICogb2YgdGhlIHN0YXRpYyBzdGFnZSBvZiBhIHN0YWdlZCByZW5kZXIuXG4gICAqXG4gICAqIFN0YXJ0cyBhdCBjb25zdHJ1Y3Rpb246IHRoZSBsb2cgaXMgZm9sbG93ZWQgZnJvbSBiZWZvcmUgaXQuIE1vdmVzIHRvIG5vd1xuICAgKiB3aGVuIHRoZSB0cmFja2VkIG1hcmtlcnMgYXJlIGZvcmdvdHRlbiwgYW5kIHBhc3QgdGhlIHJldmFsaWRhdGlvbnMgb2ZcbiAgICogd2hhdGV2ZXIgZWxzZSBpdCBsZXRzIGdvIG9mIC0gYSBtYXJrZXIgZXZpY3RlZCBmb3Igc3BhY2UsIGEgbG9nIHJvd1xuICAgKiBwcnVuZWQgLSB3aGljaCBhcmUgbm8gbG9uZ2VyIGtub3duOiB0byBpdHMgYGV4cGlyZWRBdGAgb25seSBvbmNlIHRoYXQgaXNcbiAgICogcGFzdCwgc2luY2UgYSBwcm9maWxlJ3MgYGV4cGlyZWAgY2FuIGJlIGEgeWVhciBvdXQsIGFuZCBtb3ZpbmcgdGhlcmUgYXRcbiAgICogb25jZSB3b3VsZCB0dXJuIHRoZSByZWFkLWZyZWUgcGF0aCBvZmYgZm9yIHRoZSBpbnN0YW5jZSdzIGxpZmUuXG4gICAqXG4gICAqIEEgcm93IGlzIHBydW5lZCBvbmx5IG9uY2UgaXQgaXMgbm8gbGF0ZXIgdGhhbiBldmVyeSBlbnRyeSBoZWxkLCBzbyB0aGF0XG4gICAqIGNvc3RzIHRob3NlIGVudHJpZXMgbm90aGluZy4gQW4gZW50cnkgc3RvcmVkIGFmdGVyd2FyZHMgd2l0aCBhbiBvbGRlclxuICAgKiBgdGltZXN0YW1wYCAtIE5leHQuanMgc3RhbXBzIHRoZSBzdGFydCBvZiBpdHMgZ2VuZXJhdGlvbiwgd2hpY2ggY2FuXG4gICAqIG91dGxhc3QgYSBsb29rYmFjayAtIGlzIG9sZGVyIHRoYW4gdGhpcyB0b28sIGFuZCBpcyByZWFkIGZpcnN0LlxuICAgKlxuICAgKiBJdCBkb2VzIG5vdCBjb3ZlciBhIHJldmFsaWRhdGlvbiBvbGRlciB0aGFuIHRoZSBsb2cncyBmaXJzdCBsb29rYmFja1xuICAgKiB3aG9zZSBgZXhwaXJlZEF0YCBpcyBzdGlsbCB0byBjb21lLCB3aGljaCB3b3VsZCBleHBpcmUgYW4gZW50cnkgY3JlYXRlZFxuICAgKiBhZnRlciBpdC4gU28gdGhlIGAndXNlIGNhY2hlJ2AgaGFuZGxlciByZWFkcyBhbiBlbnRyeSdzIHRhZ3MgaW4gdGhlXG4gICAqIGJhY2tncm91bmQgYXMgaXQgc3RvcmVzIGl0LlxuICAgKi9cbiAgZ2V0IGNvbXBsZXRlU2luY2UoKTogbnVtYmVyIHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgd2hpbGUgKHRoaXMubGF0ZXJGbG9vcnMubGVuZ3RoID4gMCAmJiB0aGlzLmxhdGVyRmxvb3JzWzBdWzBdIDw9IGF0KSB7XG4gICAgICB0aGlzLmZsb29yID0gTWF0aC5tYXgodGhpcy5mbG9vciwgdGhpcy5sYXRlckZsb29ycy5zaGlmdCgpIVsxXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZsb29yO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGluLW1lbW9yeSBzdG9yZSB3aG9zZSBlbnRyaWVzIGFyZSBqdWRnZWQgYnlcbiAgICoge0BsaW5rIGNvbXBsZXRlU2luY2V9LCBieSB0aGUgYHRpbWVzdGFtcGAgb2YgdGhlIG9sZGVzdCBlbnRyeSBpdCBob2xkczpcbiAgICogYGxvZ09ubHlgIGtlZXBzIHRoZSByb3dzIHRoYXQgY291bGQgc3RpbGwgYXBwbHkgdG8gb25lIG9mIHRoZW0sIGFuZCBub1xuICAgKiBvdGhlcnMuIFdpdGggbm9uZSByZWdpc3RlcmVkIGl0IGtlZXBzIG5vdGhpbmcuIEFza2VkIHdpdGggYHNjYW5gIGZhbHNlLFxuICAgKiBgb2xkZXN0VGltZXN0YW1wYCBtYXkgYW5zd2VyIGVhcmx5LCBidXQgbmV2ZXIgbGF0ZSwgd2l0aG91dCBhIHNjYW4uXG4gICAqL1xuICBqdWRnZUVudHJpZXNPZihcbiAgICBvbGRlc3RUaW1lc3RhbXA6IChzY2FuOiBib29sZWFuKSA9PiBudW1iZXIsXG4gICAgaG9sZHNBbnk6ICgpID0+IGJvb2xlYW4gPSAoKSA9PiBvbGRlc3RUaW1lc3RhbXAoZmFsc2UpIDwgSW5maW5pdHksXG4gICk6IHZvaWQge1xuICAgIHRoaXMuZW50cnlTdG9yZXMucHVzaCh7IG9sZGVzdFRpbWVzdGFtcCwgaG9sZHNBbnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYHRhZ2Agd2l0aCBgbWFya2VyYDogd2hhdCB0aGlzIGluc3RhbmNlIGp1c3Qgd3JvdGUsIHdoaWNoIGl0IGtub3dzXG4gICAqIHdpdGhvdXQgcmVhZGluZyBpdCBiYWNrLlxuICAgKi9cbiAgc2V0KHRhZzogc3RyaW5nLCBtYXJrZXI6IFRhZ01hcmtlcik6IHZvaWQge1xuICAgIGNvbnN0IGxvZ2dlZCA9IHRoaXMubG9nT25seS5nZXQodGFnKTtcbiAgICB0aGlzLmxvZ09ubHkuZGVsZXRlKHRhZyk7XG4gICAgdGhpcy5yZW1lbWJlcih0YWcsIG1lcmdlTWFya2VycyhtYXJrZXIsIGxvZ2dlZCkpO1xuICAgIHRoaXMua25vd24odGFnLCB0aGlzLmNsb2NrKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGUgYSB1c2Ugb2YgYHRhZ3NgOiB0aG9zZSBvZiBhbiBlbnRyeSB0aGlzIGluc3RhbmNlIGp1c3Qgc3RvcmVkLlxuICAgKlxuICAgKiBXaXRoIHRoZSB0YWJsZSwgYSB0YWcgbm90IHRyYWNrZWQgeWV0IGlzIGxlZnQgdW50cmFja2VkLCB0byBiZSByZWFkIGJ5XG4gICAqIHtAbGluayBlbnN1cmV9IHRoZSBmaXJzdCB0aW1lIGFuIGVudHJ5IG5lZWRzIGl0LiBOb3RoaW5nIHJldmFsaWRhdGVkIGJlZm9yZVxuICAgKiB0aGUgbmV3IGVudHJ5IHdhcyBjcmVhdGVkIGFwcGxpZXMgdG8gKml0KiwgYnV0IHRyYWNraW5nIGlzIHBlciB0YWcsIG5vdCBwZXJcbiAgICogZW50cnk6IHRyYWNraW5nIHRoZSB0YWcgd2l0aCBhbiBlbXB0eSBtYXJrZXIgd291bGQgYWxzbyB2b3VjaCBmb3IgZXZlcnlcbiAgICogb2xkZXIgZW50cnkgdGhhdCBjYXJyaWVzIGl0IC0gb25lIGFub3RoZXIgaW5zdGFuY2Ugc3RvcmVkIGluIFMzLCBvciBvbmVcbiAgICogdGhpcyBpbnN0YW5jZSBrZXB0IGluIG1lbW9yeSBhY3Jvc3MgYSB7QGxpbmsgZm9yZ2V0fSAtIGFuZCBhIHJldmFsaWRhdGlvblxuICAgKiBmcm9tIGJlZm9yZSB0aGUgbG9nJ3MgY3Vyc29yIHdvdWxkIGdvIHVuc2VlbiB1bnRpbCB0aGUgcm9sbGluZyByZS1yZWFkLlxuICAgKlxuICAgKiBXaXRob3V0IHRoZSB0YWJsZSBldmVyeSByZXZhbGlkYXRpb24gaXMgdGhpcyBwcm9jZXNzJ3Mgb3duLCBhcHBsaWVkIHdpdGhcbiAgICoge0BsaW5rIHNldH0sIHNvIGEgdGFnIGlzIHRyYWNrZWQgYXQgb25jZS5cbiAgICovXG4gIHRyYWNrKHRhZ3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1hcmtlcnMpIHtcbiAgICAgIHRoaXMudHJhY2tVbnJlYWQodGFncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIHRoaXMudG91Y2godGFnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgYHRhZ3NgIGFzIHRoZXkgYXJlIGtub3duIG5vdywgd2l0aG91dCByZWFkaW5nIHRoZW0sIHdpdGggYW4gZW1wdHlcbiAgICogbWFya2VyIGZvciBhbnkgbm90IHRyYWNrZWQgeWV0LlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1VucmVhZCh0YWdzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGlmICghdGhpcy50YWdzLmhhcyh0YWcpKSB7XG4gICAgICAgIHRoaXMua25vd24odGFnLCBhdCk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlbWVtYmVyKHRhZywgdGhpcy50YWdzLmdldCh0YWcpID8/IHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZCB0aGUgbWFya2VycyBvZiB3aGljaGV2ZXIgb2YgYHRhZ3NgIHRoaXMgaW5zdGFuY2UgZG9lcyBub3QgdHJhY2sgeWV0LlxuICAgKiBOZWVkZWQgYmVmb3JlIGp1ZGdpbmcgYW4gZW50cnkgdGhpcyBpbnN0YW5jZSBkaWQgbm90IGNyZWF0ZSwgc2luY2UgaXRzXG4gICAqIHRhZ3MgbWF5IGhhdmUgYmVlbiByZXZhbGlkYXRlZCBhdCBhbnkgdGltZSBiZWZvcmUuXG4gICAqL1xuICBhc3luYyBlbnN1cmUodGFnczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMubWFya2Vycykge1xuICAgICAgdGhpcy50cmFja1VucmVhZCh0YWdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgd2FpdHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IHVucmVhZDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiBuZXcgU2V0KHRhZ3MpKSB7XG4gICAgICAvLyBUcmFja2VkIGZpcnN0OiBhIHRyYWNrZWQgdGFnIGluIGByZWFkaW5nYCBpcyBvbmx5IGJlaW5nIHJlLXJlYWQgaW5cbiAgICAgIC8vIHRoZSBiYWNrZ3JvdW5kIChgc3luY2ApLCB3aGljaCBub3RoaW5nIG5lZWRzIHRvIHdhaXQgZm9yLlxuICAgICAgY29uc3QgaW5GbGlnaHQgPSB0aGlzLnJlYWRpbmcuZ2V0KHRhZyk7XG4gICAgICBpZiAodGhpcy50YWdzLmhhcyh0YWcpKSB7XG4gICAgICAgIHRoaXMudG91Y2godGFnKTtcbiAgICAgIH0gZWxzZSBpZiAoaW5GbGlnaHQpIHtcbiAgICAgICAgd2FpdHMucHVzaChpbkZsaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnJlYWQucHVzaCh0YWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodW5yZWFkLmxlbmd0aCA+IDApIHtcbiAgICAgIHdhaXRzLnB1c2godGhpcy5zdGFydFJlYWQodW5yZWFkKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhaXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgcmVhZEludG99IGB0YWdzYCwgYXMgdGhlIHJlYWQgb2YgZWFjaCB0aGF0IHdob2V2ZXIgbmVlZHMgb25lIG9mXG4gICAqIHRoZW0gbmV4dCB3YWl0cyBvbiAoe0BsaW5rIHJlYWRpbmd9KS4gTmV2ZXIgcmVqZWN0czogYSBmYWlsZWQgcmVhZCBsZWF2ZXNcbiAgICogdGhlIHRhZ3MgdHJhY2tlZC5cbiAgICovXG4gIHByaXZhdGUgc3RhcnRSZWFkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMucmVhZEludG8odGFncykudGhlbigoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgIHRoaXMucmVhZGluZy5kZWxldGUodGFnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICB0aGlzLnJlYWRpbmcuc2V0KHRhZywgcmVhZCk7XG4gICAgfVxuICAgIHJldHVybiByZWFkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxhc3QgcmVmcmVzaCBzZXR0bGVkIG1vcmUgdGhhbiBgcmVmcmVzaEludGVydmFsTXNgIHBsdXNcbiAgICoge0BsaW5rIFRBR19SRUZSRVNIX0dSQUNFX01TfSBhZ28gLSBvbmUgdGhhdCBzcGFubmVkIGEgZnJlZXplIGNvdW50cyBmcm9tXG4gICAqIHdoZW4gaXQgc3RhcnRlZDogYWZ0ZXIgdGhlIGluc3RhbmNlIHNhdCBpZGxlIG9yIGZyb3plbiAtIG9yIGFsd2F5cywgd2l0aFxuICAgKiBhIGByZWZyZXNoSW50ZXJ2YWxNc2Agb2YgYDBgLiBBbnN3ZXJpbmcgZnJvbSB3aGF0IGl0IGtub3dzIHRoZW4gY291bGRcbiAgICogc2VydmUgYW4gZW50cnkgcmV2YWxpZGF0ZWQgZWxzZXdoZXJlIHNpbmNlLCBob3dldmVyIGxvbmcgYWdvIHRoYXQgd2FzLCBzb1xuICAgKiBgcmVmcmVzaFRhZ3NgIHdhaXRzIGZvciB0aGUgcmVmcmVzaCwgYW5kIHRoZSBydW50aW1lIHdhaXRzIGZvciBpdCBiZWZvcmVcbiAgICogYSBwYWdlIHJlbmRlciBzdGFydHMgKHtAbGluayBjYXRjaFVwfSkuXG4gICAqXG4gICAqIEZyb20gd2hlbiBpdCBzZXR0bGVkLCBub3Qgd2hlbiBpdCBzdGFydGVkLCBzbyBhIHNsb3cgcXVlcnkgdGhlIHJ1bnRpbWVcbiAgICogd2FpdGVkIGZvciBiZWZvcmUgdGhlIHJlbmRlciBkb2VzIG5vdCBsZWF2ZSB0aGUgaW5zdGFuY2UgYmVoaW5kIGluc2lkZVxuICAgKiBpdC4gQSBmYWlsZWQgb25lIGNvdW50cyB0b28sIHNvIG9uZSByZXF1ZXN0IGRvZXMgbm90IHdhaXQgZm9yIHR3bzogdGhlXG4gICAqIHNhbWUgXCJhc3N1bWUgdGhlIGVudHJ5IGlzIHZhbGlkXCIgYSBmYWlsZWQgcmVhZCBhbnN3ZXJzIHdpdGgsIHVudGlsIHRoZVxuICAgKiBuZXh0IHJlZnJlc2gsIGF0IG1vc3QgdGhlIGludGVydmFsIGFuZCB0aGUgZ3JhY2UgbGF0ZXIuXG4gICAqL1xuICBnZXQgYmVoaW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxvZyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAvLyBgMGAgYXNrcyBiZWZvcmUgZXZlcnkgY2hlY2ssIHNvIGV2ZXJ5IGNoZWNrIHdhaXRzIGZvciB0aGUgYW5zd2VyLlxuICAgICAgKHRoaXMucmVmcmVzaEludGVydmFsTXMgPT09IDAgfHwgdGhpcy5vdmVyZHVlKHRoaXMuc2V0dGxlZEF0KSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHtAbGluayBiZWhpbmR9LCBhcyBgcmVmcmVzaFRhZ3NgIGFza3MgaXQ6IG5ldmVyIGluc2lkZSBhIHBhZ2UncyByZW5kZXJcbiAgICoge0BsaW5rIGNhdGNoVXB9IGNhdWdodCB1cCwgc2luY2UgdGhlIHJ1bnRpbWUgc2V0dGxlZCBpdCBmb3IgdGhhdCByZXF1ZXN0XG4gICAqIGJlZm9yZSB0aGUgcmVuZGVyIHN0YXJ0ZWQsIGFuZCBhIHdhaXQgaW5zaWRlIGEgYCd1c2UgY2FjaGUnYCBsb29rdXAgaXNcbiAgICogd2hhdCBpdCBzZXR0bGVkIGl0IHRvIGF2b2lkIC0gYSByZW5kZXIgY3Jvc3NpbmcgdGhlIGxpbmUgcGFydHdheSB0aHJvdWdoXG4gICAqIHdvdWxkIG90aGVyd2lzZSB3YWl0IGFmdGVyIGFsbC4gU28gYSByZXZhbGlkYXRpb24gZWxzZXdoZXJlIGNhbiBnbyB1bnNlZW5cbiAgICogZm9yIGEgcmVuZGVyJ3MgZHVyYXRpb24gb24gdG9wIG9mIHRoZSB1c3VhbCB3aW5kb3cuXG4gICAqXG4gICAqIEEgcm91dGUgaGFuZGxlciwgd2hpY2ggbm8gY2F0Y2gtdXAgcHJlY2VkZXMsIHdhaXRzIGF0IHRoZSBwbGFpbiBsaW5lLlxuICAgKi9cbiAgZ2V0IGJlaGluZEluUmVuZGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zICE9PSAwICYmIHRoaXMuY2F1Z2h0VXBSZW5kZXIuZ2V0U3RvcmUoKVxuICAgICAgPyBmYWxzZVxuICAgICAgOiB0aGlzLmJlaGluZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgcmVnaXN0ZXJlZCBzdG9yZSAoe0BsaW5rIGp1ZGdlRW50cmllc09mfSkgaG9sZHMgYW55IGVudHJ5OiBvbmVcbiAgICogYSByZWZyZXNoIGNvdWxkIGV4cGlyZS4gV2l0aCBub25lIHRoZXJlIGlzIG5vdGhpbmcgdG8gd2FpdCBmb3IgZXZlbiB3aGVuXG4gICAqIHRoZSBpbnN0YW5jZSBpcyB7QGxpbmsgYmVoaW5kfSwgc2luY2Ugd2hhdGV2ZXIgaXMgc3RvcmVkIGZyb20gaGVyZSBvbiBpc1xuICAgKiBuZXdlciB0aGFuIHdoYXQgdGhlIGxvZyB3b3VsZCBzYXkgLSB3aGljaCBjb3ZlcnMgdGhlIGZpcnN0IGAndXNlIGNhY2hlJ2BcbiAgICogY2FsbCBvZiBhIHByb2Nlc3MsIHdoaWNoIGNyZWF0ZXMgdGhlIGhhbmRsZXIgaW5zaWRlIHRoZSByZW5kZXIuXG4gICAqL1xuICBnZXQgaG9sZHNFbnRyaWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVudHJ5U3RvcmVzLnNvbWUoKHN0b3JlKSA9PiBzdG9yZS5ob2xkc0FueSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB7QGxpbmsgcmVmcmVzaH0sIHdhaXRlZCBmb3Igd2hlbiB0aGUgaW5zdGFuY2UgaXMge0BsaW5rIGJlaGluZH0uIFRoZVxuICAgKiBydW50aW1lIGNhbGxzIGl0IGJlZm9yZSBoYW5kaW5nIGEgcGFnZSByZXF1ZXN0IHRvIE5leHQuanMsIG91dHNpZGUgdGhlXG4gICAqIHN0YWdlZCByZW5kZXIgd2hvc2Ugc3RhdGljIHN0YWdlIGEgd2FpdCBpbnNpZGUgYSBgJ3VzZSBjYWNoZSdgIGxvb2t1cFxuICAgKiB3b3VsZCBjdXQgc2hvcnQuIE9ubHkgZm9yIHRoZSBgJ3VzZSBjYWNoZSdgIGhhbmRsZXIncyBlbnRyaWVzXG4gICAqICh7QGxpbmsganVkZ2VFbnRyaWVzT2Z9KTogdGhlIG90aGVyIGNhY2hlcyB3YWl0IGZvciB0aGUgcmVmcmVzaCB3aGVyZSB0aGV5XG4gICAqIHJlYWQgYW55d2F5LiBOb3Qgd2l0aCBhIGByZWZyZXNoSW50ZXJ2YWxNc2Agb2YgYDBgIGVpdGhlciwgd2hlcmVcbiAgICogYHJlZnJlc2hUYWdzYCBhc2tzIGFnYWluIHJlZ2FyZGxlc3MuIFRoZW4gYHJlbmRlcmAsIG1hcmtlZCBhcyBjYXVnaHQgdXBcbiAgICogZm9yICh7QGxpbmsgYmVoaW5kSW5SZW5kZXJ9KS4gUmVqZWN0cyBvbmx5IGFzIGByZW5kZXJgIGRvZXMuXG4gICAqL1xuICBhc3luYyBjYXRjaFVwPFQ+KHJlbmRlcjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGxvZyA9IChlcnJvcjogdW5rbm93bikgPT5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWZyZXNoaW5nIGNhY2hlIHRhZ3M6XCIsIGVycm9yKTtcbiAgICBpZiAodGhpcy5yZWZyZXNoSW50ZXJ2YWxNcyA+IDAgJiYgdGhpcy5iZWhpbmQpIHtcbiAgICAgIGlmICghdGhpcy5ob2xkc0VudHJpZXMpIHtcbiAgICAgICAgLy8gTm90IGNhdWdodCB1cCwgc28gbm8gZ3JhY2U6IGFuIGVudHJ5IHN0b3JlZCBtZWFud2hpbGUsIGJ5IGFub3RoZXJcbiAgICAgICAgLy8gcmVxdWVzdCwgbWFrZXMgdGhlIHJlbmRlcidzIGxvb2t1cHMgd2FpdCBhdCB0aGUgcGxhaW4gbGluZS5cbiAgICAgICAgcmV0dXJuIHJlbmRlcigpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCkuY2F0Y2gobG9nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucmVmcmVzaEludGVydmFsTXMgPiAwKSB7XG4gICAgICAvLyBTdGFydGVkLCBub3Qgd2FpdGVkIGZvciwgYXMgYHJlZnJlc2hUYWdzYCB3b3VsZDogYSBwYWdlIHRoYXQgcmVhZHNcbiAgICAgIC8vIG5vIGNhY2hlIGtlZXBzIHRoZSBpbnN0YW5jZSBjdXJyZW50IHRvbywgcmF0aGVyIHRoYW4gZmFsbGluZyBiZWhpbmRcbiAgICAgIC8vIGFuZCBtYWtpbmcgYSBsYXRlciByZXF1ZXN0IHdhaXQuXG4gICAgICB2b2lkIHRoaXMucmVmcmVzaCgpLmNhdGNoKGxvZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhdWdodFVwUmVuZGVyLnJ1bih0cnVlLCByZW5kZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBgZm5gIG91dHNpZGUgdGhlIHJlcXVlc3QncyBjb250ZXh0IChgb3V0c2lkZVJlcXVlc3RgKSwga2VlcGluZyBvbmx5XG4gICAqIHdoZXRoZXIgdGhlIHJlbmRlciB3YXMge0BsaW5rIGNhdGNoVXAgY2F1Z2h0IHVwfTogYSBjYWNoZSBoYW5kbGVyIG1ldGhvZFxuICAgKiBjYWxsZWQgZnJvbSBpbnNpZGUgYSBzdGFnZWQgcmVuZGVyLCB3aG9zZSBjbG9jayByZWFkcyBhbmQgQVdTIFNESyBjYWxsc1xuICAgKiB3b3VsZCBvdGhlcndpc2UgZW5kIGl0cyBzdGF0aWMgc3RhZ2UuXG4gICAqL1xuICBvdXRzaWRlUmVuZGVyPFQ+KGZuOiAoKSA9PiBUKTogVCB7XG4gICAgY29uc3QgY2F1Z2h0VXAgPSB0aGlzLmNhdWdodFVwUmVuZGVyLmdldFN0b3JlKCk7XG4gICAgcmV0dXJuIG91dHNpZGVSZXF1ZXN0KCgpID0+XG4gICAgICBjYXVnaHRVcCA/IHRoaXMuY2F1Z2h0VXBSZW5kZXIucnVuKGNhdWdodFVwLCBmbikgOiBmbigpLFxuICAgICk7XG4gIH1cblxuICAvKiogV2hldGhlciBgYXRgIGlzIG1vcmUgdGhhbiB0aGUgaW50ZXJ2YWwgYW5kIHRoZSBncmFjZSBhZ28uICovXG4gIHByaXZhdGUgb3ZlcmR1ZShhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvY2soKSAtIGF0ID4gdGhpcy5yZWZyZXNoSW50ZXJ2YWxNcyArIFRBR19SRUZSRVNIX0dSQUNFX01TO1xuICB9XG5cbiAgLyoqXG4gICAqIENhdGNoIHVwIG9uIHJldmFsaWRhdGlvbnMgb3RoZXIgaW5zdGFuY2VzIHJhbiwgYXQgbW9zdCBvbmNlIHBlclxuICAgKiBgcmVmcmVzaEludGVydmFsTXNgLiBTZWUge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSBmb3IgdGhlIGNvc3QuXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nO1xuICAgIGlmICghbG9nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnJlZnJlc2hpbmcpIHtcbiAgICAgIC8vIE9uZSBzdGFydGVkIGJlZm9yZSBhIGZyZWV6ZSByZWFkIHRoZSBsb2cgYXMgaXQgd2FzIHRoZW4sIGFuZCBzYXlzXG4gICAgICAvLyBub3RoaW5nIG9mIHdoYXQgcmFuIG1lYW53aGlsZTogYW4gaW5zdGFuY2UgYmVoaW5kIHdhaXRzIGZvciBhIGZyZXNoXG4gICAgICAvLyBvbmUsIGFmdGVyIGl0LiBPbmUgdGhhdCBpcyBtZXJlbHkgc2xvdyBpcyBhcyBmcmVzaCBhcyBhbnkuXG4gICAgICBpZiAodGhpcy5iZWhpbmQgJiYgdGhpcy5wYXVzZWRTaW5jZVJlZnJlc2hTdGFydGVkKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaGluZy50aGVuKCgpID0+IHRoaXMucmVmcmVzaCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hpbmc7XG4gICAgfVxuICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgIGlmIChhdCAtIHRoaXMubGFzdFJlZnJlc2ggPCB0aGlzLnJlZnJlc2hJbnRlcnZhbE1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFzdFJlZnJlc2ggPSBhdDtcbiAgICAvLyBXaGF0ZXZlciBnZXRzIHRyYWNrZWQgYmVmb3JlIHRoZSBuZXh0IHJlZnJlc2ggaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIsXG4gICAgLy8gc28gdGhlcmUgaXMgbm90aGluZyB0byBjYXRjaCB1cCBvbiB5ZXQgLSB1bmxlc3MgYW4gZW50cnkgaXMganVkZ2VkIGJ5XG4gICAgLy8gYGNvbXBsZXRlU2luY2VgLCB3aGljaCByZWxpZXMgb24gdGhlIGxvZyBmb3IgZXZlcnkgdGFnLiBFdmVuIHdpdGggbm9uZVxuICAgIC8vIGhlbGQ6IGEgcm93IGxldCBnbyBvZiB0aGVuIG1vdmVzIGBjb21wbGV0ZVNpbmNlYCBwYXN0IGl0LCBmb3IgYW4gZW50cnlcbiAgICAvLyB3aG9zZSBnZW5lcmF0aW9uIHN0YXJ0ZWQgYmVmb3JlIHRoYXQgcmV2YWxpZGF0aW9uIGFuZCB0aGF0IGlzIHN0b3JlZFxuICAgIC8vIGFmdGVyIGl0LlxuICAgIGlmICh0aGlzLnRhZ3Muc2l6ZSA9PT0gMCAmJiB0aGlzLmVudHJ5U3RvcmVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXJ0VGlja2luZygpO1xuICAgIHRoaXMucmVmcmVzaGluZyA9IHRoaXMuc3luYyhhdCwgbG9nKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIC8vIE9uZSB0aGF0IHNwYW5uZWQgYSBwYXVzZSBrbm93cyB0aGUgbG9nIGFzIG9mIGl0cyBzdGFydCBhdCBiZXN0LiBTb1xuICAgICAgLy8gZG9lcyBvbmUgdGhhdCBvbmx5IGxvb2tlZCBwYXVzZWQsIGl0cyBldmVudCBsb29wIGhlbGQgdXA6IGl0IGNvdW50c1xuICAgICAgLy8gYXMgbm8gb2xkZXIgdGhhbiBpdHMgc3RhcnQsIGFzIGlmIGl0IGhhZCBub3Qgc2V0dGxlZCBzaW5jZS5cbiAgICAgIHRoaXMuc2V0dGxlZEF0ID0gTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuc2V0dGxlZEF0LFxuICAgICAgICB0aGlzLnBhdXNlZFNpbmNlUmVmcmVzaFN0YXJ0ZWQoKSA/IHRoaXMubGFzdFJlZnJlc2ggOiB0aGlzLmNsb2NrKCksXG4gICAgICApO1xuICAgICAgdGhpcy5zdG9wVGlja2luZygpO1xuICAgICAgdGhpcy5yZWZyZXNoaW5nID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnJlZnJlc2hpbmc7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGlja2luZygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuRnJlZXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubGFzdFRpY2sgPSB0aGlzLmNsb2NrKCk7XG4gICAgdGhpcy5wYXVzZWRXaGlsZVJlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnRpY2tlciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIGNvbnN0IGF0ID0gdGhpcy5jbG9jaygpO1xuICAgICAgaWYgKGF0IC0gdGhpcy5sYXN0VGljayA+IFJFRlJFU0hfUEFVU0VfTVMpIHtcbiAgICAgICAgdGhpcy5wYXVzZWRXaGlsZVJlZnJlc2hpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VGljayA9IGF0O1xuICAgIH0sIFJFRlJFU0hfVElDS19NUyk7XG4gICAgLy8gTmV2ZXIgd2hhdCBrZWVwcyBhIHByb2Nlc3MgYWxpdmUuXG4gICAgdGhpcy50aWNrZXIudW5yZWY/LigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wVGlja2luZygpOiB2b2lkIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMudGlja2VyKTtcbiAgICB0aGlzLnRpY2tlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcm9jZXNzIHdhcyBwYXVzZWQgc2luY2Uge0BsaW5rIHJlZnJlc2hpbmd9IHN0YXJ0ZWQ6IGEgdGlja1xuICAgKiBjYW1lIGxhdGUsIG9yIHRoZSBuZXh0IG9uZSBpcyBvdmVyZHVlIChhZnRlciBhIHRoYXcsIGEgcmVxdWVzdCBjYW4gcnVuXG4gICAqIGJlZm9yZSB0aGUgdGltZXIgZG9lcykuXG4gICAqL1xuICBwcml2YXRlIHBhdXNlZFNpbmNlUmVmcmVzaFN0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2FuRnJlZXplICYmXG4gICAgICAodGhpcy5wYXVzZWRXaGlsZVJlZnJlc2hpbmcgfHxcbiAgICAgICAgdGhpcy5jbG9jaygpIC0gdGhpcy5sYXN0VGljayA+IFJFRlJFU0hfUEFVU0VfTVMpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSByZXZhbGlkYXRpb24gb2YgYHRhZ3NgOiBoZXJlIGF0IG9uY2UsIGFuZCBpbiB0aGUgcmV2YWxpZGF0aW9uXG4gICAqIHRhYmxlIGZvciBldmVyeSBvdGhlciBpbnN0YW5jZSAtIHRoZSBtYXJrZXIgcm93IHBsdXMgYSBsb2cgcm93IHBlciB0YWcuXG4gICAqXG4gICAqIE5leHQuanMgY2FsbHMgYHJldmFsaWRhdGVUYWdgIG9uIHRoZSBpbmNyZW1lbnRhbCBjYWNoZSBhbmQgYHVwZGF0ZVRhZ3NgIG9uXG4gICAqIGV2ZXJ5IGRpc3RpbmN0IGBjYWNoZUhhbmRsZXJzYCBlbnRyeSwgYWxsIGluIG9uZSBzeW5jaHJvbm91cyBsb29wXG4gICAqIChgcmV2YWxpZGF0aW9uLXV0aWxzYCksIGFuZCBhbGwgb2YgdGhlbSBzaGFyZSB0aGlzIG1hbmlmZXN0LiBTbyBhblxuICAgKiBpZGVudGljYWwgY2FsbCBpbiB0aGUgc2FtZSB0dXJuIGpvaW5zIHRoZSBmaXJzdCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhlXG4gICAqIHJvd3MgYWdhaW4uIE9uZSBpbiBhIGxhdGVyIHR1cm4gaXMgYSByZXZhbGlkYXRpb24gb2YgaXRzIG93biwgZXZlbiB3aGlsZVxuICAgKiB0aGUgZmlyc3Qgb25lJ3Mgd3JpdGVzIGFyZSBpbiBmbGlnaHQsIGFuZCBnZXRzIGl0cyBvd24sIGxhdGVyLCBtYXJrZXIuXG4gICAqIE5ldmVyIHJlamVjdHM6IHJlc29sdmVzIGBmYWxzZWAgd2hlbiBhIHJvdyBmYWlsZWQgdG8gd3JpdGUgKHRoZSBlcnJvciBpc1xuICAgKiBsb2dnZWQpLCBzbyBvdGhlciBpbnN0YW5jZXMgbWF5IG5vdCBzZWUgaXQuXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgdGFnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShbdGFncywgZHVyYXRpb25zID8/IG51bGxdKTtcbiAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMudXBkYXRpbmcuZ2V0KGtleSk7XG4gICAgaWYgKGluRmxpZ2h0KSB7XG4gICAgICByZXR1cm4gaW5GbGlnaHQ7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMud3JpdGUodGFncywgZHVyYXRpb25zKTtcbiAgICB0aGlzLnVwZGF0aW5nLnNldChrZXksIHVwZGF0ZSk7XG4gICAgLy8gRm9yZ290dGVuIGFzIHNvb24gYXMgdGhlIGN1cnJlbnQgdHVybidzIGNhbGxzIGhhdmUgYmVlbiBtYWRlLlxuICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0aW5nLmRlbGV0ZShrZXkpKTtcbiAgICByZXR1cm4gdXBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIHRyYWNrZWQgbWFya2VycyBzYXkgYWJvdXQgYW4gZW50cnkgY2FycnlpbmcgYHRhZ3NgLCBjcmVhdGVkIGF0XG4gICAqIGBjcmVhdGVkQXRgOiB0aGUgbW9zdCBzZXZlcmUgYW5zd2VyIG9mIGFueSBvZiB0aGVtLlxuICAgKi9cbiAgc3RhdGUodGFnczogcmVhZG9ubHkgc3RyaW5nW10sIGNyZWF0ZWRBdDogbnVtYmVyKTogUmV2YWxpZGF0aW9uU3RhdGUge1xuICAgIC8vIGBtYXJrZXJDbG9jaygpYCwgbm90IGBEYXRlLm5vdygpYCwgaGVyZSBhbmQgd2hlcmV2ZXIgYSBtYXJrZXIgaXMgc3RhbXBlZDpcbiAgICAvLyBgY3JlYXRlZEF0YCBpcyBvbiBOZXh0LmpzJ3MgY2xvY2ssIGFuZCBhIG1hcmtlciBvbiB0aGUgd2FsbCBjbG9jayB3b3VsZCBiZVxuICAgIC8vIGNvbXBhcmVkIGFjcm9zcyB0aGUgdHdvLCBzbyBhbiBlbnRyeSByZWdlbmVyYXRlZCBqdXN0IGFmdGVyIGFcbiAgICAvLyByZXZhbGlkYXRpb24gY291bGQgc3RpbGwgcmVhZCBhcyBvbGRlciB0aGFuIGl0IHdoZXJldmVyIHRoZXkgZHJpZnQuXG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGxldCBzdGF0ZTogUmV2YWxpZGF0aW9uU3RhdGUgPSBcImZyZXNoXCI7XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgY29uc3QgbWFya2VyID0gdGhpcy5rbm93bk1hcmtlcih0YWcpO1xuICAgICAgaWYgKCFtYXJrZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YWdTdGF0ZSA9IG1hcmtlclN0YXRlKG1hcmtlciwgY3JlYXRlZEF0LCBhdCk7XG4gICAgICBpZiAodGFnU3RhdGUgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHJldHVybiBcImV4cGlyZWRcIjtcbiAgICAgIH1cbiAgICAgIGlmICh0YWdTdGF0ZSA9PT0gXCJzdGFsZVwiKSB7XG4gICAgICAgIHN0YXRlID0gXCJzdGFsZVwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogYGdldEV4cGlyYXRpb25gJ3MgYW5zd2VyOiB0aGUgbGF0ZXN0IHRpbWUgYW55IG9mIGB0YWdzYCBleHBpcmVkLCBgMGAgaWZcbiAgICogbm9uZSBoYXMuIE9ubHkgZXhwaXJhdGlvbnMgYWxyZWFkeSBwYXN0IGNvdW50IC0gYSBwcm9maWxlJ3MgZnV0dXJlXG4gICAqIGBleHBpcmVgIGlzIG5vdCBhbiBleHBpcmF0aW9uIHlldCAtIGFuZCBhIHN0YWxlIG1hcmsgZG9lcyBub3QsIG1hdGNoaW5nXG4gICAqIE5leHQuanMncyBkZWZhdWx0IGhhbmRsZXIsIHdoaWNoIHJlYWRzIG9ubHkgYGV4cGlyZWRgIGZvciBpbXBsaWNpdCB0YWdzLlxuICAgKi9cbiAgZXhwaXJhdGlvbih0YWdzOiByZWFkb25seSBzdHJpbmdbXSk6IG51bWJlciB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIGxldCBsYXRlc3QgPSAwO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMua25vd25NYXJrZXIodGFnKTtcbiAgICAgIGlmICghbWFya2VyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG1hcmtlci5yZXZhbGlkYXRlZEF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGF0ZXN0ID0gTWF0aC5tYXgobGF0ZXN0LCBtYXJrZXIucmV2YWxpZGF0ZWRBdCk7XG4gICAgICB9XG4gICAgICBpZiAobWFya2VyLmV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIG1hcmtlci5leHBpcmVkQXQgPD0gYXQpIHtcbiAgICAgICAgbGF0ZXN0ID0gTWF0aC5tYXgobGF0ZXN0LCBtYXJrZXIuZXhwaXJlZEF0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxhdGVzdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGUoXG4gICAgdGFnczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgZHVyYXRpb25zOiBSZXZhbGlkYXRlRHVyYXRpb25zIHwgdW5kZWZpbmVkLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgY29uc3QgbWFya2VyID0gbWFya2VyRm9yKGF0LCBkdXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgIHRoaXMuc2V0KHRhZywgYXBwbHlNYXJrZXIodGhpcy5nZXQodGFnKSwgbWFya2VyKSk7XG4gICAgfVxuICAgIGNvbnN0IHsgbWFya2VycywgbG9nIH0gPSB0aGlzO1xuICAgIGlmICghbWFya2VycyB8fCAhbG9nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3Qgd3JpdGVzOiBbc3RyaW5nLCBQcm9taXNlPHVua25vd24+XVtdID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgbmV3IFNldCh0YWdzKSkge1xuICAgICAgd3JpdGVzLnB1c2goW1xuICAgICAgICBcIkVycm9yIHdyaXRpbmcgdGFnIHJldmFsaWRhdGlvbiBtYXJrZXI6XCIsXG4gICAgICAgIC8vIFRoZSByb3cgYXMgaXQgaXMgbm93LCB3aGljaCBjYXJyaWVzIGFueSBlYXJsaWVyIGByZXZhbGlkYXRlZEF0YFxuICAgICAgICAvLyBhbm90aGVyIGluc3RhbmNlIHdyb3RlOiB0cmFja2luZyBvbmx5IHdoYXQgdGhpcyBjYWxsIHNldCB3b3VsZFxuICAgICAgICAvLyBoaWRlIHRoYXQgb25lIHVudGlsIHRoZSByb2xsaW5nIHJlLXJlYWQsIGFuZCBhbiBlbnRyeSBvbGRlciB0aGFuIGl0XG4gICAgICAgIC8vIHdvdWxkIHJlYWQgYXMgbWVyZWx5IHN0YWxlLlxuICAgICAgICBtYXJrZXJzLndyaXRlKHRhZywgYXQsIGR1cmF0aW9ucykudGhlbigocm93KSA9PiB7XG4gICAgICAgICAgaWYgKHJvdykge1xuICAgICAgICAgICAgdGhpcy5zZXQodGFnLCBtZXJnZU1hcmtlcnModGhpcy5nZXQodGFnKSwgcm93KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgIF0pO1xuICAgICAgd3JpdGVzLnB1c2goW1xuICAgICAgICBcIkVycm9yIHdyaXRpbmcgdGFnIHJldmFsaWRhdGlvbiBsb2cgcm93OlwiLFxuICAgICAgICB0aGlzLnB1dExvZ1Jvdyhsb2csIHRhZywgbWFya2VyKSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHdyaXRlcy5tYXAoKFssIHdyaXRlXSkgPT4gd3JpdGUpKTtcbiAgICByZXN1bHRzLmZvckVhY2goKHJlc3VsdCwgaSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICBjb25zb2xlLmVycm9yKHdyaXRlc1tpXVswXSwgcmVzdWx0LnJlYXNvbik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkoKHJlc3VsdCkgPT4gcmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIik7XG4gIH1cblxuICAvKipcbiAgICogUHV0IGB0YWdgJ3MgbG9nIHJvdywgc3RhbXBlZCBvbiB0aGUgd2FsbCBjbG9jayAodGhlIG1hcmtlciB2YWx1ZXMgYXJlIG9uXG4gICAqIE5leHQuanMnczogc2VlIHtAbGluayBSZXZhbGlkYXRpb25Mb2d9KS5cbiAgICpcbiAgICogUmVhZGVycyBvbmx5IGxvb2sge0BsaW5rIFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVN9IGJlaGluZCB0aGVpciBsYXN0XG4gICAqIHF1ZXJ5LCBzbyBhIHJvdyB0aGF0IHNob3dzIHVwIG11Y2ggbGF0ZXIgdGhhbiBpdHMgdGltZXN0YW1wIC0gYSBzbG93XG4gICAqIGNvbm5lY3Rpb24sIHJldHJpZXMgdW5kZXIgdGhyb3R0bGluZyAtIGlzIGJlaGluZCBldmVyeSBjdXJzb3IgYW5kIG5ldmVyXG4gICAqIHJlYWQuIEEgc2xvdyBwdXQgaXMgdGhlcmVmb3JlIG1hZGUgYWdhaW4gdW5kZXIgYSBmcmVzaCB0aW1lc3RhbXAsIHdoaWNoXG4gICAqIHJlYWRlcnMgd2lsbCBzZWU7IG9uZSBzbG93IHR3aWNlIGlzIHJlcG9ydGVkIGFzIGEgZmFpbHVyZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHV0TG9nUm93KFxuICAgIGxvZzogUmV2YWxpZGF0aW9uTG9nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIG1hcmtlcjogVGFnTWFya2VyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgICBhd2FpdCBsb2cucHV0KHRhZywgYXQsIG1hcmtlcik7XG4gICAgICBpZiAodGhpcy5jbG9jaygpIC0gYXQgPD0gTUFYX0xPR19QVVRfTVMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJldmFsaWRhdGlvbiBsb2cgcm93IGZvciAke3RhZ30gdG9vayBsb25nZXIgdGhhbiByZWFkZXJzIGxvb2sgYmFja2AsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgcmVmcmVzaCBzdGFydGVkIGF0IGBhdGA6IHRoZSBsb2cgcm93cyBzaW5jZSB0aGUgY3Vyc29yLCBhbmQgdGhlIG5leHRcbiAgICogc2xpY2Ugb2YgdGhlIHJvbGxpbmcgcmUtcmVhZC5cbiAgICpcbiAgICogQSBmYWlsZWQgcXVlcnkgY2hhbmdlcyBub3RoaW5nIGJ1dCB0aGUgbG9nOiB0aGUgdGFncyBzdGF5IHRyYWNrZWQgYXMgdGhleVxuICAgKiB3ZXJlLCBhbmQgdGhlIG5leHQgcmVmcmVzaCBhc2tzIGFnYWluIGZyb20gdGhlIHNhbWUgY3Vyc29yLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzeW5jKGF0OiBudW1iZXIsIGxvZzogUmV2YWxpZGF0aW9uTG9nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGF0IC0gdGhpcy5sYXN0TG9nUmVhZCA+IE1BWF9SRVZBTElEQVRJT05fTE9HX0dBUF9NUykge1xuICAgICAgdGhpcy5mb3JnZXQoXG4gICAgICAgIGF0LFxuICAgICAgICBcInRoZSByZXZhbGlkYXRpb24gbG9nIG1heSBub3QgY292ZXIgdGhlIGdhcCBzaW5jZSBpdCB3YXMgbGFzdCByZWFkXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgcm9sbGluZyByZS1yZWFkIHJ1bnMgYWxvbmdzaWRlLCBub3Qgd2FpdGVkIGZvcjogY2F0Y2hpbmcgdXAgbmVlZHNcbiAgICAvLyBvbmx5IHRoZSBsb2csIGFuZCBhIHRocm90dGxlZCBgQmF0Y2hHZXRJdGVtYCBzaG91bGQgbm90IGhvbGQgdGhlXG4gICAgLy8gcmVxdWVzdCBgY2F0Y2hVcGAgbWFrZXMgd2FpdC4gQSBmb3JnZXQgbWVhbndoaWxlIHJlYWRzIGl0IGFnYWluLlxuICAgIGNvbnN0IGR1ZSA9IHRoaXMuZHVlKGF0KTtcbiAgICBpZiAoZHVlLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvaWQgdGhpcy5zdGFydFJlYWQoZHVlKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbG9nLnF1ZXJ5KHRoaXMuY3Vyc29yKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIHRhZyByZXZhbGlkYXRpb24gbG9nOlwiLCBlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyZXN1bHQudHJ1bmNhdGVkKSB7XG4gICAgICB0aGlzLmZvcmdldChcbiAgICAgICAgYXQsXG4gICAgICAgIFwidGhlIHJldmFsaWRhdGlvbiBsb2cgaGFzIG1vcmUgcm93cyB0aGFuIG9uZSBxdWVyeSByZWFkc1wiLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBzY2FuIG9mIGV2ZXJ5IGVudHJ5IGhlbGQsIHdoaWNoIGFsc28gZHJvcHMgdGhlIGV4cGlyZWQgb25lcywgb25jZSBpblxuICAgIC8vIGEgd2hpbGU6IHNvIGV4cGlyZWQgZW50cmllcyBuZXZlciByZWFkIGFnYWluIGRvbid0IHBpbGUgdXAgYWhlYWQgb2ZcbiAgICAvLyBsaXZlIG9uZXMuIEluIGJldHdlZW4sIHRoZSBzdG9yZXMgYW5zd2VyIGVhcmx5IHdpdGhvdXQgb25lLCB3aGljaCBvbmx5XG4gICAgLy8ga2VlcHMgcm93cyBpbiBgbG9nT25seWAgYSBsaXR0bGUgbG9uZ2VyLlxuICAgIGNvbnN0IHNjYW4gPSBhdCAtIHRoaXMubGFzdEVudHJ5U2NhbiA+IEVOVFJZX1NDQU5fSU5URVJWQUxfTVM7XG4gICAgaWYgKHNjYW4pIHtcbiAgICAgIHRoaXMubGFzdEVudHJ5U2NhbiA9IGF0O1xuICAgIH1cbiAgICBjb25zdCBvbGRlc3QgPSB0aGlzLm9sZGVzdEVudHJ5KHNjYW4pO1xuICAgIGxldCBhcHBsaWVkID0gMDtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXN1bHQucm93cykge1xuICAgICAgaWYgKHRoaXMuYXBwbGllZC5oYXMocm93LnNrKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hcmtlciA9IHRoaXMudGFncy5nZXQocm93LnRhZyk7XG4gICAgICBpZiAobWFya2VyKSB7XG4gICAgICAgIC8vIGBzZXRgIG9uIGEga2V5IGFscmVhZHkgdGhlcmUga2VlcHMgaXRzIHBsYWNlIGluIHRoZSBMUlUgb3JkZXI6IGJlaW5nXG4gICAgICAgIC8vIHJldmFsaWRhdGVkIGVsc2V3aGVyZSBpcyBub3QgYSB1c2UuXG4gICAgICAgIHRoaXMudGFncy5zZXQocm93LnRhZywgbWVyZ2VNYXJrZXJzKG1hcmtlciwgcm93Lm1hcmtlcikpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlYWRpbmcuaGFzKHJvdy50YWcpKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1Jvd3Muc2V0KFxuICAgICAgICAgIHJvdy50YWcsXG4gICAgICAgICAgbWVyZ2VNYXJrZXJzKHRoaXMucGVuZGluZ1Jvd3MuZ2V0KHJvdy50YWcpLCByb3cubWFya2VyKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEEgdGFnIHRoaXMgaW5zdGFuY2UgZG9lcyBub3QgdHJhY2sgaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIgd2hlbiBpdFxuICAgICAgICAvLyBpcyBuZXh0IG5lZWRlZCAtIGJ1dCBub3QgeWV0IG1hcmtlZCBhcHBsaWVkLCBiZWNhdXNlIHRoYXQgcmVhZCBtYXlcbiAgICAgICAgLy8gbWlzcyB0aGlzIHZlcnkgcmV2YWxpZGF0aW9uOiB0aGUgd3JpdGVyIHB1dHMgdGhlIGxvZyByb3cgYW5kIHRoZVxuICAgICAgICAvLyBtYXJrZXIgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZSByZWFkIGlzIGFuIGV2ZW50dWFsbHkgY29uc2lzdGVudFxuICAgICAgICAvLyBgQmF0Y2hHZXRJdGVtYCB0aGF0IGNhbiBsYW5kIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgcm93IHNob3dlZCBoZXJlLlxuICAgICAgICAvLyBNYXJrZWQgYXBwbGllZCwgdGhlIHJvdyB3YXMgc2tpcHBlZCBieSBldmVyeSBxdWVyeSB0aGUgbG9va2JhY2tcbiAgICAgICAgLy8gcmV0dXJuZWQgaXQgdG8sIGFuZCB0aGUgcHJlLXJldmFsaWRhdGlvbiBtYXJrZXIgc3Rvb2QgdW50aWwgdGhlXG4gICAgICAgIC8vIHJvbGxpbmcgcmUtcmVhZC4gTGVmdCB1bm1hcmtlZCwgdGhlIG5leHQgcmVmcmVzaCBhcHBsaWVzIGl0IHRvXG4gICAgICAgIC8vIHdoYXRldmVyIHRoYXQgcmVhZCBmb3VuZDsgaXQgY29zdHMgbm8gcmVhZCwgb25seSB0aGUgcm93IGJlaW5nXG4gICAgICAgIC8vIGxvb2tlZCBhdCBhZ2FpbiB3aGlsZSBpdCBpcyBpbnNpZGUgdGhlIGxvb2tiYWNrLlxuICAgICAgICAvL1xuICAgICAgICAvLyBLZXB0IG1lYW53aGlsZSBpbiBgbG9nT25seWAsIHdoaWNoIGlzIGFsbCBgY29tcGxldGVTaW5jZWAgbmVlZHMuXG4gICAgICAgIHRoaXMucmVtZW1iZXJMb2dnZWQoXG4gICAgICAgICAgcm93LnRhZyxcbiAgICAgICAgICBtZXJnZU1hcmtlcnModGhpcy5sb2dPbmx5LmdldChyb3cudGFnKSwgcm93Lm1hcmtlciksXG4gICAgICAgICAgb2xkZXN0LFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwbGllZC5zZXQocm93LnNrLCByb3cuYXQpO1xuICAgICAgYXBwbGllZCsrO1xuICAgIH1cbiAgICBpZiAob2xkZXN0ID4gdGhpcy5wcnVuZWRBZ2FpbnN0KSB7XG4gICAgICB0aGlzLnBydW5lTG9nZ2VkKG9sZGVzdCk7XG4gICAgfVxuICAgIC8vIFRoZSByb3dzIGp1c3Qga2VwdCBhcmUga25vd24gYnkgbGF0ZXIgdGhhbiBgb2xkZXN0YCB0b28uXG4gICAgdGhpcy5wcnVuZWRBZ2FpbnN0ID0gb2xkZXN0O1xuICAgIHRoaXMubGFzdExvZ1JlYWQgPSBhdDtcbiAgICB0aGlzLmFkdmFuY2UoYXQgLSBSRVZBTElEQVRJT05fTE9HX0xPT0tCQUNLX01TKTtcbiAgICB0aGlzLmRlYnVnKFxuICAgICAgYHJlYWQgJHtyZXN1bHQucm93cy5sZW5ndGh9IHJldmFsaWRhdGlvbiBsb2cgcm93cyAoJHthcHBsaWVkfSBhcHBsaWVkKWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdGFncyB0byByZWFkIG9uIHRoaXMgcmVmcmVzaCwgYXQgbW9zdCBvbmUgYEJhdGNoR2V0SXRlbWAncyB3b3J0aDpcbiAgICogdGhvc2Ugd2hvc2UgcmVhZCBmYWlsZWQsIHRoZW4gdGhvc2Ugd2hvc2UgcmUtcmVhZCBoYXMgY29tZSBkdWUsIGluIHRoZVxuICAgKiBvcmRlciB0aGV5IHdlcmUgbGFzdCByZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSBkdWUoYXQ6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBkdWU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy51bnJlYWQpIHtcbiAgICAgIGlmIChkdWUubGVuZ3RoID49IEJBVENIX0dFVF9NQVhfS0VZUykgcmV0dXJuIGR1ZTtcbiAgICAgIGlmICghdGhpcy5yZWFkaW5nLmhhcyh0YWcpKSB7XG4gICAgICAgIGR1ZS5wdXNoKHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEtub3duIGluIHRpbWUgb3JkZXIsIGFuZCBlYWNoIGR1ZSBhdCBtb3N0IGBqaXR0ZXJgIGVhcmxpZXIgdGhhbiB0aGVcbiAgICAvLyB0YWdzIGFmdGVyIGl0OiBwYXN0IGEgdGFnIGR1ZSBtb3JlIHRoYW4gdGhhdCBmcm9tIG5vdywgbm9uZSBpcyBkdWUuXG4gICAgY29uc3Qgaml0dGVyID0gdGhpcy5yZXN5bmNJbnRlcnZhbE1zICogVEFHX1JFU1lOQ19KSVRURVI7XG4gICAgZm9yIChjb25zdCBbdGFnLCBkdWVBdF0gb2YgdGhpcy5kdWVBdCkge1xuICAgICAgaWYgKGR1ZS5sZW5ndGggPj0gQkFUQ0hfR0VUX01BWF9LRVlTIHx8IGR1ZUF0IC0gaml0dGVyID4gYXQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoZHVlQXQgPD0gYXQgJiYgIXRoaXMudW5yZWFkLmhhcyh0YWcpICYmICF0aGlzLnJlYWRpbmcuaGFzKHRhZykpIHtcbiAgICAgICAgZHVlLnB1c2godGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGR1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JnZXQgZXZlcnkgdHJhY2tlZCBtYXJrZXIsIGFuZCBmb2xsb3cgdGhlIGxvZyBmcm9tIGBhdGA6IHdoYXQgaXMgbmVlZGVkXG4gICAqIG5leHQgaXMgcmVhZCBmcm9tIGl0cyBtYXJrZXIgYXMgaXQgaXMgbmVlZGVkLCBzcHJlYWQgb3ZlciB0aGUgcmVxdWVzdHNcbiAgICogdGhhdCBuZWVkIGl0LCByYXRoZXIgdGhhbiBldmVyeSB0cmFja2VkIHRhZyByZS1yZWFkIGF0IG9uY2UuXG4gICAqL1xuICBwcml2YXRlIGZvcmdldChhdDogbnVtYmVyLCB3aHk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVidWcoYGZvcmdldHRpbmcgJHt0aGlzLnRhZ3Muc2l6ZX0gdHJhY2tlZCB0YWdzOiAke3doeX1gKTtcbiAgICB0aGlzLmZvcmdvdHRlbisrO1xuICAgIC8vIFdoYXQgdGhlIG1hcmtlcnMgZXhwaXJlIGxhdGVyIGlzIHN0aWxsIHRvIGFwcGx5IG9uY2UgaXQgaXMgcGFzdC5cbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiB0aGlzLnRhZ3MudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMucmFpc2VGbG9vcihtYXJrZXIpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiB0aGlzLmxvZ09ubHkudmFsdWVzKCkpIHtcbiAgICAgIHRoaXMucmFpc2VGbG9vcihtYXJrZXIpO1xuICAgIH1cbiAgICB0aGlzLnRhZ3MuY2xlYXIoKTtcbiAgICB0aGlzLmR1ZUF0LmNsZWFyKCk7XG4gICAgdGhpcy51bnJlYWQuY2xlYXIoKTtcbiAgICB0aGlzLmFwcGxpZWQuY2xlYXIoKTtcbiAgICB0aGlzLmxvZ09ubHkuY2xlYXIoKTtcbiAgICAvLyBOZXZlciBiYWNrOiBhIG1hcmtlciBkcm9wcGVkIGVhcmxpZXIgbWF5IGhhdmUgZXhwaXJlZCBlbnRyaWVzIGxhdGVyLlxuICAgIHRoaXMuZmxvb3IgPSBNYXRoLm1heCh0aGlzLmZsb29yLCBtYXJrZXJDbG9jaygpKTtcbiAgICB0aGlzLmN1cnNvciA9IGF0IC0gUkVWQUxJREFUSU9OX0xPR19MT09LQkFDS19NUztcbiAgICB0aGlzLmxhc3RMb2dSZWFkID0gYXQ7XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgY3Vyc29yIGZvcndhcmQgdG8gYGN1cnNvcmAsIGZvcmdldHRpbmcgYXBwbGllZCByb3dzIGJlZm9yZSBpdDpcbiAgICogbm8gcXVlcnkgcmV0dXJucyB0aGVtIGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSBhZHZhbmNlKGN1cnNvcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGN1cnNvciA8PSB0aGlzLmN1cnNvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnNvciA9IGN1cnNvcjtcbiAgICBmb3IgKGNvbnN0IFtzaywgYXRdIG9mIHRoaXMuYXBwbGllZCkge1xuICAgICAgaWYgKGF0IDwgY3Vyc29yKSB7XG4gICAgICAgIHRoaXMuYXBwbGllZC5kZWxldGUoc2spO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIGB0YWdzYCBmcm9tIHRoZSB0YWJsZSwgYW5kIHJlcG9ydCB3aGV0aGVyIHRoYXQgd29ya2VkLiBBIHJlYWQgdGhhdFxuICAgKiBmYWlscyBsZWF2ZXMgdGhlbSB0cmFja2VkIGFzIHRoZXkgd2VyZSwgYW5kIHRoZSBuZXh0IHJlZnJlc2ggcmVhZHMgdGhlbVxuICAgKiBhZ2FpbjogdGhlIHNhbWUgXCJhc3N1bWUgdGhlIGVudHJ5IGlzIHZhbGlkXCIgdGhlIGluY3JlbWVudGFsIGNhY2hlIGhhc1xuICAgKiBhbHdheXMgYW5zd2VyZWQgd2l0aCwgcmF0aGVyIHRoYW4gYSByZWFkIG9uIGV2ZXJ5IHJlcXVlc3Qgd2hpbGUgRHluYW1vREJcbiAgICogaXMgdW5hdmFpbGFibGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRJbnRvKHRhZ3M6IHN0cmluZ1tdLCBhZ2FpbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgYXQgPSB0aGlzLmNsb2NrKCk7XG4gICAgY29uc3QgZm9yZ290dGVuID0gdGhpcy5mb3Jnb3R0ZW47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCB0aGlzLm1hcmtlcnMhLnJlYWQodGFncyk7XG4gICAgICBpZiAodGhpcy5mb3Jnb3R0ZW4gIT09IGZvcmdvdHRlbiAmJiAhYWdhaW4pIHtcbiAgICAgICAgLy8gUmVhZCBiZWZvcmUgYSBmb3JnZXQgLSBhY3Jvc3MgYSBmcmVlemUsIGFzIGxpa2UgYXMgbm90IC0gc28gYXNcbiAgICAgICAgLy8gc3RhbGUgYXMgd2hhdCBpdCBmb3Jnb3QuIFJlYWQgYWdhaW4gcmF0aGVyIHRoYW4gbGVhdmUgdGhlIHRhZ3NcbiAgICAgICAgLy8gdW50cmFja2VkOiB3aG9ldmVyIHdhaXRzIG9uIHRoaXMgcmVhZCAoYHJlYWRpbmdgKSBqdWRnZXMgZW50cmllc1xuICAgICAgICAvLyBieSBpdCBuZXh0LCBhbmQgYW4gdW50cmFja2VkIHRhZyBjb3VudHMgZm9yIG5vdGhpbmcuIE9uY2U6IGEgcnVuXG4gICAgICAgIC8vIG9mIGZvcmdldHMgKGEgdHJ1bmNhdGVkIGxvZywgcXVlcnkgYWZ0ZXIgcXVlcnkpIHdvdWxkIG90aGVyd2lzZVxuICAgICAgICAvLyBrZWVwIHRoZW0gd2FpdGluZywgYW5kIHRoZSBzZWNvbmQgcmVhZCBiZWdhbiBhZnRlciB0aGUgZmlyc3QuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlYWRJbnRvKHRhZ3MsIHRydWUpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICB0aGlzLnVucmVhZC5kZWxldGUodGFnKTtcbiAgICAgICAgdGhpcy5yZW1lbWJlcihcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgbWVyZ2VNYXJrZXJzKFxuICAgICAgICAgICAgbWVyZ2VNYXJrZXJzKHRoaXMudGFncy5nZXQodGFnKSwgcmVhZC5nZXQodGFnKSksXG4gICAgICAgICAgICB0aGlzLnRha2VQZW5kaW5nUm93cyh0YWcpLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMua25vd24odGFnLCBhdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlYnVnKGByZWFkICR7dGFncy5sZW5ndGh9IHRhZyBtYXJrZXJzICgke3JlYWQuc2l6ZX0gc2V0KWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciByZWFkaW5nIHRhZyBtYXJrZXJzOlwiLCBlcnJvcik7XG4gICAgICBpZiAodGhpcy5mb3Jnb3R0ZW4gIT09IGZvcmdvdHRlbiAmJiAhYWdhaW4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEludG8odGFncywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyYWNrVW5yZWFkKHRhZ3MpO1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFncykge1xuICAgICAgICB0aGlzLnVucmVhZC5hZGQodGFnKTtcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMudGFrZVBlbmRpbmdSb3dzKHRhZyk7XG4gICAgICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICAgICAgdGhpcy5yZW1lbWJlcih0YWcsIG1lcmdlTWFya2Vycyh0aGlzLnRhZ3MuZ2V0KHRhZyksIHBlbmRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdGFrZVBlbmRpbmdSb3dzKHRhZzogc3RyaW5nKTogVGFnTWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nUm93cy5nZXQodGFnKTtcbiAgICBjb25zdCBsb2dnZWQgPSB0aGlzLmxvZ09ubHkuZ2V0KHRhZyk7XG4gICAgdGhpcy5wZW5kaW5nUm93cy5kZWxldGUodGFnKTtcbiAgICB0aGlzLmxvZ09ubHkuZGVsZXRlKHRhZyk7XG4gICAgcmV0dXJuIGxvZ2dlZCA/IG1lcmdlTWFya2Vycyhsb2dnZWQsIHBlbmRpbmcpIDogcGVuZGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoaXMgaW5zdGFuY2Uga25vd3Mgb2YgYHRhZ2A6IHRyYWNrZWQsIG9yIGZyb20gdGhlIGxvZyBhbG9uZSAtXG4gICAqIGluY2x1ZGluZyByb3dzIHRoYXQgYXJyaXZlZCB3aGlsZSBpdHMgZmlyc3QgcmVhZCBpcyBpbiBmbGlnaHQuXG4gICAqL1xuICBwcml2YXRlIGtub3duTWFya2VyKHRhZzogc3RyaW5nKTogVGFnTWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0cmFja2VkID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgIGlmICh0cmFja2VkKSB7XG4gICAgICByZXR1cm4gdHJhY2tlZDtcbiAgICB9XG4gICAgY29uc3QgbG9nZ2VkID0gdGhpcy5sb2dPbmx5LmdldCh0YWcpO1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSb3dzLmdldCh0YWcpO1xuICAgIHJldHVybiBsb2dnZWQgfHwgcGVuZGluZyA/IG1lcmdlTWFya2Vycyhsb2dnZWQsIHBlbmRpbmcpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgYHRhZ2AncyBsb2cgcm93cyBpbiBgbG9nT25seWAsIHVubGVzcyB0aGV5IGNhbm5vdCBhcHBseSB0byBhbiBlbnRyeVxuICAgKiBoZWxkLCBgb2xkZXN0YCBvciBuZXdlciAoc2VlIHtAbGluayBwcnVuZUxvZ2dlZH0pLCBhcyBib3VuZGVkIGFzIHRoZVxuICAgKiB0cmFja2VkIHRhZ3MuIEVpdGhlciB3YXkgYSByb3cgbGV0IGdvIG9mIHRha2VzIHdoYXQgaXQga25ldyB3aXRoIGl0LCBzb1xuICAgKiBgY29tcGxldGVTaW5jZWAgbW92ZXMgcGFzdCBpdC5cbiAgICovXG4gIHByaXZhdGUgcmVtZW1iZXJMb2dnZWQodGFnOiBzdHJpbmcsIG1hcmtlcjogVGFnTWFya2VyLCBvbGRlc3Q6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubG9nT25seS5kZWxldGUodGFnKTtcbiAgICBpZiAoa25vd25CeShtYXJrZXIsIG1hcmtlckNsb2NrKCkpIDw9IG9sZGVzdCkge1xuICAgICAgdGhpcy5yYWlzZUZsb29yKG1hcmtlcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nT25seS5zZXQodGFnLCBtYXJrZXIpO1xuICAgIGZvciAoY29uc3QgW2ZpcnN0LCBkcm9wcGVkXSBvZiB0aGlzLmxvZ09ubHkpIHtcbiAgICAgIGlmICh0aGlzLmxvZ09ubHkuc2l6ZSA8PSB0aGlzLm1heFRyYWNrZWRUYWdzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dPbmx5LmRlbGV0ZShmaXJzdCk7XG4gICAgICB0aGlzLnJhaXNlRmxvb3IoZHJvcHBlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyb3AgdGhlIGBsb2dPbmx5YCByb3dzIHRoYXQgY2Fubm90IGFwcGx5IHRvIGFuIGVudHJ5IGhlbGQsIGBvbGRlc3RgIG9yXG4gICAqIG5ld2VyOiBldmVyeSByZXZhbGlkYXRpb24gdGhleSBuYW1lIHNvIGZhciBpcyBubyBsYXRlciB0aGFuIGl0LiBUaGF0XG4gICAqIG1vdmVzIGBjb21wbGV0ZVNpbmNlYCBubyBmdXJ0aGVyIHRoYW4gYG9sZGVzdGAsIHdoaWNoIGNvc3RzIHRoZSBlbnRyaWVzXG4gICAqIGhlbGQgbm90aGluZywgYW5kIGEgcHJvZmlsZSdzIGBleHBpcmVkQXRgIHN0aWxsIHRvIGNvbWUgd2FpdHMgaW5cbiAgICogYGxhdGVyRmxvb3JzYC4gV2l0aG91dCB0aGlzLCBhIGRlcGxveW1lbnQgcmV2YWxpZGF0aW5nIG1hbnkgZGlzdGluY3QgdGFnc1xuICAgKiBmaWxsZWQgYGxvZ09ubHlgIHdpdGggdGFncyBubyBlbnRyeSBoZXJlIGNhcnJpZXMsIGFuZCB0aGUgZXZpY3Rpb25zIHBhc3RcbiAgICogaXRzIGJvdW5kIGtlcHQgbW92aW5nIGBjb21wbGV0ZVNpbmNlYCB1cCB0byB0aGUgcHJlc2VudC5cbiAgICovXG4gIHByaXZhdGUgcHJ1bmVMb2dnZWQob2xkZXN0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhdCA9IG1hcmtlckNsb2NrKCk7XG4gICAgZm9yIChjb25zdCBbdGFnLCBtYXJrZXJdIG9mIHRoaXMubG9nT25seSkge1xuICAgICAgaWYgKGtub3duQnkobWFya2VyLCBhdCkgPD0gb2xkZXN0KSB7XG4gICAgICAgIHRoaXMubG9nT25seS5kZWxldGUodGFnKTtcbiAgICAgICAgdGhpcy5yYWlzZUZsb29yKG1hcmtlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgZW50cnkgdGltZXN0YW1wIG9mIGFueSByZWdpc3RlcmVkIHN0b3JlLCBgSW5maW5pdHlgIHdpdGggbm9uZTpcbiAgICogZWFybHksIG5ldmVyIGxhdGUsIHVubGVzcyBgc2NhbmAuXG4gICAqL1xuICBwcml2YXRlIG9sZGVzdEVudHJ5KHNjYW46IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIGxldCBvbGRlc3QgPSBJbmZpbml0eTtcbiAgICBmb3IgKGNvbnN0IHsgb2xkZXN0VGltZXN0YW1wIH0gb2YgdGhpcy5lbnRyeVN0b3Jlcykge1xuICAgICAgb2xkZXN0ID0gTWF0aC5taW4ob2xkZXN0LCBvbGRlc3RUaW1lc3RhbXAoc2NhbikpO1xuICAgIH1cbiAgICByZXR1cm4gb2xkZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYGNvbXBsZXRlU2luY2VgIHBhc3QgYG1hcmtlcmAncyByZXZhbGlkYXRpb25zOiB3aGF0IGlzIG5vIGxvbmdlclxuICAgKiBrbm93biBhYm91dCBhIHRhZyBvbmNlIGl0cyBtYXJrZXIgaXMgZHJvcHBlZC4gQSBmdXR1cmUgYGV4cGlyZWRBdGAgd2FpdHNcbiAgICogaW4gYGxhdGVyRmxvb3JzYCB1bnRpbCBpdCBpcyBwYXN0LlxuICAgKi9cbiAgcHJpdmF0ZSByYWlzZUZsb29yKG1hcmtlcjogVGFnTWFya2VyKTogdm9pZCB7XG4gICAgY29uc3QgYXQgPSBtYXJrZXJDbG9jaygpO1xuICAgIHRoaXMuZmxvb3IgPSBNYXRoLm1heCh0aGlzLmZsb29yLCBrbm93bkJ5KG1hcmtlciwgYXQpKTtcbiAgICBjb25zdCB7IGV4cGlyZWRBdCB9ID0gbWFya2VyO1xuICAgIGlmIChleHBpcmVkQXQgIT09IHVuZGVmaW5lZCAmJiBleHBpcmVkQXQgPiBNYXRoLm1heChhdCwgdGhpcy5mbG9vcikpIHtcbiAgICAgIHRoaXMubGF0ZXJGbG9vcihleHBpcmVkQXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYHRpbWVgIHRvIGBsYXRlckZsb29yc2AsIGluIG9yZGVyLiBQYXN0IHRoZSB0cmFja2VkLXRhZyBib3VuZCB0aGUgdHdvXG4gICAqIHNwYW5zIGNsb3Nlc3QgdG9nZXRoZXIgYXJlIG1lcmdlZDogZnJvbSB0aGUgZmlyc3QncyBzdGFydCxcbiAgICogYGNvbXBsZXRlU2luY2VgIGlzIHRoZSBzZWNvbmQncyBlbmQsIGVhcmx5IC0gd2hpY2ggb25seSBjb3N0cyByZWFkcywgYW5kXG4gICAqIGZvciBhcyBzaG9ydCBhIHRpbWUgYXMgYW55IG1lcmdlIGFsbG93cy4gTmV2ZXIgbGF0ZXIgdGhhbiBpdHMgdGltZSwgd2hpY2hcbiAgICogd291bGQgbGV0IGFuIGVudHJ5IGV4cGlyZSB1bnNlZW4uXG4gICAqL1xuICBwcml2YXRlIGxhdGVyRmxvb3IodGltZTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZmxvb3JzID0gdGhpcy5sYXRlckZsb29ycztcbiAgICBsZXQgbG93ID0gMDtcbiAgICBsZXQgaGlnaCA9IGZsb29ycy5sZW5ndGg7XG4gICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICBpZiAoZmxvb3JzW21pZF1bMF0gPCB0aW1lKSB7XG4gICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJbnNpZGUgYSBtZXJnZWQgc3BhbiBhbHJlYWR5OiBieSBpdHMgc3RhcnQsIGBjb21wbGV0ZVNpbmNlYCBpcyBwYXN0IGl0LlxuICAgIC8vIE9yIGFscmVhZHkgdGhlcmU6IGEgbG9nIHJvdyBmb3IgYW4gdW50cmFja2VkIHRhZyBpcyBhcHBsaWVkIGFnYWluIGJ5XG4gICAgLy8gZXZlcnkgcXVlcnkgaXRzIGxvb2tiYWNrIHJldHVybnMgaXQgdG8uXG4gICAgaWYgKChsb3cgPiAwICYmIGZsb29yc1tsb3cgLSAxXVsxXSA+PSB0aW1lKSB8fCBmbG9vcnNbbG93XT8uWzBdID09PSB0aW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZsb29ycy5zcGxpY2UobG93LCAwLCBbdGltZSwgdGltZV0pO1xuICAgIC8vIEEgc2NhbiwgYnV0IG9ubHkgb25jZSBwYXN0IHRoZSBib3VuZC4gTWVyZ2luZyB0aGUgbmV3IHRpbWUgaW50byBhXG4gICAgLy8gbmVpZ2hib3VyIGluc3RlYWQgY291bGQgam9pbiBhbiBob3VyLW91dCBzcGFuIHdpdGggYSB5ZWFyLW91dCBvbmUsIGFuZFxuICAgIC8vIGhvbGQgYGNvbXBsZXRlU2luY2VgIGEgeWVhciBlYXJseS5cbiAgICBpZiAoZmxvb3JzLmxlbmd0aCA+IHRoaXMubWF4VHJhY2tlZFRhZ3MpIHtcbiAgICAgIGxldCBtZXJnZSA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGZsb29ycy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZsb29yc1tpICsgMV1bMV0gLSBmbG9vcnNbaV1bMF0gPFxuICAgICAgICAgIGZsb29yc1ttZXJnZSArIDFdWzFdIC0gZmxvb3JzW21lcmdlXVswXVxuICAgICAgICApIHtcbiAgICAgICAgICBtZXJnZSA9IGk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZsb29ycy5zcGxpY2UobWVyZ2UsIDIsIFtmbG9vcnNbbWVyZ2VdWzBdLCBmbG9vcnNbbWVyZ2UgKyAxXVsxXV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWNvcmQgdGhhdCBgdGFnYCdzIG1hcmtlciB3YXMga25vd24gZnJvbSB0aGUgdGFibGUgYXQgYGF0YC4gKi9cbiAgcHJpdmF0ZSBrbm93bih0YWc6IHN0cmluZywgYXQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZHVlQXQuZGVsZXRlKHRhZyk7XG4gICAgdGhpcy5kdWVBdC5zZXQoXG4gICAgICB0YWcsXG4gICAgICBhdCArIHRoaXMucmVzeW5jSW50ZXJ2YWxNcyAqICgxIC0gVEFHX1JFU1lOQ19KSVRURVIgKiB0aGlzLnJhbmRvbSgpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih0YWc6IHN0cmluZywgbWFya2VyOiBUYWdNYXJrZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRhZ3MuZGVsZXRlKHRhZyk7XG4gICAgdGhpcy50YWdzLnNldCh0YWcsIG1hcmtlcik7XG4gICAgZm9yIChjb25zdCBvbGRlc3Qgb2YgdGhpcy50YWdzLmtleXMoKSkge1xuICAgICAgaWYgKHRoaXMudGFncy5zaXplIDw9IHRoaXMubWF4VHJhY2tlZFRhZ3MpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0aGlzLnJhaXNlRmxvb3IodGhpcy50YWdzLmdldChvbGRlc3QpISk7XG4gICAgICB0aGlzLnRhZ3MuZGVsZXRlKG9sZGVzdCk7XG4gICAgICB0aGlzLmR1ZUF0LmRlbGV0ZShvbGRlc3QpO1xuICAgICAgdGhpcy51bnJlYWQuZGVsZXRlKG9sZGVzdCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0b3VjaCh0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMudGFncy5nZXQodGFnKTtcbiAgICBpZiAobWFya2VyKSB7XG4gICAgICB0aGlzLnJlbWVtYmVyKHRhZywgbWFya2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbGF0ZXN0IHJldmFsaWRhdGlvbiBgbWFya2VyYCBoYXMgbWFkZSBrbm93biBieSBgYXRgLCBgLUluZmluaXR5YCB3aXRoXG4gKiBub25lOiBhIGZ1dHVyZSBgZXhwaXJlZEF0YCBpcyBzdGlsbCB0byBjb21lLlxuICovXG5mdW5jdGlvbiBrbm93bkJ5KG1hcmtlcjogVGFnTWFya2VyLCBhdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgeyByZXZhbGlkYXRlZEF0LCBzdGFsZUF0LCBleHBpcmVkQXQgfSA9IG1hcmtlcjtcbiAgcmV0dXJuIE1hdGgubWF4KFxuICAgIHJldmFsaWRhdGVkQXQgPz8gLUluZmluaXR5LFxuICAgIHN0YWxlQXQgPz8gLUluZmluaXR5LFxuICAgIGV4cGlyZWRBdCAhPT0gdW5kZWZpbmVkICYmIGV4cGlyZWRBdCA8PSBhdCA/IGV4cGlyZWRBdCA6IC1JbmZpbml0eSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgbG9uZ2VzdCBhIGxvZyByb3cncyBwdXQgbWF5IHRha2UgYW5kIHN0aWxsIGJlIHNlZW4gYnkgZXZlcnkgcmVhZGVyOiBoYWxmXG4gKiB0aGUgbG9va2JhY2ssIGxlYXZpbmcgdGhlIHJlc3QgZm9yIHdyaXRlcnMnIGNsb2NrcyBhbmQgZXZlbnR1YWxseSBjb25zaXN0ZW50XG4gKiBxdWVyaWVzLlxuICovXG5jb25zdCBNQVhfTE9HX1BVVF9NUyA9IFJFVkFMSURBVElPTl9MT0dfTE9PS0JBQ0tfTVMgLyAyO1xuXG4vKipcbiAqIEhvdyBvZnRlbiBhIHJlZnJlc2ggc2NhbnMgdGhlIGVudHJ5IHN0b3JlcyBmb3IgdGhlaXIgb2xkZXN0IGVudHJ5LCBkcm9wcGluZ1xuICogdGhlIGV4cGlyZWQgb25lcyBubyByZXF1ZXN0IHJlYWRzIGFnYWluLlxuICovXG5jb25zdCBFTlRSWV9TQ0FOX0lOVEVSVkFMX01TID0gNjBfMDAwO1xuXG4vKiogSG93IG9mdGVuIGEgcmVmcmVzaCBpbiBmbGlnaHQgY2hlY2tzIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcuICovXG5jb25zdCBSRUZSRVNIX1RJQ0tfTVMgPSAyNTA7XG5cbi8qKlxuICogSG93IGxhdGUgYSB0aWNrIG1heSBjb21lIGJlZm9yZSB0aGUgcHJvY2VzcyBjb3VudHMgYXMgcGF1c2VkIChmcm96ZW4pXG4gKiBzaW5jZSB0aGUgcmVmcmVzaCBpbiBmbGlnaHQgc3RhcnRlZC4gQSBidXN5IGV2ZW50IGxvb3AgY2FuIGRlbGF5IG9uZSB0b286XG4gKiB0aGUgcmVmcmVzaCB0aGVuIGNvdW50cyBhcyBubyBmcmVzaGVyIHRoYW4gaXRzIHN0YXJ0LCBhcyBiZWZvcmUgdGhlIHBhdXNlXG4gKiBjaGVjaywgc28gYSByZXF1ZXN0IHdhaXRzIGZvciB0aGUgbmV4dCBvbmUgb25jZSB0aGF0IGlzIHBhc3QgdGhlIGdyYWNlLlxuICovXG5jb25zdCBSRUZSRVNIX1BBVVNFX01TID0gMTAwMDtcblxuLyoqXG4gKiBBIG1hcmtlciBhcyByZWFkIGZyb20gdGhlIHRhYmxlIG9yIHRoZSBsb2csIGtlZXBpbmcgd2hhdGV2ZXIgdGhpcyBpbnN0YW5jZVxuICogYWxyZWFkeSBrbm93cyB0aGF0IHRoZSByZWFkIGRvZXMgbm90IHNob3cgeWV0OiByZWFkcyBhcmUgZXZlbnR1YWxseVxuICogY29uc2lzdGVudCwgYW5kIGEgcmVhZCBzdHJhaWdodCBhZnRlciB0aGlzIGluc3RhbmNlJ3Mgb3duIHJldmFsaWRhdGlvbiBjb3VsZFxuICogb3RoZXJ3aXNlIHRha2UgaXQgYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTWFya2VycyhcbiAgbG9jYWw6IFRhZ01hcmtlciB8IHVuZGVmaW5lZCxcbiAgcmVtb3RlOiBUYWdNYXJrZXIgfCB1bmRlZmluZWQsXG4pOiBUYWdNYXJrZXIge1xuICBpZiAoIWxvY2FsKSB7XG4gICAgcmV0dXJuIHJlbW90ZSA/PyB7fTtcbiAgfVxuICBpZiAoIXJlbW90ZSkge1xuICAgIHJldHVybiBsb2NhbDtcbiAgfVxuICAvLyBgZXhwaXJlZEF0YCBpcyB3cml0dGVuIHdpdGggYHN0YWxlQXRgLCBzbyBpdCBiZWxvbmdzIHRvIHdoaWNoZXZlciBpc1xuICAvLyBuZXdlciAtIHVubGVzcyB0aGF0IHJldmFsaWRhdGlvbidzIHByb2ZpbGUgaGFkIG5vIGBleHBpcmVgIGFuZCBsZWZ0IGl0LlxuICBjb25zdCBbb2xkZXIsIG5ld2VyXSA9XG4gICAgKGxvY2FsLnN0YWxlQXQgPz8gLTEpID4gKHJlbW90ZS5zdGFsZUF0ID8/IC0xKVxuICAgICAgPyBbcmVtb3RlLCBsb2NhbF1cbiAgICAgIDogW2xvY2FsLCByZW1vdGVdO1xuICByZXR1cm4ge1xuICAgIC4uLmFwcGx5TWFya2VyKG9sZGVyLCBuZXdlciksXG4gICAgcmV2YWxpZGF0ZWRBdDogbWF4RGVmaW5lZChsb2NhbC5yZXZhbGlkYXRlZEF0LCByZW1vdGUucmV2YWxpZGF0ZWRBdCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1heERlZmluZWQoYTogbnVtYmVyIHwgdW5kZWZpbmVkLCBiOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgaWYgKGEgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGI7XG4gIGlmIChiID09PSB1bmRlZmluZWQpIHJldHVybiBhO1xuICByZXR1cm4gTWF0aC5tYXgoYSwgYik7XG59XG5cbi8qKlxuICogVGhlIGNhY2hlIGJ1Y2tldCwgYXMgdGhlIGhhbmRsZXJzIHVzZSBpdDogd2hvbGUgb2JqZWN0cyByZWFkIGFuZCB3cml0dGVuIGFzXG4gKiBVVEYtOCB0ZXh0IHVuZGVyIHRoZSBrZXlzIGFib3ZlLlxuICovXG5leHBvcnQgY2xhc3MgQ2FjaGVCdWNrZXQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogUzNDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBidWNrZXROYW1lOiBzdHJpbmcsXG4gICkge31cblxuICAvKipcbiAgICogVGhlIGJvZHkgb2YgdGhlIG9iamVjdCBhdCBga2V5YCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lIChgTm9TdWNoS2V5YCwgb3IgYW5cbiAgICogZW1wdHkgcmVzcG9uc2UgYm9keSkuIEFueSBvdGhlciBlcnJvciBpcyB0aHJvd246IHRoZSBoYW5kbGVycyBkaXNhZ3JlZSBvblxuICAgKiB3aGV0aGVyIG9uZSBpcyB3b3J0aCBsb2dnaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgICBuZXcgR2V0T2JqZWN0Q29tbWFuZCh7IEJ1Y2tldDogdGhpcy5idWNrZXROYW1lLCBLZXk6IGtleSB9KSxcbiAgICAgICk7XG4gICAgICBpZiAoIXJlc3BvbnNlLkJvZHkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5Cb2R5LnRyYW5zZm9ybVRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vU3VjaEtleSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdyaXRlIGBib2R5YCBhcyBhIEpTT04gb2JqZWN0IGF0IGBrZXlgLiAqL1xuICBhc3luYyBwdXRKc29uKGtleTogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5zZW5kKFxuICAgICAgbmV3IFB1dE9iamVjdENvbW1hbmQoe1xuICAgICAgICBCdWNrZXQ6IHRoaXMuYnVja2V0TmFtZSxcbiAgICAgICAgS2V5OiBrZXksXG4gICAgICAgIEJvZHk6IGJvZHksXG4gICAgICAgIENvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLThcIixcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==