@dbx-tools/appkit 0.9.154 → 0.9.158

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 (44) hide show
  1. package/index.ts +18 -13
  2. package/lib/index.d.ts +18 -13
  3. package/lib/index.js +19 -12
  4. package/lib/src/appkit.js +6 -6
  5. package/lib/src/brand-context.js +3 -3
  6. package/lib/src/cache-storage.d.ts +1 -1
  7. package/lib/src/cache-storage.js +6 -6
  8. package/lib/src/databricks.js +3 -3
  9. package/lib/src/files-cache.js +9 -9
  10. package/lib/src/identity.d.ts +0 -14
  11. package/lib/src/identity.js +9 -23
  12. package/lib/src/interceptor.js +3 -3
  13. package/lib/src/lakebase-resolver.d.ts +1 -1
  14. package/lib/src/lakebase-resolver.js +16 -17
  15. package/lib/src/migration.js +6 -6
  16. package/lib/src/openapi-tool.js +5 -5
  17. package/lib/src/plugin-execution.d.ts +2 -2
  18. package/lib/src/plugin-execution.js +4 -4
  19. package/lib/src/provision.d.ts +2 -2
  20. package/lib/src/provision.js +4 -4
  21. package/lib/src/request-tags.js +2 -2
  22. package/lib/src/telemetry.js +4 -4
  23. package/lib/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +10 -178
  25. package/src/appkit.ts +5 -5
  26. package/src/brand-context.ts +2 -2
  27. package/src/cache-storage.ts +5 -5
  28. package/src/databricks.ts +2 -2
  29. package/src/files-cache.ts +8 -8
  30. package/src/identity.ts +16 -25
  31. package/src/interceptor.ts +2 -2
  32. package/src/lakebase-resolver.ts +27 -34
  33. package/src/migration.ts +11 -5
  34. package/src/openapi-tool.ts +4 -4
  35. package/src/plugin-execution.ts +4 -4
  36. package/src/provision.ts +4 -4
  37. package/src/request-tags.ts +1 -1
  38. package/src/telemetry.ts +3 -3
  39. package/lib/src/bundle.d.ts +0 -33
  40. package/lib/src/bundle.js +0 -38
  41. package/lib/src/pgaddress.d.ts +0 -20
  42. package/lib/src/pgaddress.js +0 -21
  43. package/src/bundle.ts +0 -57
  44. package/src/pgaddress.ts +0 -42
@@ -19,7 +19,7 @@
19
19
  * @module
20
20
  */
21
21
  import { Plugin, toPlugin } from "@databricks/appkit";
22
- import { errorUtils, log } from "@dbx-tools/shared-core";
22
+ import { log, toError } from "@dbx-tools/shared-core";
23
23
  const logger = log.logger("interceptor");
24
24
  /**
25
25
  * Build an {@link InterceptorContext} + its {@link InterceptorRuntime}.
@@ -46,7 +46,7 @@ export function createInterceptorContext(env) {
46
46
  // never blocks its siblings.
47
47
  logger.warn("lifecycle handler failed", {
48
48
  event,
49
- error: errorUtils.toError(error),
49
+ error: toError(error),
50
50
  });
51
51
  }
52
52
  }
@@ -92,4 +92,4 @@ export class LifecycleBridgePlugin extends Plugin {
92
92
  }
93
93
  /** Factory for the injected {@link LifecycleBridgePlugin}. */
94
94
  export const lifecycleBridge = toPlugin(LifecycleBridgePlugin);
95
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBOEMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3pELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUE0RXpDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEdBQW1CO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO0lBRS9ELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBcUIsRUFBRSxFQUFvQixFQUFRLEVBQUU7UUFDeEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUNuQixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLEtBQXFCLEVBQWlCLEVBQUU7UUFDbkUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNiLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHdFQUF3RTtnQkFDeEUsNkJBQTZCO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO29CQUN0QyxLQUFLO29CQUNMLEtBQUssRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztpQkFDakMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBdUI7UUFDbEMsR0FBRztRQUNILFdBQVc7S0FDWixDQUFDO0lBRUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBaUJELFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3RDLE9BQU8sT0FBUSxPQUE0QyxFQUFFLFdBQVcsS0FBSyxVQUFVLENBQUM7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxNQUE2QjtJQUN0RSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixXQUFXLEVBQUUsc0VBQXNFO1FBQ25GLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0tBQ1UsQ0FBQztJQUU3QyxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDM0YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgY3JlYXRlQXBwYCBJTlRFUkNFUFRPUiBjb250ZXh0OiBhbiBpbi1wcm9jZXNzIGhhbmRsZSBhbiBhcHAgaGFuZHMgdG9cbiAqIGFkZC1vbnMgKHRoZSB0dW5uZWwsIGNoaWVmbHkpIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb25cbiAqIGNvbXB1dGVkIGFuZCBob29rIEFwcEtpdCdzIGxpZmVjeWNsZS5cbiAqXG4gKiBBbiBpbnRlcmNlcHRvciBpcyBhIHBsYWluIGZ1bmN0aW9uIGAoY3R4KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPmAgcGFzc2VkIHRvXG4gKiBgYXBwa2l0LmNyZWF0ZUFwcGAncyBgaW50ZXJjZXB0b3JgIG9wdGlvbiAoXCJvbmUgb3IgbWFueVwiKS4gYGFwcGtpdC5jcmVhdGVBcHBgXG4gKiBydW5zIGVhY2ggb25lIEFGVEVSIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgcG9wdWxhdGVkIGBwcm9jZXNzLmVudmAgYnV0IGFzIHBhcnRcbiAqIG9mIGJvb3RpbmcgdGhlIGFwcCwgc28gYW4gaW50ZXJjZXB0b3Igc2VlcyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBhbmQgY2FuIGJpbmRcbiAqIHByb2Nlc3NlcyBiZWZvcmUgb3IgZHVyaW5nIHNldHVwLlxuICpcbiAqIFRoZSBuYW1lcyBoZXJlIG1pcnJvciBBcHBLaXQncyBvd24gdm9jYWJ1bGFyeSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgcGFyYWxsZWxcbiAqIG9uZXM6IHtAbGluayBMaWZlY3ljbGVFdmVudH0gYW5kIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHQub25MaWZlY3ljbGV9IGFyZSB0aGVcbiAqIGV4YWN0IHNoYXBlIG9mIGBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlYCAoYHNldHVwOmNvbXBsZXRlYCAvIGBzZXJ2ZXI6cmVhZHlgIC9cbiAqIGBzaHV0ZG93bmApLiBUaGUgYnJpZGdlIHRoYXQgbWFrZXMgdGhhdCBob29rIHJlYWNoYWJsZSBmcm9tIE9VVFNJREUgYSBwbHVnaW4gLVxuICogd2hlcmUgaW50ZXJjZXB0b3JzIHJ1biAtIGlzIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9LCBhIHRpbnkgaW50ZXJuYWwgcGx1Z2luXG4gKiBgYXBwa2l0LmNyZWF0ZUFwcGAgaW5qZWN0cyB0byBjYXB0dXJlIGB0aGlzLmNvbnRleHRgIGFuZCByZWxheSBpdHMgZXZlbnRzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBQbHVnaW4sIHRvUGx1Z2luLCB0eXBlIEJhc2VQbHVnaW5Db25maWcsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiaW50ZXJjZXB0b3JcIik7XG5cbi8qKlxuICogQXBwS2l0J3MgcGx1Z2luLWxpZmVjeWNsZSBldmVudHMsIHZlcmJhdGltIGZyb20gYFBsdWdpbkNvbnRleHRgXG4gKiAoYG5vZGVfbW9kdWxlcy9AZGF0YWJyaWNrcy9hcHBraXQvLi4uL2NvcmUvcGx1Z2luLWNvbnRleHQuZC50c2ApLiBSZS1kZWNsYXJlZFxuICogc3RydWN0dXJhbGx5IHJhdGhlciB0aGFuIGltcG9ydGVkIGJlY2F1c2UgYFBsdWdpbkNvbnRleHRgIGlzIG5vdCBpbiB0aGVcbiAqIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwICh0aGUgc2FtZSByZWFzb24ge0BsaW5rIFBsdWdpbkNvbnRleHRMaWtlfSBleGlzdHMgaW5cbiAqIGAuL3BsdWdpbmApLlxuICpcbiAqIC0gYHNldHVwOmNvbXBsZXRlYCAtIGV2ZXJ5IHBsdWdpbidzIGBzZXR1cCgpYCBoYXMgcmVzb2x2ZWQuXG4gKiAtIGBzZXJ2ZXI6cmVhZHlgIC0gdGhlIGBzZXJ2ZXIoKWAgcGx1Z2luIGlzIGxpc3RlbmluZyAobmV2ZXIgZmlyZXMgZm9yIGFcbiAqICAgc2VydmVybGVzcyBhcHAsIGUuZy4gdGhlIHR1bm5lbCBnYXRlKS5cbiAqIC0gYHNodXRkb3duYCAtIHRoZSBhcHAgaXMgdGVhcmluZyBkb3duLlxuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVFdmVudCA9IFwic2V0dXA6Y29tcGxldGVcIiB8IFwic2VydmVyOnJlYWR5XCIgfCBcInNodXRkb3duXCI7XG5cbi8qKiBBIGxpZmVjeWNsZSBzdWJzY3JpYmVyLiBFcnJvcnMgYXJlIGxvZ2dlZCwgbm90IHByb3BhZ2F0ZWQgKG1hdGNoZXMgQXBwS2l0KS4gKi9cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUhhbmRsZXIgPSAoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgZW52IGF1dG8tY29uZmlndXJhdGlvbiByZXNvbHZlZCBiZWZvcmUgYm9vdCwgZXhwb3NlZCB0byBpbnRlcmNlcHRvcnMgc29cbiAqIHRoZXkgcmVhZCBDT01QVVRFRCB2YWx1ZXMgaW5zdGVhZCBvZiByZS1yZWFkaW5nIGBwcm9jZXNzLmVudmAgdGhlbXNlbHZlcy5cbiAqXG4gKiBgbGFrZWJhc2VgIGlzIHRoZSByZXNvbHZlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHdoZW4gTGFrZWJhc2UgYXV0by1jb25maWcgcmFuXG4gKiAoc2VlIGBhcHBraXQuYXV0b0NvbmZpZ3VyZWApLCBlbHNlIGB1bmRlZmluZWRgLiBgZGF0YWJyaWNrc0hvc3RgIGlzIHRoZVxuICogd29ya3NwYWNlIGhvc3QgYXMgcmVzb2x2ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hpY2ggdGhlXG4gKiB0dW5uZWwgaW50ZXJjZXB0b3IgYm90aCByZWFkcyBhbmQsIHdoZW4gaXQgbXVzdCwgc2V0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcEVudiB7XG4gIC8qKiBSZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uLCB3aGVuIGF1dG8tY29uZmlnIHJlc29sdmVkIG9uZS4gKi9cbiAgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZUNvbm5lY3Rpb247XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0IChgREFUQUJSSUNLU19IT1NUYCksIHdoZW4ga25vd24uICovXG4gIHJlYWRvbmx5IGRhdGFicmlja3NIb3N0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVhY2ggaW50ZXJjZXB0b3IuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IGFwcGtpdC5jcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbc2VydmVyKCldLFxuICogICBpbnRlcmNlcHRvcjogKGN0eCkgPT4ge1xuICogICAgIGNvbnN0IGF1eGlsaWFyeSA9IHN0YXJ0QXV4aWxpYXJ5KGN0eC5lbnYuZGF0YWJyaWNrc0hvc3QpO1xuICogICAgIGN0eC5vbkxpZmVjeWNsZShcInNodXRkb3duXCIsICgpID0+IGF1eGlsaWFyeS5zdG9wKCkpO1xuICogICB9LFxuICogfSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JDb250ZXh0IHtcbiAgLyoqIFRoZSBlbnYgYXV0by1jb25maWd1cmF0aW9uIGNvbXB1dGVkIGJlZm9yZSBib290LiAqL1xuICByZWFkb25seSBlbnY6IFJlc29sdmVkQXBwRW52O1xuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGFuIEFwcEtpdCBsaWZlY3ljbGUgZXZlbnQuIE1pcnJvcnMgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgO1xuICAgKiB0aGUgaW5qZWN0ZWQge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0gcmVsYXlzIHRoZSByZWFsIGV2ZW50cyBoZXJlIG9uY2UgdGhlIGFwcFxuICAgKiBib290cy4gQSBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIGFuIGV2ZW50IHRoYXQgYWxyZWFkeSBmaXJlZCBpcyBOT1QgY2FsbGVkXG4gICAqIHJldHJvYWN0aXZlbHkgKHNhbWUgc2VtYW50aWNzIGFzIEFwcEtpdCkuXG4gICAqL1xuICBvbkxpZmVjeWNsZShldmVudDogTGlmZWN5Y2xlRXZlbnQsIGZuOiBMaWZlY3ljbGVIYW5kbGVyKTogdm9pZDtcbn1cblxuLyoqIEEgc2luZ2xlIGludGVyY2VwdG9yLCBvciBzZXZlcmFsLiBUaGUgYGNyZWF0ZUFwcGAgYGludGVyY2VwdG9yPzpgIG9wdGlvbi4gKi9cbmV4cG9ydCB0eXBlIEludGVyY2VwdG9yID0gKGN0eDogSW50ZXJjZXB0b3JDb250ZXh0KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgbXV0YWJsZSBtYWNoaW5lcnkgYmVoaW5kIGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9LiBTcGxpdCBvdXQgc29cbiAqIHtAbGluayBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHR9IGNhbiBoYW5kIHRoZSBwdWJsaWMgY29udGV4dCB0byBpbnRlcmNlcHRvcnNcbiAqIHdoaWxlIGBhcHBraXQuY3JlYXRlQXBwYCByZXRhaW5zIHRoZSBgZW1pdExpZmVjeWNsZWAgc2lkZS1jaGFubmVsIHRoZSBicmlkZ2UgZHJpdmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVyY2VwdG9yUnVudGltZSB7XG4gIC8qKiBUaGUgY29udGV4dCBoYW5kZWQgdG8gZWFjaCBpbnRlcmNlcHRvci4gKi9cbiAgcmVhZG9ubHkgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0O1xuICAvKiogRmlyZSBhIGxpZmVjeWNsZSBldmVudCB0byBldmVyeSBzdWJzY3JpYmVyIChjYWxsZWQgYnkge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0pLiAqL1xuICBlbWl0TGlmZWN5Y2xlKGV2ZW50OiBMaWZlY3ljbGVFdmVudCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0gKyBpdHMge0BsaW5rIEludGVyY2VwdG9yUnVudGltZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbnRlcmNlcHRvckNvbnRleHQoZW52OiBSZXNvbHZlZEFwcEVudik6IEludGVyY2VwdG9yUnVudGltZSB7XG4gIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDxMaWZlY3ljbGVFdmVudCwgTGlmZWN5Y2xlSGFuZGxlcltdPigpO1xuXG4gIGNvbnN0IG9uTGlmZWN5Y2xlID0gKGV2ZW50OiBMaWZlY3ljbGVFdmVudCwgZm46IExpZmVjeWNsZUhhbmRsZXIpOiB2b2lkID0+IHtcbiAgICBjb25zdCBsaXN0ID0gaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAobGlzdCkgbGlzdC5wdXNoKGZuKTtcbiAgICBlbHNlIGhhbmRsZXJzLnNldChldmVudCwgW2ZuXSk7XG4gIH07XG5cbiAgY29uc3QgZW1pdExpZmVjeWNsZSA9IGFzeW5jIChldmVudDogTGlmZWN5Y2xlRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBsaXN0ID0gaGFuZGxlcnMuZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWxpc3QpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGxpc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZuKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBNYXRjaCBBcHBLaXQ6IGEgZmFpbGluZyBsaWZlY3ljbGUgaGFuZGxlciBpcyBsb2dnZWQsIG5ldmVyIGZhdGFsLCBhbmRcbiAgICAgICAgLy8gbmV2ZXIgYmxvY2tzIGl0cyBzaWJsaW5ncy5cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJsaWZlY3ljbGUgaGFuZGxlciBmYWlsZWRcIiwge1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0ID0ge1xuICAgIGVudixcbiAgICBvbkxpZmVjeWNsZSxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiBgYXBwa2l0LmNyZWF0ZUFwcGAgaW5qZWN0cyB0byBtYWtlIEFwcEtpdCdzIGxpZmVjeWNsZVxuICogcmVhY2hhYmxlIGZyb20gaW50ZXJjZXB0b3IgY29kZS4gT24gYHNldHVwKClgIGl0IHJlYWRzIGl0cyBvd24gYHRoaXMuY29udGV4dGBcbiAqICh0aGUgcmVhbCBgUGx1Z2luQ29udGV4dGApIGFuZCBmb3J3YXJkcyBlYWNoIHtAbGluayBMaWZlY3ljbGVFdmVudH0gdG8gdGhlXG4gKiBpbnRlcmNlcHRvciBydW50aW1lLCBzbyBgY3R4Lm9uTGlmZWN5Y2xlKC4uLilgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmVcbiAqIGV2ZW50cy4gSXQgb3ducyBubyByb3V0ZXMsIGNvbmZpZyBzdXJmYWNlLCBvciBleHBvcnRzLlxuICovXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExpZmVjeWNsZUJyaWRnZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJkYnhUb29sc0xpZmVjeWNsZUJyaWRnZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkxpZmVjeWNsZSBCcmlkZ2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZWxheXMgQXBwS2l0IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGNyZWF0ZUFwcCBpbnRlcmNlcHRvciBjb250ZXh0LlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCI+O1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLmNvbmZpZy5ydW50aW1lO1xuICAgIGlmICghcnVudGltZSkgcmV0dXJuO1xuICAgIGlmICghaGFzT25MaWZlY3ljbGUodGhpcy5jb250ZXh0KSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwibm8gUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZSB0byBicmlkZ2U7IGludGVyY2VwdG9yIGxpZmVjeWNsZSBldmVudHMgaW5lcnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50czogTGlmZWN5Y2xlRXZlbnRbXSA9IFtcInNldHVwOmNvbXBsZXRlXCIsIFwic2VydmVyOnJlYWR5XCIsIFwic2h1dGRvd25cIl07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkxpZmVjeWNsZShldmVudCwgKCkgPT4gcnVudGltZS5lbWl0TGlmZWN5Y2xlKGV2ZW50KSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBGYWN0b3J5IGZvciB0aGUgaW5qZWN0ZWQge0BsaW5rIExpZmVjeWNsZUJyaWRnZVBsdWdpbn0uICovXG5leHBvcnQgY29uc3QgbGlmZWN5Y2xlQnJpZGdlID0gdG9QbHVnaW4oTGlmZWN5Y2xlQnJpZGdlUGx1Z2luKTtcbiJdfQ==
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBOEMsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3RELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUE0RXpDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLEdBQW1CO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFzQyxDQUFDO0lBRS9ELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBcUIsRUFBRSxFQUFvQixFQUFRLEVBQUU7UUFDeEUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztZQUNuQixRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLEtBQXFCLEVBQWlCLEVBQUU7UUFDbkUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU87UUFDbEIsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNiLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHdFQUF3RTtnQkFDeEUsNkJBQTZCO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFO29CQUN0QyxLQUFLO29CQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDO2lCQUN0QixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUF1QjtRQUNsQyxHQUFHO1FBQ0gsV0FBVztLQUNaLENBQUM7SUFFRixPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQ3BDLENBQUM7QUFpQkQsU0FBUyxjQUFjLENBQUMsT0FBZ0I7SUFDdEMsT0FBTyxPQUFRLE9BQTRDLEVBQUUsV0FBVyxLQUFLLFVBQVUsQ0FBQztBQUMxRixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLHFCQUFzQixTQUFRLE1BQTZCO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsSUFBSSxFQUFFLHlCQUF5QjtRQUMvQixXQUFXLEVBQUUsa0JBQWtCO1FBQy9CLFdBQVcsRUFBRSxzRUFBc0U7UUFDbkYsU0FBUyxFQUFFLE1BQU07UUFDakIsTUFBTSxFQUFFLElBQUk7UUFDWixTQUFTLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUU7S0FDVSxDQUFDO0lBRTdDLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztZQUMzRixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFxQixDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEUsQ0FBQztJQUNILENBQUM7O0FBR0gsOERBQThEO0FBQzlELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGBjcmVhdGVBcHBgIElOVEVSQ0VQVE9SIGNvbnRleHQ6IGFuIGluLXByb2Nlc3MgaGFuZGxlIGFuIGFwcCBoYW5kcyB0b1xuICogYWRkLW9ucyAodGhlIHR1bm5lbCwgY2hpZWZseSkgc28gdGhleSBjYW4gcmVhZCB0aGUgZW52IGF1dG8tY29uZmlndXJhdGlvblxuICogY29tcHV0ZWQgYW5kIGhvb2sgQXBwS2l0J3MgbGlmZWN5Y2xlLlxuICpcbiAqIEFuIGludGVyY2VwdG9yIGlzIGEgcGxhaW4gZnVuY3Rpb24gYChjdHgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+YCBwYXNzZWQgdG9cbiAqIGBhcHBraXQuY3JlYXRlQXBwYCdzIGBpbnRlcmNlcHRvcmAgb3B0aW9uIChcIm9uZSBvciBtYW55XCIpLiBgYXBwa2l0LmNyZWF0ZUFwcGBcbiAqIHJ1bnMgZWFjaCBvbmUgQUZURVIgYXV0by1jb25maWd1cmF0aW9uIGhhcyBwb3B1bGF0ZWQgYHByb2Nlc3MuZW52YCBidXQgYXMgcGFydFxuICogb2YgYm9vdGluZyB0aGUgYXBwLCBzbyBhbiBpbnRlcmNlcHRvciBzZWVzIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIGFuZCBjYW4gYmluZFxuICogcHJvY2Vzc2VzIGJlZm9yZSBvciBkdXJpbmcgc2V0dXAuXG4gKlxuICogVGhlIG5hbWVzIGhlcmUgbWlycm9yIEFwcEtpdCdzIG93biB2b2NhYnVsYXJ5IHJhdGhlciB0aGFuIGludmVudGluZyBwYXJhbGxlbFxuICogb25lczoge0BsaW5rIExpZmVjeWNsZUV2ZW50fSBhbmQge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dC5vbkxpZmVjeWNsZX0gYXJlIHRoZVxuICogZXhhY3Qgc2hhcGUgb2YgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgIChgc2V0dXA6Y29tcGxldGVgIC8gYHNlcnZlcjpyZWFkeWAgL1xuICogYHNodXRkb3duYCkuIFRoZSBicmlkZ2UgdGhhdCBtYWtlcyB0aGF0IGhvb2sgcmVhY2hhYmxlIGZyb20gT1VUU0lERSBhIHBsdWdpbiAtXG4gKiB3aGVyZSBpbnRlcmNlcHRvcnMgcnVuIC0gaXMge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0sIGEgdGlueSBpbnRlcm5hbCBwbHVnaW5cbiAqIGBhcHBraXQuY3JlYXRlQXBwYCBpbmplY3RzIHRvIGNhcHR1cmUgYHRoaXMuY29udGV4dGAgYW5kIHJlbGF5IGl0cyBldmVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IFBsdWdpbiwgdG9QbHVnaW4sIHR5cGUgQmFzZVBsdWdpbkNvbmZpZywgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IExha2ViYXNlQ29ubmVjdGlvbiB9IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJpbnRlcmNlcHRvclwiKTtcblxuLyoqXG4gKiBBcHBLaXQncyBwbHVnaW4tbGlmZWN5Y2xlIGV2ZW50cywgdmVyYmF0aW0gZnJvbSBgUGx1Z2luQ29udGV4dGBcbiAqIChgbm9kZV9tb2R1bGVzL0BkYXRhYnJpY2tzL2FwcGtpdC8uLi4vY29yZS9wbHVnaW4tY29udGV4dC5kLnRzYCkuIFJlLWRlY2xhcmVkXG4gKiBzdHJ1Y3R1cmFsbHkgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgYmVjYXVzZSBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGluIHRoZVxuICogcGFja2FnZSdzIGBleHBvcnRzYCBtYXAgKHRoZSBzYW1lIHJlYXNvbiB7QGxpbmsgUGx1Z2luQ29udGV4dExpa2V9IGV4aXN0cyBpblxuICogYC4vcGx1Z2luYCkuXG4gKlxuICogLSBgc2V0dXA6Y29tcGxldGVgIC0gZXZlcnkgcGx1Z2luJ3MgYHNldHVwKClgIGhhcyByZXNvbHZlZC5cbiAqIC0gYHNlcnZlcjpyZWFkeWAgLSB0aGUgYHNlcnZlcigpYCBwbHVnaW4gaXMgbGlzdGVuaW5nIChuZXZlciBmaXJlcyBmb3IgYVxuICogICBzZXJ2ZXJsZXNzIGFwcCwgZS5nLiB0aGUgdHVubmVsIGdhdGUpLlxuICogLSBgc2h1dGRvd25gIC0gdGhlIGFwcCBpcyB0ZWFyaW5nIGRvd24uXG4gKi9cbmV4cG9ydCB0eXBlIExpZmVjeWNsZUV2ZW50ID0gXCJzZXR1cDpjb21wbGV0ZVwiIHwgXCJzZXJ2ZXI6cmVhZHlcIiB8IFwic2h1dGRvd25cIjtcblxuLyoqIEEgbGlmZWN5Y2xlIHN1YnNjcmliZXIuIEVycm9ycyBhcmUgbG9nZ2VkLCBub3QgcHJvcGFnYXRlZCAobWF0Y2hlcyBBcHBLaXQpLiAqL1xuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlSGFuZGxlciA9ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBlbnYgYXV0by1jb25maWd1cmF0aW9uIHJlc29sdmVkIGJlZm9yZSBib290LCBleHBvc2VkIHRvIGludGVyY2VwdG9ycyBzb1xuICogdGhleSByZWFkIENPTVBVVEVEIHZhbHVlcyBpbnN0ZWFkIG9mIHJlLXJlYWRpbmcgYHByb2Nlc3MuZW52YCB0aGVtc2VsdmVzLlxuICpcbiAqIGBsYWtlYmFzZWAgaXMgdGhlIHJlc29sdmVkIFBvc3RncmVzIGNvbm5lY3Rpb24gd2hlbiBMYWtlYmFzZSBhdXRvLWNvbmZpZyByYW5cbiAqIChzZWUgYGFwcGtpdC5hdXRvQ29uZmlndXJlYCksIGVsc2UgYHVuZGVmaW5lZGAuIGBkYXRhYnJpY2tzSG9zdGAgaXMgdGhlXG4gKiB3b3Jrc3BhY2UgaG9zdCBhcyByZXNvbHZlZCBpbnRvIHRoZSBlbnZpcm9ubWVudCAoYERBVEFCUklDS1NfSE9TVGApLCB3aGljaCB0aGVcbiAqIHR1bm5lbCBpbnRlcmNlcHRvciBib3RoIHJlYWRzIGFuZCwgd2hlbiBpdCBtdXN0LCBzZXRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXBwRW52IHtcbiAgLyoqIFJlc29sdmVkIExha2ViYXNlIGNvbm5lY3Rpb24sIHdoZW4gYXV0by1jb25maWcgcmVzb2x2ZWQgb25lLiAqL1xuICByZWFkb25seSBsYWtlYmFzZT86IExha2ViYXNlQ29ubmVjdGlvbjtcbiAgLyoqIFJlc29sdmVkIERhdGFicmlja3Mgd29ya3NwYWNlIGhvc3QgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hlbiBrbm93bi4gKi9cbiAgcmVhZG9ubHkgZGF0YWJyaWNrc0hvc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgYXBwa2l0LmNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtzZXJ2ZXIoKV0sXG4gKiAgIGludGVyY2VwdG9yOiAoY3R4KSA9PiB7XG4gKiAgICAgY29uc3QgYXV4aWxpYXJ5ID0gc3RhcnRBdXhpbGlhcnkoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCk7XG4gKiAgICAgY3R4Lm9uTGlmZWN5Y2xlKFwic2h1dGRvd25cIiwgKCkgPT4gYXV4aWxpYXJ5LnN0b3AoKSk7XG4gKiAgIH0sXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmNlcHRvckNvbnRleHQge1xuICAvKiogVGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb24gY29tcHV0ZWQgYmVmb3JlIGJvb3QuICovXG4gIHJlYWRvbmx5IGVudjogUmVzb2x2ZWRBcHBFbnY7XG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gYW4gQXBwS2l0IGxpZmVjeWNsZSBldmVudC4gTWlycm9ycyBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWA7XG4gICAqIHRoZSBpbmplY3RlZCB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSByZWxheXMgdGhlIHJlYWwgZXZlbnRzIGhlcmUgb25jZSB0aGUgYXBwXG4gICAqIGJvb3RzLiBBIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgYW4gZXZlbnQgdGhhdCBhbHJlYWR5IGZpcmVkIGlzIE5PVCBjYWxsZWRcbiAgICogcmV0cm9hY3RpdmVseSAoc2FtZSBzZW1hbnRpY3MgYXMgQXBwS2l0KS5cbiAgICovXG4gIG9uTGlmZWN5Y2xlKGV2ZW50OiBMaWZlY3ljbGVFdmVudCwgZm46IExpZmVjeWNsZUhhbmRsZXIpOiB2b2lkO1xufVxuXG4vKiogQSBzaW5nbGUgaW50ZXJjZXB0b3IsIG9yIHNldmVyYWwuIFRoZSBgY3JlYXRlQXBwYCBgaW50ZXJjZXB0b3I/OmAgb3B0aW9uLiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJjZXB0b3IgPSAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBtdXRhYmxlIG1hY2hpbmVyeSBiZWhpbmQgYW4ge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dH0uIFNwbGl0IG91dCBzb1xuICoge0BsaW5rIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dH0gY2FuIGhhbmQgdGhlIHB1YmxpYyBjb250ZXh0IHRvIGludGVyY2VwdG9yc1xuICogd2hpbGUgYGFwcGtpdC5jcmVhdGVBcHBgIHJldGFpbnMgdGhlIGBlbWl0TGlmZWN5Y2xlYCBzaWRlLWNoYW5uZWwgdGhlIGJyaWRnZSBkcml2ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgLyoqIFRoZSBjb250ZXh0IGhhbmRlZCB0byBlYWNoIGludGVyY2VwdG9yLiAqL1xuICByZWFkb25seSBjb250ZXh0OiBJbnRlcmNlcHRvckNvbnRleHQ7XG4gIC8qKiBGaXJlIGEgbGlmZWN5Y2xlIGV2ZW50IHRvIGV2ZXJ5IHN1YnNjcmliZXIgKGNhbGxlZCBieSB7QGxpbmsgbGlmZWN5Y2xlQnJpZGdlfSkuICovXG4gIGVtaXRMaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50KTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSArIGl0cyB7QGxpbmsgSW50ZXJjZXB0b3JSdW50aW1lfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dChlbnY6IFJlc29sdmVkQXBwRW52KTogSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyW10+KCk7XG5cbiAgY29uc3Qgb25MaWZlY3ljbGUgPSAoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2goZm4pO1xuICAgIGVsc2UgaGFuZGxlcnMuc2V0KGV2ZW50LCBbZm5dKTtcbiAgfTtcblxuICBjb25zdCBlbWl0TGlmZWN5Y2xlID0gYXN5bmMgKGV2ZW50OiBMaWZlY3ljbGVFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGxpc3QgPSBoYW5kbGVycy5nZXQoZXZlbnQpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgZm4gb2YgbGlzdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIE1hdGNoIEFwcEtpdDogYSBmYWlsaW5nIGxpZmVjeWNsZSBoYW5kbGVyIGlzIGxvZ2dlZCwgbmV2ZXIgZmF0YWwsIGFuZFxuICAgICAgICAvLyBuZXZlciBibG9ja3MgaXRzIHNpYmxpbmdzLlxuICAgICAgICBsb2dnZXIud2FybihcImxpZmVjeWNsZSBoYW5kbGVyIGZhaWxlZFwiLCB7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgY29udGV4dDogSW50ZXJjZXB0b3JDb250ZXh0ID0ge1xuICAgIGVudixcbiAgICBvbkxpZmVjeWNsZSxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiBgYXBwa2l0LmNyZWF0ZUFwcGAgaW5qZWN0cyB0byBtYWtlIEFwcEtpdCdzIGxpZmVjeWNsZVxuICogcmVhY2hhYmxlIGZyb20gaW50ZXJjZXB0b3IgY29kZS4gT24gYHNldHVwKClgIGl0IHJlYWRzIGl0cyBvd24gYHRoaXMuY29udGV4dGBcbiAqICh0aGUgcmVhbCBgUGx1Z2luQ29udGV4dGApIGFuZCBmb3J3YXJkcyBlYWNoIHtAbGluayBMaWZlY3ljbGVFdmVudH0gdG8gdGhlXG4gKiBpbnRlcmNlcHRvciBydW50aW1lLCBzbyBgY3R4Lm9uTGlmZWN5Y2xlKC4uLilgIGhhbmRsZXJzIGZpcmUgb24gdGhlIGdlbnVpbmVcbiAqIGV2ZW50cy4gSXQgb3ducyBubyByb3V0ZXMsIGNvbmZpZyBzdXJmYWNlLCBvciBleHBvcnRzLlxuICovXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlQnJpZGdlUGx1Z2luIGV4dGVuZHMgUGx1Z2luPExpZmVjeWNsZUJyaWRnZUNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJkYnhUb29sc0xpZmVjeWNsZUJyaWRnZVwiLFxuICAgIGRpc3BsYXlOYW1lOiBcIkxpZmVjeWNsZSBCcmlkZ2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJSZWxheXMgQXBwS2l0IGxpZmVjeWNsZSBldmVudHMgdG8gdGhlIGNyZWF0ZUFwcCBpbnRlcmNlcHRvciBjb250ZXh0LlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgaGlkZGVuOiB0cnVlLFxuICAgIHJlc291cmNlczogeyByZXF1aXJlZDogW10sIG9wdGlvbmFsOiBbXSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCI+O1xuXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLmNvbmZpZy5ydW50aW1lO1xuICAgIGlmICghcnVudGltZSkgcmV0dXJuO1xuICAgIGlmICghaGFzT25MaWZlY3ljbGUodGhpcy5jb250ZXh0KSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwibm8gUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZSB0byBicmlkZ2U7IGludGVyY2VwdG9yIGxpZmVjeWNsZSBldmVudHMgaW5lcnRcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV2ZW50czogTGlmZWN5Y2xlRXZlbnRbXSA9IFtcInNldHVwOmNvbXBsZXRlXCIsIFwic2VydmVyOnJlYWR5XCIsIFwic2h1dGRvd25cIl07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHMpIHtcbiAgICAgIHRoaXMuY29udGV4dC5vbkxpZmVjeWNsZShldmVudCwgKCkgPT4gcnVudGltZS5lbWl0TGlmZWN5Y2xlKGV2ZW50KSk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBGYWN0b3J5IGZvciB0aGUgaW5qZWN0ZWQge0BsaW5rIExpZmVjeWNsZUJyaWRnZVBsdWdpbn0uICovXG5leHBvcnQgY29uc3QgbGlmZWN5Y2xlQnJpZGdlID0gdG9QbHVnaW4oTGlmZWN5Y2xlQnJpZGdlUGx1Z2luKTtcbiJdfQ==
@@ -35,7 +35,7 @@
35
35
  * @module
36
36
  */
37
37
  import { type LakebasePool } from "@databricks/appkit";
38
- import { type LakebaseConnectionInputs, type SslMode } from "./pgaddress.ts";
38
+ import { type LakebaseConnectionInputs, type SslMode } from "@dbx-tools/lakebase";
39
39
  /**
40
40
  * User-supplied Lakebase inputs (config or env) before any API resolution.
41
41
  * Extends {@link LakebaseConnectionInputs} with resolver-only options.
@@ -35,11 +35,11 @@
35
35
  * @module
36
36
  */
37
37
  import { ConfigurationError, ExecutionError, getUsernameWithApiLookup, getWorkspaceClient, ValidationError, } from "@databricks/appkit";
38
- import { configUtils, projectUtils } from "@dbx-tools/core";
39
- import { asyncUtils, errorUtils, log, object, options as sharedOptions, stringUtils, } from "@dbx-tools/shared-core";
38
+ import { projectUtils, resolveValue } from "@dbx-tools/core";
39
+ import { parseAddress, parseResourcePath, parseSslMode as parseNativeSslMode, SSL_MODES, } from "@dbx-tools/lakebase";
40
+ import { log, sleep, toError, isRecord, tcpPortSchema, databricksEnvironmentNames, toSlugWithOptions, MAX_TCP_PORT, } from "@dbx-tools/shared-core";
40
41
  import { z } from "zod";
41
42
  import { toContext } from "./databricks.js";
42
- import { parseAddress, parseResourcePath, parseSslMode as parseNativeSslMode, SSL_MODES, } from "./pgaddress.js";
43
43
  const logger = log.logger("lakebase-resolver");
44
44
  const API_BASE = "/api/2.0/postgres";
45
45
  const DEFAULT_PORT = 5432;
@@ -173,7 +173,7 @@ const operationSchema = z.object({
173
173
  response: z.unknown().optional().describe("Result payload present when the operation succeeded."),
174
174
  });
175
175
  /** `PGPORT` must land inside the TCP port range. */
176
- const portSchema = sharedOptions.tcpPortSchema;
176
+ const portSchema = tcpPortSchema;
177
177
  /**
178
178
  * Validate a `PGPORT`-shaped value. Returns `undefined` when unset, and throws
179
179
  * a {@link ValidationError} naming `PGPORT` for anything that is not a TCP
@@ -184,7 +184,7 @@ export function parsePort(value) {
184
184
  return undefined;
185
185
  const parsed = portSchema.safeParse(value);
186
186
  if (!parsed.success) {
187
- throw ValidationError.invalidValue("PGPORT", value, `a TCP port between 1 and ${configUtils.MAX_TCP_PORT}`);
187
+ throw ValidationError.invalidValue("PGPORT", value, `a TCP port between 1 and ${MAX_TCP_PORT}`);
188
188
  }
189
189
  return parsed.data;
190
190
  }
@@ -218,7 +218,7 @@ export function nextPollDelay(attempt, baseMs) {
218
218
  * instead of finishing its backoff first.
219
219
  */
220
220
  export function pollDelay(attempt, baseMs, signal) {
221
- return asyncUtils.sleep(nextPollDelay(attempt, baseMs), signal);
221
+ return sleep(nextPollDelay(attempt, baseMs), signal);
222
222
  }
223
223
  /**
224
224
  * Pull resolver inputs from `process.env`, parse the address blob, and
@@ -234,11 +234,10 @@ export function pollDelay(attempt, baseMs, signal) {
234
234
  */
235
235
  export async function readLakebaseInputs(config) {
236
236
  const configOptions = { bundleProfile: config?.bundleProfile };
237
- const rawAddress = config?.endpoint ??
238
- configUtils.resolveValue(sharedOptions.databricksEnvironmentNames.lakebaseEndpoint, configOptions);
237
+ const rawAddress = config?.endpoint ?? resolveValue(databricksEnvironmentNames.lakebaseEndpoint, configOptions);
239
238
  const parsed = parseAddress(rawAddress);
240
- const portEnv = parsePort(configUtils.resolveValue("PGPORT", configOptions));
241
- const sslModeEnv = parseSslMode(configUtils.resolveValue("PGSSLMODE", configOptions));
239
+ const portEnv = parsePort(resolveValue("PGPORT", configOptions));
240
+ const sslModeEnv = parseSslMode(resolveValue("PGSSLMODE", configOptions));
242
241
  const configuredSslMode = parseSslMode(config?.sslMode);
243
242
  const parsedSslMode = parseSslMode(parsed.sslMode);
244
243
  return {
@@ -248,8 +247,8 @@ export async function readLakebaseInputs(config) {
248
247
  // bare hostnames set `host` instead and leave `endpoint` undefined
249
248
  // until the REST resolver fills it in.
250
249
  endpoint: parsed.endpoint,
251
- database: config?.database ?? configUtils.resolveValue("PGDATABASE", configOptions) ?? parsed.database,
252
- host: config?.host ?? configUtils.resolveValue("PGHOST", configOptions) ?? parsed.host,
250
+ database: config?.database ?? resolveValue("PGDATABASE", configOptions) ?? parsed.database,
251
+ host: config?.host ?? resolveValue("PGHOST", configOptions) ?? parsed.host,
253
252
  port: config?.port ?? portEnv ?? parsed.port,
254
253
  sslMode: configuredSslMode ?? sslModeEnv ?? parsedSslMode,
255
254
  autoCreate: config?.autoCreate,
@@ -344,7 +343,7 @@ export async function resolveLakebaseConnection(config, signal) {
344
343
  */
345
344
  export function applyLakebaseToEnv(resolved) {
346
345
  if (resolved.endpoint) {
347
- process.env[sharedOptions.databricksEnvironmentNames.lakebaseEndpoint] ??= resolved.endpoint;
346
+ process.env[databricksEnvironmentNames.lakebaseEndpoint] ??= resolved.endpoint;
348
347
  }
349
348
  if (resolved.host)
350
349
  process.env.PGHOST ??= resolved.host;
@@ -534,7 +533,7 @@ async function pickOrCreateProject(ws, autoCreate, signal) {
534
533
  */
535
534
  async function defaultProjectId() {
536
535
  const name = projectUtils.name();
537
- const slug = stringUtils.toSlugWithOptions({ maxLength: PROJECT_ID_MAX_LEN }, name);
536
+ const slug = toSlugWithOptions({ maxLength: PROJECT_ID_MAX_LEN }, name);
538
537
  if (!slug || !/^[a-z]/.test(slug)) {
539
538
  logger.warn("autopg: project name does not slugify to a Lakebase project id", { name });
540
539
  throw ConfigurationError.invalidConnection("Lakebase", "Could not derive a project id from the package name; pass autoCreate explicitly.");
@@ -596,9 +595,9 @@ function isAlreadyExistsError(error) {
596
595
  function operationFailed(opName, opError) {
597
596
  logger.error("autopg: operation failed", {
598
597
  operation: opName,
599
- error: errorUtils.toError(opError),
598
+ error: toError(opError),
600
599
  });
601
- const code = object.isRecord(opError) ? (opError.code ?? opError.reason) : undefined;
600
+ const code = isRecord(opError) ? (opError.code ?? opError.reason) : undefined;
602
601
  return new ExecutionError(`Lakebase operation failed: ${opName}`, {
603
602
  context: {
604
603
  operation: opName,
@@ -746,4 +745,4 @@ async function pickDatabase(ws, project, branch, signal) {
746
745
  logger.debug("autopg: resolved database", { database: choice });
747
746
  return choice;
748
747
  }
749
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFVBQVUsRUFDVixHQUFHLEVBQ0gsTUFBTSxFQUNOLE9BQU8sSUFBSSxhQUFhLEVBQ3hCLFdBQVcsR0FDWixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFlBQVksSUFBSSxrQkFBa0IsRUFDbEMsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFZLFNBQVMsQ0FBQztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5Qiw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxD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QyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEgsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiByZXNvbHZlci5cbiAqXG4gKiBSZWFkcyB0aGUgc2FtZSBlbnYgdmFycyB0aGUgYGxha2ViYXNlYCBwbHVnaW4gY29uc3VtZXMgKGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCBgUEdQT1JUYCwgYFBHU1NMTU9ERWAsIGBMQUtFQkFTRV9FTkRQT0lOVGApIGFuZCBmaWxscyBpblxuICogd2hpY2hldmVyIHBpZWNlcyBhcmUgbWlzc2luZyB1c2luZyB0aGUgTGFrZWJhc2UgQXV0b3NjYWxpbmcgUkVTVCBBUElcbiAqIHVuZGVyIGAvYXBpLzIuMC9wb3N0Z3Jlcy9gIHZpYSB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LlxuICpcbiAqIGBMQUtFQkFTRV9FTkRQT0lOVGAgKGFuZCBgY29uZmlnLmVuZHBvaW50YCkgYWNjZXB0IGFueXRoaW5nXG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kcyAtIGNhbm9uaWNhbCByZXNvdXJjZSBwYXRocywgUG9zdGdyZXNcbiAqIFVSSXMsIGJhcmUgaG9zdG5hbWVzLCBvciBiYXJlIHByb2plY3QgaWRzLiBUaGUgcmVzb2x2ZXIgbGF5ZXJzXG4gKiB3aGF0ZXZlciBwaWVjZXMgZmFsbCBvdXQgb2YgcGFyc2luZyB1bmRlciBleHBsaWNpdCBjb25maWcgLyBlbnZcbiAqIHZhbHVlcywgdGhlbiBmaWxscyB0aGUgcmVtYWluaW5nIGdhcHMgdmlhIHRoZSBBUEk6XG4gKlxuICogICAxLiBSZXZlcnNlLWxvb2t1cDogd2hlbiBhIGhvc3QgaXMga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGggaXMsXG4gKiAgICAgIHNjYW4gcHJvamVjdHMgLT4gYnJhbmNoZXMgLT4gZW5kcG9pbnRzIGZvciBhIG1hdGNoaW5nXG4gKiAgICAgIGBzdGF0dXMuaG9zdHMuaG9zdGAgYW5kIHJlY292ZXIgdGhlIG93bmluZyBwcm9qZWN0L2JyYW5jaC9lbmRwb2ludC5cbiAqICAgMi4gUGljazogd2hlbiBhIHByb2plY3QgaXMga25vd24gYnV0IGNoaWxkIHJlc291cmNlcyBhcmVuJ3QsIHByZWZlclxuICogICAgICB0aGUgc2VydmVyLXNpZGUgZGVmYXVsdCAoYHN0YXR1cy5kZWZhdWx0YCwgYEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWAsXG4gKiAgICAgIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkgYW5kIGZhbGwgYmFjayB0byBcInRoZSBvbmx5IG9uZVwiIHdoZW4gYVxuICogICAgICBsaXN0aW5nIHJldHVybnMgYSBzaW5nbGUgcmVzdWx0LlxuICogICAzLiBBdXRvLWNyZWF0ZTogd2hlbiBubyBwcm9qZWN0cyBleGlzdCBhdCBhbGwsIGNyZWF0ZSBvbmUgd2hvc2VcbiAqICAgICAgaWQgZGVmYXVsdHMgdG8gYHByb2plY3QubmFtZSgpYCBzbHVnaWZpZWQgKG92ZXJyaWRlXG4gKiAgICAgIHdpdGggYGNvbmZpZy5hdXRvQ3JlYXRlOiBcIm15LWlkXCJgIG9yIGRpc2FibGUgd2l0aFxuICogICAgICBgY29uZmlnLmF1dG9DcmVhdGU6IGZhbHNlYCkuIFRoZSBjcmVhdGUgY2FsbCBpcyBpZGVtcG90ZW50IC0gYW5cbiAqICAgICAgYEFMUkVBRFlfRVhJU1RTYCByZXNwb25zZSBmcm9tIGEgY29uY3VycmVudCBib290IGlzIHRyZWF0ZWQgYXNcbiAqICAgICAgc3VjY2Vzcy4gVGhlbiBwb2xsIHRoZSBkZWZhdWx0IGVuZHBvaW50IHVudGlsIGl0IHJlcG9ydHNcbiAqICAgICAgYGN1cnJlbnRfc3RhdGVgIGBSRUFEWWAgb3IgYElETEVgLlxuICpcbiAqIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdyaXRlcyB0aGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG9cbiAqIGBwcm9jZXNzLmVudmAgc28gdGhlIGRvd25zdHJlYW0gYGxha2ViYXNlYCBwbHVnaW4gcGlja3MgdGhlbSB1cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hcGkvd29ya3NwYWNlL3Bvc3RncmVzXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCxcbiAgZ2V0V29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIExha2ViYXNlUG9vbCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjb25maWdVdGlscywgcHJvamVjdFV0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgYXN5bmNVdGlscyxcbiAgZXJyb3JVdGlscyxcbiAgbG9nLFxuICBvYmplY3QsXG4gIG9wdGlvbnMgYXMgc2hhcmVkT3B0aW9ucyxcbiAgc3RyaW5nVXRpbHMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyB0b0NvbnRleHQgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFkZHJlc3MsXG4gIHBhcnNlUmVzb3VyY2VQYXRoLFxuICBwYXJzZVNzbE1vZGUgYXMgcGFyc2VOYXRpdmVTc2xNb2RlLFxuICBTU0xfTU9ERVMsXG4gIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLFxuICB0eXBlIFNzbE1vZGUsXG59IGZyb20gXCIuL3BnYWRkcmVzcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJhc2UtcmVzb2x2ZXJcIik7XG5jb25zdCBBUElfQkFTRSA9IFwiL2FwaS8yLjAvcG9zdGdyZXNcIjtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDU0MzI7XG5jb25zdCBERUZBVUxUX1NTTF9NT0RFOiBTc2xNb2RlID0gXCJyZXF1aXJlXCI7XG5jb25zdCBERUZBVUxUX1BHX1ZFUlNJT04gPSAxNztcbi8qKiBMYWtlYmFzZSBwcm9qZWN0IGlkczogYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGAuICovXG5jb25zdCBQUk9KRUNUX0lEX01BWF9MRU4gPSA2MztcbmNvbnN0IE9QRVJBVElPTl9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IE9QRVJBVElPTl9QT0xMX01TID0gMl8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1BPTExfTVMgPSAyXzAwMDtcbi8qKiBDZWlsaW5nIG9uIGEgc2luZ2xlIGJhY2tvZmYgc3RlcCwgc28gYSBsb25nIHdhaXQgc3RpbGwgcG9sbHMgcmVndWxhcmx5LiAqL1xuY29uc3QgUE9MTF9NQVhfREVMQVlfTVMgPSAxNV8wMDA7XG5jb25zdCBQT0xMX0JBQ0tPRkZfRkFDVE9SID0gMS41O1xuLyoqIEZyYWN0aW9uIG9mIGVhY2ggZGVsYXkgYXBwbGllZCBhcyArLy0gaml0dGVyLCBzbyBjb25jdXJyZW50IGJvb3RzIGRlc3luY2hyb25pemUuICovXG5jb25zdCBQT0xMX0pJVFRFUl9SQVRJTyA9IDAuMjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmVuZHBvaW50X3R5cGVgIGZvciB0aGUgd3JpdGFibGUgcHJpbWFyeS4gKi9cbmNvbnN0IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSA9IFwiRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFXCI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCB2YWx1ZXMgdGhhdCB3aWxsIGFjY2VwdCBhIGNvbm5lY3Rpb24uICovXG5jb25zdCBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMgPSBuZXcgU2V0KFtcIlJFQURZXCIsIFwiSURMRVwiXSk7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCBiZWZvcmUgYSBob3N0bmFtZSBpcyBtZWFuaW5nZnVsLiAqL1xuY29uc3QgSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFID0gXCJJTklUSUFMSVpJTkdcIjtcbi8qKiBMYWtlYmFzZSdzIG93biBkZWZhdWx0IFBvc3RncmVzIGRhdGFiYXNlIG5hbWUuICovXG5jb25zdCBERUZBVUxUX0RBVEFCQVNFID0gXCJkYXRhYnJpY2tzX3Bvc3RncmVzXCI7XG5cbi8qKlxuICogVXNlci1zdXBwbGllZCBMYWtlYmFzZSBpbnB1dHMgKGNvbmZpZyBvciBlbnYpIGJlZm9yZSBhbnkgQVBJIHJlc29sdXRpb24uXG4gKiBFeHRlbmRzIHtAbGluayBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHN9IHdpdGggcmVzb2x2ZXItb25seSBvcHRpb25zLlxuICoge0BsaW5rIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb259IGZpbGxzIGdhcHMgZnJvbSB0aGUgTGFrZWJhc2UgQVBJIHdoZW5cbiAqIGl0IGhhcyBlbm91Z2ggY29udGV4dCAodHlwaWNhbGx5IGEgYHByb2plY3RgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVJlc29sdmVySW5wdXRzIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgLyoqIEF1dGgtcmVzb2x2ZWQgcHJvZmlsZSB1c2VkIG9ubHkgZm9yIERhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRpb24uICovXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gbm8gcHJvamVjdCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSBhdCBhbGwuXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb21cbiAgICogICB7QGxpbmsgcHJvamVjdC5uYW1lfSAodGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gICAqICAgbmFtZSkgc2x1Z2lmaWVkIHRvIExha2ViYXNlIGlkIGNvbnN0cmFpbnRzLCB0aGVuIGNyZWF0ZSBpdC5cbiAgICogLSBgc3RyaW5nYDogY3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCB0aGlzIGV4YWN0IGlkLlxuICAgKiAtIGBmYWxzZWA6IHNraXAgY3JlYXRpb24gYW5kIHRocm93IHdpdGggYSBjbGVhciBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgYXV0b0NyZWF0ZT86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogRnVsbHktcmVzb2x2ZWQgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VDb25uZWN0aW9uIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgcG9ydDogbnVtYmVyO1xuICBzc2xNb2RlOiBTc2xNb2RlO1xufVxuXG4vKipcbiAqIENhcHR1cmUgQXBwS2l0J3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbC5cbiAqXG4gKiBDYWxsIHRoaXMgZHVyaW5nIGBzZXR1cDpjb21wbGV0ZWAsIG91dHNpZGUgYW55IGBhc1VzZXIoKWAgc2NvcGUuIEFwcEtpdCdzXG4gKiBleHBvcnRlZCBwb29sIHJvdXRlcyBkeW5hbWljYWxseSBieSByZXF1ZXN0IGNvbnRleHQsIGJ1dCBpdHMgcnVudGltZVxuICogYGFjdGl2ZVBvb2woKWAgbWV0aG9kIHJldHVybnMgdGhlIGFscmVhZHktY3JlYXRlZCB1bmRlcmx5aW5nIHBvb2wgc2VsZWN0ZWQgaW5cbiAqIHRoZSBjdXJyZW50IGNvbnRleHQuIENhcHR1cmluZyBpdCBvbmNlIGF0IHN0YXJ0dXAgcGlucyBhcHBsaWNhdGlvbi1vd25lZFxuICogc3RvcmFnZSB0byB0aGUgc2VydmljZSBwcmluY2lwYWwgd2l0aG91dCBjcmVhdGluZyBhbm90aGVyIHBvb2wgb3IgY29ubmVjdGlvbi5cbiAqXG4gKiBBIGZ1dHVyZSBBcHBLaXQgdmVyc2lvbiBtYXkgZXhwb3J0IGEgZml4ZWQgcG9vbCBkaXJlY3RseTsgaW4gdGhhdCBjYXNlIHRoZVxuICogcG9vbCBoYXMgbm8gYGFjdGl2ZVBvb2woKWAgbWV0aG9kIGFuZCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlU2VydmljZVByaW5jaXBhbFBvb2wocG9vbDogTGFrZWJhc2VQb29sKTogTGFrZWJhc2VQb29sIHtcbiAgY29uc3Qgcm91dGluZ1Bvb2wgPSBwb29sIGFzIExha2ViYXNlUG9vbCAmIHsgYWN0aXZlUG9vbD86ICgpID0+IExha2ViYXNlUG9vbCB9O1xuICByZXR1cm4gcm91dGluZ1Bvb2wuYWN0aXZlUG9vbD8uY2FsbChwb29sKSA/PyBwb29sO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGZpZWxkIG9mIHRoZSBMYWtlYmFzZSBSRVNUIHBheWxvYWRzIGlzIG1vZGVsbGVkIGFzIG9wdGlvbmFsIGFuZFxuICogdmFsaWRhdGVkIGF0IHRoZSBib3VuZGFyeSByYXRoZXIgdGhhbiBhc3NlcnRlZCB3aXRoIGEgY2FzdDogdGhlIHBpY2tlcnMgYmVsb3dcbiAqIGJyYW5jaCBvbiBgc3RhdHVzLipgLCBhbmQgYSBzaGFwZSBjaGFuZ2UgdXBzdHJlYW0gc2hvdWxkIHN1cmZhY2UgYXMgb25lIGxvdWRcbiAqIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBhbiBgdW5kZWZpbmVkYCB0aHJlZSBmcmFtZXMgYXdheS4gRW51bS1zaGFwZWQgZmllbGRzXG4gKiBzdGF5IGBzdHJpbmdgIHNvIGEgbmV3bHkgYWRkZWQgc3RhdGUgZG9lcyBub3QgZmFpbCB0aGUgd2hvbGUgcmVzcG9uc2UuXG4gKi9cbmNvbnN0IHByb2plY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZ1bGwgcmVzb3VyY2UgcGF0aDogcHJvamVjdHMve3B9LlwiKSxcbn0pO1xudHlwZSBQcm9qZWN0ID0gei5pbmZlcjx0eXBlb2YgcHJvamVjdFNjaGVtYT47XG5cbmNvbnN0IGVuZHBvaW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZW5kcG9pbnRzL3tlfS5cIiksXG4gIHVpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU3RhYmxlIGVuZHBvaW50IHVpZCBhc3NpZ25lZCBieSBMYWtlYmFzZS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZW5kcG9pbnRfdHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRW5kcG9pbnQgcm9sZSwgc3VjaCBhcyBFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEUuXCIpLFxuICAgICAgaG9zdHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV3JpdGFibGUgcHJpbWFyeSBob3N0bmFtZS5cIiksXG4gICAgICAgICAgcmVhZF9vbmx5X2hvc3Q6IHpcbiAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlJlYWQtb25seSByZXBsaWNhIGhvc3RuYW1lIHdoZW4gcHJlc2VudC5cIiksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlJlc29sdmVkIGhvc3RuYW1lcy4gaG9zdHMuaG9zdCBpcyB0aGUgd3JpdGFibGUgcHJpbWFyeS5cIiksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21wdXRlIHN0YXRlOiBJTklUSUFMSVpJTkcsIFNUQVJUSU5HLCBSRUFEWSwgSURMRSwgYW5kIGxhdGVyIHZhbHVlcy5cIiksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIlNlcnZlci1zaWRlIHN0YXRlLiBSdW50aW1lIGhvc3RuYW1lcyBsaXZlIGhlcmUsIG5vdCBpbiB0aGUgc3BlYyBibG9jay5cIiksXG59KTtcbnR5cGUgRW5kcG9pbnQgPSB6LmluZmVyPHR5cGVvZiBlbmRwb2ludFNjaGVtYT47XG5cbmNvbnN0IGJyYW5jaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9LlwiKSxcbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBkZWZhdWx0OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiVHJ1ZSBmb3IgdGhlIHByb2plY3QncyBkZWZhdWx0IGJyYW5jaCwgc3VjaCBhcyBwcm9kdWN0aW9uLlwiKSxcbiAgICAgIGN1cnJlbnRfc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkJyYW5jaCBjb21wdXRlIHN0YXRlIHJlcG9ydGVkIGJ5IExha2ViYXNlLlwiKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIEJyYW5jaCA9IHouaW5mZXI8dHlwZW9mIGJyYW5jaFNjaGVtYT47XG5cbmNvbnN0IGRhdGFiYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZGF0YWJhc2VzL3tkfS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgcG9zdGdyZXNfZGF0YWJhc2U6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkFjdHVhbCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lIHVzZWQgYXMgUEdEQVRBQkFTRS4gTWF5IGRpZmZlciBmcm9tIHRoZSByZXNvdXJjZSBpZC5cIixcbiAgICAgICAgKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIERhdGFiYXNlID0gei5pbmZlcjx0eXBlb2YgZGF0YWJhc2VTY2hlbWE+O1xuXG4vKipcbiAqIExha2ViYXNlIFJFU1QgbGlzdCByZXNwb25zZXMgZm9sbG93IHRoZSBHb29nbGUgQUlQIGNvbnZlbnRpb246XG4gKiBgeyA8cGx1cmFsLXJlc291cmNlPjogVFtdLCBuZXh0X3BhZ2VfdG9rZW4/OiBzdHJpbmcgfWAuIFdlIG9ubHkgcmVhZFxuICogdGhlIGZpcnN0IHBhZ2U7IGZvciBhdXRvLWNvbmZpZydzIFwicGljayBzb21ldGhpbmcgc2Vuc2libGVcIiBzZW1hbnRpY3MgdGhlXG4gKiBjYXAgaXMgZmluZS5cbiAqL1xuY29uc3QgbGlzdFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuZXh0X3BhZ2VfdG9rZW46IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIkFJUCBwYWdlIHRva2VuLiBPbmx5IHRoZSBmaXJzdCBwYWdlIGlzIGNvbnN1bWVkLlwiKSxcbiAgcHJvamVjdHM6IHouYXJyYXkocHJvamVjdFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgYnJhbmNoZXM6IHouYXJyYXkoYnJhbmNoU2NoZW1hKS5vcHRpb25hbCgpLFxuICBlbmRwb2ludHM6IHouYXJyYXkoZW5kcG9pbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGRhdGFiYXNlczogei5hcnJheShkYXRhYmFzZVNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExvbmctcnVubmluZyBvcGVyYXRpb24gZW52ZWxvcGUgcmV0dXJuZWQgYnkgbXV0YXRpbmcgUkVTVCBjYWxscy5cbiAqIGBkb25lOiB0cnVlYCBtZWFucyB0ZXJtaW5hbDsgY2hlY2sgYGVycm9yYCBiZWZvcmUgcmVhZGluZyBgcmVzcG9uc2VgLlxuICovXG5jb25zdCBvcGVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk9wZXJhdGlvbiByZXNvdXJjZSBuYW1lLlwiKSxcbiAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHRlcm1pbmFsLlwiKSxcbiAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBwYXlsb2FkIHByZXNlbnQgd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cIiksXG4gIHJlc3BvbnNlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVzdWx0IHBheWxvYWQgcHJlc2VudCB3aGVuIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLlwiKSxcbn0pO1xudHlwZSBPcGVyYXRpb24gPSB6LmluZmVyPHR5cGVvZiBvcGVyYXRpb25TY2hlbWE+O1xuXG4vKiogYFBHUE9SVGAgbXVzdCBsYW5kIGluc2lkZSB0aGUgVENQIHBvcnQgcmFuZ2UuICovXG5jb25zdCBwb3J0U2NoZW1hID0gc2hhcmVkT3B0aW9ucy50Y3BQb3J0U2NoZW1hO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHUE9SVGAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZCB0aHJvd3NcbiAqIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1BPUlRgIGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIFRDUFxuICogcG9ydCwgc28gYSB0eXBvIGNhbm5vdCByZWFjaCB0aGUgY29ubmVjdGlvbiByZWNvcmQgYXMgYE5hTmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBvcnQodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBwb3J0U2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgXCJQR1BPUlRcIixcbiAgICAgIHZhbHVlLFxuICAgICAgYGEgVENQIHBvcnQgYmV0d2VlbiAxIGFuZCAke2NvbmZpZ1V0aWxzLk1BWF9UQ1BfUE9SVH1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHU1NMTU9ERWAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZFxuICogdGhyb3dzIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1NTTE1PREVgIGZvciBhbiB1bnN1cHBvcnRlZCBtb2RlXG4gKiByYXRoZXIgdGhhbiBoYW5kaW5nIGBwZ2AgYSB2YWx1ZSBpdCB3aWxsIHJlamVjdCBhdCBjb25uZWN0IHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNzbE1vZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFNzbE1vZGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VOYXRpdmVTc2xNb2RlKHZhbHVlKTtcbiAgaWYgKHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcIlBHU1NMTU9ERVwiLCB2YWx1ZSwgU1NMX01PREVTLmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuLyoqXG4gKiBEZWxheSBiZWZvcmUgdGhlIG5leHQgcG9sbCBhdHRlbXB0OiBleHBvbmVudGlhbCBiYWNrb2ZmIGNhcHBlZCBhdFxuICoge0BsaW5rIFBPTExfTUFYX0RFTEFZX01TfSwgcGx1cyBqaXR0ZXIgc28gc2V2ZXJhbCBhcHBzIGJvb3RpbmcgYWdhaW5zdCB0aGVcbiAqIHNhbWUgd29ya3NwYWNlIGRvIG5vdCByZXRyeSBpbiBsb2Nrc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRQb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBNYXRoLm1pbihiYXNlTXMgKiBQT0xMX0JBQ0tPRkZfRkFDVE9SICoqIGF0dGVtcHQsIFBPTExfTUFYX0RFTEFZX01TKTtcbiAgY29uc3Qgaml0dGVyID0gYmFja29mZiAqIFBPTExfSklUVEVSX1JBVElPICogKE1hdGgucmFuZG9tKCkgKiAyIC0gMSk7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGJhY2tvZmYgKyBqaXR0ZXIpKTtcbn1cblxuLyoqXG4gKiBXYWl0IG91dCB7QGxpbmsgbmV4dFBvbGxEZWxheX0gYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQuIFJlamVjdHMgd2l0aCB0aGVcbiAqIHNpZ25hbCdzIHJlYXNvbiB3aGVuIHRoZSBjYWxsZXIgY2FuY2VscyBtaWQtd2FpdCwgc28gYSBwb2xsIGxvb3AgdW53aW5kc1xuICogaW5zdGVhZCBvZiBmaW5pc2hpbmcgaXRzIGJhY2tvZmYgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jVXRpbHMuc2xlZXAobmV4dFBvbGxEZWxheShhdHRlbXB0LCBiYXNlTXMpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFB1bGwgcmVzb2x2ZXIgaW5wdXRzIGZyb20gYHByb2Nlc3MuZW52YCwgcGFyc2UgdGhlIGFkZHJlc3MgYmxvYiwgYW5kXG4gKiBsYXllciBleHBsaWNpdCBjb25maWcgb24gdG9wIHdpdGggdGhpcyBwcmVjZWRlbmNlOlxuICpcbiAqICAgYGNvbmZpZy48ZmllbGQ+YCA+IGBjb25maWdVdGlscy5yZXNvbHZlVmFsdWVgIChzaGFyZWQgY29uZmlnIHNvdXJjZXMpID5cbiAqICAgd2hhdGV2ZXIge0BsaW5rIHBhcnNlQWRkcmVzc30gcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiAgIGBlbmRwb2ludGAgLyBgTEFLRUJBU0VfRU5EUE9JTlRgIGJsb2IuXG4gKlxuICogU2V0IGBjb25maWcuZW5kcG9pbnRgIChvciBgTEFLRUJBU0VfRU5EUE9JTlRgKSB0byBhbnkgaW5wdXRcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzOiBjYW5vbmljYWwgcmVzb3VyY2UgcGF0aHMsIFBvc3RncmVzXG4gKiBVUklzLCBiYXJlIGhvc3RuYW1lcywgb3IgYmFyZSBwcm9qZWN0IGlkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWtlYmFzZUlucHV0cyhcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbik6IFByb21pc2U8TGFrZWJhc2VSZXNvbHZlcklucHV0cz4ge1xuICBjb25zdCBjb25maWdPcHRpb25zID0geyBidW5kbGVQcm9maWxlOiBjb25maWc/LmJ1bmRsZVByb2ZpbGUgfTtcbiAgY29uc3QgcmF3QWRkcmVzcyA9XG4gICAgY29uZmlnPy5lbmRwb2ludCA/P1xuICAgIGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcbiAgICAgIHNoYXJlZE9wdGlvbnMuZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMubGFrZWJhc2VFbmRwb2ludCxcbiAgICAgIGNvbmZpZ09wdGlvbnMsXG4gICAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VBZGRyZXNzKHJhd0FkZHJlc3MpO1xuICBjb25zdCBwb3J0RW52ID0gcGFyc2VQb3J0KGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHUE9SVFwiLCBjb25maWdPcHRpb25zKSk7XG4gIGNvbnN0IHNzbE1vZGVFbnYgPSBwYXJzZVNzbE1vZGUoY29uZmlnVXRpbHMucmVzb2x2ZVZhbHVlKFwiUEdTU0xNT0RFXCIsIGNvbmZpZ09wdGlvbnMpKTtcbiAgY29uc3QgY29uZmlndXJlZFNzbE1vZGUgPSBwYXJzZVNzbE1vZGUoY29uZmlnPy5zc2xNb2RlKTtcbiAgY29uc3QgcGFyc2VkU3NsTW9kZSA9IHBhcnNlU3NsTW9kZShwYXJzZWQuc3NsTW9kZSk7XG4gIHJldHVybiB7XG4gICAgcHJvamVjdDogY29uZmlnPy5wcm9qZWN0ID8/IHBhcnNlZC5wcm9qZWN0LFxuICAgIGJyYW5jaDogY29uZmlnPy5icmFuY2ggPz8gcGFyc2VkLmJyYW5jaCxcbiAgICAvLyBPbmx5IGNhbm9uaWNhbCBlbmRwb2ludCByZXNvdXJjZSBwYXRocyBzdXJ2aXZlIGhlcmU7IFVSSXMgYW5kXG4gICAgLy8gYmFyZSBob3N0bmFtZXMgc2V0IGBob3N0YCBpbnN0ZWFkIGFuZCBsZWF2ZSBgZW5kcG9pbnRgIHVuZGVmaW5lZFxuICAgIC8vIHVudGlsIHRoZSBSRVNUIHJlc29sdmVyIGZpbGxzIGl0IGluLlxuICAgIGVuZHBvaW50OiBwYXJzZWQuZW5kcG9pbnQsXG4gICAgZGF0YWJhc2U6XG4gICAgICBjb25maWc/LmRhdGFiYXNlID8/IGNvbmZpZ1V0aWxzLnJlc29sdmVWYWx1ZShcIlBHREFUQUJBU0VcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmRhdGFiYXNlLFxuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyBjb25maWdVdGlscy5yZXNvbHZlVmFsdWUoXCJQR0hPU1RcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmhvc3QsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBvcnRFbnYgPz8gcGFyc2VkLnBvcnQsXG4gICAgc3NsTW9kZTogY29uZmlndXJlZFNzbE1vZGUgPz8gc3NsTW9kZUVudiA/PyBwYXJzZWRTc2xNb2RlLFxuICAgIGF1dG9DcmVhdGU6IGNvbmZpZz8uYXV0b0NyZWF0ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZnVsbHktcG9wdWxhdGVkIFBvc3RncmVzIGNvbm5lY3Rpb24gcmVjb3JkIGZyb20gY29uZmlnICsgZW52LlxuICpcbiAqIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBuZXR3b3JrIHRyYWZmaWMgd2hlbiBlbnYgYWxyZWFkeSBzdXBwbGllc1xuICogYGVuZHBvaW50YCwgYGhvc3RgLCBhbmQgYGRhdGFiYXNlYC4gT3RoZXJ3aXNlIGlzc3VlcyBSRVNUIGNhbGxzIGFuZFxuICogbWF5IGF1dG8tY3JlYXRlIGEgcHJvamVjdCAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgZXZlcnkgUkVTVCBjYWxsIGFuZCBpbnRlci1wb2xsIHNsZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBsYWtlYmFzZVJlc29sdmVyLnJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gKiAgIHsgYXV0b0NyZWF0ZTogZmFsc2UgfSxcbiAqICAgQWJvcnRTaWduYWwudGltZW91dCg2MF8wMDApLFxuICogKTtcbiAqIGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24+IHtcbiAgY29uc3QgaW5wdXRzID0gYXdhaXQgcmVhZExha2ViYXNlSW5wdXRzKGNvbmZpZyk7XG4gIGxldCB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0IH0gPSBpbnB1dHM7XG4gIGNvbnN0IHBvcnQgPSBpbnB1dHMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNzbE1vZGUgPSBwYXJzZVNzbE1vZGUoaW5wdXRzLnNzbE1vZGUpID8/IERFRkFVTFRfU1NMX01PREU7XG5cbiAgLy8gUmVzb3VyY2UgcGF0aHMgbWF5IGNhcnJ5IHJlZHVuZGFudCBpbmZvOyBoYXJ2ZXN0IHByb2plY3QvYnJhbmNoXG4gIC8vIGZyb20gYW55IGNhbm9uaWNhbCBwYXRoIHRoYXQgc251Y2sgaW4gdmlhIFBHREFUQUJBU0Ugb3Igc2ltaWxhci5cbiAgaWYgKGVuZHBvaW50ICYmICghcHJvamVjdCB8fCAhYnJhbmNoKSkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBwcm9qZWN0ID8/PSBwYXJzZWRFbmRwb2ludC5wcm9qZWN0O1xuICAgIGJyYW5jaCA/Pz0gcGFyc2VkRW5kcG9pbnQuYnJhbmNoO1xuICB9XG4gIGlmIChkYXRhYmFzZSAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWREYXRhYmFzZSA9IHBhcnNlQWRkcmVzcyhkYXRhYmFzZSk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRGF0YWJhc2UucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZERhdGFiYXNlLmJyYW5jaDtcbiAgICBpZiAocGFyc2VkRGF0YWJhc2UuZGF0YWJhc2VSZXNvdXJjZUlkKSB7XG4gICAgICBkYXRhYmFzZSA9IHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZDtcbiAgICB9XG4gIH1cblxuICAvLyBBbHJlYWR5IGNvbXBsZXRlOiBza2lwIGV2ZXJ5IFJFU1QgY2FsbC5cbiAgaWYgKGVuZHBvaW50ICYmIGhvc3QgJiYgZGF0YWJhc2UpIHtcbiAgICByZXR1cm4geyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCwgcG9ydCwgc3NsTW9kZSB9O1xuICB9XG5cbiAgY29uc3Qgd3MgPSBnZXRXb3Jrc3BhY2VDbGllbnQoe30pO1xuXG4gIC8vIEhvc3Qga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGg6IHNjYW4gdGhlIHdvcmtzcGFjZSB0byBmaW5kIHdoaWNoXG4gIC8vIGVuZHBvaW50IG93bnMgdGhpcyBob3N0IHNvIHdlIGNhbiBwb3B1bGF0ZSBMQUtFQkFTRV9FTkRQT0lOVC5cbiAgaWYgKCFwcm9qZWN0ICYmIGhvc3QpIHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IGZpbmRFbmRwb2ludEJ5SG9zdCh3cywgaG9zdCwgc2lnbmFsKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHByb2plY3QgPSBmb3VuZC5wcm9qZWN0O1xuICAgICAgYnJhbmNoID0gZm91bmQuYnJhbmNoO1xuICAgICAgZW5kcG9pbnQgPz89IGZvdW5kLmVuZHBvaW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIHByb2plY3QgYW55d2hlcmUgaW4gY29uZmlnL2Vudi9hZGRyZXNzOiBsaXN0LCBwaWNrLCBvciBjcmVhdGUuXG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBhd2FpdCBwaWNrT3JDcmVhdGVQcm9qZWN0KHdzLCBjb25maWc/LmF1dG9DcmVhdGUsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWJyYW5jaCkge1xuICAgIGJyYW5jaCA9IGF3YWl0IHBpY2tCcmFuY2god3MsIHByb2plY3QsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgY29uc3QgZXAgPSBhd2FpdCBwaWNrRW5kcG9pbnQod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgICBlbmRwb2ludCA9IGVwLm5hbWU7XG4gICAgaG9zdCA/Pz0gZXAuaG9zdDtcbiAgfVxuXG4gIGlmICghaG9zdCAmJiBlbmRwb2ludCkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBpZiAocGFyc2VkRW5kcG9pbnQucHJvamVjdCAmJiBwYXJzZWRFbmRwb2ludC5icmFuY2ggJiYgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCkge1xuICAgICAgY29uc3QgZXAgPSBhd2FpdCB3YWl0RW5kcG9pbnRSZWFkeShcbiAgICAgICAgd3MsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LnByb2plY3QsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmJyYW5jaCxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIGhvc3QgPSBlcC5zdGF0dXM/Lmhvc3RzPy5ob3N0O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBob3N0IGZyb20gZW5kcG9pbnRcIiwgeyBob3N0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGF0YWJhc2UpIHtcbiAgICBkYXRhYmFzZSA9IGF3YWl0IHBpY2tEYXRhYmFzZSh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbn1cblxuLyoqXG4gKiBXcml0ZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0byBgcHJvY2Vzcy5lbnZgIHNvIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogKHdoaWNoIHJlYWRzIGVudiBkaXJlY3RseSkgcGlja3MgdGhlbSB1cCBkdXJpbmcgaXRzIG93biBgc2V0dXAoKWAuXG4gKiBFeGlzdGluZyBlbnYgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHkgbWlzc2luZyBrZXlzIGFyZSBmaWxsZWQgaW4sXG4gKiB3aGljaCBrZWVwcyBleHBsaWNpdCBvdmVycmlkZXMgYXV0aG9yaXRhdGl2ZS5cbiAqXG4gKiBUaGlzIGRvZXMgTk9UIHNldCBgUEdVU0VSYCwgd2hpY2ggbmVlZHMgYW4gYXdhaXQgLSBzZWVcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBmb3IgdGhlIGNvbXBsZXRlIHNldCBhIFBvc3RncmVzIHBvb2wgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUxha2ViYXNlVG9FbnYocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IHZvaWQge1xuICBpZiAocmVzb2x2ZWQuZW5kcG9pbnQpIHtcbiAgICBwcm9jZXNzLmVudltzaGFyZWRPcHRpb25zLmRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLmxha2ViYXNlRW5kcG9pbnRdID8/PSByZXNvbHZlZC5lbmRwb2ludDtcbiAgfVxuICBpZiAocmVzb2x2ZWQuaG9zdCkgcHJvY2Vzcy5lbnYuUEdIT1NUID8/PSByZXNvbHZlZC5ob3N0O1xuICBpZiAocmVzb2x2ZWQuZGF0YWJhc2UpIHByb2Nlc3MuZW52LlBHREFUQUJBU0UgPz89IHJlc29sdmVkLmRhdGFiYXNlO1xuICBwcm9jZXNzLmVudi5QR1BPUlQgPz89IFN0cmluZyhyZXNvbHZlZC5wb3J0KTtcbiAgcHJvY2Vzcy5lbnYuUEdTU0xNT0RFID8/PSByZXNvbHZlZC5zc2xNb2RlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbm5lY3Rpb24gQU5EIGFwcGx5IGV2ZXJ5IFBvc3RncmVzIGVudiB2YXIgYSBMYWtlYmFzZSBwb29sIG5lZWRzLFxuICogcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIHBsdXMgdGhlIHVzZXJuYW1lIHRoYXQgd2FzIGFwcGxpZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgd2hvbGUgc2V0LCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgaGF2aW5nIG9uZSBmdW5jdGlvbiBmb3IgaXQ6XG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRocm93cyB1bmxlc3MgYExBS0VCQVNFX0VORFBPSU5UYCwgYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsICoqYW5kKiogYSB1c2VybmFtZSAoYFBHVVNFUmAsIG9yIGBEQVRBQlJJQ0tTX0NMSUVOVF9JRGAgZm9yIGFcbiAqIHNlcnZpY2UgcHJpbmNpcGFsKSBhcmUgYWxsIHByZXNlbnQsIGFuZCBhIERhdGFicmlja3MgQXBwIGBwb3N0Z3Jlc2AgcmVzb3VyY2VcbiAqIGJpbmRpbmcgc3VwcGxpZXMgb25seSB0aGUgZmlyc3QuIEFueXRoaW5nIHRoYXQgd2FudHMgYSB3b3JraW5nIHBvb2wgLSB0aGVcbiAqIGBsYWtlYmFzZWAgcGx1Z2luLCBvciBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLCB3aGljaCBxdWlldGx5IGRlZ3JhZGVzIHRvXG4gKiBpbi1tZW1vcnkgd2hlbiB0aGUgcG9vbCBjYW5ub3QgYmUgYnVpbHQgLSBuZWVkcyBhbGwgZm91ciwgc28gY2FsbGVycyBzaG91bGQgbm90XG4gKiBwYWlyIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdpdGggdGhlaXIgb3duIHVzZXJuYW1lIGxvb2t1cC5cbiAqXG4gKiBgUEdVU0VSYCBpcyBhcHBsaWVkIHdpdGggYD8/PWAgbGlrZSB0aGUgcmVzdCwgc28gYW4gZXhwbGljaXRseSBjb25maWd1cmVkIHZhbHVlXG4gKiBzdGF5cyBhdXRob3JpdGF0aXZlLiBUaGUgbG9va3VwIHJldHVybnMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gdGhyb3dpbmcgd2hlbiBpdFxuICogY2Fubm90IGRldGVybWluZSBhIHVzZXIsIGxlYXZpbmcgdGhlIHBvb2wgdG8gcmVzb2x2ZSBpdHMgb3duLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gRW5vdWdoIGZvciBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRvIGJ1aWxkIGEgcG9vbC5cbiAqIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5hcHBseUxha2ViYXNlRW52KHsgYXV0b0NyZWF0ZTogZmFsc2UgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUxha2ViYXNlRW52KFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyByZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uOyB1c2VyPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKGNvbmZpZywgc2lnbmFsKTtcbiAgYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCh7fSk7XG4gIGlmICh1c2VyKSBwcm9jZXNzLmVudi5QR1VTRVIgPz89IHVzZXI7XG4gIHJldHVybiB7IHJlc29sdmVkLCAuLi4odXNlciA/IHsgdXNlciB9IDoge30pIH07XG59XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ya3NwYWNlQ2xpZW50PjtcblxuLyoqIFRoZSBTREsgYENvbnRleHRgIGFjY2VwdGVkIGJ5IHRoZSB3b3Jrc3BhY2UgY2xpZW50J3Mgb3duIGNvcHkgb2YgdGhlIFNESy4gKi9cbnR5cGUgQXBpUmVxdWVzdENvbnRleHQgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPFdvcmtzcGFjZUNsaWVudFtcImFwaUNsaWVudFwiXVtcInJlcXVlc3RcIl0+WzFdPjtcblxuLyoqXG4gKiBBZGFwdCBhbiB7QGxpbmsgQWJvcnRTaWduYWx9IGludG8gdGhlIGFwaSBjbGllbnQncyBjYW5jZWxsYXRpb24gY29udGV4dC5cbiAqIEFwcEtpdCByZXNvbHZlcyBhIGRpZmZlcmVudCBjb3B5IG9mIGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYCB0aGFuIHRoaXNcbiAqIHBhY2thZ2UgZG9lcywgYW5kIGBDb250ZXh0YCBjYXJyaWVzIGEgcHJpdmF0ZSBmaWVsZCwgc28gdGhlIHR3byBkZWNsYXJhdGlvbnNcbiAqIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlIGV2ZW4gdGhvdWdoIHRoZSBhcGkgY2xpZW50IG9ubHkgcmVhZHNcbiAqIGBjYW5jZWxsYXRpb25Ub2tlbmAgYW5kIGBsb2dnZXJgIG9mZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogQXBpUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2lnbmFsID8gKHRvQ29udGV4dChzaWduYWwpIGFzIHVua25vd24gYXMgQXBpUmVxdWVzdENvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgTGFrZWJhc2UgUkVTVCBib2R5LiBUaGUgZnVsbCBwYXlsb2FkIGlzIGxvZ2dlZCByYXRoZXIgdGhhbiB0aHJvd25cbiAqIHNvIGEgY2xpZW50IG5ldmVyIHJlY2VpdmVzIHVwc3RyZWFtIGRldGFpbC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSZXNwb25zZTxUPihzY2hlbWE6IHouWm9kVHlwZTxUPiwgcGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duKTogVCB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoYm9keSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IHVuZXhwZWN0ZWQgTGFrZWJhc2UgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICBwYXRoLFxuICAgIGlzc3VlczogcGFyc2VkLmVycm9yLmlzc3VlcyxcbiAgfSk7XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkxha2ViYXNlIEFQSSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlXCIsIHsgY29udGV4dDogeyBwYXRoIH0gfSk7XG59XG5cbi8qKiBHRVQgaGVscGVyIHRoYXQgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkgYW5kIGZvcndhcmRzIGNhbmNlbGxhdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IHdzLmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICByYXc6IGZhbHNlLFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG4vKiogUE9TVCBoZWxwZXIgZm9yIGNyZWF0ZSAvIG11dGF0ZSBjYWxsczsgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SnNvbjxUPihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgYm9keTogdW5rbm93bixcbiAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHF1ZXJ5LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICAgIHBheWxvYWQ6IGJvZHksXG4gICAgfSxcbiAgICByZXF1ZXN0Q29udGV4dChzaWduYWwpLFxuICApO1xuICByZXR1cm4gcGFyc2VSZXNwb25zZShzY2hlbWEsIHBhdGgsIHJlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0cyh3czogV29ya3NwYWNlQ2xpZW50LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsIGxpc3RSZXNwb25zZVNjaGVtYSwgc2lnbmFsKTtcbiAgcmV0dXJuIHJlcy5wcm9qZWN0cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEJyYW5jaGVzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuY2hbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmJyYW5jaGVzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RW5kcG9pbnRzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnRbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZW5kcG9pbnRzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RGF0YWJhc2VzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RGF0YWJhc2VbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9kYXRhYmFzZXNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZGF0YWJhc2VzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgcmV0dXJuIGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YCxcbiAgICBlbmRwb2ludFNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG59XG5cbi8qKlxuICogU2NhbiB0aGUgd29ya3NwYWNlIGZvciBhbiBlbmRwb2ludCB3aG9zZSBgc3RhdHVzLmhvc3RzLmhvc3RgIG1hdGNoZXNcbiAqIHRoZSBwcm92aWRlZCBob3N0bmFtZS4gVXNlZCB0byByZWNvdmVyIHRoZSBvd25pbmcgcHJvamVjdC9icmFuY2gvXG4gKiBlbmRwb2ludCByZXNvdXJjZSBwYXRoIHdoZW4gdGhlIGNhbGxlciBvbmx5IHN1cHBsaWVkIGEgUG9zdGdyZXMgVVJJLlxuICpcbiAqIE8ocHJvamVjdHMgKiBicmFuY2hlcyAqIGVuZHBvaW50cykgLSBmaW5lIGZvciB0eXBpY2FsIHdvcmtzcGFjZXNcbiAqIChzaW5nbGUgZGlnaXRzIHBlciB0aWVyKTsgcGFnaW5hdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCBmb2xsb3dlZFxuICogc2luY2UgdGhpcyBpcyBhIGJlc3QtZWZmb3J0IGZhbGxiYWNrLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRW5kcG9pbnRCeUhvc3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGhvc3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcHJvamVjdDogc3RyaW5nOyBicmFuY2g6IHN0cmluZzsgZW5kcG9pbnQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGxpc3RQcm9qZWN0cyh3cywgc2lnbmFsKTtcbiAgZm9yIChjb25zdCBwIG9mIHByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gcGFyc2VSZXNvdXJjZVBhdGgocC5uYW1lKS5wcm9qZWN0O1xuICAgIGlmICghcHJvamVjdElkKSBjb250aW51ZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdElkLCBzaWduYWwpO1xuICAgIGZvciAoY29uc3QgYiBvZiBicmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoSWQgPSBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaDtcbiAgICAgIGlmICghYnJhbmNoSWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdElkLCBicmFuY2hJZCwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5ob3N0cz8uaG9zdCA9PT0gaG9zdCk7XG4gICAgICBpZiAobWF0Y2g/Lm5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBtYXRjaGVkIGVuZHBvaW50IGJ5IGhvc3RcIiwge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgZW5kcG9pbnQ6IG1hdGNoLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICAgICAgICBicmFuY2g6IGJyYW5jaElkLFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG5vIGVuZHBvaW50IG1hdGNoZWQgaG9zdFwiLCB7IGhvc3QgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHByb2plY3QgdG8gdXNlLCBvciBjcmVhdGUgb25lIHdoZW4gdGhlIHdvcmtzcGFjZSBpcyBlbXB0eS5cbiAqXG4gKiBTZWxlY3Rpb24gb3JkZXI6XG4gKiAxLiBFeGFjdGx5IG9uZSBwcm9qZWN0IGxpc3RlZCAtPiB1c2UgaXQuXG4gKiAyLiBaZXJvIHByb2plY3RzIEFORCBgYXV0b0NyZWF0ZSAhPT0gZmFsc2VgIC0+IGVuc3VyZSBhIHByb2plY3Qgd2l0aFxuICogICAgdGhlIHJlc29sdmVkIGlkIGV4aXN0cywgdGhlbiByZXR1cm4gaXRzIGlkLlxuICogMy4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgPT09IGZhbHNlYCAtPiB0aHJvdy5cbiAqIDQuIE11bHRpcGxlIHByb2plY3RzIC0+IHRocm93IHdpdGggdGhlIGNhbmRpZGF0ZSBsaXN0IChzZXRcbiAqICAgIGBjb25maWcucHJvamVjdGAgb3IgcGluIGEgcHJvamVjdCBpZCBpbiBgTEFLRUJBU0VfRU5EUE9JTlRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja09yQ3JlYXRlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgYXV0b0NyZWF0ZTogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHByb2plY3RzWzBdIS5uYW1lKS5wcm9qZWN0O1xuICAgIGlmIChpZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiB1c2luZyBvbmx5IHByb2plY3RcIiwgeyBwcm9qZWN0OiBpZCB9KTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChhdXRvQ3JlYXRlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiTGFrZWJhc2UgcHJvamVjdFwiLFxuICAgICAgICBcImF1dG9DcmVhdGUgaXMgZmFsc2U7IGNyZWF0ZSBhIHByb2plY3Qgb3Igc2V0IGNvbmZpZy5wcm9qZWN0IC8gTEFLRUJBU0VfRU5EUE9JTlQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGF1dG9DcmVhdGUgPz8gKGF3YWl0IGRlZmF1bHRQcm9qZWN0SWQoKSk7XG4gICAgcmV0dXJuIGVuc3VyZVByb2plY3Qod3MsIGlkLCBzaWduYWwpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBwcm9qZWN0c1xuICAgIC5tYXAoKHApID0+IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdClcbiAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAuam9pbihcIiwgXCIpO1xuICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgXCJMYWtlYmFzZVwiLFxuICAgIGBNdWx0aXBsZSBwcm9qZWN0cyBmb3VuZDsgc2V0IGNvbmZpZy5wcm9qZWN0IG9yIHBpbiBhIHByb2plY3QgaWQgaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICApO1xufVxuXG4vKipcbiAqIERlcml2ZSBhIExha2ViYXNlIHByb2plY3QgaWQgZnJvbSB0aGUgaG9zdCByZXBvJ3MgYHBhY2thZ2UuanNvbmBcbiAqIG5hbWUgKHZpYSB7QGxpbmsgcHJvamVjdC5uYW1lfSkgc2x1Z2lmaWVkIHRvIHNhdGlzZnkgdGhlXG4gKiBMYWtlYmFzZSBpZCBjb25zdHJhaW50IChgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYCkuXG4gKlxuICogVGhyb3dzIHdoZW4gdGhlIHNsdWcgZW5kcyB1cCBlbXB0eSBvciBzdGFydHMgd2l0aCBhIGRpZ2l0LCBzaW5jZSB0aGVcbiAqIHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5IC0gY2FsbGVycyBzaG91bGQgcGFzcyBhbiBleHBsaWNpdFxuICogYGF1dG9DcmVhdGVgIGlkIGluIHRoYXQgY2FzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFByb2plY3RJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBuYW1lID0gcHJvamVjdFV0aWxzLm5hbWUoKTtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZ1V0aWxzLnRvU2x1Z1dpdGhPcHRpb25zKHsgbWF4TGVuZ3RoOiBQUk9KRUNUX0lEX01BWF9MRU4gfSwgbmFtZSk7XG4gIGlmICghc2x1ZyB8fCAhL15bYS16XS8udGVzdChzbHVnKSkge1xuICAgIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBwcm9qZWN0IG5hbWUgZG9lcyBub3Qgc2x1Z2lmeSB0byBhIExha2ViYXNlIHByb2plY3QgaWRcIiwgeyBuYW1lIH0pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIFwiQ291bGQgbm90IGRlcml2ZSBhIHByb2plY3QgaWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lOyBwYXNzIGF1dG9DcmVhdGUgZXhwbGljaXRseS5cIixcbiAgICApO1xuICB9XG4gIHJldHVybiBzbHVnO1xufVxuXG4vKipcbiAqIEVuc3VyZSBhIExha2ViYXNlIHByb2plY3Qgd2l0aCBgcHJvamVjdElkYCBleGlzdHMuIENyZWF0ZXMgaXQgYW5kXG4gKiB3YWl0cyBmb3IgdGhlIGNyZWF0ZSBvcGVyYXRpb24gdG8gY29tcGxldGUuIEFuIGBBTFJFQURZX0VYSVNUU2BcbiAqIHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgc3VjY2VzcyAtIHNvbWVvbmUgZWxzZSAoYSBjb25jdXJyZW50IGJvb3QsXG4gKiBhIHNpYmxpbmcgcHJvY2Vzcykgd29uIHRoZSByYWNlIGFuZCB0aGUgcHJvamVjdCB3ZSB3YW50ZWQgaXMgbm93XG4gKiBzaXR0aW5nIHRoZXJlIHJlYWR5IGZvciBkb3duc3RyZWFtIHBpY2tlcnMuXG4gKlxuICogUHJvamVjdCBjcmVhdGlvbiB0eXBpY2FsbHkgcHJvdmlzaW9ucyBhIGRlZmF1bHQgYHByb2R1Y3Rpb25gIGJyYW5jaFxuICogYWxvbmdzaWRlOyBkb3duc3RyZWFtIHBpY2tlcnMgaGFuZGxlIHRoZSByZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVQcm9qZWN0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBsb2dnZXIud2FybihcImF1dG9wZzogbm8gcHJvamVjdHMgZm91bmQ7IGNyZWF0aW5nXCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IG9wID0gYXdhaXQgcG9zdEpzb24oXG4gICAgICB3cyxcbiAgICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsXG4gICAgICBvcGVyYXRpb25TY2hlbWEsXG4gICAgICB7IHNwZWM6IHsgcGdfdmVyc2lvbjogREVGQVVMVF9QR19WRVJTSU9OIH0gfSxcbiAgICAgIHsgcHJvamVjdF9pZDogcHJvamVjdElkIH0sXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICBhd2FpdCB3YWl0Rm9yT3BlcmF0aW9uKHdzLCBvcCwgc2lnbmFsKTtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogY3JlYXRlZCBwcm9qZWN0XCIsIHsgcHJvamVjdDogcHJvamVjdElkIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoIWlzQWxyZWFkeUV4aXN0c0Vycm9yKGVycikpIHRocm93IGVycjtcbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogcHJvamVjdCBhbHJlYWR5IGV4aXN0cyAocmFjZSk7IHByb2NlZWRpbmdcIiwge1xuICAgICAgcHJvamVjdDogcHJvamVjdElkLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwcm9qZWN0SWQ7XG59XG5cbi8qKlxuICogUmVjb2duaXplIHRoZSBEYXRhYnJpY2tzIFNESydzIGBBTFJFQURZX0VYSVNUU2AgZmFpbHVyZSBtb2RlcyBzbyBhXG4gKiBsb3N0IHJhY2UgZHVyaW5nIGBlbnN1cmVQcm9qZWN0YCBiZWNvbWVzIGEgbm8tb3AgaW5zdGVhZCBvZiBhbiBlcnJvci5cbiAqXG4gKiBUaGUgU0RLIHRocm93cyBgQXBpRXJyb3IgeyBlcnJvckNvZGUsIHN0YXR1c0NvZGUgfWAgZm9yIHN0cnVjdHVyZWRcbiAqIHNlcnZlciBlcnJvcnMgYW5kIGBIdHRwRXJyb3IgeyBjb2RlIH1gIGZvciB0cmFuc3BvcnQtbGF5ZXIgNHh4LzV4eC5cbiAqIEJvdGggc3VyZmFjZSBhIGh1bWFuIG1lc3NhZ2UgdGhhdCBvZnRlbiBjYXJyaWVzIFwiYWxyZWFkeSBleGlzdHNcIiBzb1xuICogd2UgdXNlIHRoYXQgYXMgYSBmaW5hbCBmYWxsYmFjayBmb3IgZm9yd2FyZCBjb21wYXRpYmlsaXR5LlxuICovXG5mdW5jdGlvbiBpc0FscmVhZHlFeGlzdHNFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWVycm9yIHx8IHR5cGVvZiBlcnJvciAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBlID0gZXJyb3IgYXMge1xuICAgIHN0YXR1c0NvZGU/OiBudW1iZXI7XG4gICAgY29kZT86IG51bWJlcjtcbiAgICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gICAgbWVzc2FnZT86IHN0cmluZztcbiAgfTtcbiAgaWYgKGUuc3RhdHVzQ29kZSA9PT0gNDA5IHx8IGUuY29kZSA9PT0gNDA5KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGUuZXJyb3JDb2RlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUuZXJyb3JDb2RlKSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLm1lc3NhZ2UgJiYgL2FscmVhZHkuP2V4aXN0cy9pLnRlc3QoZS5tZXNzYWdlKSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZWR1Y2UgYSBMYWtlYmFzZSBvcGVyYXRpb24gZmFpbHVyZSB0byBhbiBlcnJvciBzYWZlIHRvIHByb3BhZ2F0ZTogdGhlXG4gKiBvcGVyYXRpb24gbmFtZSBwbHVzIHdoYXRldmVyIGNvZGUgdGhlIHBheWxvYWQgY2Fycmllcy4gVGhlIHBheWxvYWQgaXRzZWxmIGNhblxuICogZWNobyByZXF1ZXN0IGNvbnRleHQsIHNvIGl0IGdvZXMgdG8gdGhlIGxvZyBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBvcGVyYXRpb25GYWlsZWQob3BOYW1lOiBzdHJpbmcsIG9wRXJyb3I6IHVua25vd24pOiBFeGVjdXRpb25FcnJvciB7XG4gIGxvZ2dlci5lcnJvcihcImF1dG9wZzogb3BlcmF0aW9uIGZhaWxlZFwiLCB7XG4gICAgb3BlcmF0aW9uOiBvcE5hbWUsXG4gICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihvcEVycm9yKSxcbiAgfSk7XG4gIGNvbnN0IGNvZGUgPSBvYmplY3QuaXNSZWNvcmQob3BFcnJvcikgPyAob3BFcnJvci5jb2RlID8/IG9wRXJyb3IucmVhc29uKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWxlZDogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgZXJyb3JDb2RlOiB0eXBlb2YgY29kZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IFN0cmluZyhjb2RlKSA6IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYSBMYWtlYmFzZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIHVudGlsIGBkb25lOiB0cnVlYC4gUmV0dXJuc1xuICogdGhlIGZpbmFsIG9wZXJhdGlvbiBlbnZlbG9wZSAod2hpY2ggbWF5IGNhcnJ5IGByZXNwb25zZWAgb3IgYGVycm9yYCkuXG4gKlxuICogVGhyb3dzIHdoZW46XG4gKiAgIC0gdGhlIHJlc3BvbnNlIGNhcnJpZXMgYW4gYGVycm9yYCBmaWVsZDtcbiAqICAgLSBgb3AubmFtZWAgaXMgbWlzc2luZyAobm90aGluZyB0byBwb2xsKTtcbiAqICAgLSB0aGUgdGltZW91dCBlbGFwc2VzIGJlZm9yZSBgZG9uZTogdHJ1ZWA7XG4gKiAgIC0gYHNpZ25hbGAgYWJvcnRzIG1pZC13YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yT3BlcmF0aW9uKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBvcDogT3BlcmF0aW9uLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8T3BlcmF0aW9uPiB7XG4gIGlmIChvcC5kb25lKSB7XG4gICAgaWYgKG9wLmVycm9yKSB7XG4gICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3AubmFtZSA/PyBcInVua25vd25cIiwgb3AuZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgY29uc3Qgb3BOYW1lID0gb3AubmFtZTtcbiAgaWYgKCFvcE5hbWUpIHtcbiAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIm9wZXJhdGlvbiBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IE9QRVJBVElPTl9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgT1BFUkFUSU9OX1BPTExfTVMsIHNpZ25hbCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS8ke29wTmFtZX1gLCBvcGVyYXRpb25TY2hlbWEsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBvcGVyYXRpb24gc3RhdHVzXCIsIHsgb3A6IG9wTmFtZSwgZG9uZTogY3VycmVudC5kb25lIH0pO1xuICAgIGlmIChjdXJyZW50LmRvbmUpIHtcbiAgICAgIGlmIChjdXJyZW50LmVycm9yKSB7XG4gICAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcE5hbWUsIGN1cnJlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogb3BOYW1lLCB0aW1lb3V0TXM6IE9QRVJBVElPTl9USU1FT1VUX01TIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYGdldEVuZHBvaW50YCB1bnRpbCB0aGUgY29tcHV0ZSByZXBvcnRzIGEgdXNhYmxlXG4gKiBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgLiBgUkVBRFlgIGFuZCBgSURMRWAgYXJlIGJvdGggYWNjZXB0YWJsZSAtXG4gKiBgSURMRWAganVzdCBtZWFucyB0aGUgY29tcHV0ZSBoYXMgc2NhbGVkIHRvIHplcm8gYnV0IGEgY29ubmVjdGlvblxuICogd2lsbCB3YWtlIGl0LiBSZXR1cm5zIHRoZSBmaW5hbCBlbmRwb2ludCBwYXlsb2FkICh3aXRoIGBob3N0cy5ob3N0YCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRFbmRwb2ludFJlYWR5KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBsYXN0OiBFbmRwb2ludCB8IG51bGwgPSBudWxsO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGFzdCA9IGF3YWl0IGdldEVuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50SWQsIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdGUgPSBsYXN0LnN0YXR1cz8uY3VycmVudF9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgJiYgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTLmhhcyhzdGF0ZSkpIHJldHVybiBsYXN0O1xuICAgIGlmIChsYXN0LnN0YXR1cz8uaG9zdHM/Lmhvc3QgJiYgc3RhdGUgIT09IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSkge1xuICAgICAgLy8gQ29tcHV0ZSBpcyBpbiBzb21lIG90aGVyIHN0YXRlIChTVEFSVElORywgZXRjLikgYnV0IGhvc3RuYW1lIGlzXG4gICAgICAvLyBhbHJlYWR5IHB1Ymxpc2hlZCAtIGdvb2QgZW5vdWdoIHRvIGNvbm5lY3Q7IGxha2ViYXNlJ3MgT0F1dGhcbiAgICAgIC8vIHRva2VuIHJlcXVlc3Qgd2lsbCB3YWtlIGl0LlxuICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogd2FpdGluZyBmb3IgZW5kcG9pbnRcIiwgeyBlbmRwb2ludElkLCBzdGF0ZSB9KTtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUywgc2lnbmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIGVuZHBvaW50IGRpZCBub3QgYmVjb21lIHJlYWR5OiAke2VuZHBvaW50SWR9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHByb2plY3QsXG4gICAgICBicmFuY2gsXG4gICAgICBlbmRwb2ludElkLFxuICAgICAgdGltZW91dE1zOiBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TLFxuICAgICAgbGFzdFN0YXRlOiBsYXN0Py5zdGF0dXM/LmN1cnJlbnRfc3RhdGUgPz8gXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBicmFuY2ggZm9yIGEgcHJvamVjdC4gUHJlZmVycyB0aGUgYnJhbmNoIGZsYWdnZWRcbiAqIGBzdGF0dXMuZGVmYXVsdDogdHJ1ZWAgKHNlcnZlci1zaWRlIGRlZmF1bHQsIHR5cGljYWxseSBgcHJvZHVjdGlvbmBcbiAqIHVubGVzcyB0aGUgcHJvamVjdCBvd25lciBjaGFuZ2VkIGl0KS4gRmFsbHMgYmFjayB0byB0aGUgb25seSBicmFuY2hcbiAqIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gT3RoZXJ3aXNlIHRocm93cyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0JyYW5jaChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgYnJhbmNoIGluIHByb2plY3QgJyR7cHJvamVjdH0nYCxcbiAgICAgIFwiVGhlIHByb2plY3QgaGFzIG5vIGJyYW5jaGVzOyBjcmVhdGUgb25lIG9yIHNldCBjb25maWcuYnJhbmNoLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZmxhZ2dlZCA9IGJyYW5jaGVzLmZpbmQoKGIpID0+IGIuc3RhdHVzPy5kZWZhdWx0ID09PSB0cnVlKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBwYXJzZVJlc291cmNlUGF0aChmbGFnZ2VkPy5uYW1lKS5icmFuY2ggPz9cbiAgICAoYnJhbmNoZXMubGVuZ3RoID09PSAxID8gcGFyc2VSZXNvdXJjZVBhdGgoYnJhbmNoZXNbMF0hLm5hbWUpLmJyYW5jaCA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGJyYW5jaGVzXG4gICAgICAubWFwKChiKSA9PiBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgUHJvamVjdCAnJHtwcm9qZWN0fScgaGFzIG11bHRpcGxlIGJyYW5jaGVzIGFuZCBub25lIG1hcmtlZCBkZWZhdWx0OyBzZXQgY29uZmlnLmJyYW5jaCBvciBpbmNsdWRlIHRoZSBicmFuY2ggaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBicmFuY2hcIiwgeyBwcm9qZWN0LCBicmFuY2g6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcmltYXJ5IGVuZHBvaW50IGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBQcmVmZXJzXG4gKiBgc3RhdHVzLmVuZHBvaW50X3R5cGUgPT09IEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWA7IGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBvbmx5IGVuZHBvaW50IHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gUmV0dXJucyBgeyBuYW1lLCBob3N0IH1gXG4gKiBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSBib3RoIGBMQUtFQkFTRV9FTkRQT0lOVGAgYW5kIGBQR0hPU1RgXG4gKiBmcm9tIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBob3N0Pzogc3RyaW5nIH0+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGVuZHBvaW50IGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBlbmRwb2ludHM7IGNyZWF0ZSBvbmUgb3Igc2V0IExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpbWFyeSA9XG4gICAgZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5lbmRwb2ludF90eXBlID09PSBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUpID8/XG4gICAgKGVuZHBvaW50cy5sZW5ndGggPT09IDEgPyBlbmRwb2ludHNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIXByaW1hcnk/Lm5hbWUpIHtcbiAgICBjb25zdCBuYW1lcyA9IGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBCcmFuY2ggaGFzIG5vIHByaW1hcnkgcmVhZC13cml0ZSBlbmRwb2ludDsgc2V0IExBS0VCQVNFX0VORFBPSU5UIG9yIGNvbmZpZy5lbmRwb2ludC4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSBwcmltYXJ5LnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZW5kcG9pbnRcIiwgeyBlbmRwb2ludDogcHJpbWFyeS5uYW1lLCBob3N0IH0pO1xuICByZXR1cm4geyBuYW1lOiBwcmltYXJ5Lm5hbWUsIGhvc3QgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IHBvc3RncmVzIGRhdGFiYXNlIGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBUaGVcbiAqIFBvc3RncmVzIGRhdGFiYXNlIE5BTUUgKGBzdGF0dXMucG9zdGdyZXNfZGF0YWJhc2VgKSBpcyB3aGF0XG4gKiBgUEdEQVRBQkFTRWAgbmVlZHMgLSB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgcmVzb3VyY2UgaWQsIHdoaWNoIGNhblxuICogdXNlIGEgZGlmZmVyZW50IHNlcGFyYXRvciAoZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAqIHN1cmZhY2VzIGFzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkuIFByZWZlcnNcbiAqIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCAodGhlIExha2ViYXNlIGRlZmF1bHQpLCBvdGhlcndpc2UgdGhlIG9ubHlcbiAqIGRhdGFiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRGF0YWJhc2UoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgbGlzdERhdGFiYXNlcyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZGF0YWJhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGRhdGFiYXNlIGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBkYXRhYmFzZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IFBHREFUQUJBU0UuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IGRhdGFiYXNlc1xuICAgIC5tYXAoKGQpID0+IGQuc3RhdHVzPy5wb3N0Z3Jlc19kYXRhYmFzZSlcbiAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgbmFtZXMuZmluZCgobikgPT4gbiA9PT0gREVGQVVMVF9EQVRBQkFTRSkgPz8gKG5hbWVzLmxlbmd0aCA9PT0gMSA/IG5hbWVzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgTXVsdGlwbGUgZGF0YWJhc2VzIGFuZCBubyAnJHtERUZBVUxUX0RBVEFCQVNFfSc7IHNldCBQR0RBVEFCQVNFIG9yIGNvbmZpZy5kYXRhYmFzZS4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuIl19
748
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUVsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixZQUFZLElBQUksa0JBQWtCLEVBQ2xDLFNBQVMsR0FHVixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsYUFBYSxFQUNiLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIsWUFBWSxHQUNiLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFZLFNBQVMsQ0FBQztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5Qiw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0saUJB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QztJQUNoRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlc29sdmVyLlxuICpcbiAqIFJlYWRzIHRoZSBzYW1lIGVudiB2YXJzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBjb25zdW1lcyAoYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsIGBQR1BPUlRgLCBgUEdTU0xNT0RFYCwgYExBS0VCQVNFX0VORFBPSU5UYCkgYW5kIGZpbGxzIGluXG4gKiB3aGljaGV2ZXIgcGllY2VzIGFyZSBtaXNzaW5nIHVzaW5nIHRoZSBMYWtlYmFzZSBBdXRvc2NhbGluZyBSRVNUIEFQSVxuICogdW5kZXIgYC9hcGkvMi4wL3Bvc3RncmVzL2AgdmlhIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuXG4gKlxuICogYExBS0VCQVNFX0VORFBPSU5UYCAoYW5kIGBjb25maWcuZW5kcG9pbnRgKSBhY2NlcHQgYW55dGhpbmdcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzIC0gY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuIFRoZSByZXNvbHZlciBsYXllcnNcbiAqIHdoYXRldmVyIHBpZWNlcyBmYWxsIG91dCBvZiBwYXJzaW5nIHVuZGVyIGV4cGxpY2l0IGNvbmZpZyAvIGVudlxuICogdmFsdWVzLCB0aGVuIGZpbGxzIHRoZSByZW1haW5pbmcgZ2FwcyB2aWEgdGhlIEFQSTpcbiAqXG4gKiAgIDEuIFJldmVyc2UtbG9va3VwOiB3aGVuIGEgaG9zdCBpcyBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aCBpcyxcbiAqICAgICAgc2NhbiBwcm9qZWN0cyAtPiBicmFuY2hlcyAtPiBlbmRwb2ludHMgZm9yIGEgbWF0Y2hpbmdcbiAqICAgICAgYHN0YXR1cy5ob3N0cy5ob3N0YCBhbmQgcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL2VuZHBvaW50LlxuICogICAyLiBQaWNrOiB3aGVuIGEgcHJvamVjdCBpcyBrbm93biBidXQgY2hpbGQgcmVzb3VyY2VzIGFyZW4ndCwgcHJlZmVyXG4gKiAgICAgIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IChgc3RhdHVzLmRlZmF1bHRgLCBgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYCxcbiAqICAgICAgYGRhdGFicmlja3NfcG9zdGdyZXNgKSBhbmQgZmFsbCBiYWNrIHRvIFwidGhlIG9ubHkgb25lXCIgd2hlbiBhXG4gKiAgICAgIGxpc3RpbmcgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuXG4gKiAgIDMuIEF1dG8tY3JlYXRlOiB3aGVuIG5vIHByb2plY3RzIGV4aXN0IGF0IGFsbCwgY3JlYXRlIG9uZSB3aG9zZVxuICogICAgICBpZCBkZWZhdWx0cyB0byBgcHJvamVjdC5uYW1lKClgIHNsdWdpZmllZCAob3ZlcnJpZGVcbiAqICAgICAgd2l0aCBgY29uZmlnLmF1dG9DcmVhdGU6IFwibXktaWRcImAgb3IgZGlzYWJsZSB3aXRoXG4gKiAgICAgIGBjb25maWcuYXV0b0NyZWF0ZTogZmFsc2VgKS4gVGhlIGNyZWF0ZSBjYWxsIGlzIGlkZW1wb3RlbnQgLSBhblxuICogICAgICBgQUxSRUFEWV9FWElTVFNgIHJlc3BvbnNlIGZyb20gYSBjb25jdXJyZW50IGJvb3QgaXMgdHJlYXRlZCBhc1xuICogICAgICBzdWNjZXNzLiBUaGVuIHBvbGwgdGhlIGRlZmF1bHQgZW5kcG9pbnQgdW50aWwgaXQgcmVwb3J0c1xuICogICAgICBgY3VycmVudF9zdGF0ZWAgYFJFQURZYCBvciBgSURMRWAuXG4gKlxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gd3JpdGVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0b1xuICogYHByb2Nlc3MuZW52YCBzbyB0aGUgZG93bnN0cmVhbSBgbGFrZWJhc2VgIHBsdWdpbiBwaWNrcyB0aGVtIHVwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2FwaS93b3Jrc3BhY2UvcG9zdGdyZXNcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwLFxuICBnZXRXb3Jrc3BhY2VDbGllbnQsXG4gIHR5cGUgTGFrZWJhc2VQb29sLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHByb2plY3RVdGlscywgcmVzb2x2ZVZhbHVlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgcGFyc2VBZGRyZXNzLFxuICBwYXJzZVJlc291cmNlUGF0aCxcbiAgcGFyc2VTc2xNb2RlIGFzIHBhcnNlTmF0aXZlU3NsTW9kZSxcbiAgU1NMX01PREVTLFxuICB0eXBlIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyxcbiAgdHlwZSBTc2xNb2RlLFxufSBmcm9tIFwiQGRieC10b29scy9sYWtlYmFzZVwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICBzbGVlcCxcbiAgdG9FcnJvcixcbiAgaXNSZWNvcmQsXG4gIHRjcFBvcnRTY2hlbWEsXG4gIGRhdGFicmlja3NFbnZpcm9ubWVudE5hbWVzLFxuICB0b1NsdWdXaXRoT3B0aW9ucyxcbiAgTUFYX1RDUF9QT1JULFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgdG9Db250ZXh0IH0gZnJvbSBcIi4vZGF0YWJyaWNrcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJhc2UtcmVzb2x2ZXJcIik7XG5jb25zdCBBUElfQkFTRSA9IFwiL2FwaS8yLjAvcG9zdGdyZXNcIjtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDU0MzI7XG5jb25zdCBERUZBVUxUX1NTTF9NT0RFOiBTc2xNb2RlID0gXCJyZXF1aXJlXCI7XG5jb25zdCBERUZBVUxUX1BHX1ZFUlNJT04gPSAxNztcbi8qKiBMYWtlYmFzZSBwcm9qZWN0IGlkczogYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGAuICovXG5jb25zdCBQUk9KRUNUX0lEX01BWF9MRU4gPSA2MztcbmNvbnN0IE9QRVJBVElPTl9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IE9QRVJBVElPTl9QT0xMX01TID0gMl8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1BPTExfTVMgPSAyXzAwMDtcbi8qKiBDZWlsaW5nIG9uIGEgc2luZ2xlIGJhY2tvZmYgc3RlcCwgc28gYSBsb25nIHdhaXQgc3RpbGwgcG9sbHMgcmVndWxhcmx5LiAqL1xuY29uc3QgUE9MTF9NQVhfREVMQVlfTVMgPSAxNV8wMDA7XG5jb25zdCBQT0xMX0JBQ0tPRkZfRkFDVE9SID0gMS41O1xuLyoqIEZyYWN0aW9uIG9mIGVhY2ggZGVsYXkgYXBwbGllZCBhcyArLy0gaml0dGVyLCBzbyBjb25jdXJyZW50IGJvb3RzIGRlc3luY2hyb25pemUuICovXG5jb25zdCBQT0xMX0pJVFRFUl9SQVRJTyA9IDAuMjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmVuZHBvaW50X3R5cGVgIGZvciB0aGUgd3JpdGFibGUgcHJpbWFyeS4gKi9cbmNvbnN0IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSA9IFwiRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFXCI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCB2YWx1ZXMgdGhhdCB3aWxsIGFjY2VwdCBhIGNvbm5lY3Rpb24uICovXG5jb25zdCBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMgPSBuZXcgU2V0KFtcIlJFQURZXCIsIFwiSURMRVwiXSk7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCBiZWZvcmUgYSBob3N0bmFtZSBpcyBtZWFuaW5nZnVsLiAqL1xuY29uc3QgSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFID0gXCJJTklUSUFMSVpJTkdcIjtcbi8qKiBMYWtlYmFzZSdzIG93biBkZWZhdWx0IFBvc3RncmVzIGRhdGFiYXNlIG5hbWUuICovXG5jb25zdCBERUZBVUxUX0RBVEFCQVNFID0gXCJkYXRhYnJpY2tzX3Bvc3RncmVzXCI7XG5cbi8qKlxuICogVXNlci1zdXBwbGllZCBMYWtlYmFzZSBpbnB1dHMgKGNvbmZpZyBvciBlbnYpIGJlZm9yZSBhbnkgQVBJIHJlc29sdXRpb24uXG4gKiBFeHRlbmRzIHtAbGluayBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHN9IHdpdGggcmVzb2x2ZXItb25seSBvcHRpb25zLlxuICoge0BsaW5rIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb259IGZpbGxzIGdhcHMgZnJvbSB0aGUgTGFrZWJhc2UgQVBJIHdoZW5cbiAqIGl0IGhhcyBlbm91Z2ggY29udGV4dCAodHlwaWNhbGx5IGEgYHByb2plY3RgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVJlc29sdmVySW5wdXRzIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgLyoqIEF1dGgtcmVzb2x2ZWQgcHJvZmlsZSB1c2VkIG9ubHkgZm9yIERhdGFicmlja3MgYnVuZGxlIHZhbGlkYXRpb24uICovXG4gIGJ1bmRsZVByb2ZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gbm8gcHJvamVjdCBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZSBhdCBhbGwuXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb21cbiAgICogICB7QGxpbmsgcHJvamVjdC5uYW1lfSAodGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gICAqICAgbmFtZSkgc2x1Z2lmaWVkIHRvIExha2ViYXNlIGlkIGNvbnN0cmFpbnRzLCB0aGVuIGNyZWF0ZSBpdC5cbiAgICogLSBgc3RyaW5nYDogY3JlYXRlIGEgbmV3IHByb2plY3Qgd2l0aCB0aGlzIGV4YWN0IGlkLlxuICAgKiAtIGBmYWxzZWA6IHNraXAgY3JlYXRpb24gYW5kIHRocm93IHdpdGggYSBjbGVhciBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgYXV0b0NyZWF0ZT86IHN0cmluZyB8IGZhbHNlO1xufVxuXG4vKiogRnVsbHktcmVzb2x2ZWQgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFrZWJhc2VDb25uZWN0aW9uIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgcG9ydDogbnVtYmVyO1xuICBzc2xNb2RlOiBTc2xNb2RlO1xufVxuXG4vKipcbiAqIENhcHR1cmUgQXBwS2l0J3MgZXhpc3Rpbmcgc2VydmljZS1wcmluY2lwYWwgTGFrZWJhc2UgcG9vbC5cbiAqXG4gKiBDYWxsIHRoaXMgZHVyaW5nIGBzZXR1cDpjb21wbGV0ZWAsIG91dHNpZGUgYW55IGBhc1VzZXIoKWAgc2NvcGUuIEFwcEtpdCdzXG4gKiBleHBvcnRlZCBwb29sIHJvdXRlcyBkeW5hbWljYWxseSBieSByZXF1ZXN0IGNvbnRleHQsIGJ1dCBpdHMgcnVudGltZVxuICogYGFjdGl2ZVBvb2woKWAgbWV0aG9kIHJldHVybnMgdGhlIGFscmVhZHktY3JlYXRlZCB1bmRlcmx5aW5nIHBvb2wgc2VsZWN0ZWQgaW5cbiAqIHRoZSBjdXJyZW50IGNvbnRleHQuIENhcHR1cmluZyBpdCBvbmNlIGF0IHN0YXJ0dXAgcGlucyBhcHBsaWNhdGlvbi1vd25lZFxuICogc3RvcmFnZSB0byB0aGUgc2VydmljZSBwcmluY2lwYWwgd2l0aG91dCBjcmVhdGluZyBhbm90aGVyIHBvb2wgb3IgY29ubmVjdGlvbi5cbiAqXG4gKiBBIGZ1dHVyZSBBcHBLaXQgdmVyc2lvbiBtYXkgZXhwb3J0IGEgZml4ZWQgcG9vbCBkaXJlY3RseTsgaW4gdGhhdCBjYXNlIHRoZVxuICogcG9vbCBoYXMgbm8gYGFjdGl2ZVBvb2woKWAgbWV0aG9kIGFuZCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlU2VydmljZVByaW5jaXBhbFBvb2wocG9vbDogTGFrZWJhc2VQb29sKTogTGFrZWJhc2VQb29sIHtcbiAgY29uc3Qgcm91dGluZ1Bvb2wgPSBwb29sIGFzIExha2ViYXNlUG9vbCAmIHsgYWN0aXZlUG9vbD86ICgpID0+IExha2ViYXNlUG9vbCB9O1xuICByZXR1cm4gcm91dGluZ1Bvb2wuYWN0aXZlUG9vbD8uY2FsbChwb29sKSA/PyBwb29sO1xufVxuXG4vKipcbiAqIEV2ZXJ5IGZpZWxkIG9mIHRoZSBMYWtlYmFzZSBSRVNUIHBheWxvYWRzIGlzIG1vZGVsbGVkIGFzIG9wdGlvbmFsIGFuZFxuICogdmFsaWRhdGVkIGF0IHRoZSBib3VuZGFyeSByYXRoZXIgdGhhbiBhc3NlcnRlZCB3aXRoIGEgY2FzdDogdGhlIHBpY2tlcnMgYmVsb3dcbiAqIGJyYW5jaCBvbiBgc3RhdHVzLipgLCBhbmQgYSBzaGFwZSBjaGFuZ2UgdXBzdHJlYW0gc2hvdWxkIHN1cmZhY2UgYXMgb25lIGxvdWRcbiAqIGVycm9yIGhlcmUgaW5zdGVhZCBvZiBhbiBgdW5kZWZpbmVkYCB0aHJlZSBmcmFtZXMgYXdheS4gRW51bS1zaGFwZWQgZmllbGRzXG4gKiBzdGF5IGBzdHJpbmdgIHNvIGEgbmV3bHkgYWRkZWQgc3RhdGUgZG9lcyBub3QgZmFpbCB0aGUgd2hvbGUgcmVzcG9uc2UuXG4gKi9cbmNvbnN0IHByb2plY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkZ1bGwgcmVzb3VyY2UgcGF0aDogcHJvamVjdHMve3B9LlwiKSxcbn0pO1xudHlwZSBQcm9qZWN0ID0gei5pbmZlcjx0eXBlb2YgcHJvamVjdFNjaGVtYT47XG5cbmNvbnN0IGVuZHBvaW50U2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZW5kcG9pbnRzL3tlfS5cIiksXG4gIHVpZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiU3RhYmxlIGVuZHBvaW50IHVpZCBhc3NpZ25lZCBieSBMYWtlYmFzZS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgZW5kcG9pbnRfdHlwZTogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiRW5kcG9pbnQgcm9sZSwgc3VjaCBhcyBFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEUuXCIpLFxuICAgICAgaG9zdHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV3JpdGFibGUgcHJpbWFyeSBob3N0bmFtZS5cIiksXG4gICAgICAgICAgcmVhZF9vbmx5X2hvc3Q6IHpcbiAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlJlYWQtb25seSByZXBsaWNhIGhvc3RuYW1lIHdoZW4gcHJlc2VudC5cIiksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcIlJlc29sdmVkIGhvc3RuYW1lcy4gaG9zdHMuaG9zdCBpcyB0aGUgd3JpdGFibGUgcHJpbWFyeS5cIiksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXCJDb21wdXRlIHN0YXRlOiBJTklUSUFMSVpJTkcsIFNUQVJUSU5HLCBSRUFEWSwgSURMRSwgYW5kIGxhdGVyIHZhbHVlcy5cIiksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIlNlcnZlci1zaWRlIHN0YXRlLiBSdW50aW1lIGhvc3RuYW1lcyBsaXZlIGhlcmUsIG5vdCBpbiB0aGUgc3BlYyBibG9jay5cIiksXG59KTtcbnR5cGUgRW5kcG9pbnQgPSB6LmluZmVyPHR5cGVvZiBlbmRwb2ludFNjaGVtYT47XG5cbmNvbnN0IGJyYW5jaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRnVsbCByZXNvdXJjZSBwYXRoOiBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9LlwiKSxcbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBkZWZhdWx0OiB6XG4gICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFwiVHJ1ZSBmb3IgdGhlIHByb2plY3QncyBkZWZhdWx0IGJyYW5jaCwgc3VjaCBhcyBwcm9kdWN0aW9uLlwiKSxcbiAgICAgIGN1cnJlbnRfc3RhdGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkJyYW5jaCBjb21wdXRlIHN0YXRlIHJlcG9ydGVkIGJ5IExha2ViYXNlLlwiKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIEJyYW5jaCA9IHouaW5mZXI8dHlwZW9mIGJyYW5jaFNjaGVtYT47XG5cbmNvbnN0IGRhdGFiYXNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXCJGdWxsIHJlc291cmNlIHBhdGg6IHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZGF0YWJhc2VzL3tkfS5cIiksXG4gIHN0YXR1czogelxuICAgIC5vYmplY3Qoe1xuICAgICAgcG9zdGdyZXNfZGF0YWJhc2U6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBcIkFjdHVhbCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lIHVzZWQgYXMgUEdEQVRBQkFTRS4gTWF5IGRpZmZlciBmcm9tIHRoZSByZXNvdXJjZSBpZC5cIixcbiAgICAgICAgKSxcbiAgICB9KVxuICAgIC5vcHRpb25hbCgpLFxufSk7XG50eXBlIERhdGFiYXNlID0gei5pbmZlcjx0eXBlb2YgZGF0YWJhc2VTY2hlbWE+O1xuXG4vKipcbiAqIExha2ViYXNlIFJFU1QgbGlzdCByZXNwb25zZXMgZm9sbG93IHRoZSBHb29nbGUgQUlQIGNvbnZlbnRpb246XG4gKiBgeyA8cGx1cmFsLXJlc291cmNlPjogVFtdLCBuZXh0X3BhZ2VfdG9rZW4/OiBzdHJpbmcgfWAuIFdlIG9ubHkgcmVhZFxuICogdGhlIGZpcnN0IHBhZ2U7IGZvciBhdXRvLWNvbmZpZydzIFwicGljayBzb21ldGhpbmcgc2Vuc2libGVcIiBzZW1hbnRpY3MgdGhlXG4gKiBjYXAgaXMgZmluZS5cbiAqL1xuY29uc3QgbGlzdFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBuZXh0X3BhZ2VfdG9rZW46IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcIkFJUCBwYWdlIHRva2VuLiBPbmx5IHRoZSBmaXJzdCBwYWdlIGlzIGNvbnN1bWVkLlwiKSxcbiAgcHJvamVjdHM6IHouYXJyYXkocHJvamVjdFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgYnJhbmNoZXM6IHouYXJyYXkoYnJhbmNoU2NoZW1hKS5vcHRpb25hbCgpLFxuICBlbmRwb2ludHM6IHouYXJyYXkoZW5kcG9pbnRTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGRhdGFiYXNlczogei5hcnJheShkYXRhYmFzZVNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExvbmctcnVubmluZyBvcGVyYXRpb24gZW52ZWxvcGUgcmV0dXJuZWQgYnkgbXV0YXRpbmcgUkVTVCBjYWxscy5cbiAqIGBkb25lOiB0cnVlYCBtZWFucyB0ZXJtaW5hbDsgY2hlY2sgYGVycm9yYCBiZWZvcmUgcmVhZGluZyBgcmVzcG9uc2VgLlxuICovXG5jb25zdCBvcGVyYXRpb25TY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIk9wZXJhdGlvbiByZXNvdXJjZSBuYW1lLlwiKSxcbiAgZG9uZTogei5ib29sZWFuKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlRydWUgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIHRlcm1pbmFsLlwiKSxcbiAgZXJyb3I6IHoudW5rbm93bigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJFcnJvciBwYXlsb2FkIHByZXNlbnQgd2hlbiB0aGUgb3BlcmF0aW9uIGZhaWxlZC5cIiksXG4gIHJlc3BvbnNlOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiUmVzdWx0IHBheWxvYWQgcHJlc2VudCB3aGVuIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLlwiKSxcbn0pO1xudHlwZSBPcGVyYXRpb24gPSB6LmluZmVyPHR5cGVvZiBvcGVyYXRpb25TY2hlbWE+O1xuXG4vKiogYFBHUE9SVGAgbXVzdCBsYW5kIGluc2lkZSB0aGUgVENQIHBvcnQgcmFuZ2UuICovXG5jb25zdCBwb3J0U2NoZW1hID0gdGNwUG9ydFNjaGVtYTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1BPUlRgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmQgdGhyb3dzXG4gKiBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdQT1JUYCBmb3IgYW55dGhpbmcgdGhhdCBpcyBub3QgYSBUQ1BcbiAqIHBvcnQsIHNvIGEgdHlwbyBjYW5ub3QgcmVhY2ggdGhlIGNvbm5lY3Rpb24gcmVjb3JkIGFzIGBOYU5gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3J0KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gcG9ydFNjaGVtYS5zYWZlUGFyc2UodmFsdWUpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcIlBHUE9SVFwiLCB2YWx1ZSwgYGEgVENQIHBvcnQgYmV0d2VlbiAxIGFuZCAke01BWF9UQ1BfUE9SVH1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkLmRhdGE7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBgUEdTU0xNT0RFYC1zaGFwZWQgdmFsdWUuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB1bnNldCwgYW5kXG4gKiB0aHJvd3MgYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSBuYW1pbmcgYFBHU1NMTU9ERWAgZm9yIGFuIHVuc3VwcG9ydGVkIG1vZGVcbiAqIHJhdGhlciB0aGFuIGhhbmRpbmcgYHBnYCBhIHZhbHVlIGl0IHdpbGwgcmVqZWN0IGF0IGNvbm5lY3QgdGltZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3NsTW9kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3NsTW9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZU5hdGl2ZVNzbE1vZGUodmFsdWUpO1xuICBpZiAocGFyc2VkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwiUEdTU0xNT0RFXCIsIHZhbHVlLCBTU0xfTU9ERVMuam9pbihcIiwgXCIpKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIERlbGF5IGJlZm9yZSB0aGUgbmV4dCBwb2xsIGF0dGVtcHQ6IGV4cG9uZW50aWFsIGJhY2tvZmYgY2FwcGVkIGF0XG4gKiB7QGxpbmsgUE9MTF9NQVhfREVMQVlfTVN9LCBwbHVzIGppdHRlciBzbyBzZXZlcmFsIGFwcHMgYm9vdGluZyBhZ2FpbnN0IHRoZVxuICogc2FtZSB3b3Jrc3BhY2UgZG8gbm90IHJldHJ5IGluIGxvY2tzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IE1hdGgubWluKGJhc2VNcyAqIFBPTExfQkFDS09GRl9GQUNUT1IgKiogYXR0ZW1wdCwgUE9MTF9NQVhfREVMQVlfTVMpO1xuICBjb25zdCBqaXR0ZXIgPSBiYWNrb2ZmICogUE9MTF9KSVRURVJfUkFUSU8gKiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKTtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgucm91bmQoYmFja29mZiArIGppdHRlcikpO1xufVxuXG4vKipcbiAqIFdhaXQgb3V0IHtAbGluayBuZXh0UG9sbERlbGF5fSBiZWZvcmUgdGhlIG5leHQgYXR0ZW1wdC4gUmVqZWN0cyB3aXRoIHRoZVxuICogc2lnbmFsJ3MgcmVhc29uIHdoZW4gdGhlIGNhbGxlciBjYW5jZWxzIG1pZC13YWl0LCBzbyBhIHBvbGwgbG9vcCB1bndpbmRzXG4gKiBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpdHMgYmFja29mZiBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gc2xlZXAobmV4dFBvbGxEZWxheShhdHRlbXB0LCBiYXNlTXMpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFB1bGwgcmVzb2x2ZXIgaW5wdXRzIGZyb20gYHByb2Nlc3MuZW52YCwgcGFyc2UgdGhlIGFkZHJlc3MgYmxvYiwgYW5kXG4gKiBsYXllciBleHBsaWNpdCBjb25maWcgb24gdG9wIHdpdGggdGhpcyBwcmVjZWRlbmNlOlxuICpcbiAqICAgYGNvbmZpZy48ZmllbGQ+YCA+IGBjb25maWdVdGlscy5yZXNvbHZlVmFsdWVgIChzaGFyZWQgY29uZmlnIHNvdXJjZXMpID5cbiAqICAgd2hhdGV2ZXIge0BsaW5rIHBhcnNlQWRkcmVzc30gcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiAgIGBlbmRwb2ludGAgLyBgTEFLRUJBU0VfRU5EUE9JTlRgIGJsb2IuXG4gKlxuICogU2V0IGBjb25maWcuZW5kcG9pbnRgIChvciBgTEFLRUJBU0VfRU5EUE9JTlRgKSB0byBhbnkgaW5wdXRcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzOiBjYW5vbmljYWwgcmVzb3VyY2UgcGF0aHMsIFBvc3RncmVzXG4gKiBVUklzLCBiYXJlIGhvc3RuYW1lcywgb3IgYmFyZSBwcm9qZWN0IGlkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWtlYmFzZUlucHV0cyhcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbik6IFByb21pc2U8TGFrZWJhc2VSZXNvbHZlcklucHV0cz4ge1xuICBjb25zdCBjb25maWdPcHRpb25zID0geyBidW5kbGVQcm9maWxlOiBjb25maWc/LmJ1bmRsZVByb2ZpbGUgfTtcbiAgY29uc3QgcmF3QWRkcmVzcyA9XG4gICAgY29uZmlnPy5lbmRwb2ludCA/PyByZXNvbHZlVmFsdWUoZGF0YWJyaWNrc0Vudmlyb25tZW50TmFtZXMubGFrZWJhc2VFbmRwb2ludCwgY29uZmlnT3B0aW9ucyk7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQWRkcmVzcyhyYXdBZGRyZXNzKTtcbiAgY29uc3QgcG9ydEVudiA9IHBhcnNlUG9ydChyZXNvbHZlVmFsdWUoXCJQR1BPUlRcIiwgY29uZmlnT3B0aW9ucykpO1xuICBjb25zdCBzc2xNb2RlRW52ID0gcGFyc2VTc2xNb2RlKHJlc29sdmVWYWx1ZShcIlBHU1NMTU9ERVwiLCBjb25maWdPcHRpb25zKSk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRTc2xNb2RlID0gcGFyc2VTc2xNb2RlKGNvbmZpZz8uc3NsTW9kZSk7XG4gIGNvbnN0IHBhcnNlZFNzbE1vZGUgPSBwYXJzZVNzbE1vZGUocGFyc2VkLnNzbE1vZGUpO1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IGNvbmZpZz8ucHJvamVjdCA/PyBwYXJzZWQucHJvamVjdCxcbiAgICBicmFuY2g6IGNvbmZpZz8uYnJhbmNoID8/IHBhcnNlZC5icmFuY2gsXG4gICAgLy8gT25seSBjYW5vbmljYWwgZW5kcG9pbnQgcmVzb3VyY2UgcGF0aHMgc3Vydml2ZSBoZXJlOyBVUklzIGFuZFxuICAgIC8vIGJhcmUgaG9zdG5hbWVzIHNldCBgaG9zdGAgaW5zdGVhZCBhbmQgbGVhdmUgYGVuZHBvaW50YCB1bmRlZmluZWRcbiAgICAvLyB1bnRpbCB0aGUgUkVTVCByZXNvbHZlciBmaWxscyBpdCBpbi5cbiAgICBlbmRwb2ludDogcGFyc2VkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiBjb25maWc/LmRhdGFiYXNlID8/IHJlc29sdmVWYWx1ZShcIlBHREFUQUJBU0VcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmRhdGFiYXNlLFxuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyByZXNvbHZlVmFsdWUoXCJQR0hPU1RcIiwgY29uZmlnT3B0aW9ucykgPz8gcGFyc2VkLmhvc3QsXG4gICAgcG9ydDogY29uZmlnPy5wb3J0ID8/IHBvcnRFbnYgPz8gcGFyc2VkLnBvcnQsXG4gICAgc3NsTW9kZTogY29uZmlndXJlZFNzbE1vZGUgPz8gc3NsTW9kZUVudiA/PyBwYXJzZWRTc2xNb2RlLFxuICAgIGF1dG9DcmVhdGU6IGNvbmZpZz8uYXV0b0NyZWF0ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZnVsbHktcG9wdWxhdGVkIFBvc3RncmVzIGNvbm5lY3Rpb24gcmVjb3JkIGZyb20gY29uZmlnICsgZW52LlxuICpcbiAqIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBuZXR3b3JrIHRyYWZmaWMgd2hlbiBlbnYgYWxyZWFkeSBzdXBwbGllc1xuICogYGVuZHBvaW50YCwgYGhvc3RgLCBhbmQgYGRhdGFiYXNlYC4gT3RoZXJ3aXNlIGlzc3VlcyBSRVNUIGNhbGxzIGFuZFxuICogbWF5IGF1dG8tY3JlYXRlIGEgcHJvamVjdCAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgZXZlcnkgUkVTVCBjYWxsIGFuZCBpbnRlci1wb2xsIHNsZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBsYWtlYmFzZVJlc29sdmVyLnJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gKiAgIHsgYXV0b0NyZWF0ZTogZmFsc2UgfSxcbiAqICAgQWJvcnRTaWduYWwudGltZW91dCg2MF8wMDApLFxuICogKTtcbiAqIGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24+IHtcbiAgY29uc3QgaW5wdXRzID0gYXdhaXQgcmVhZExha2ViYXNlSW5wdXRzKGNvbmZpZyk7XG4gIGxldCB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0IH0gPSBpbnB1dHM7XG4gIGNvbnN0IHBvcnQgPSBpbnB1dHMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNzbE1vZGUgPSBwYXJzZVNzbE1vZGUoaW5wdXRzLnNzbE1vZGUpID8/IERFRkFVTFRfU1NMX01PREU7XG5cbiAgLy8gUmVzb3VyY2UgcGF0aHMgbWF5IGNhcnJ5IHJlZHVuZGFudCBpbmZvOyBoYXJ2ZXN0IHByb2plY3QvYnJhbmNoXG4gIC8vIGZyb20gYW55IGNhbm9uaWNhbCBwYXRoIHRoYXQgc251Y2sgaW4gdmlhIFBHREFUQUJBU0Ugb3Igc2ltaWxhci5cbiAgaWYgKGVuZHBvaW50ICYmICghcHJvamVjdCB8fCAhYnJhbmNoKSkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBwcm9qZWN0ID8/PSBwYXJzZWRFbmRwb2ludC5wcm9qZWN0O1xuICAgIGJyYW5jaCA/Pz0gcGFyc2VkRW5kcG9pbnQuYnJhbmNoO1xuICB9XG4gIGlmIChkYXRhYmFzZSAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWREYXRhYmFzZSA9IHBhcnNlQWRkcmVzcyhkYXRhYmFzZSk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRGF0YWJhc2UucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZERhdGFiYXNlLmJyYW5jaDtcbiAgICBpZiAocGFyc2VkRGF0YWJhc2UuZGF0YWJhc2VSZXNvdXJjZUlkKSB7XG4gICAgICBkYXRhYmFzZSA9IHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZDtcbiAgICB9XG4gIH1cblxuICAvLyBBbHJlYWR5IGNvbXBsZXRlOiBza2lwIGV2ZXJ5IFJFU1QgY2FsbC5cbiAgaWYgKGVuZHBvaW50ICYmIGhvc3QgJiYgZGF0YWJhc2UpIHtcbiAgICByZXR1cm4geyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCwgcG9ydCwgc3NsTW9kZSB9O1xuICB9XG5cbiAgY29uc3Qgd3MgPSBnZXRXb3Jrc3BhY2VDbGllbnQoe30pO1xuXG4gIC8vIEhvc3Qga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGg6IHNjYW4gdGhlIHdvcmtzcGFjZSB0byBmaW5kIHdoaWNoXG4gIC8vIGVuZHBvaW50IG93bnMgdGhpcyBob3N0IHNvIHdlIGNhbiBwb3B1bGF0ZSBMQUtFQkFTRV9FTkRQT0lOVC5cbiAgaWYgKCFwcm9qZWN0ICYmIGhvc3QpIHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IGZpbmRFbmRwb2ludEJ5SG9zdCh3cywgaG9zdCwgc2lnbmFsKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHByb2plY3QgPSBmb3VuZC5wcm9qZWN0O1xuICAgICAgYnJhbmNoID0gZm91bmQuYnJhbmNoO1xuICAgICAgZW5kcG9pbnQgPz89IGZvdW5kLmVuZHBvaW50O1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIHByb2plY3QgYW55d2hlcmUgaW4gY29uZmlnL2Vudi9hZGRyZXNzOiBsaXN0LCBwaWNrLCBvciBjcmVhdGUuXG4gIGlmICghcHJvamVjdCkge1xuICAgIHByb2plY3QgPSBhd2FpdCBwaWNrT3JDcmVhdGVQcm9qZWN0KHdzLCBjb25maWc/LmF1dG9DcmVhdGUsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWJyYW5jaCkge1xuICAgIGJyYW5jaCA9IGF3YWl0IHBpY2tCcmFuY2god3MsIHByb2plY3QsIHNpZ25hbCk7XG4gIH1cblxuICBpZiAoIWVuZHBvaW50KSB7XG4gICAgY29uc3QgZXAgPSBhd2FpdCBwaWNrRW5kcG9pbnQod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgICBlbmRwb2ludCA9IGVwLm5hbWU7XG4gICAgaG9zdCA/Pz0gZXAuaG9zdDtcbiAgfVxuXG4gIGlmICghaG9zdCAmJiBlbmRwb2ludCkge1xuICAgIGNvbnN0IHBhcnNlZEVuZHBvaW50ID0gcGFyc2VBZGRyZXNzKGVuZHBvaW50KTtcbiAgICBpZiAocGFyc2VkRW5kcG9pbnQucHJvamVjdCAmJiBwYXJzZWRFbmRwb2ludC5icmFuY2ggJiYgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCkge1xuICAgICAgY29uc3QgZXAgPSBhd2FpdCB3YWl0RW5kcG9pbnRSZWFkeShcbiAgICAgICAgd3MsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LnByb2plY3QsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmJyYW5jaCxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQuZW5kcG9pbnRJZCxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICAgIGhvc3QgPSBlcC5zdGF0dXM/Lmhvc3RzPy5ob3N0O1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBob3N0IGZyb20gZW5kcG9pbnRcIiwgeyBob3N0IH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGF0YWJhc2UpIHtcbiAgICBkYXRhYmFzZSA9IGF3YWl0IHBpY2tEYXRhYmFzZSh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICB9XG5cbiAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbn1cblxuLyoqXG4gKiBXcml0ZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0byBgcHJvY2Vzcy5lbnZgIHNvIHRoZSBgbGFrZWJhc2VgIHBsdWdpblxuICogKHdoaWNoIHJlYWRzIGVudiBkaXJlY3RseSkgcGlja3MgdGhlbSB1cCBkdXJpbmcgaXRzIG93biBgc2V0dXAoKWAuXG4gKiBFeGlzdGluZyBlbnYgdmFsdWVzIGFyZSBwcmVzZXJ2ZWQ7IG9ubHkgbWlzc2luZyBrZXlzIGFyZSBmaWxsZWQgaW4sXG4gKiB3aGljaCBrZWVwcyBleHBsaWNpdCBvdmVycmlkZXMgYXV0aG9yaXRhdGl2ZS5cbiAqXG4gKiBUaGlzIGRvZXMgTk9UIHNldCBgUEdVU0VSYCwgd2hpY2ggbmVlZHMgYW4gYXdhaXQgLSBzZWVcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBmb3IgdGhlIGNvbXBsZXRlIHNldCBhIFBvc3RncmVzIHBvb2wgcmVxdWlyZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUxha2ViYXNlVG9FbnYocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IHZvaWQge1xuICBpZiAocmVzb2x2ZWQuZW5kcG9pbnQpIHtcbiAgICBwcm9jZXNzLmVudltkYXRhYnJpY2tzRW52aXJvbm1lbnROYW1lcy5sYWtlYmFzZUVuZHBvaW50XSA/Pz0gcmVzb2x2ZWQuZW5kcG9pbnQ7XG4gIH1cbiAgaWYgKHJlc29sdmVkLmhvc3QpIHByb2Nlc3MuZW52LlBHSE9TVCA/Pz0gcmVzb2x2ZWQuaG9zdDtcbiAgaWYgKHJlc29sdmVkLmRhdGFiYXNlKSBwcm9jZXNzLmVudi5QR0RBVEFCQVNFID8/PSByZXNvbHZlZC5kYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUEdQT1JUID8/PSBTdHJpbmcocmVzb2x2ZWQucG9ydCk7XG4gIHByb2Nlc3MuZW52LlBHU1NMTU9ERSA/Pz0gcmVzb2x2ZWQuc3NsTW9kZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjb25uZWN0aW9uIEFORCBhcHBseSBldmVyeSBQb3N0Z3JlcyBlbnYgdmFyIGEgTGFrZWJhc2UgcG9vbCBuZWVkcyxcbiAqIHJldHVybmluZyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBwbHVzIHRoZSB1c2VybmFtZSB0aGF0IHdhcyBhcHBsaWVkLlxuICpcbiAqIFRoaXMgaXMgdGhlIHdob2xlIHNldCwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIGhhdmluZyBvbmUgZnVuY3Rpb24gZm9yIGl0OlxuICogYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0aHJvd3MgdW5sZXNzIGBMQUtFQkFTRV9FTkRQT0lOVGAsIGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCAqKmFuZCoqIGEgdXNlcm5hbWUgKGBQR1VTRVJgLCBvciBgREFUQUJSSUNLU19DTElFTlRfSURgIGZvciBhXG4gKiBzZXJ2aWNlIHByaW5jaXBhbCkgYXJlIGFsbCBwcmVzZW50LCBhbmQgYSBEYXRhYnJpY2tzIEFwcCBgcG9zdGdyZXNgIHJlc291cmNlXG4gKiBiaW5kaW5nIHN1cHBsaWVzIG9ubHkgdGhlIGZpcnN0LiBBbnl0aGluZyB0aGF0IHdhbnRzIGEgd29ya2luZyBwb29sIC0gdGhlXG4gKiBgbGFrZWJhc2VgIHBsdWdpbiwgb3IgQXBwS2l0J3MgUEVSU0lTVEVOVCBjYWNoZSwgd2hpY2ggcXVpZXRseSBkZWdyYWRlcyB0b1xuICogaW4tbWVtb3J5IHdoZW4gdGhlIHBvb2wgY2Fubm90IGJlIGJ1aWx0IC0gbmVlZHMgYWxsIGZvdXIsIHNvIGNhbGxlcnMgc2hvdWxkIG5vdFxuICogcGFpciB7QGxpbmsgYXBwbHlMYWtlYmFzZVRvRW52fSB3aXRoIHRoZWlyIG93biB1c2VybmFtZSBsb29rdXAuXG4gKlxuICogYFBHVVNFUmAgaXMgYXBwbGllZCB3aXRoIGA/Pz1gIGxpa2UgdGhlIHJlc3QsIHNvIGFuIGV4cGxpY2l0bHkgY29uZmlndXJlZCB2YWx1ZVxuICogc3RheXMgYXV0aG9yaXRhdGl2ZS4gVGhlIGxvb2t1cCByZXR1cm5zIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIHRocm93aW5nIHdoZW4gaXRcbiAqIGNhbm5vdCBkZXRlcm1pbmUgYSB1c2VyLCBsZWF2aW5nIHRoZSBwb29sIHRvIHJlc29sdmUgaXRzIG93bi5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIC8vIEVub3VnaCBmb3IgYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCB0byBidWlsZCBhIHBvb2wuXG4gKiBjb25zdCB7IHVzZXIgfSA9IGF3YWl0IGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZUVudih7IGF1dG9DcmVhdGU6IGZhbHNlIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlMYWtlYmFzZUVudihcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbjsgdXNlcj86IHN0cmluZyB9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbihjb25maWcsIHNpZ25hbCk7XG4gIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAoe30pO1xuICBpZiAodXNlcikgcHJvY2Vzcy5lbnYuUEdVU0VSID8/PSB1c2VyO1xuICByZXR1cm4geyByZXNvbHZlZCwgLi4uKHVzZXIgPyB7IHVzZXIgfSA6IHt9KSB9O1xufVxuXG50eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8dHlwZW9mIGdldFdvcmtzcGFjZUNsaWVudD47XG5cbi8qKiBUaGUgU0RLIGBDb250ZXh0YCBhY2NlcHRlZCBieSB0aGUgd29ya3NwYWNlIGNsaWVudCdzIG93biBjb3B5IG9mIHRoZSBTREsuICovXG50eXBlIEFwaVJlcXVlc3RDb250ZXh0ID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxXb3Jrc3BhY2VDbGllbnRbXCJhcGlDbGllbnRcIl1bXCJyZXF1ZXN0XCJdPlsxXT47XG5cbi8qKlxuICogQWRhcHQgYW4ge0BsaW5rIEFib3J0U2lnbmFsfSBpbnRvIHRoZSBhcGkgY2xpZW50J3MgY2FuY2VsbGF0aW9uIGNvbnRleHQuXG4gKiBBcHBLaXQgcmVzb2x2ZXMgYSBkaWZmZXJlbnQgY29weSBvZiBgQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbGAgdGhhbiB0aGlzXG4gKiBwYWNrYWdlIGRvZXMsIGFuZCBgQ29udGV4dGAgY2FycmllcyBhIHByaXZhdGUgZmllbGQsIHNvIHRoZSB0d28gZGVjbGFyYXRpb25zXG4gKiBhcmUgbm9taW5hbGx5IGluY29tcGF0aWJsZSBldmVuIHRob3VnaCB0aGUgYXBpIGNsaWVudCBvbmx5IHJlYWRzXG4gKiBgY2FuY2VsbGF0aW9uVG9rZW5gIGFuZCBgbG9nZ2VyYCBvZmYgdGhlIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcmVxdWVzdENvbnRleHQoc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IEFwaVJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNpZ25hbCA/ICh0b0NvbnRleHQoc2lnbmFsKSBhcyB1bmtub3duIGFzIEFwaVJlcXVlc3RDb250ZXh0KSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIExha2ViYXNlIFJFU1QgYm9keS4gVGhlIGZ1bGwgcGF5bG9hZCBpcyBsb2dnZWQgcmF0aGVyIHRoYW4gdGhyb3duXG4gKiBzbyBhIGNsaWVudCBuZXZlciByZWNlaXZlcyB1cHN0cmVhbSBkZXRhaWwuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUmVzcG9uc2U8VD4oc2NoZW1hOiB6LlpvZFR5cGU8VD4sIHBhdGg6IHN0cmluZywgYm9keTogdW5rbm93bik6IFQge1xuICBjb25zdCBwYXJzZWQgPSBzY2hlbWEuc2FmZVBhcnNlKGJvZHkpO1xuICBpZiAocGFyc2VkLnN1Y2Nlc3MpIHJldHVybiBwYXJzZWQuZGF0YTtcbiAgbG9nZ2VyLmVycm9yKFwiYXV0b3BnOiB1bmV4cGVjdGVkIExha2ViYXNlIEFQSSByZXNwb25zZVwiLCB7XG4gICAgcGF0aCxcbiAgICBpc3N1ZXM6IHBhcnNlZC5lcnJvci5pc3N1ZXMsXG4gIH0pO1xuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJMYWtlYmFzZSBBUEkgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCByZXNwb25zZVwiLCB7IGNvbnRleHQ6IHsgcGF0aCB9IH0pO1xufVxuXG4vKiogR0VUIGhlbHBlciB0aGF0IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5IGFuZCBmb3J3YXJkcyBjYW5jZWxsYXRpb24uICovXG5hc3luYyBmdW5jdGlvbiBnZXRKc29uPFQ+KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoeyBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICB9LFxuICAgIHJlcXVlc3RDb250ZXh0KHNpZ25hbCksXG4gICk7XG4gIHJldHVybiBwYXJzZVJlc3BvbnNlKHNjaGVtYSwgcGF0aCwgcmVzKTtcbn1cblxuLyoqIFBPU1QgaGVscGVyIGZvciBjcmVhdGUgLyBtdXRhdGUgY2FsbHM7IHZhbGlkYXRlcyB0aGUgSlNPTiBib2R5LiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIGJvZHk6IHVua25vd24sXG4gIHF1ZXJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgd3MuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBxdWVyeSxcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHtcbiAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9KSxcbiAgICAgIHJhdzogZmFsc2UsXG4gICAgICBwYXlsb2FkOiBib2R5LFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0UHJvamVjdHMod3M6IFdvcmtzcGFjZUNsaWVudCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFByb2plY3RbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKHdzLCBgJHtBUElfQkFTRX0vcHJvamVjdHNgLCBsaXN0UmVzcG9uc2VTY2hlbWEsIHNpZ25hbCk7XG4gIHJldHVybiByZXMucHJvamVjdHMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RCcmFuY2hlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8QnJhbmNoW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlc2AsXG4gICAgbGlzdFJlc3BvbnNlU2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHJlcy5icmFuY2hlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEVuZHBvaW50cyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50W10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZW5kcG9pbnRzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmVuZHBvaW50cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdERhdGFiYXNlcyhcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPERhdGFiYXNlW10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZGF0YWJhc2VzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmRhdGFiYXNlcyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RW5kcG9pbnQoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIGVuZHBvaW50SWQ6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gIHJldHVybiBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHMvJHtlbmRwb2ludElkfWAsXG4gICAgZW5kcG9pbnRTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xufVxuXG4vKipcbiAqIFNjYW4gdGhlIHdvcmtzcGFjZSBmb3IgYW4gZW5kcG9pbnQgd2hvc2UgYHN0YXR1cy5ob3N0cy5ob3N0YCBtYXRjaGVzXG4gKiB0aGUgcHJvdmlkZWQgaG9zdG5hbWUuIFVzZWQgdG8gcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL1xuICogZW5kcG9pbnQgcmVzb3VyY2UgcGF0aCB3aGVuIHRoZSBjYWxsZXIgb25seSBzdXBwbGllZCBhIFBvc3RncmVzIFVSSS5cbiAqXG4gKiBPKHByb2plY3RzICogYnJhbmNoZXMgKiBlbmRwb2ludHMpIC0gZmluZSBmb3IgdHlwaWNhbCB3b3Jrc3BhY2VzXG4gKiAoc2luZ2xlIGRpZ2l0cyBwZXIgdGllcik7IHBhZ2luYXRpb24gaXMgaW50ZW50aW9uYWxseSBub3QgZm9sbG93ZWRcbiAqIHNpbmNlIHRoaXMgaXMgYSBiZXN0LWVmZm9ydCBmYWxsYmFjay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmluZEVuZHBvaW50QnlIb3N0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBob3N0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx7IHByb2plY3Q6IHN0cmluZzsgYnJhbmNoOiBzdHJpbmc7IGVuZHBvaW50OiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGZvciAoY29uc3QgcCBvZiBwcm9qZWN0cykge1xuICAgIGNvbnN0IHByb2plY3RJZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdDtcbiAgICBpZiAoIXByb2plY3RJZCkgY29udGludWU7XG4gICAgY29uc3QgYnJhbmNoZXMgPSBhd2FpdCBsaXN0QnJhbmNoZXMod3MsIHByb2plY3RJZCwgc2lnbmFsKTtcbiAgICBmb3IgKGNvbnN0IGIgb2YgYnJhbmNoZXMpIHtcbiAgICAgIGNvbnN0IGJyYW5jaElkID0gcGFyc2VSZXNvdXJjZVBhdGgoYi5uYW1lKS5icmFuY2g7XG4gICAgICBpZiAoIWJyYW5jaElkKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RFbmRwb2ludHMod3MsIHByb2plY3RJZCwgYnJhbmNoSWQsIHNpZ25hbCk7XG4gICAgICBjb25zdCBtYXRjaCA9IGVuZHBvaW50cy5maW5kKChlKSA9PiBlLnN0YXR1cz8uaG9zdHM/Lmhvc3QgPT09IGhvc3QpO1xuICAgICAgaWYgKG1hdGNoPy5uYW1lKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogbWF0Y2hlZCBlbmRwb2ludCBieSBob3N0XCIsIHtcbiAgICAgICAgICBob3N0LFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm9qZWN0OiBwcm9qZWN0SWQsXG4gICAgICAgICAgYnJhbmNoOiBicmFuY2hJZCxcbiAgICAgICAgICBlbmRwb2ludDogbWF0Y2gubmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBubyBlbmRwb2ludCBtYXRjaGVkIGhvc3RcIiwgeyBob3N0IH0pO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcm9qZWN0IHRvIHVzZSwgb3IgY3JlYXRlIG9uZSB3aGVuIHRoZSB3b3Jrc3BhY2UgaXMgZW1wdHkuXG4gKlxuICogU2VsZWN0aW9uIG9yZGVyOlxuICogMS4gRXhhY3RseSBvbmUgcHJvamVjdCBsaXN0ZWQgLT4gdXNlIGl0LlxuICogMi4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgIT09IGZhbHNlYCAtPiBlbnN1cmUgYSBwcm9qZWN0IHdpdGhcbiAqICAgIHRoZSByZXNvbHZlZCBpZCBleGlzdHMsIHRoZW4gcmV0dXJuIGl0cyBpZC5cbiAqIDMuIFplcm8gcHJvamVjdHMgQU5EIGBhdXRvQ3JlYXRlID09PSBmYWxzZWAgLT4gdGhyb3cuXG4gKiA0LiBNdWx0aXBsZSBwcm9qZWN0cyAtPiB0aHJvdyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdCAoc2V0XG4gKiAgICBgY29uZmlnLnByb2plY3RgIG9yIHBpbiBhIHByb2plY3QgaWQgaW4gYExBS0VCQVNFX0VORFBPSU5UYCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tPckNyZWF0ZVByb2plY3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGF1dG9DcmVhdGU6IHN0cmluZyB8IGZhbHNlIHwgdW5kZWZpbmVkLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgbGlzdFByb2plY3RzKHdzLCBzaWduYWwpO1xuICBpZiAocHJvamVjdHMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgaWQgPSBwYXJzZVJlc291cmNlUGF0aChwcm9qZWN0c1swXSEubmFtZSkucHJvamVjdDtcbiAgICBpZiAoaWQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogdXNpbmcgb25seSBwcm9qZWN0XCIsIHsgcHJvamVjdDogaWQgfSk7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoYXV0b0NyZWF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkxha2ViYXNlIHByb2plY3RcIixcbiAgICAgICAgXCJhdXRvQ3JlYXRlIGlzIGZhbHNlOyBjcmVhdGUgYSBwcm9qZWN0IG9yIHNldCBjb25maWcucHJvamVjdCAvIExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgaWQgPSBhdXRvQ3JlYXRlID8/IChhd2FpdCBkZWZhdWx0UHJvamVjdElkKCkpO1xuICAgIHJldHVybiBlbnN1cmVQcm9qZWN0KHdzLCBpZCwgc2lnbmFsKTtcbiAgfVxuICBjb25zdCBjYW5kaWRhdGVzID0gcHJvamVjdHNcbiAgICAubWFwKChwKSA9PiBwYXJzZVJlc291cmNlUGF0aChwLm5hbWUpLnByb2plY3QpXG4gICAgLmZpbHRlcigoaWQpOiBpZCBpcyBzdHJpbmcgPT4gQm9vbGVhbihpZCkpXG4gICAgLmpvaW4oXCIsIFwiKTtcbiAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgIFwiTGFrZWJhc2VcIixcbiAgICBgTXVsdGlwbGUgcHJvamVjdHMgZm91bmQ7IHNldCBjb25maWcucHJvamVjdCBvciBwaW4gYSBwcm9qZWN0IGlkIGluIExBS0VCQVNFX0VORFBPSU5ULiBDYW5kaWRhdGVzOiAke2NhbmRpZGF0ZXN9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBMYWtlYmFzZSBwcm9qZWN0IGlkIGZyb20gdGhlIGhvc3QgcmVwbydzIGBwYWNrYWdlLmpzb25gXG4gKiBuYW1lICh2aWEge0BsaW5rIHByb2plY3QubmFtZX0pIHNsdWdpZmllZCB0byBzYXRpc2Z5IHRoZVxuICogTGFrZWJhc2UgaWQgY29uc3RyYWludCAoYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGApLlxuICpcbiAqIFRocm93cyB3aGVuIHRoZSBzbHVnIGVuZHMgdXAgZW1wdHkgb3Igc3RhcnRzIHdpdGggYSBkaWdpdCwgc2luY2UgdGhlXG4gKiBzZXJ2ZXIgd291bGQgcmVqZWN0IGl0IGFueXdheSAtIGNhbGxlcnMgc2hvdWxkIHBhc3MgYW4gZXhwbGljaXRcbiAqIGBhdXRvQ3JlYXRlYCBpZCBpbiB0aGF0IGNhc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRQcm9qZWN0SWQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbmFtZSA9IHByb2plY3RVdGlscy5uYW1lKCk7XG4gIGNvbnN0IHNsdWcgPSB0b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogUFJPSkVDVF9JRF9NQVhfTEVOIH0sIG5hbWUpO1xuICBpZiAoIXNsdWcgfHwgIS9eW2Etel0vLnRlc3Qoc2x1ZykpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogcHJvamVjdCBuYW1lIGRvZXMgbm90IHNsdWdpZnkgdG8gYSBMYWtlYmFzZSBwcm9qZWN0IGlkXCIsIHsgbmFtZSB9KTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBcIkNvdWxkIG5vdCBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb20gdGhlIHBhY2thZ2UgbmFtZTsgcGFzcyBhdXRvQ3JlYXRlIGV4cGxpY2l0bHkuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc2x1Zztcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBMYWtlYmFzZSBwcm9qZWN0IHdpdGggYHByb2plY3RJZGAgZXhpc3RzLiBDcmVhdGVzIGl0IGFuZFxuICogd2FpdHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiBBbiBgQUxSRUFEWV9FWElTVFNgXG4gKiByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHN1Y2Nlc3MgLSBzb21lb25lIGVsc2UgKGEgY29uY3VycmVudCBib290LFxuICogYSBzaWJsaW5nIHByb2Nlc3MpIHdvbiB0aGUgcmFjZSBhbmQgdGhlIHByb2plY3Qgd2Ugd2FudGVkIGlzIG5vd1xuICogc2l0dGluZyB0aGVyZSByZWFkeSBmb3IgZG93bnN0cmVhbSBwaWNrZXJzLlxuICpcbiAqIFByb2plY3QgY3JlYXRpb24gdHlwaWNhbGx5IHByb3Zpc2lvbnMgYSBkZWZhdWx0IGBwcm9kdWN0aW9uYCBicmFuY2hcbiAqIGFsb25nc2lkZTsgZG93bnN0cmVhbSBwaWNrZXJzIGhhbmRsZSB0aGUgcmVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IG5vIHByb2plY3RzIGZvdW5kOyBjcmVhdGluZ1wiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcCA9IGF3YWl0IHBvc3RKc29uKFxuICAgICAgd3MsXG4gICAgICBgJHtBUElfQkFTRX0vcHJvamVjdHNgLFxuICAgICAgb3BlcmF0aW9uU2NoZW1hLFxuICAgICAgeyBzcGVjOiB7IHBnX3ZlcnNpb246IERFRkFVTFRfUEdfVkVSU0lPTiB9IH0sXG4gICAgICB7IHByb2plY3RfaWQ6IHByb2plY3RJZCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgd2FpdEZvck9wZXJhdGlvbih3cywgb3AsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IGNyZWF0ZWQgcHJvamVjdFwiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFpc0FscmVhZHlFeGlzdHNFcnJvcihlcnIpKSB0aHJvdyBlcnI7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IHByb2plY3QgYWxyZWFkeSBleGlzdHMgKHJhY2UpOyBwcm9jZWVkaW5nXCIsIHtcbiAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvamVjdElkO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZSB0aGUgRGF0YWJyaWNrcyBTREsncyBgQUxSRUFEWV9FWElTVFNgIGZhaWx1cmUgbW9kZXMgc28gYVxuICogbG9zdCByYWNlIGR1cmluZyBgZW5zdXJlUHJvamVjdGAgYmVjb21lcyBhIG5vLW9wIGluc3RlYWQgb2YgYW4gZXJyb3IuXG4gKlxuICogVGhlIFNESyB0aHJvd3MgYEFwaUVycm9yIHsgZXJyb3JDb2RlLCBzdGF0dXNDb2RlIH1gIGZvciBzdHJ1Y3R1cmVkXG4gKiBzZXJ2ZXIgZXJyb3JzIGFuZCBgSHR0cEVycm9yIHsgY29kZSB9YCBmb3IgdHJhbnNwb3J0LWxheWVyIDR4eC81eHguXG4gKiBCb3RoIHN1cmZhY2UgYSBodW1hbiBtZXNzYWdlIHRoYXQgb2Z0ZW4gY2FycmllcyBcImFscmVhZHkgZXhpc3RzXCIgc29cbiAqIHdlIHVzZSB0aGF0IGFzIGEgZmluYWwgZmFsbGJhY2sgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gaXNBbHJlYWR5RXhpc3RzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZSA9IGVycm9yIGFzIHtcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwOSB8fCBlLmNvZGUgPT09IDQwOSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLmVycm9yQ29kZSAmJiAvYWxyZWFkeS4/ZXhpc3RzL2kudGVzdChlLmVycm9yQ29kZSkpIHJldHVybiB0cnVlO1xuICBpZiAoZS5tZXNzYWdlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUubWVzc2FnZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVkdWNlIGEgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWx1cmUgdG8gYW4gZXJyb3Igc2FmZSB0byBwcm9wYWdhdGU6IHRoZVxuICogb3BlcmF0aW9uIG5hbWUgcGx1cyB3aGF0ZXZlciBjb2RlIHRoZSBwYXlsb2FkIGNhcnJpZXMuIFRoZSBwYXlsb2FkIGl0c2VsZiBjYW5cbiAqIGVjaG8gcmVxdWVzdCBjb250ZXh0LCBzbyBpdCBnb2VzIHRvIHRoZSBsb2cgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gb3BlcmF0aW9uRmFpbGVkKG9wTmFtZTogc3RyaW5nLCBvcEVycm9yOiB1bmtub3duKTogRXhlY3V0aW9uRXJyb3Ige1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IG9wZXJhdGlvbiBmYWlsZWRcIiwge1xuICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgIGVycm9yOiB0b0Vycm9yKG9wRXJyb3IpLFxuICB9KTtcbiAgY29uc3QgY29kZSA9IGlzUmVjb3JkKG9wRXJyb3IpID8gKG9wRXJyb3IuY29kZSA/PyBvcEVycm9yLnJlYXNvbikgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIG9wZXJhdGlvbiBmYWlsZWQ6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7XG4gICAgICBvcGVyYXRpb246IG9wTmFtZSxcbiAgICAgIGVycm9yQ29kZTogdHlwZW9mIGNvZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNvZGUgPT09IFwibnVtYmVyXCIgPyBTdHJpbmcoY29kZSkgOiBcInVua25vd25cIixcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQb2xsIGEgTGFrZWJhc2UgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiB1bnRpbCBgZG9uZTogdHJ1ZWAuIFJldHVybnNcbiAqIHRoZSBmaW5hbCBvcGVyYXRpb24gZW52ZWxvcGUgKHdoaWNoIG1heSBjYXJyeSBgcmVzcG9uc2VgIG9yIGBlcnJvcmApLlxuICpcbiAqIFRocm93cyB3aGVuOlxuICogICAtIHRoZSByZXNwb25zZSBjYXJyaWVzIGFuIGBlcnJvcmAgZmllbGQ7XG4gKiAgIC0gYG9wLm5hbWVgIGlzIG1pc3NpbmcgKG5vdGhpbmcgdG8gcG9sbCk7XG4gKiAgIC0gdGhlIHRpbWVvdXQgZWxhcHNlcyBiZWZvcmUgYGRvbmU6IHRydWVgO1xuICogICAtIGBzaWduYWxgIGFib3J0cyBtaWQtd2FpdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvck9wZXJhdGlvbihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgb3A6IE9wZXJhdGlvbixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPE9wZXJhdGlvbj4ge1xuICBpZiAob3AuZG9uZSkge1xuICAgIGlmIChvcC5lcnJvcikge1xuICAgICAgdGhyb3cgb3BlcmF0aW9uRmFpbGVkKG9wLm5hbWUgPz8gXCJ1bmtub3duXCIsIG9wLmVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wO1xuICB9XG4gIGNvbnN0IG9wTmFtZSA9IG9wLm5hbWU7XG4gIGlmICghb3BOYW1lKSB7XG4gICAgdGhyb3cgRXhlY3V0aW9uRXJyb3IubWlzc2luZ0RhdGEoXCJvcGVyYXRpb24gbmFtZVwiKTtcbiAgfVxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBEYXRlLm5vdygpIC0gc3RhcnQgPCBPUEVSQVRJT05fVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgcG9sbERlbGF5KGF0dGVtcHQsIE9QRVJBVElPTl9QT0xMX01TLCBzaWduYWwpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRKc29uKHdzLCBgJHtBUElfQkFTRX0vJHtvcE5hbWV9YCwgb3BlcmF0aW9uU2NoZW1hLCBzaWduYWwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogb3BlcmF0aW9uIHN0YXR1c1wiLCB7IG9wOiBvcE5hbWUsIGRvbmU6IGN1cnJlbnQuZG9uZSB9KTtcbiAgICBpZiAoY3VycmVudC5kb25lKSB7XG4gICAgICBpZiAoY3VycmVudC5lcnJvcikge1xuICAgICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3BOYW1lLCBjdXJyZW50LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlOiAke29wTmFtZX1gLCB7XG4gICAgY29udGV4dDogeyBvcGVyYXRpb246IG9wTmFtZSwgdGltZW91dE1zOiBPUEVSQVRJT05fVElNRU9VVF9NUyB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQb2xsIGBnZXRFbmRwb2ludGAgdW50aWwgdGhlIGNvbXB1dGUgcmVwb3J0cyBhIHVzYWJsZVxuICogYHN0YXR1cy5jdXJyZW50X3N0YXRlYC4gYFJFQURZYCBhbmQgYElETEVgIGFyZSBib3RoIGFjY2VwdGFibGUgLVxuICogYElETEVgIGp1c3QgbWVhbnMgdGhlIGNvbXB1dGUgaGFzIHNjYWxlZCB0byB6ZXJvIGJ1dCBhIGNvbm5lY3Rpb25cbiAqIHdpbGwgd2FrZSBpdC4gUmV0dXJucyB0aGUgZmluYWwgZW5kcG9pbnQgcGF5bG9hZCAod2l0aCBgaG9zdHMuaG9zdGApLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0RW5kcG9pbnRSZWFkeShcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgbGFzdDogRW5kcG9pbnQgfCBudWxsID0gbnVsbDtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IEVORFBPSU5UX1JFQURZX1RJTUVPVVRfTVM7IGF0dGVtcHQrKykge1xuICAgIGxhc3QgPSBhd2FpdCBnZXRFbmRwb2ludCh3cywgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludElkLCBzaWduYWwpO1xuICAgIGNvbnN0IHN0YXRlID0gbGFzdC5zdGF0dXM/LmN1cnJlbnRfc3RhdGU7XG4gICAgaWYgKHN0YXRlICYmIENPTk5FQ1RBQkxFX0VORFBPSU5UX1NUQVRFUy5oYXMoc3RhdGUpKSByZXR1cm4gbGFzdDtcbiAgICBpZiAobGFzdC5zdGF0dXM/Lmhvc3RzPy5ob3N0ICYmIHN0YXRlICE9PSBJTklUSUFMSVpJTkdfRU5EUE9JTlRfU1RBVEUpIHtcbiAgICAgIC8vIENvbXB1dGUgaXMgaW4gc29tZSBvdGhlciBzdGF0ZSAoU1RBUlRJTkcsIGV0Yy4pIGJ1dCBob3N0bmFtZSBpc1xuICAgICAgLy8gYWxyZWFkeSBwdWJsaXNoZWQgLSBnb29kIGVub3VnaCB0byBjb25uZWN0OyBsYWtlYmFzZSdzIE9BdXRoXG4gICAgICAvLyB0b2tlbiByZXF1ZXN0IHdpbGwgd2FrZSBpdC5cbiAgICAgIHJldHVybiBsYXN0O1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHdhaXRpbmcgZm9yIGVuZHBvaW50XCIsIHsgZW5kcG9pbnRJZCwgc3RhdGUgfSk7XG4gICAgYXdhaXQgcG9sbERlbGF5KGF0dGVtcHQsIEVORFBPSU5UX1JFQURZX1BPTExfTVMsIHNpZ25hbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBMYWtlYmFzZSBlbmRwb2ludCBkaWQgbm90IGJlY29tZSByZWFkeTogJHtlbmRwb2ludElkfWAsIHtcbiAgICBjb250ZXh0OiB7XG4gICAgICBwcm9qZWN0LFxuICAgICAgYnJhbmNoLFxuICAgICAgZW5kcG9pbnRJZCxcbiAgICAgIHRpbWVvdXRNczogRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUyxcbiAgICAgIGxhc3RTdGF0ZTogbGFzdD8uc3RhdHVzPy5jdXJyZW50X3N0YXRlID8/IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGRlZmF1bHQgYnJhbmNoIGZvciBhIHByb2plY3QuIFByZWZlcnMgdGhlIGJyYW5jaCBmbGFnZ2VkXG4gKiBgc3RhdHVzLmRlZmF1bHQ6IHRydWVgIChzZXJ2ZXItc2lkZSBkZWZhdWx0LCB0eXBpY2FsbHkgYHByb2R1Y3Rpb25gXG4gKiB1bmxlc3MgdGhlIHByb2plY3Qgb3duZXIgY2hhbmdlZCBpdCkuIEZhbGxzIGJhY2sgdG8gdGhlIG9ubHkgYnJhbmNoXG4gKiB3aGVuIHRoZXJlJ3MgZXhhY3RseSBvbmUuIE90aGVyd2lzZSB0aHJvd3Mgd2l0aCB0aGUgY2FuZGlkYXRlIGxpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tCcmFuY2goXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdCwgc2lnbmFsKTtcbiAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGJyYW5jaCBpbiBwcm9qZWN0ICcke3Byb2plY3R9J2AsXG4gICAgICBcIlRoZSBwcm9qZWN0IGhhcyBubyBicmFuY2hlczsgY3JlYXRlIG9uZSBvciBzZXQgY29uZmlnLmJyYW5jaC5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZsYWdnZWQgPSBicmFuY2hlcy5maW5kKChiKSA9PiBiLnN0YXR1cz8uZGVmYXVsdCA9PT0gdHJ1ZSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgcGFyc2VSZXNvdXJjZVBhdGgoZmxhZ2dlZD8ubmFtZSkuYnJhbmNoID8/XG4gICAgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSA/IHBhcnNlUmVzb3VyY2VQYXRoKGJyYW5jaGVzWzBdIS5uYW1lKS5icmFuY2ggOiB1bmRlZmluZWQpO1xuICBpZiAoIWNob2ljZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBicmFuY2hlc1xuICAgICAgLm1hcCgoYikgPT4gcGFyc2VSZXNvdXJjZVBhdGgoYi5uYW1lKS5icmFuY2gpXG4gICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgYFByb2plY3QgJyR7cHJvamVjdH0nIGhhcyBtdWx0aXBsZSBicmFuY2hlcyBhbmQgbm9uZSBtYXJrZWQgZGVmYXVsdDsgc2V0IGNvbmZpZy5icmFuY2ggb3IgaW5jbHVkZSB0aGUgYnJhbmNoIGluIExBS0VCQVNFX0VORFBPSU5ULiBDYW5kaWRhdGVzOiAke2NhbmRpZGF0ZXN9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgYnJhbmNoXCIsIHsgcHJvamVjdCwgYnJhbmNoOiBjaG9pY2UgfSk7XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8qKlxuICogUGljayB0aGUgcHJpbWFyeSBlbmRwb2ludCBmb3IgYSAocHJvamVjdCwgYnJhbmNoKS4gUHJlZmVyc1xuICogYHN0YXR1cy5lbmRwb2ludF90eXBlID09PSBFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEVgOyBmYWxscyBiYWNrIHRvXG4gKiB0aGUgb25seSBlbmRwb2ludCB3aGVuIHRoZXJlJ3MgZXhhY3RseSBvbmUuIFJldHVybnMgYHsgbmFtZSwgaG9zdCB9YFxuICogc28gdGhlIGNhbGxlciBjYW4gcG9wdWxhdGUgYm90aCBgTEFLRUJBU0VfRU5EUE9JTlRgIGFuZCBgUEdIT1NUYFxuICogZnJvbSBhIHNpbmdsZSBjYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRW5kcG9pbnQoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgaG9zdD86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RFbmRwb2ludHMod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBMYWtlYmFzZSBlbmRwb2ludCBpbiAncHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0nYCxcbiAgICAgIFwiVGhlIGJyYW5jaCBoYXMgbm8gZW5kcG9pbnRzOyBjcmVhdGUgb25lIG9yIHNldCBMQUtFQkFTRV9FTkRQT0lOVC5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaW1hcnkgPVxuICAgIGVuZHBvaW50cy5maW5kKChlKSA9PiBlLnN0YXR1cz8uZW5kcG9pbnRfdHlwZSA9PT0gUkVBRF9XUklURV9FTkRQT0lOVF9UWVBFKSA/P1xuICAgIChlbmRwb2ludHMubGVuZ3RoID09PSAxID8gZW5kcG9pbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFwcmltYXJ5Py5uYW1lKSB7XG4gICAgY29uc3QgbmFtZXMgPSBlbmRwb2ludHMubWFwKChlKSA9PiBlLm5hbWUpLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgQnJhbmNoIGhhcyBubyBwcmltYXJ5IHJlYWQtd3JpdGUgZW5kcG9pbnQ7IHNldCBMQUtFQkFTRV9FTkRQT0lOVCBvciBjb25maWcuZW5kcG9pbnQuIENhbmRpZGF0ZXM6ICR7bmFtZXMuam9pbihcIiwgXCIpfWAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBob3N0ID0gcHJpbWFyeS5zdGF0dXM/Lmhvc3RzPy5ob3N0O1xuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGVuZHBvaW50XCIsIHsgZW5kcG9pbnQ6IHByaW1hcnkubmFtZSwgaG9zdCB9KTtcbiAgcmV0dXJuIHsgbmFtZTogcHJpbWFyeS5uYW1lLCBob3N0IH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBwb3N0Z3JlcyBkYXRhYmFzZSBmb3IgYSAocHJvamVjdCwgYnJhbmNoKS4gVGhlXG4gKiBQb3N0Z3JlcyBkYXRhYmFzZSBOQU1FIChgc3RhdHVzLnBvc3RncmVzX2RhdGFiYXNlYCkgaXMgd2hhdFxuICogYFBHREFUQUJBU0VgIG5lZWRzIC0gdGhpcyBkaWZmZXJzIGZyb20gdGhlIHJlc291cmNlIGlkLCB3aGljaCBjYW5cbiAqIHVzZSBhIGRpZmZlcmVudCBzZXBhcmF0b3IgKGUuZy4gcmVzb3VyY2UgYGRhdGFicmlja3MtcG9zdGdyZXNgXG4gKiBzdXJmYWNlcyBhcyBkYXRhYmFzZSBgZGF0YWJyaWNrc19wb3N0Z3Jlc2ApLiBQcmVmZXJzXG4gKiBgZGF0YWJyaWNrc19wb3N0Z3Jlc2AgKHRoZSBMYWtlYmFzZSBkZWZhdWx0KSwgb3RoZXJ3aXNlIHRoZSBvbmx5XG4gKiBkYXRhYmFzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0RhdGFiYXNlKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRhdGFiYXNlcyA9IGF3YWl0IGxpc3REYXRhYmFzZXMod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgaWYgKGRhdGFiYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBMYWtlYmFzZSBkYXRhYmFzZSBpbiAncHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0nYCxcbiAgICAgIFwiVGhlIGJyYW5jaCBoYXMgbm8gZGF0YWJhc2VzOyBjcmVhdGUgb25lIG9yIHNldCBQR0RBVEFCQVNFLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBkYXRhYmFzZXNcbiAgICAubWFwKChkKSA9PiBkLnN0YXR1cz8ucG9zdGdyZXNfZGF0YWJhc2UpXG4gICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpO1xuICBjb25zdCBjaG9pY2UgPVxuICAgIG5hbWVzLmZpbmQoKG4pID0+IG4gPT09IERFRkFVTFRfREFUQUJBU0UpID8/IChuYW1lcy5sZW5ndGggPT09IDEgPyBuYW1lc1swXSA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgYE11bHRpcGxlIGRhdGFiYXNlcyBhbmQgbm8gJyR7REVGQVVMVF9EQVRBQkFTRX0nOyBzZXQgUEdEQVRBQkFTRSBvciBjb25maWcuZGF0YWJhc2UuIENhbmRpZGF0ZXM6ICR7bmFtZXMuam9pbihcIiwgXCIpfWAsXG4gICAgKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGRhdGFiYXNlXCIsIHsgZGF0YWJhc2U6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cbiJdfQ==
@@ -1,9 +1,9 @@
1
1
  /** Shared classification and logging policy for soft database migrations. */
2
- import { errorUtils, log } from "@dbx-tools/shared-core";
2
+ import { errorContext, errorMessage, toError, isLevelEnabled, } from "@dbx-tools/shared-core";
3
3
  const loggedOwnershipErrors = new Set();
4
4
  /** Whether a migration failed because the current role does not own an object. */
5
5
  export function isOwnershipMigrationError(cause) {
6
- return errorUtils.errorContext(cause).hasMessage("must be owner");
6
+ return errorContext(cause).hasMessage("must be owner");
7
7
  }
8
8
  /**
9
9
  * Classify and log an ownership-only migration failure once per subsystem.
@@ -12,16 +12,16 @@ export function isOwnershipMigrationError(cause) {
12
12
  export function handleOwnershipMigrationError(cause, options) {
13
13
  if (!isOwnershipMigrationError(cause))
14
14
  return false;
15
- const message = errorUtils.errorMessage(cause);
15
+ const message = errorMessage(cause);
16
16
  const key = `${options.scope}\0${message}`;
17
17
  if (loggedOwnershipErrors.has(key))
18
18
  return true;
19
19
  loggedOwnershipErrors.add(key);
20
- const error = errorUtils.toError(cause);
21
- if (log.isLevelEnabled("debug"))
20
+ const error = toError(cause);
21
+ if (isLevelEnabled("debug"))
22
22
  options.logger.error(options.event, { error });
23
23
  else
24
24
  options.logger.warn(options.event, { error, ...options.context });
25
25
  return true;
26
26
  }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2RUFBNkU7QUFFN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQWUsTUFBTSx3QkFBd0IsQ0FBQztBQUV0RSxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFXaEQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxLQUFjO0lBQ3RELE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsS0FBYyxFQUNkLE9BQXVDO0lBRXZDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QyxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7O1FBQzNFLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogU2hhcmVkIGNsYXNzaWZpY2F0aW9uIGFuZCBsb2dnaW5nIHBvbGljeSBmb3Igc29mdCBkYXRhYmFzZSBtaWdyYXRpb25zLiAqL1xuXG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIHR5cGUgTG9nZ2VyIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgbG9nZ2VkT3duZXJzaGlwRXJyb3JzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKiBJbnB1dHMgZm9yIG9uZSBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIHtcbiAgLyoqIFN0YWJsZSBzdWJzeXN0ZW0ga2V5IHVzZWQgdG8gZGVkdXBsaWNhdGUgZXF1aXZhbGVudCB3YXJuaW5ncy4gKi9cbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nZ2VyOiBQaWNrPExvZ2dlciwgXCJlcnJvclwiIHwgXCJ3YXJuXCI+O1xuICByZWFkb25seSBldmVudDogc3RyaW5nO1xuICByZWFkb25seSBjb250ZXh0PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogV2hldGhlciBhIG1pZ3JhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgY3VycmVudCByb2xlIGRvZXMgbm90IG93biBhbiBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPd25lcnNoaXBNaWdyYXRpb25FcnJvcihjYXVzZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3JVdGlscy5lcnJvckNvbnRleHQoY2F1c2UpLmhhc01lc3NhZ2UoXCJtdXN0IGJlIG93bmVyXCIpO1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IGFuZCBsb2cgYW4gb3duZXJzaGlwLW9ubHkgbWlncmF0aW9uIGZhaWx1cmUgb25jZSBwZXIgc3Vic3lzdGVtLlxuICogUmV0dXJucyBgZmFsc2VgIGZvciBldmVyeSBvdGhlciBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIHJldGhyb3cgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVPd25lcnNoaXBNaWdyYXRpb25FcnJvcihcbiAgY2F1c2U6IHVua25vd24sXG4gIG9wdGlvbnM6IE93bmVyc2hpcE1pZ3JhdGlvbkVycm9yT3B0aW9ucyxcbik6IGJvb2xlYW4ge1xuICBpZiAoIWlzT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoY2F1c2UpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShjYXVzZSk7XG4gIGNvbnN0IGtleSA9IGAke29wdGlvbnMuc2NvcGV9XFwwJHttZXNzYWdlfWA7XG4gIGlmIChsb2dnZWRPd25lcnNoaXBFcnJvcnMuaGFzKGtleSkpIHJldHVybiB0cnVlO1xuICBsb2dnZWRPd25lcnNoaXBFcnJvcnMuYWRkKGtleSk7XG4gIGNvbnN0IGVycm9yID0gZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKTtcbiAgaWYgKGxvZy5pc0xldmVsRW5hYmxlZChcImRlYnVnXCIpKSBvcHRpb25zLmxvZ2dlci5lcnJvcihvcHRpb25zLmV2ZW50LCB7IGVycm9yIH0pO1xuICBlbHNlIG9wdGlvbnMubG9nZ2VyLndhcm4ob3B0aW9ucy5ldmVudCwgeyBlcnJvciwgLi4ub3B0aW9ucy5jb250ZXh0IH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiJdfQ==
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2RUFBNkU7QUFFN0UsT0FBTyxFQUVMLFlBQVksRUFDWixZQUFZLEVBQ1osT0FBTyxFQUNQLGNBQWMsR0FDZixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQVdoRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLEtBQWM7SUFDdEQsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLEtBQWMsRUFDZCxPQUF1QztJQUV2QyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUUsQ0FBQztJQUMzQyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRCxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOztRQUN2RSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFNoYXJlZCBjbGFzc2lmaWNhdGlvbiBhbmQgbG9nZ2luZyBwb2xpY3kgZm9yIHNvZnQgZGF0YWJhc2UgbWlncmF0aW9ucy4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBMb2dnZXIsXG4gIGVycm9yQ29udGV4dCxcbiAgZXJyb3JNZXNzYWdlLFxuICB0b0Vycm9yLFxuICBpc0xldmVsRW5hYmxlZCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuY29uc3QgbG9nZ2VkT3duZXJzaGlwRXJyb3JzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKiBJbnB1dHMgZm9yIG9uZSBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJzaGlwTWlncmF0aW9uRXJyb3JPcHRpb25zIHtcbiAgLyoqIFN0YWJsZSBzdWJzeXN0ZW0ga2V5IHVzZWQgdG8gZGVkdXBsaWNhdGUgZXF1aXZhbGVudCB3YXJuaW5ncy4gKi9cbiAgcmVhZG9ubHkgc2NvcGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbG9nZ2VyOiBQaWNrPExvZ2dlciwgXCJlcnJvclwiIHwgXCJ3YXJuXCI+O1xuICByZWFkb25seSBldmVudDogc3RyaW5nO1xuICByZWFkb25seSBjb250ZXh0PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogV2hldGhlciBhIG1pZ3JhdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgY3VycmVudCByb2xlIGRvZXMgbm90IG93biBhbiBvYmplY3QuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPd25lcnNoaXBNaWdyYXRpb25FcnJvcihjYXVzZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3JDb250ZXh0KGNhdXNlKS5oYXNNZXNzYWdlKFwibXVzdCBiZSBvd25lclwiKTtcbn1cblxuLyoqXG4gKiBDbGFzc2lmeSBhbmQgbG9nIGFuIG93bmVyc2hpcC1vbmx5IG1pZ3JhdGlvbiBmYWlsdXJlIG9uY2UgcGVyIHN1YnN5c3RlbS5cbiAqIFJldHVybnMgYGZhbHNlYCBmb3IgZXZlcnkgb3RoZXIgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiByZXRocm93IGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoXG4gIGNhdXNlOiB1bmtub3duLFxuICBvcHRpb25zOiBPd25lcnNoaXBNaWdyYXRpb25FcnJvck9wdGlvbnMsXG4pOiBib29sZWFuIHtcbiAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGNhdXNlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgY29uc3Qga2V5ID0gYCR7b3B0aW9ucy5zY29wZX1cXDAke21lc3NhZ2V9YDtcbiAgaWYgKGxvZ2dlZE93bmVyc2hpcEVycm9ycy5oYXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gIGxvZ2dlZE93bmVyc2hpcEVycm9ycy5hZGQoa2V5KTtcbiAgY29uc3QgZXJyb3IgPSB0b0Vycm9yKGNhdXNlKTtcbiAgaWYgKGlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIikpIG9wdGlvbnMubG9nZ2VyLmVycm9yKG9wdGlvbnMuZXZlbnQsIHsgZXJyb3IgfSk7XG4gIGVsc2Ugb3B0aW9ucy5sb2dnZXIud2FybihvcHRpb25zLmV2ZW50LCB7IGVycm9yLCAuLi5vcHRpb25zLmNvbnRleHQgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuIl19