@mnaoumov/obsidian-lib 10.7.0 → 10.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +4 -0
  2. package/data-stores/data-store-locations/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +18 -1
  4. package/dist/lib/cjs/__merged.d.cts +4 -1
  5. package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
  6. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
  7. package/dist/lib/cjs/community-plugins.cjs +2 -2
  8. package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
  9. package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
  10. package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
  11. package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
  12. package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
  13. package/dist/lib/cjs/data-stores/data-store-locations.cjs +248 -0
  14. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +60 -0
  15. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +2 -2
  16. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +1 -1
  17. package/dist/lib/cjs/data-stores/data-store-transport.cjs +126 -21
  18. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +38 -4
  19. package/dist/lib/cjs/data-stores/index.cjs +4 -1
  20. package/dist/lib/cjs/data-stores/index.d.cts +1 -0
  21. package/dist/lib/cjs/data-stores/shared-data-store.cjs +145 -22
  22. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +53 -1
  23. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
  24. package/dist/lib/cjs/folder-note.cjs +5 -5
  25. package/dist/lib/cjs/formula-function.cjs +152 -0
  26. package/dist/lib/cjs/formula-function.d.cts +98 -0
  27. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
  28. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  29. package/dist/lib/cjs/index.cjs +7 -1
  30. package/dist/lib/cjs/index.d.cts +2 -0
  31. package/dist/lib/cjs/link.cjs +12 -12
  32. package/dist/lib/cjs/markdown.cjs +7 -7
  33. package/dist/lib/cjs/vault.cjs +2 -2
  34. package/dist/lib/cjs/virtual-file.cjs +340 -0
  35. package/dist/lib/cjs/virtual-file.d.cts +48 -0
  36. package/dist/lib/esm/__merged.d.mts +4 -1
  37. package/dist/lib/esm/__merged.mjs +20 -2
  38. package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
  39. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
  40. package/dist/lib/esm/community-plugins.mjs +2 -2
  41. package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
  42. package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
  43. package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
  44. package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
  45. package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
  46. package/dist/lib/esm/data-stores/data-store-locations.d.mts +60 -0
  47. package/dist/lib/esm/data-stores/data-store-locations.mjs +160 -0
  48. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +1 -1
  49. package/dist/lib/esm/data-stores/data-store-seeds.mjs +2 -2
  50. package/dist/lib/esm/data-stores/data-store-transport.d.mts +38 -4
  51. package/dist/lib/esm/data-stores/data-store-transport.mjs +126 -21
  52. package/dist/lib/esm/data-stores/index.d.mts +1 -0
  53. package/dist/lib/esm/data-stores/index.mjs +3 -1
  54. package/dist/lib/esm/data-stores/shared-data-store.d.mts +53 -1
  55. package/dist/lib/esm/data-stores/shared-data-store.mjs +145 -22
  56. package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
  57. package/dist/lib/esm/folder-note.mjs +5 -5
  58. package/dist/lib/esm/formula-function.d.mts +98 -0
  59. package/dist/lib/esm/formula-function.mjs +62 -0
  60. package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
  61. package/dist/lib/esm/generated-during-build.mjs +1 -1
  62. package/dist/lib/esm/index.d.mts +2 -0
  63. package/dist/lib/esm/index.mjs +5 -1
  64. package/dist/lib/esm/link.mjs +12 -12
  65. package/dist/lib/esm/markdown.mjs +7 -7
  66. package/dist/lib/esm/vault.mjs +2 -2
  67. package/dist/lib/esm/virtual-file.d.mts +48 -0
  68. package/dist/lib/esm/virtual-file.mjs +264 -0
  69. package/package.json +5 -5
@@ -511,11 +511,7 @@ class PluginNoticeComponent extends ComponentEx {
511
511
  this.installExplicitCloseGuards(builtNotice, requiresExplicitClose);
512
512
  this.installUserClickTracking(builtNotice);
513
513
  this.wireOnHide(builtNotice, onHide);
514
- if (shouldRegisterAsPermanent) {
515
- this.setPermanentNotice(builtNotice);
516
- } else {
517
- this.setPermanentNotice(null);
518
- }
514
+ this.setPermanentNotice(shouldRegisterAsPermanent ? builtNotice : null);
519
515
  return { contentEl, isNoticeOwned: true, notice: builtNotice };
520
516
  }
521
517
  /**
@@ -602,4 +598,4 @@ export {
602
598
  PluginNoticeComponent,
603
599
  PluginNoticeMode
604
600
  };
605
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG5jb25zdCBQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVkgPSAncGx1Z2luLW5vdGljZS1jb21wb25lbnQ6cGVybWFuZW50LW5vdGljZXMnO1xuY29uc3QgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSAwO1xuY29uc3QgREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG4vLyBPYnNpZGlhbidzIG93biBkZWZhdWx0IG5vdGljZSBkdXJhdGlvbiwgYXBwbGllZCBieSB0aGUgYE5vdGljZWAgY29uc3RydWN0b3Igd2hlbiBub25lIGlzIGdpdmVuLiBJdCBpc1xuLy8gcmVwZWF0ZWQgaGVyZSBiZWNhdXNlIHJlc3RhcnRpbmcgdGhlIGNvdW50ZG93biBvbiBhbiBhcHBlbmQgZ29lcyB0aHJvdWdoIGBzZXRBdXRvSGlkZWAsIHdoaWNoIHRha2VzIGFuXG4vLyBleHBsaWNpdCBkdXJhdGlvbiBhbmQgc28gY2Fubm90IGZhbGwgYmFjayB0byB0aGF0IGRlZmF1bHQgaXRzZWxmLlxuY29uc3QgT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gNDAwMDtcblxuLy8gRWxlbWVudHMgYSB1c2VyIGNsaWNrcyB0byBhY3Qgb24gdGhlbSByYXRoZXIgdGhhbiB0byBkaXNtaXNzIHRoZSBub3RpY2UuIEEgY2xpY2sgbGFuZGluZyBvbiAob3Jcbi8vIGluc2lkZSkgb25lIG9mIHRoZXNlIGlzIGtlcHQgZnJvbSBidWJibGluZyB0byB0aGUgbm90aWNlLCBzbyB0aGUgbm90aWNlIHN0YXlzIG9wZW4uXG5jb25zdCBJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SID0gJ2EsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGxhYmVsLCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSwgW3JvbGU9XCJidXR0b25cIl0sIFtyb2xlPVwibGlua1wiXSwgW3JvbGU9XCJjaGVja2JveFwiXSwgW3JvbGU9XCJ0YWJcIl0sIFtyb2xlPVwibWVudWl0ZW1cIl0nO1xuXG4vKipcbiAqIEhvdyBhIG5ldyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHRoZSBvbmUgb2NjdXB5aW5nIHRoZSBzaW5nbGUgcGVyLXBsdWdpblxuICogc2xvdCB0aGlzIGNvbXBvbmVudCBrZWVwcy5cbiAqXG4gKiBSYXcgYG5ldyBOb3RpY2UoLi4uKWAgY2FsbHMgYWx3YXlzIHBpbGUgdXAsIHdoaWNoIGlzIHJhcmVseSB3aGF0IGEgcGx1Z2luIHdhbnRzOiB1c3VhbGx5IG9ubHkgdGhlXG4gKiBsYXRlc3QgbWVzc2FnZSBtYXR0ZXJzLiBTbyB0aGUgc2xvdCBleGlzdHMsIGFuZCB0aGlzIGNob29zZXMgd2hhdCBhIG5ldyBtZXNzYWdlIGRvZXMgd2l0aCBpdC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luTm90aWNlTW9kZSB7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IG5vdGljZSwgc28gYm90aCBtZXNzYWdlcyBzdGF5IHZpc2libGUgaW4gYSBzaW5nbGUgbm90aWNlIOKAlCBmb3IgYVxuICAgKiBydW5uaW5nIGFjY291bnQgb2YgYW4gb3BlcmF0aW9uLiBUaGUgY291bnRkb3duIHJlc3RhcnRzLCBzbyBhbiBhcHBlbmRlZCBtZXNzYWdlIGlzIHJlYWRhYmxlIGZvciBhXG4gICAqIGZ1bGwgZHVyYXRpb24gcmF0aGVyIHRoYW4gaW5oZXJpdGluZyB0aGUgcmVtYWlucyBvZiB0aGUgY3VycmVudCBvbmUuXG4gICAqXG4gICAqIEZhbGxzIGJhY2sgdG8ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IG5vdGljZSBvbiBzY3JlZW4gKGl0IHdhc1xuICAgKiBuZXZlciBzaG93biwgb3IgaXQgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkKS5cbiAgICovXG4gIEFwcGVuZCA9ICdhcHBlbmQnLFxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2UgYW5kIHNob3dzIHRoaXMgb25lIGluIGl0cyBwbGFjZSwgc28gb25seSB0aGUgbGF0ZXN0IG1lc3NhZ2UgaXMgb24gc2NyZWVuLlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgdGhlIHJlYXNvbiB0aGUgc2xvdCBleGlzdHMuXG4gICAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgbWVzc2FnZSBhcyBpdHMgb3duIG5vdGljZSwgbGVhdmluZyB0aGUgY3VycmVudCBvbmUgYWxvbmU6IGJvdGggYXJlIG9uIHNjcmVlbiwgcGlsZWQgdXBcbiAgICogbGlrZSBwbGFpbiBgbmV3IE5vdGljZSguLi4pYCBjYWxscy4gQSBzZXBhcmF0ZSBub3RpY2UgbmV2ZXIgcmVwbGFjZXMsIGFuZCBpcyBuZXZlciByZXBsYWNlZCBieSwgYVxuICAgKiBzbG90IG5vdGljZTsgYW55IG51bWJlciBvZiB0aGVtIGNvZXhpc3QuIFRoZXkgYXJlIHN0aWxsIGhpZGRlbiB0b2dldGhlciBvbiB1bmxvYWQuXG4gICAqL1xuICBTZXBhcmF0ZSA9ICdzZXBhcmF0ZSdcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnQgcGFzc2VkIHRvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9IHdoZW4gdGhlIG5vdGljZSdzXG4gKiBjbG9zZSAoWCkgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50IHtcbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGNsb3NlLCBsZWF2aW5nIHRoZSBub3RpY2Ugb3Blbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbDogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIGRlbGF5ZWQgbm90aWNlIGNyZWF0ZWQgYnkge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uIEl0IGlzIGFcbiAqIHtAbGluayBEaXNwb3NhYmxlfSAoc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBgdXNpbmdgKSB0aGF0IGFsc28gbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIHRoZVxuICogbm90aWNlIGlzIHNob3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoaXMgaGFuZGxlJ3MgbWVzc2FnZSwgcmUtYXBwbHlpbmcgdGhlIHBsdWdpbi1uYW1lIHByZWZpeCwgdGhlIGludGVyYWN0aXZlLWNsaWNrIGd1YXJkLCBhbmRcbiAgICogdGhlIENhbmNlbCBidXR0b24uIFVzZWZ1bCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzLiBJZiB0aGUgZGVsYXkgaGFzIG5vdCBlbGFwc2VkIHlldCwgdGhlIG5ldyBjb250ZW50XG4gICAqIGJlY29tZXMgd2hhdCBpcyBzaG93biBvbmNlIGl0IGRvZXMuXG4gICAqXG4gICAqIE9ubHkgdGhpcyBoYW5kbGUncyBvd24gbWVzc2FnZSBpcyByZXdyaXR0ZW46IHdoZW4gdGhlIG5vdGljZSB3YXMgam9pbmVkIHJhdGhlciB0aGFuIG9wZW5lZCAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5tb2RlfSksIHRoZSBtZXNzYWdlcyBhbHJlYWR5IGluIGl0IGFyZSBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBuZXcgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhIENhbmNlbCBidXR0b24gaXMgYXBwZW5kZWQgdG8gdGhlIG5vdGljZTsgY2xpY2tpbmcgaXQgYWJvcnRzIHRoaXMgY29udHJvbGxlci4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBDYW5jZWwgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG93biB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIGlzIHByb3ZpZGVkLiBXaGVuIG9taXR0ZWQsIHRoZSBsb2NhbGl6ZWQgYENhbmNlbGAgbGFiZWwgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29udGVudCwgcmVzb2x2ZWQgbGF6aWx5IG9ubHkgaWYgdGhlIGRlbGF5IGVsYXBzZXMg4oCUIHNvIGFuIG9wZXJhdGlvbiB0aGF0IGZpbmlzaGVzXG4gICAqIHNvb25lciBuZXZlciBidWlsZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG11c3QgcnVuIGJlZm9yZSB0aGUgbm90aWNlIGlzIHNob3duLiBPcGVyYXRpb25zIHRoYXQgZmluaXNoIHNvb25lciBuZXZlclxuICAgKiBzaG93IGEgbm90aWNlLCBhdm9pZGluZyBhIGRpc3RyYWN0aW5nIGZsYXNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoaXMgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIOKAlCBzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9LlxuICAgKlxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gaXMgd29ydGggY29uc2lkZXJpbmcgZm9yIGEgbG9uZyBvcGVyYXRpb246IG9uIHRoZSBkZWZhdWx0XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IHRoZSBwcm9ncmVzcyBub3RpY2UgdGFrZXMgdGhlIHNoYXJlZCBzbG90LCBzbyBhbnkgb3JkaW5hcnkgbm90aWNlXG4gICAqIHJhaXNlZCB3aGlsZSB0aGUgb3BlcmF0aW9uIHJ1bnMgaGlkZXMgaXQsIGFuZCB0aGUgcHJvZ3Jlc3MgdGhlIHVzZXIgd2FzIHdhdGNoaW5nIGRvZXMgbm90IGNvbWUgYmFjay5cbiAgICpcbiAgICogV2hpY2hldmVyIG1vZGUgaXMgdXNlZCwgdGhlIHJldHVybmVkIGhhbmRsZSBvd25zIG9ubHkgSVRTIG1lc3NhZ2U6IHVwZGF0aW5nIHRoZSBjb250ZW50IHJld3JpdGVzXG4gICAqIHRoYXQgbWVzc2FnZSBhbG9uZSwgYW5kIGRpc3Bvc2luZyB0YWtlcyBhd2F5IG9ubHkgdGhhdCBtZXNzYWdlIHdoZW4gdGhlIG5vdGljZSB3YXMgYWxyZWFkeSBvblxuICAgKiBzY3JlZW4gKGEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBpcyBoaWRkZW4gYXMgYSB3aG9sZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9XG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQZXJtYW5lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBjYW5ub3QgYmUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IChpdCBuZWVkcyB0aGUgc2hhcmVkIHNsb3QgaXQgaXNcbiAgICogdHJhY2tlZCBpbiksIGFuZCBhIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKHNvIGEgbGF0ZXIgbm90aWNlIG5ldmVyIHNpbGVudGx5IHJlcGxhY2VzIGl0KTsgZWl0aGVyXG4gICAqIGNvbnRyYWRpY3Rpb24gdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSwgb3Ige0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IHdoZW5cbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBpcyBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBiZWZvcmUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIENhbGxcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudC5jYW5jZWx9IG9uIHRoZSBldmVudCB0byBjYW5jZWwgdGhlIGNsb3NlIGFuZCBrZWVwIHRoZSBub3RpY2VcbiAgICogb3BlbiDigJQgZm9yIGV4YW1wbGUgYWZ0ZXIgeW91ciBvd24gY29uZmlybWF0aW9uIGRlY2xpbmVzLiBBbiBhc3luYyBjYWxsYmFjayBpcyBhd2FpdGVkIGJlZm9yZSB0aGVcbiAgICogbm90aWNlIGlzIGhpZGRlbi4gUnVucyBvbmx5IHdoZW4gYSBjbG9zZSBidXR0b24gaXMgc2hvd24gKGJvdGhcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWAgYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRTaG93Q2xvc2VCdXR0b259IGFyZSBzZXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIG5vdGljZSBoaWRlcyBpdC4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIG5vdGljZSBkaXNtaXNzZXMgb24gY2xpY2sgbGlrZVxuICAgKiBhIG5vcm1hbCBPYnNpZGlhbiBub3RpY2UuIFdoZW4gYGZhbHNlYCwgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBpdCBkb2VzIG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheVxuICAgKiBjbGljaywgYW5kIGluc3RlYWQgc2hvd3MgYSBjbG9zZSAoWCkgYnV0dG9uIHRoYXQgaGlkZXMgaXQgZGlyZWN0bHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30pLlxuICAgKlxuICAgKiBBIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBzdGFuZHMgb24gaXRzIG93blxuICAgKiAoaW1wbGllcyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0pLCBzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdDsgcGFzc2luZ1xuICAgKiBhbnkgb3RoZXIge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWBcbiAgICogdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24g4oCUIGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IOKAlCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGdldE5vdGljZTogKCkgPT4gTm90aWNlIHwgbnVsbDtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoJGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBzdG9wcyBldmVyeSBjbGljayBmcm9tIGRpc21pc3NpbmcgaXQgYW5kLCB1bmxlc3Mgc3VwcHJlc3NlZCBieVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0sIGFkZHMgYSBjbG9zZSBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgcHJlZml4ZWQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIE9ubHkgYSBtZXNzYWdlIHRoYXQgb3BlbnMgYSBub3RpY2UgaXNcbiAgICogcHJlZml4ZWQ7IGEgbWVzc2FnZSBhcHBlbmRlZCB0byBvbmUgYWxyZWFkeSBzaG93aW5nIGl0IGlzIG5vdCwgc28gdGhlIG5hbWUgaXMgbm90IHJlcGVhdGVkIG9uIGV2ZXJ5XG4gICAqIGxpbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgY2xvc2UgYnV0dG9uIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcy5yZXF1aXJlc0V4cGxpY2l0Q2xvc2V9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidWlsdCBtZXNzYWdlOiB0aGUgd3JhcHBlciBlbGVtZW50IGhvbGRpbmcgaXQsIGFuZCB0aGUgZnJhZ21lbnQgdGhhdCBlbGVtZW50IHNpdHMgaW4uXG4gKlxuICogVGhlIGVsZW1lbnQgaXMgaGFuZGVkIGJhY2sgYmVjYXVzZSBhIG5vdGljZSBjYW4gaG9sZCBzZXZlcmFsIG9mIHRoZW0gKHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9KSxcbiAqIHNvIHdob2V2ZXIgb3ducyBvbmUgbWVzc2FnZSBoYXMgdG8gYmUgYWJsZSB0byB1cGRhdGUgb3IgcmVtb3ZlIGV4YWN0bHkgdGhhdCBtZXNzYWdlLiBUaGUgcmVmZXJlbmNlXG4gKiBzdGF5cyB2YWxpZCBvbmNlIHRoZSBmcmFnbWVudCBpcyBoYW5kZWQgdG8gYE5vdGljZWA6IGFwcGVuZGluZyBhIGZyYWdtZW50IG1vdmVzIGl0cyBjaGlsZHJlbiByYXRoZXJcbiAqIHRoYW4gY29weWluZyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB3cmFwcGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhZ21lbnQgaG9sZGluZyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudC5jb250ZW50RWx9LCByZWFkeSB0byBoYW5kIHRvIGBOb3RpY2VgXG4gICAqIG9yIHRvIGFwcGVuZCBpbnRvIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50O1xufVxuXG4vKipcbiAqIEEgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHB1dCBvbiBzY3JlZW4sIGFuZCB3aGVyZSBpdCBlbmRlZCB1cC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGhvbGRpbmcgdGhpcyBtZXNzYWdlIGFsb25lLCBpbnNpZGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlLm5vdGljZX0uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBjcmVhdGVkIHRoZSBub3RpY2UsIGFzIG9wcG9zZWQgdG8gam9pbmluZyBvbmUgdGhhdCB3YXMgYWxyZWFkeSBvbiBzY3JlZW4uXG4gICAqIE9ubHkgdGhlIGNyZWF0b3IgbWF5IGhpZGUgaXQ7IGEgam9pbmVkIG1lc3NhZ2UgY2FuIG1lcmVseSByZW1vdmUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb3RpY2VPd25lZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5vdGljZSB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGljZTogTm90aWNlO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IG51bGwgfCBudW1iZXI7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU6IFBsdWdpbk5vdGljZU1vZGU7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljazogKCgkZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQnkgZGVmYXVsdCBhIG5ldyBub3RpY2UgaGlkZXMgdGhlIHByZXZpb3VzIG9uZSwgc28gb25seSB0aGUgbGF0ZXN0XG4gKiBtZXNzYWdlIGlzIG9uIHNjcmVlbjsge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IGNob29zZXMgb3RoZXJ3aXNlIOKAlCBzZWVcbiAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YW5kYWxvbmVOb3RpY2VzID0gbmV3IFNldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTmFtZSA9IHBhcmFtcy5wbHVnaW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgcGVybWFuZW50IG5vdGljZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGxvYWQgKGUuZy4gYSBwcmV2aW91cyBwbHVnaW4gc2Vzc2lvbikgb24gbG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgcGVybWFuZW50Tm90aWNlID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKTtcbiAgICBwZXJtYW5lbnROb3RpY2U/LmhpZGUoKTtcbiAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2Ugb24gdW5sb2FkLCB1bmxlc3MgaXQgaXMgdGhlIHBlcm1hbmVudCBub3RpY2UgKHdoaWNoIGlzIG1lYW50IHRvIG91dGxpdmUgdGhlIHBsdWdpbikuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGFueSBkZWxheWVkIG5vdGljZSB3aG9zZSB0aW1lciBoYXMgbm90IGZpcmVkIHlldCwgc28gaXQgbmV2ZXIgYXBwZWFycyBhZnRlciB1bmxvYWQuXG4gICAgZm9yIChjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgb2Ygc25hcHNob3QodGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zKSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LiBUaGUgbm90aWNlIHNob3dzIHRoZSBwbHVnaW4gbmFtZSBhYm92ZSBpdCwgc28gYSBsZWFkaW5nXG4gICAqIGA8cGx1Z2luIG5hbWU+OmAgaW4gdGhlIG1lc3NhZ2UgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biB0d2ljZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIOKAlCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmNsb3NlQXJpYUxhYmVsKSB9XG4gICAgfSk7XG4gICAgLy8gUmV1c2UgT2JzaWRpYW4ncyBtb2RhbCBjbG9zZS1idXR0b24gY2xhc3NlcyBzbyB0aGlzIGJ1dHRvbiBtYXRjaGVzIHRoZSBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uXG4gICAgLy8gKGxvb2sgYW5kIGhvdmVyKTsgdGhlIHN0eWxlc2hlZXQgb25seSBwb3NpdGlvbnMgaXQgaW4gdGhlIG5vdGljZSBjb3JuZXIuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjbG9zZUJ1dHRvbkVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRDbGFzc2VzKFtDc3NDbGFzcy5DbGlja2FibGVJY29uLCBDc3NDbGFzcy5Nb2RhbEhlYWRlckJ1dHRvbl0pO1xuICAgIHNldEljb24oY2xvc2VCdXR0b25FbCwgJ3gnKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25DbG9zZUNsaWNrPy4oe1xuICAgICAgICAgIGNhbmNlbDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIENhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIGlmIChpc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3RpY2UgPSBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UoKSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgICAgbm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBub3RpY2UgY3VycmVudGx5IGluIHRoZSBwZXItcGx1Z2luIHNsb3QsIHNvIGJvdGggbWVzc2FnZXMgc3RheSBvbiBzY3JlZW4gaW4gYVxuICAgKiBzaW5nbGUgbm90aWNlLlxuICAgKlxuICAgKiBUaGUgYXBwZW5kZWQgbWVzc2FnZSBjYXJyaWVzIG5vIHBsdWdpbi1uYW1lIHByZWZpeCDigJQgdGhlIG5vdGljZSBhbHJlYWR5IG9wZW5zIHdpdGggb25lLCBhbmRcbiAgICogcmVwZWF0aW5nIGl0IG9uIGV2ZXJ5IGxpbmUgcmVhZHMgYXMgbm9pc2UuIEl0IGlzIHdyYXBwZWQgbGlrZSBhbnkgb3RoZXIgbm90aWNlIGNvbnRlbnQsIHNvIGEgbGluayBvclxuICAgKiBidXR0b24gaW5zaWRlIGl0IHN0aWxsIGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEFwcGVuZGluZyByZXN0YXJ0cyB0aGUgbm90aWNlJ3MgY291bnRkb3duICh7QGxpbmsgTm90aWNlLnNldEF1dG9IaWRlfSksIHNvIHRoZSBuZXcgbWVzc2FnZSBnZXRzIGFcbiAgICogZnVsbCBkdXJhdGlvbiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgd2hhdCB3YXMgbGVmdCBvZiB0aGUgY3VycmVudCBvbmUg4oCUIGEgbGluZSBhcHBlbmRlZCBhIG1vbWVudFxuICAgKiBiZWZvcmUgdGhlIG5vdGljZSBleHBpcmVzIHdvdWxkIG90aGVyd2lzZSBmbGFzaCBhbmQgdmFuaXNoLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2V9IGRlc2NyaWJpbmcgdGhlIGpvaW5lZCBub3RpY2UsIG9yIGBudWxsYCB3aGVuXG4gICAqIHRoZXJlIGlzIG5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0byDigJQgdGhlIHNsb3QgaXMgZW1wdHksIG9yIGl0cyBub3RpY2UgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkXG4gICAqIOKAlCBhbmQgdGhlIGNhbGxlciBzaG91bGQgc2hvdyBhIG5ldyBub3RpY2UgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXBwZW5kVG9DdXJyZW50Tm90aWNlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zKTogbnVsbCB8IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG9uSGlkZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGN1cnJlbnROb3RpY2UgPSB0aGlzLm5vdGljZTtcbiAgICAvLyBgaXNTaG93bmAgaXMgdGhlIHNhbWUgY2hlY2sgT2JzaWRpYW4ncyBvd24gYE5vdGljZS5oaWRlYCBtYWtlcyBiZWZvcmUgYW5pbWF0aW5nIGEgbm90aWNlIGF3YXksIHNvXG4gICAgLy8gaXQgaXMgZXhhY3RseSBcInN0aWxsIG9uIHNjcmVlblwiOiBhIG5vdGljZSB0aGF0IGV4cGlyZWQgb3Igd2FzIGRpc21pc3NlZCBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICBpZiAoIWN1cnJlbnROb3RpY2U/LmNvbnRhaW5lckVsLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7IG1lc3NhZ2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lOiBmYWxzZSB9KTtcbiAgICBjdXJyZW50Tm90aWNlLm1lc3NhZ2VFbC5hcHBlbmQoZnJhZ21lbnQpO1xuICAgIC8vIEEgYG51bGxgIGR1cmF0aW9uIG1lYW5zIFwiT2JzaWRpYW4ncyBvd24gZGVmYXVsdFwiLCB3aGljaCBvbmx5IHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVzIOKAlCBzbyByZXN0YXJ0XG4gICAgLy8gdGhlIGNvdW50ZG93biB3aXRoIHRoYXQgc2FtZSBkZWZhdWx0IHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlIGN1cnJlbnQgb25lIHJ1bm5pbmcuXG4gICAgY3VycmVudE5vdGljZS5zZXRBdXRvSGlkZShkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IE9CU0lESUFOX0RFRkFVTFRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyk7XG4gICAgdGhpcy53aXJlT25IaWRlKGN1cnJlbnROb3RpY2UsIG9uSGlkZSk7XG4gICAgLy8gT25seSBldmVyIHJlZ2lzdGVycywgbmV2ZXIgY2xlYXJzOiB0aGUgbm90aWNlIGJlaW5nIGFwcGVuZGVkIHRvIG1heSBhbHJlYWR5IGJlIHRoaXMgcGx1Z2luJ3NcbiAgICAvLyBwZXJtYW5lbnQgbm90aWNlLCBhbmQgYSBsYXRlciBhcHBlbmRlZCBtZXNzYWdlIGlzIG5vIHJlYXNvbiB0byBmb3JnZXQgdGhhdC5cbiAgICBpZiAoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCkge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UoY3VycmVudE5vdGljZSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogZmFsc2UsIG5vdGljZTogY3VycmVudE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZWxheWVkIG5vdGljZTogdGhlIHJlc29sdmVkIGNvbnRlbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBDYW5jZWxcbiAgICogYnV0dG9uIHRoYXQgYWJvcnRzIHRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSBob2xkaW5nIHRoZSBjb250ZW50IGFuZCwgaWYgcmVxdWVzdGVkLCBhIENhbmNlbCBidXR0b24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgeyBhYm9ydENvbnRyb2xsZXIsIGNhbmNlbEJ1dHRvblRleHQsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gZGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNhbmNlbEJ1dHRvbi5idXR0b25FbCwgQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgICAgIC8vIFRoZSBjbGljayBpcyB3aXJlZCB2aWEgYGFkZEV2ZW50TGlzdGVuZXJgIHJhdGhlciB0aGFuIGBCdXR0b25Db21wb25lbnQub25DbGlja2Agc28gaXRcbiAgICAgIC8vIGJ1YmJsZXMgdGhyb3VnaCB0aGUgaW50ZXJhY3RpdmUtZWxlbWVudCBndWFyZCAoa2VlcGluZyB0aGUgbm90aWNlIG9wZW4pIGFuZCBzdGF5c1xuICAgICAgLy8gZGlyZWN0bHkgZXhlcmNpc2FibGUgdmlhIGEgZGlzcGF0Y2hlZCBET00gZXZlbnQgaW4gdW5pdCB0ZXN0cy5cbiAgICAgIGNhbmNlbEJ1dHRvbi5idXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjYW5jZWxCdXR0b24uYnV0dG9uRWwpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCB3cmFwcGVkIGluIGEgY29udGFpbmVyIHRoYXQga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW4gaW50ZXJhY3RpdmVcbiAgICogZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC4gT2JzaWRpYW4gZGlzbWlzc2VzIGEgbm90aWNlIG9uIGFueSBjbGljayB0aGF0IGJ1YmJsZXMgdXAgdG8gaXRzXG4gICAqIGVsZW1lbnQ7IHRoZSBjb250YWluZXIgaW50ZXJjZXB0cyBjbGlja3Mgb3JpZ2luYXRpbmcgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCAoYSBsaW5rLCBidXR0b24sXG4gICAqIGlucHV0LCBldGMuKSBhbmQgc3RvcHMgdGhlbSB0aGVyZSwgc28gdGhlIGVsZW1lbnQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIGJ1dCB0aGUgbm90aWNlIHN0YXlzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb3RpY2VDb250ZW50KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gICAgY29uc3QgeyBnZXROb3RpY2UsIG9uQ2xvc2VDbGljaywgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gZmFsc2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lID0gdHJ1ZSwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnN0cmlwUGx1Z2luTmFtZVByZWZpeChwYXJhbXMubWVzc2FnZSk7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IGNvbnRlbnRFbCA9IGZyYWdtZW50LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGVudEVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDb250ZW50KTtcbiAgICBpZiAoc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWUpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQodGhpcy5idWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAvLyBBIGhhcmQtdG8tY2xvc2Ugbm90aWNlIG11c3Qgbm90IGRpc21pc3Mgb24gYW55IHN0cmF5IGNsaWNrOyBvbmx5IGl0cyBjbG9zZSBidXR0b24gbWF5IGhpZGUgaXQuXG4gICAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlICYmIHNob3VsZFNob3dDbG9zZUJ1dHRvbikge1xuICAgICAgdGhpcy5hcHBlbmRDbG9zZUJ1dHRvbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXM+KHtcbiAgICAgICAgY29udGVudEVsLFxuICAgICAgICBnZXROb3RpY2U6IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSksXG4gICAgICAgIG9uQ2xvc2VDbGlja1xuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGZyYWdtZW50IH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCwgcHJlZml4aW5nIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBsdWdpbiBuYW1lIGluIGEgc3R5bGVkIGVsZW1lbnQgc28gaXQgaXNcbiAgICogdmlzdWFsbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAqXG4gICAqIFRoZSBuYW1lIGlzIHJlbmRlcmVkIGFzIGlubGluZSBjb2RlLCB0aGUgd2F5IGV2ZXJ5IHBsdWdpbiBuYW1lIGluIHRoZSBVSSBpcywgaW5zaWRlIGEgc3BhbiB0aGF0IGtlZXBzXG4gICAqIHRoZSBwcmVmaXgncyBvd24gbGF5b3V0IGFuZCBhY2NlbnQgY29sb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhZnRlciB0aGUgcGx1Z2luIG5hbWUgcHJlZml4LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB3aXRoIHRoZSBzdHlsZWQgcGx1Z2luIG5hbWUgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgICBhcHBlbmRDb2RlQmxvY2sobmFtZUVsLCB0aGlzLnBsdWdpbk5hbWUpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobmFtZUVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VOYW1lKTtcbiAgICBmcmFnbWVudC5hcHBlbmQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZSgpOiBOb3RpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2VzKCkuZ2V0KHRoaXMucGx1Z2luTmFtZSkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlcygpOiBNYXA8c3RyaW5nLCBOb3RpY2U+IHtcbiAgICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxNYXA8c3RyaW5nLCBOb3RpY2U+PihQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBOb3RpY2U+KCkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmVzIGEgbGVhZGluZyBgPHBsdWdpbiBuYW1lPjpgIGluIGEgbWVzc2FnZSwgdG9nZXRoZXIgd2l0aCB0aGUgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGNvbG9uIGFuZFxuICAgKiBhZnRlciBpdC5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgbWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXgsIG9yIGAwYCB3aGVuIHRoZSB0ZXh0IGRvZXMgbm90IG9wZW4gd2l0aCB0aGlzIHBsdWdpbidzIG5hbWUgYW5kIGFcbiAgICogY29sb24uXG4gICAqL1xuICBwcml2YXRlIGdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMucGx1Z2luTmFtZSB8fCAhdGV4dC5zdGFydHNXaXRoKHRoaXMucGx1Z2luTmFtZSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBzZXBhcmF0b3JNYXRjaCA9IC9eXFxzKjpcXHMqLy5leGVjKHRleHQuc2xpY2UodGhpcy5wbHVnaW5OYW1lLmxlbmd0aCkpO1xuICAgIHJldHVybiBzZXBhcmF0b3JNYXRjaCA/IHRoaXMucGx1Z2luTmFtZS5sZW5ndGggKyBzZXBhcmF0b3JNYXRjaFswXS5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgbm90aWNlIGhhcmQgdG8gY2xvc2U6IG1hcmtzIGl0cyBvdXRlciBlbGVtZW50IChzbyB0aGUgQ1NTIG5ldXRyYWxpemVzIGl0cyBwYWRkaW5nKSBhbmRcbiAgICogaW5zdGFsbHMgYSBjYXB0dXJlLXBoYXNlIGNsaWNrIGd1YXJkIHRoYXQgc3RvcHMgZXZlcnkgY2xpY2sgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGFcbiAgICogYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3Mgb3duIGRpc21pc3MgaGFuZGxlciDigJQgc28gYW5cbiAgICogaW50ZXJhY3RpdmUgY2hpbGQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIHdoaWxlIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRpc21pc3MgdGhlIG5vdGljZS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gZ3VhcmQuXG4gICAqIEBwYXJhbSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgLSBXaGV0aGVyIHRoZSBub3RpY2UgcmVxdWlyZXMgZXhwbGljaXQgY2xvc2U7IHdoZW4gYGZhbHNlYCwgbm90aGluZyBpc1xuICAgKiBpbnN0YWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKG5vdGljZTogTm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3V0ZXIgYC5ub3RpY2VgIGVsZW1lbnQgKGBjb250YWluZXJFbGApIGNhcnJpZXMgT2JzaWRpYW4ncyBkaXNtaXNzLW9uLWNsaWNrIGhhbmRsZXIgYW5kIHRoZVxuICAgIC8vIHBhZGRpbmcgYSBzdHJheSBjbGljayBjb3VsZCBsYW5kIG9uOyBtYXJrIGl0IHNvIHRoZSBzdHlsZXNoZWV0IGRyb3BzIHRoYXQgcGFkZGluZy5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5vdGljZS5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAvLyBTdG9wIGV2ZXJ5IGNsaWNrIG9uIHRoZSBub3RpY2Ug4oCUIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IOKAlCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3NcbiAgICAvLyBkaXNtaXNzIGhhbmRsZXIuIFJlZ2lzdGVyZWQgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugb24gdGhlIG91dGVybW9zdCBlbGVtZW50IHNvIGl0IGFsd2F5cyBydW5zIGZpcnN0LlxuICAgIC8vIExldHRpbmcgYSBjbGljayByZWFjaCBhbiBpbnRlcmFjdGl2ZSBjaGlsZCAoYSBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGlzIHdoYXQga2VlcHNcbiAgICAvLyBpdHMgb3duIGhhbmRsZXIgd29ya2luZzsgdGhlIGJ1YmJsZS1waGFzZSBndWFyZCBvbiB0aGUgY29udGVudCB3cmFwcGVyIHRoZW4gc3RvcHMgdGhhdCBjbGljayBmcm9tXG4gICAgLy8gYnViYmxpbmcgdXAgdG8gT2JzaWRpYW4ncyBkaXNtaXNzIGhhbmRsZXIsIHNvIHRoZSBub3RpY2Ugc3RpbGwgc3RheXMgb3Blbi5cbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgY2xpY2sgb24gdGhlIG5vdGljZSBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW4gcmVwb3J0IGFcbiAgICogdXNlciBkaXNtaXNzYWwuIE9ic2lkaWFuIGhpZGVzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoZSBjbGljaywgc28gYVxuICAgKiBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIG1hcmtzIHRoZSBub3RpY2UgYmVmb3JlIHRoYXQgaGlkZSBydW5zOyB0aGUgbWFyayBpcyBjbGVhcmVkIGFmdGVyIHRoZSBldmVudFxuICAgKiBzbyBhIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkLiBBIGNsb3NlLWJ1dHRvbiBjbGljayBpcyB0cmFja2VkIHNlcGFyYXRlbHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LmFwcGVuZENsb3NlQnV0dG9ufSkuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIHRyYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcobm90aWNlOiBOb3RpY2UpOiB2b2lkIHtcbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBPYnNpZGlhbiBkaXNtaXNzZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhpcyBjbGljaywgc28gbWFyayBpdCBub3cgKGJlZm9yZVxuICAgICAgLy8gdGhhdCBoaWRlIHJ1bnMpIGFuZCBjbGVhciBpdCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sg4oCUIGFmdGVyIGFueSBzeW5jaHJvbm91cyBkaXNtaXNzLCBidXQgYmVmb3JlIGFcbiAgICAgIC8vIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlLCBzbyB0aGF0IGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQgYXMgYSB1c2VyIGFjdGlvbi5cbiAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLCBwbGFjaW5nIGl0IGFjY29yZGluZyB0byBpdHMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9OiBhXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IG5vdGljZSB0YWtlcyB0aGUgcGVyLXBsdWdpbiBzbG90IChoaWRpbmcgd2hhdGV2ZXIgd2FzIGluIGl0LCBhbmRcbiAgICogb3B0aW9uYWxseSByZWdpc3RlcmluZyBhcyB0aGlzIHBsdWdpbidzIHBlcm1hbmVudCBub3RpY2UpLCBhbiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9IG9uZVxuICAgKiBqb2lucyB0aGUgbm90aWNlIGFscmVhZHkgaW4gdGhlIHNsb3QsIGFuZCBhIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBvbmUgaXMgdHJhY2tlZCBvbiBpdHNcbiAgICogb3duLCBsZWF2aW5nIHRoZSBzbG90IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlfSBkZXNjcmliaW5nIHdoZXJlIHRoZSBtZXNzYWdlIGVuZGVkIHVwLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm90aWNlV2l0aER1cmF0aW9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG1vZGUsIG9uQ2xvc2VDbGljaywgb25IaWRlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiB9ID0gcGFyYW1zO1xuICAgIC8vIE9ic2lkaWFuJ3MgYE5vdGljZWAgdHJlYXRzIGFuIG9taXR0ZWQgZHVyYXRpb24gYXMgaXRzIGRlZmF1bHQsIHNvIG1hcCB0aGUgYG51bGxgIFwibm8gZXhwbGljaXRcbiAgICAvLyBkdXJhdGlvblwiIHZhbHVlIHRvIGB1bmRlZmluZWRgLlxuICAgIGNvbnN0IG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZCkge1xuICAgICAgY29uc3QgYXBwZW5kZWROb3RpY2UgPSB0aGlzLmFwcGVuZFRvQ3VycmVudE5vdGljZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zPih7XG4gICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG9uSGlkZSxcbiAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudFxuICAgICAgfSkpO1xuICAgICAgaWYgKGFwcGVuZGVkTm90aWNlKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmRlZE5vdGljZTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0bywgc28gdGhpcyBtZXNzYWdlIGJlY29tZXMgdGhlIHNsb3QncyBub3RpY2UgaW5zdGVhZC5cbiAgICB9XG5cbiAgICBjb25zdCBoYXNDbG9zZUJ1dHRvbiA9IHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b247XG4gICAgLy8gVGhlIGNsb3NlIGJ1dHRvbidzIGNsaWNrIGhhbmRsZXIgbmVlZHMgdGhlIGBOb3RpY2VgLCB3aGljaCBkb2VzIG5vdCBleGlzdCB1bnRpbCBpdCBpcyBidWlsdCBmcm9tXG4gICAgLy8gdGhpcyBjb250ZW50OyBjYXB0dXJlIGl0IGxhemlseSB2aWEgYSBob2xkZXIgcmVzb2x2ZWQgYXQgY2xpY2sgdGltZS4gVGhlIGdldHRlciBpcyBjcmVhdGVkIG9ubHlcbiAgICAvLyB3aGVuIGEgY2xvc2UgYnV0dG9uIGlzIHNob3duLlxuICAgIGxldCBidWlsdE5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zPih7XG4gICAgICBnZXROb3RpY2U6IGhhc0Nsb3NlQnV0dG9uID8gKCk6IE5vdGljZSB8IG51bGwgPT4gYnVpbHROb3RpY2UgOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgb25DbG9zZUNsaWNrLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uXG4gICAgfSkpO1xuXG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUpIHtcbiAgICAgIGJ1aWx0Tm90aWNlID0gbmV3IE5vdGljZShmcmFnbWVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5hZGQoYnVpbHROb3RpY2UpO1xuICAgICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgIHRoaXMubm90aWNlID0gYnVpbHROb3RpY2U7XG4gICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKGJ1aWx0Tm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogdHJ1ZSwgbm90aWNlOiBidWlsdE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERyb3BzIGEgbGVhZGluZyBgPHBsdWdpbiBuYW1lPjpgIGZyb20gYSBtZXNzYWdlLiBUaGUgbm90aWNlIGFscmVhZHkgb3BlbnMgd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gaXRzXG4gICAqIG93biBzdHlsZWQgaGVhZGVyLCBzbyBhIG1lc3NhZ2UgdGhhdCByZXBlYXRzIGl0IHJlYWRzIGFzIHRoZSBuYW1lIHR3aWNlLlxuICAgKlxuICAgKiBBIGZyYWdtZW50IGlzIG1hdGNoZWQgb24gaXRzIHRleHQsIHNvIGEgbmFtZSB3cmFwcGVkIGluIGFuIGVsZW1lbnQgKHN1Y2ggYXMgaW5saW5lIGNvZGUpIHN0aWxsXG4gICAqIGNvdW50czsgdGhlIHByZWZpeCBpcyBjdXQgb3V0IG9mIGl0cyB0ZXh0IG5vZGVzLCBhbmQgYW4gZWxlbWVudCBpdCBsZWF2ZXMgZW1wdHkgaXMgcmVtb3ZlZC4gVGhlIG5hbWVcbiAgICogaXMgbWF0Y2hlZCBleGFjdGx5LCBhbmQgb25seSBhdCB0aGUgc3RhcnQ6IGEgbWVzc2FnZSB0aGF0IG1lcmVseSBtZW50aW9ucyB0aGUgbmFtZSBsYXRlciBpcyBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBUaGUgbWVzc2FnZSB3aXRob3V0IHRoZSBwcmVmaXguIEEgZnJhZ21lbnQgaXMgY2hhbmdlZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQuXG4gICAqL1xuICBwcml2YXRlIHN0cmlwUGx1Z2luTmFtZVByZWZpeChtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG1lc3NhZ2Uuc2xpY2UodGhpcy5nZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKG1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBsZXQgcmVtYWluaW5nTGVuZ3RoID0gdGhpcy5nZXRQbHVnaW5OYW1lUHJlZml4TGVuZ3RoKG1lc3NhZ2UudGV4dENvbnRlbnQpO1xuICAgIGlmIChyZW1haW5pbmdMZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdGV4dE5vZGUgb2YgZ2V0VGV4dE5vZGVzKG1lc3NhZ2UpKSB7XG4gICAgICBpZiAodGV4dE5vZGUuZGF0YS5sZW5ndGggPiByZW1haW5pbmdMZW5ndGgpIHtcbiAgICAgICAgdGV4dE5vZGUuZGF0YSA9IHRleHROb2RlLmRhdGEuc2xpY2UocmVtYWluaW5nTGVuZ3RoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZW1haW5pbmdMZW5ndGggLT0gdGV4dE5vZGUuZGF0YS5sZW5ndGg7XG4gICAgICAvLyBDbGltYiB0byB0aGUgb3V0ZXJtb3N0IGVsZW1lbnQgaG9sZGluZyBub3RoaW5nIGJ1dCB0aGlzIHRleHQsIHNvIG5vIGVtcHR5IHdyYXBwZXIgaXMgbGVmdCBiZWhpbmQuXG4gICAgICAvLyBBIG5vZGUgZGlyZWN0bHkgaW4gdGhlIGZyYWdtZW50IGhhcyBubyBwYXJlbnQgZWxlbWVudCwgd2hpY2ggaXMgd2hlcmUgdGhlIGNsaW1iIHN0b3BzLlxuICAgICAgbGV0IGVtcHRpZWROb2RlOiBDaGlsZE5vZGUgPSB0ZXh0Tm9kZTtcbiAgICAgIHdoaWxlIChlbXB0aWVkTm9kZS5wYXJlbnRFbGVtZW50Py5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBlbXB0aWVkTm9kZSA9IGVtcHRpZWROb2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICBlbXB0aWVkTm9kZS5yZW1vdmUoKTtcbiAgICAgIGlmIChyZW1haW5pbmdMZW5ndGggPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBzIGEgbm90aWNlJ3MgYGhpZGVgIHNvIHRoZSBnaXZlbiBjYWxsYmFjayBydW5zIHRoZSBmaXJzdCB0aW1lIHRoZSBub3RpY2UgaXMgaGlkZGVuIOKAlCBieSB0aGVcbiAgICogdXNlciwgYnkgYSByZXBsYWNpbmcgbm90aWNlLCBieSBpdHMgZHVyYXRpb24gZWxhcHNpbmcsIG9yIG9uIHVubG9hZC4gRG9lcyBub3RoaW5nIHdoZW4gbm8gY2FsbGJhY2tcbiAgICogaXMgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHdob3NlIGBoaWRlYCB0byB3cmFwLlxuICAgKiBAcGFyYW0gb25IaWRlIC0gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBvbiB0aGUgZmlyc3QgaGlkZSwgb3IgYHVuZGVmaW5lZGAgdG8gc2tpcCB3cmFwcGluZy5cbiAgICovXG4gIHByaXZhdGUgd2lyZU9uSGlkZShub3RpY2U6IE5vdGljZSwgb25IaWRlOiAoKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+KSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghb25IaWRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFJ1biBgb25IaWRlYCB0aGUgZmlyc3QgdGltZSB0aGUgbm90aWNlIGlzIGhpZGRlbi4gQSBgb25jZWAgcGF0Y2ggb24gYGhpZGVgIGludGVyY2VwdHMgZXhhY3RseSBvbmVcbiAgICAvLyBjYWxsIHRoZW4gdW5pbnN0YWxscyBpdHNlbGYgKHVubG9hZGluZyB0aGlzIGRlZGljYXRlZCBjb21wb25lbnQpLCBzbyB0aGVyZSBpcyBubyBtYW51YWxcbiAgICAvLyBzaW5nbGUtZmlyZSBib29ra2VlcGluZyBhbmQgbm8gbGluZ2VyaW5nIHBhdGNoIG9uIHRoZSB0cmFuc2llbnQgbm90aWNlLiBUaGUgdXNlci1jbG9zZSBmbGFncyB3ZXJlXG4gICAgLy8gc2V0IGJlZm9yZSBgaGlkZSgpYCB3YXMgaW52b2tlZCAoc2VlIGBhcHBlbmRDbG9zZUJ1dHRvbmAgLyBgaW5zdGFsbFVzZXJDbGlja1RyYWNraW5nYCksIHNvIHRoZXlcbiAgICAvLyBzdGlsbCBob2xkIHdoZW4gcmVhZCBoZXJlIGFmdGVyIGBmYWxsYmFjaygpYC5cbiAgICBjb25zdCBwYXRjaENvbXBvbmVudCA9IG5ldyBNb25rZXlBcm91bmRDb21wb25lbnQoKTtcbiAgICBwYXRjaENvbXBvbmVudC5sb2FkKCk7XG4gICAgcGF0Y2hDb21wb25lbnQucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiBub3RpY2UsXG4gICAgICBtZXRob2ROYW1lOiAnaGlkZScsXG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjayB9KSA9PiB7XG4gICAgICAgIGZhbGxiYWNrKCk7XG4gICAgICAgIGNvbnN0IGlzQ2xvc2VCdXR0b25DbGlja2VkID0gdGhpcy5jbG9zZUJ1dHRvbkNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBjb25zdCBpc1VzZXJBY3Rpb24gPSBpc0Nsb3NlQnV0dG9uQ2xpY2tlZCB8fCB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5oYXMobm90aWNlKTtcbiAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IG9uSGlkZSh7IGlzQ2xvc2VCdXR0b25DbGlja2VkLCBpc1VzZXJBY3Rpb24gfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ29sbGVjdHMgdGhlIHRleHQgbm9kZXMgdW5kZXIgYSBub2RlLCBpbiBkb2N1bWVudCBvcmRlci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIHdhbGsuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dE5vZGVzKG5vZGU6IE5vZGUpOiBUZXh0W10ge1xuICBjb25zdCB0ZXh0Tm9kZXM6IFRleHRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGNoaWxkTm9kZSBvZiBub2RlLmNoaWxkTm9kZXMpIHtcbiAgICBpZiAoaXNUZXh0Tm9kZShjaGlsZE5vZGUpKSB7XG4gICAgICB0ZXh0Tm9kZXMucHVzaChjaGlsZE5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0Tm9kZXMucHVzaCguLi5nZXRUZXh0Tm9kZXMoY2hpbGROb2RlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0ZXh0Tm9kZXM7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgdGV4dCBub2RlLiBJdCByZWFkcyB0aGUgbm9kZSB0eXBlIHJhdGhlciB0aGFuIGBpbnN0YW5jZW9mIFRleHRgLCB3aGljaCBpc1xuICogZmFsc2UgZm9yIGEgbm9kZSBmcm9tIGEgcG9wb3V0IHdpbmRvdydzIHJlYWxtLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBub2RlIGlzIGEgdGV4dCBub2RlLlxuICovXG5mdW5jdGlvbiBpc1RleHROb2RlKG5vZGU6IE5vZGUpOiBub2RlIGlzIFRleHQge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREU7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxvQkFBb0I7QUFDN0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxnQkFBZ0I7QUFDekIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsNkJBQTZCO0FBRXRDLE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0sNENBQTRDO0FBQ2xELE1BQU0sNENBQTRDO0FBSWxELE1BQU0sbURBQW1EO0FBSXpELE1BQU0sK0JBQStCO0FBUzlCLElBQUssbUJBQUwsa0JBQUtBLHNCQUFMO0FBU0wsRUFBQUEsa0JBQUEsWUFBUztBQU1ULEVB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
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZhbHVlUHJvdmlkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdmFsdWUtcHJvdmlkZXInO1xuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hcnJheSc7XG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi92YWx1ZS1wcm92aWRlcic7XG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZSxcbiAgc2V0SWNvblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IGFwcGVuZENvZGVCbG9jayB9IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IE1vbmtleUFyb3VuZENvbXBvbmVudCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG5jb25zdCBQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVkgPSAncGx1Z2luLW5vdGljZS1jb21wb25lbnQ6cGVybWFuZW50LW5vdGljZXMnO1xuY29uc3QgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSAwO1xuY29uc3QgREVGQVVMVF9ERUxBWV9CRUZPUkVfU0hPV19JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG4vLyBPYnNpZGlhbidzIG93biBkZWZhdWx0IG5vdGljZSBkdXJhdGlvbiwgYXBwbGllZCBieSB0aGUgYE5vdGljZWAgY29uc3RydWN0b3Igd2hlbiBub25lIGlzIGdpdmVuLiBJdCBpc1xuLy8gcmVwZWF0ZWQgaGVyZSBiZWNhdXNlIHJlc3RhcnRpbmcgdGhlIGNvdW50ZG93biBvbiBhbiBhcHBlbmQgZ29lcyB0aHJvdWdoIGBzZXRBdXRvSGlkZWAsIHdoaWNoIHRha2VzIGFuXG4vLyBleHBsaWNpdCBkdXJhdGlvbiBhbmQgc28gY2Fubm90IGZhbGwgYmFjayB0byB0aGF0IGRlZmF1bHQgaXRzZWxmLlxuY29uc3QgT0JTSURJQU5fREVGQVVMVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gNDAwMDtcblxuLy8gRWxlbWVudHMgYSB1c2VyIGNsaWNrcyB0byBhY3Qgb24gdGhlbSByYXRoZXIgdGhhbiB0byBkaXNtaXNzIHRoZSBub3RpY2UuIEEgY2xpY2sgbGFuZGluZyBvbiAob3Jcbi8vIGluc2lkZSkgb25lIG9mIHRoZXNlIGlzIGtlcHQgZnJvbSBidWJibGluZyB0byB0aGUgbm90aWNlLCBzbyB0aGUgbm90aWNlIHN0YXlzIG9wZW4uXG5jb25zdCBJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SID0gJ2EsIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGxhYmVsLCBbY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXSwgW3JvbGU9XCJidXR0b25cIl0sIFtyb2xlPVwibGlua1wiXSwgW3JvbGU9XCJjaGVja2JveFwiXSwgW3JvbGU9XCJ0YWJcIl0sIFtyb2xlPVwibWVudWl0ZW1cIl0nO1xuXG4vKipcbiAqIEhvdyBhIG5ldyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHRoZSBvbmUgb2NjdXB5aW5nIHRoZSBzaW5nbGUgcGVyLXBsdWdpblxuICogc2xvdCB0aGlzIGNvbXBvbmVudCBrZWVwcy5cbiAqXG4gKiBSYXcgYG5ldyBOb3RpY2UoLi4uKWAgY2FsbHMgYWx3YXlzIHBpbGUgdXAsIHdoaWNoIGlzIHJhcmVseSB3aGF0IGEgcGx1Z2luIHdhbnRzOiB1c3VhbGx5IG9ubHkgdGhlXG4gKiBsYXRlc3QgbWVzc2FnZSBtYXR0ZXJzLiBTbyB0aGUgc2xvdCBleGlzdHMsIGFuZCB0aGlzIGNob29zZXMgd2hhdCBhIG5ldyBtZXNzYWdlIGRvZXMgd2l0aCBpdC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luTm90aWNlTW9kZSB7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IG5vdGljZSwgc28gYm90aCBtZXNzYWdlcyBzdGF5IHZpc2libGUgaW4gYSBzaW5nbGUgbm90aWNlIOKAlCBmb3IgYVxuICAgKiBydW5uaW5nIGFjY291bnQgb2YgYW4gb3BlcmF0aW9uLiBUaGUgY291bnRkb3duIHJlc3RhcnRzLCBzbyBhbiBhcHBlbmRlZCBtZXNzYWdlIGlzIHJlYWRhYmxlIGZvciBhXG4gICAqIGZ1bGwgZHVyYXRpb24gcmF0aGVyIHRoYW4gaW5oZXJpdGluZyB0aGUgcmVtYWlucyBvZiB0aGUgY3VycmVudCBvbmUuXG4gICAqXG4gICAqIEZhbGxzIGJhY2sgdG8ge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZX0gd2hlbiB0aGVyZSBpcyBubyBjdXJyZW50IG5vdGljZSBvbiBzY3JlZW4gKGl0IHdhc1xuICAgKiBuZXZlciBzaG93biwgb3IgaXQgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkKS5cbiAgICovXG4gIEFwcGVuZCA9ICdhcHBlbmQnLFxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2UgYW5kIHNob3dzIHRoaXMgb25lIGluIGl0cyBwbGFjZSwgc28gb25seSB0aGUgbGF0ZXN0IG1lc3NhZ2UgaXMgb24gc2NyZWVuLlxuICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgdGhlIHJlYXNvbiB0aGUgc2xvdCBleGlzdHMuXG4gICAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuXG4gIC8qKlxuICAgKiBTaG93cyB0aGUgbWVzc2FnZSBhcyBpdHMgb3duIG5vdGljZSwgbGVhdmluZyB0aGUgY3VycmVudCBvbmUgYWxvbmU6IGJvdGggYXJlIG9uIHNjcmVlbiwgcGlsZWQgdXBcbiAgICogbGlrZSBwbGFpbiBgbmV3IE5vdGljZSguLi4pYCBjYWxscy4gQSBzZXBhcmF0ZSBub3RpY2UgbmV2ZXIgcmVwbGFjZXMsIGFuZCBpcyBuZXZlciByZXBsYWNlZCBieSwgYVxuICAgKiBzbG90IG5vdGljZTsgYW55IG51bWJlciBvZiB0aGVtIGNvZXhpc3QuIFRoZXkgYXJlIHN0aWxsIGhpZGRlbiB0b2dldGhlciBvbiB1bmxvYWQuXG4gICAqL1xuICBTZXBhcmF0ZSA9ICdzZXBhcmF0ZSdcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnQgcGFzc2VkIHRvIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5vbkNsb3NlQ2xpY2t9IHdoZW4gdGhlIG5vdGljZSdzXG4gKiBjbG9zZSAoWCkgYnV0dG9uIGlzIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50IHtcbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGNsb3NlLCBsZWF2aW5nIHRoZSBub3RpY2Ugb3Blbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbDogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZSB0byBhIGRlbGF5ZWQgbm90aWNlIGNyZWF0ZWQgYnkge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheX0uIEl0IGlzIGFcbiAqIHtAbGluayBEaXNwb3NhYmxlfSAoc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBgdXNpbmdgKSB0aGF0IGFsc28gbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIHRoZVxuICogbm90aWNlIGlzIHNob3duLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2UgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoaXMgaGFuZGxlJ3MgbWVzc2FnZSwgcmUtYXBwbHlpbmcgdGhlIHBsdWdpbi1uYW1lIHByZWZpeCwgdGhlIGludGVyYWN0aXZlLWNsaWNrIGd1YXJkLCBhbmRcbiAgICogdGhlIENhbmNlbCBidXR0b24uIFVzZWZ1bCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzLiBJZiB0aGUgZGVsYXkgaGFzIG5vdCBlbGFwc2VkIHlldCwgdGhlIG5ldyBjb250ZW50XG4gICAqIGJlY29tZXMgd2hhdCBpcyBzaG93biBvbmNlIGl0IGRvZXMuXG4gICAqXG4gICAqIE9ubHkgdGhpcyBoYW5kbGUncyBvd24gbWVzc2FnZSBpcyByZXdyaXR0ZW46IHdoZW4gdGhlIG5vdGljZSB3YXMgam9pbmVkIHJhdGhlciB0aGFuIG9wZW5lZCAoc2VlXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5tb2RlfSksIHRoZSBtZXNzYWdlcyBhbHJlYWR5IGluIGl0IGFyZSBsZWZ0XG4gICAqIGFsb25lLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBuZXcgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICByZWFkb25seSBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2VBZnRlckRlbGF5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhIENhbmNlbCBidXR0b24gaXMgYXBwZW5kZWQgdG8gdGhlIG5vdGljZTsgY2xpY2tpbmcgaXQgYWJvcnRzIHRoaXMgY29udHJvbGxlci4gV2hlblxuICAgKiBvbWl0dGVkLCBubyBDYW5jZWwgYnV0dG9uIGlzIHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCBvZiB0aGUgQ2FuY2VsIGJ1dHRvbiBzaG93biB3aGVuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9XG4gICAqIGlzIHByb3ZpZGVkLiBXaGVuIG9taXR0ZWQsIHRoZSBsb2NhbGl6ZWQgYENhbmNlbGAgbGFiZWwgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbmNlbEJ1dHRvblRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29udGVudCwgcmVzb2x2ZWQgbGF6aWx5IG9ubHkgaWYgdGhlIGRlbGF5IGVsYXBzZXMg4oCUIHNvIGFuIG9wZXJhdGlvbiB0aGF0IGZpbmlzaGVzXG4gICAqIHNvb25lciBuZXZlciBidWlsZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgb3BlcmF0aW9uIG11c3QgcnVuIGJlZm9yZSB0aGUgbm90aWNlIGlzIHNob3duLiBPcGVyYXRpb25zIHRoYXQgZmluaXNoIHNvb25lciBuZXZlclxuICAgKiBzaG93IGEgbm90aWNlLCBhdm9pZGluZyBhIGRpc3RyYWN0aW5nIGZsYXNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwYFxuICAgKi9cbiAgcmVhZG9ubHkgZGVsYXlJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoaXMgbm90aWNlIHJlbGF0ZXMgdG8gdGhlIHBsdWdpbidzIGN1cnJlbnQgbm90aWNlIOKAlCBzZWUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9LlxuICAgKlxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gaXMgd29ydGggY29uc2lkZXJpbmcgZm9yIGEgbG9uZyBvcGVyYXRpb246IG9uIHRoZSBkZWZhdWx0XG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IHRoZSBwcm9ncmVzcyBub3RpY2UgdGFrZXMgdGhlIHNoYXJlZCBzbG90LCBzbyBhbnkgb3JkaW5hcnkgbm90aWNlXG4gICAqIHJhaXNlZCB3aGlsZSB0aGUgb3BlcmF0aW9uIHJ1bnMgaGlkZXMgaXQsIGFuZCB0aGUgcHJvZ3Jlc3MgdGhlIHVzZXIgd2FzIHdhdGNoaW5nIGRvZXMgbm90IGNvbWUgYmFjay5cbiAgICpcbiAgICogV2hpY2hldmVyIG1vZGUgaXMgdXNlZCwgdGhlIHJldHVybmVkIGhhbmRsZSBvd25zIG9ubHkgSVRTIG1lc3NhZ2U6IHVwZGF0aW5nIHRoZSBjb250ZW50IHJld3JpdGVzXG4gICAqIHRoYXQgbWVzc2FnZSBhbG9uZSwgYW5kIGRpc3Bvc2luZyB0YWtlcyBhd2F5IG9ubHkgdGhhdCBtZXNzYWdlIHdoZW4gdGhlIG5vdGljZSB3YXMgYWxyZWFkeSBvblxuICAgKiBzY3JlZW4gKGEgbm90aWNlIHRoaXMgaGFuZGxlIG9wZW5lZCBpcyBoaWRkZW4gYXMgYSB3aG9sZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9XG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQZXJtYW5lbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhpcyBub3RpY2UgcmVsYXRlcyB0byB0aGUgcGx1Z2luJ3MgY3VycmVudCBub3RpY2Ug4oCUIHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZX0uXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBjYW5ub3QgYmUge0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IChpdCBuZWVkcyB0aGUgc2hhcmVkIHNsb3QgaXQgaXNcbiAgICogdHJhY2tlZCBpbiksIGFuZCBhIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0gKHNvIGEgbGF0ZXIgbm90aWNlIG5ldmVyIHNpbGVudGx5IHJlcGxhY2VzIGl0KTsgZWl0aGVyXG4gICAqIGNvbnRyYWRpY3Rpb24gdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlfSwgb3Ige0BsaW5rIFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGV9IHdoZW5cbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBpcyBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogUGx1Z2luTm90aWNlTW9kZTtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBiZWZvcmUgdGhlIG5vdGljZSBpcyBoaWRkZW4uIENhbGxcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudC5jYW5jZWx9IG9uIHRoZSBldmVudCB0byBjYW5jZWwgdGhlIGNsb3NlIGFuZCBrZWVwIHRoZSBub3RpY2VcbiAgICogb3BlbiDigJQgZm9yIGV4YW1wbGUgYWZ0ZXIgeW91ciBvd24gY29uZmlybWF0aW9uIGRlY2xpbmVzLiBBbiBhc3luYyBjYWxsYmFjayBpcyBhd2FpdGVkIGJlZm9yZSB0aGVcbiAgICogbm90aWNlIGlzIGhpZGRlbi4gUnVucyBvbmx5IHdoZW4gYSBjbG9zZSBidXR0b24gaXMgc2hvd24gKGJvdGhcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLnNob3VsZEhpZGVPbkNsaWNrfSBgPSBmYWxzZWAgYW5kXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucy5zaG91bGRTaG93Q2xvc2VCdXR0b259IGFyZSBzZXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiB0aGUgbm90aWNlIGlzIGhpZGRlbiDigJQgd2hldGhlciBieSB0aGUgdXNlciBjbG9zaW5nIGl0LCBieSBhIGxhdGVyIHJldXNhYmxlXG4gICAqIG5vdGljZSByZXBsYWNpbmcgaXQsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gY29tcG9uZW50IHVubG9hZC4gSXQgcnVucyBhdCBtb3N0IG9uY2UgcGVyXG4gICAqIG5vdGljZS4gVGhlIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mb30gYXJndW1lbnQgZGlzdGluZ3Vpc2hlcyBhIHVzZXIgY2xvc2UgKHRoZSBjbG9zZSBidXR0b24pIGZyb21cbiAgICogYSBwcm9ncmFtbWF0aWMgaGlkZS4gQW4gYXN5bmMgY2FsbGJhY2sgaXMgcnVuIGZpcmUtYW5kLWZvcmdldCAoaXRzIHJlamVjdGlvbiBzdXJmYWNlcyB0aHJvdWdoIHRoZVxuICAgKiBhc3luYy1lcnJvciBwaXBlbGluZSkuXG4gICAqL1xuICByZWFkb25seSBvbkhpZGU/OiAoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgY2xpY2tpbmcgdGhlIG5vdGljZSBoaWRlcyBpdC4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIG5vdGljZSBkaXNtaXNzZXMgb24gY2xpY2sgbGlrZVxuICAgKiBhIG5vcm1hbCBPYnNpZGlhbiBub3RpY2UuIFdoZW4gYGZhbHNlYCwgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBpdCBkb2VzIG5vdCBkaXNtaXNzIG9uIGFueSBzdHJheVxuICAgKiBjbGljaywgYW5kIGluc3RlYWQgc2hvd3MgYSBjbG9zZSAoWCkgYnV0dG9uIHRoYXQgaGlkZXMgaXQgZGlyZWN0bHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkU2hvd0Nsb3NlQnV0dG9ufSBhbmRcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30pLlxuICAgKlxuICAgKiBBIGBzaG91bGRIaWRlT25DbGljazogZmFsc2VgIG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBzdGFuZHMgb24gaXRzIG93blxuICAgKiAoaW1wbGllcyB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZX0pLCBzbyBhIGxhdGVyIG5vdGljZSBuZXZlciBzaWxlbnRseSByZXBsYWNlcyBpdDsgcGFzc2luZ1xuICAgKiBhbnkgb3RoZXIge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IHRvZ2V0aGVyIHdpdGggYHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZWBcbiAgICogdGhyb3dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEhpZGVPbkNsaWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgY2xvc2UgKFgpIGJ1dHRvbiBpcyBzaG93biBvbiBhIGhhcmQtdG8tY2xvc2Ugbm90aWNlXG4gICAqICh7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMuc2hvdWxkSGlkZU9uQ2xpY2t9IGA9IGZhbHNlYCkuIFdoZW4gYGZhbHNlYCwgbm8gY2xvc2VcbiAgICogYnV0dG9uIGlzIHJlbmRlcmVkIGFuZCB0aGUgbm90aWNlIGNhbiBvbmx5IGJlIGhpZGRlbiBwcm9ncmFtbWF0aWNhbGx5LiBJZ25vcmVkIHVubGVzc1xuICAgKiBgc2hvdWxkSGlkZU9uQ2xpY2tgIGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgd2h5IGEgbm90aWNlIHdhcyBoaWRkZW4sIHBhc3NlZCB0byB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VIaWRlSW5mbyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBub3RpY2Ugd2FzIGhpZGRlbiBieSB0aGUgdXNlciBjbGlja2luZyBpdHMgY2xvc2UgKFgpIGJ1dHRvbiBzcGVjaWZpY2FsbHkuIEFsd2F5cyBpbXBsaWVzXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VIaWRlSW5mby5pc1VzZXJBY3Rpb259LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDbG9zZUJ1dHRvbkNsaWNrZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSB3YXMgaGlkZGVuIGJ5IGEgdXNlciBhY3Rpb24g4oCUIGNsaWNraW5nIHRoZSBjbG9zZSAoWCkgYnV0dG9uLCBvciBjbGlja2luZyBhXG4gICAqIGRpc21pc3NpYmxlIG5vdGljZSB0byBkaXNtaXNzIGl0IOKAlCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgKGEgbGF0ZXIgcmV1c2FibGUgbm90aWNlIHJlcGxhY2luZ1xuICAgKiBpdCwgYW4gZXhwbGljaXQgYGhpZGUoKWAsIHRoZSBkdXJhdGlvbiBlbGFwc2luZywgb3IgY29tcG9uZW50IHVubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBpc1VzZXJBY3Rpb246IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRBcHBlbmRDbG9zZUJ1dHRvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGNvbnRlbnRFbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IGdldE5vdGljZTogKCkgPT4gTm90aWNlIHwgbnVsbDtcbiAgcmVhZG9ubHkgb25DbG9zZUNsaWNrPzogKCRldmVudDogUGx1Z2luTm90aWNlQ2xvc2VDbGlja0V2ZW50KSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgZHVyYXRpb25Jbk1pbGxpc2Vjb25kczogbnVsbCB8IG51bWJlcjtcbiAgcmVhZG9ubHkgbWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbiAgcmVhZG9ubHkgb25IaWRlPzogKGluZm86IFBsdWdpbk5vdGljZUhpZGVJbmZvKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckFzUGVybWFuZW50OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBSZXNvbHZlcyB0aGUgbm90aWNlIHRoaXMgY29udGVudCBiZWxvbmdzIHRvLCB1c2VkIGJ5IHRoZSBjbG9zZSBidXR0b24ncyBoYW5kbGVyLiBUaGUgbm90aWNlIGRvZXNcbiAgICogbm90IGV4aXN0IHlldCB3aGVuIHRoZSBjb250ZW50IGlzIGJ1aWx0LCBzbyBpdCBpcyByZXNvbHZlZCBsYXppbHkgYXQgY2xpY2sgdGltZS4gUmVxdWlyZWQgd2hlbiBhXG4gICAqIGNsb3NlIGJ1dHRvbiBpcyBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGdldE5vdGljZT86ICgpID0+IE5vdGljZSB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHBsdWdpbiBuYW1lIHByZWZpeC5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQ7IG1heSBjYW5jZWwgdGhlIGNsb3NlLiBTZWVcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uQ2xvc2VDbGlja30uXG4gICAqL1xuICByZWFkb25seSBvbkNsb3NlQ2xpY2s/OiAoJGV2ZW50OiBQbHVnaW5Ob3RpY2VDbG9zZUNsaWNrRXZlbnQpID0+IFByb21pc2FibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBpcyBoYXJkIHRvIGNsb3NlOiBzdG9wcyBldmVyeSBjbGljayBmcm9tIGRpc21pc3NpbmcgaXQgYW5kLCB1bmxlc3Mgc3VwcHJlc3NlZCBieVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zLnNob3VsZFNob3dDbG9zZUJ1dHRvbn0sIGFkZHMgYSBjbG9zZSBidXR0b24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgcHJlZml4ZWQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIE9ubHkgYSBtZXNzYWdlIHRoYXQgb3BlbnMgYSBub3RpY2UgaXNcbiAgICogcHJlZml4ZWQ7IGEgbWVzc2FnZSBhcHBlbmRlZCB0byBvbmUgYWxyZWFkeSBzaG93aW5nIGl0IGlzIG5vdCwgc28gdGhlIG5hbWUgaXMgbm90IHJlcGVhdGVkIG9uIGV2ZXJ5XG4gICAqIGxpbmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgY2xvc2UgYnV0dG9uIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEJ1aWxkTm90aWNlQ29udGVudFBhcmFtcy5yZXF1aXJlc0V4cGxpY2l0Q2xvc2V9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNob3dDbG9zZUJ1dHRvbj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidWlsdCBtZXNzYWdlOiB0aGUgd3JhcHBlciBlbGVtZW50IGhvbGRpbmcgaXQsIGFuZCB0aGUgZnJhZ21lbnQgdGhhdCBlbGVtZW50IHNpdHMgaW4uXG4gKlxuICogVGhlIGVsZW1lbnQgaXMgaGFuZGVkIGJhY2sgYmVjYXVzZSBhIG5vdGljZSBjYW4gaG9sZCBzZXZlcmFsIG9mIHRoZW0gKHNlZSB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9KSxcbiAqIHNvIHdob2V2ZXIgb3ducyBvbmUgbWVzc2FnZSBoYXMgdG8gYmUgYWJsZSB0byB1cGRhdGUgb3IgcmVtb3ZlIGV4YWN0bHkgdGhhdCBtZXNzYWdlLiBUaGUgcmVmZXJlbmNlXG4gKiBzdGF5cyB2YWxpZCBvbmNlIHRoZSBmcmFnbWVudCBpcyBoYW5kZWQgdG8gYE5vdGljZWA6IGFwcGVuZGluZyBhIGZyYWdtZW50IG1vdmVzIGl0cyBjaGlsZHJlbiByYXRoZXJcbiAqIHRoYW4gY29weWluZyB0aGVtLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB3cmFwcGluZyB0aGlzIG1lc3NhZ2UgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZnJhZ21lbnQgaG9sZGluZyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudC5jb250ZW50RWx9LCByZWFkeSB0byBoYW5kIHRvIGBOb3RpY2VgXG4gICAqIG9yIHRvIGFwcGVuZCBpbnRvIG9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50O1xufVxuXG4vKipcbiAqIEEgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHB1dCBvbiBzY3JlZW4sIGFuZCB3aGVyZSBpdCBlbmRlZCB1cC5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IGhvbGRpbmcgdGhpcyBtZXNzYWdlIGFsb25lLCBpbnNpZGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlLm5vdGljZX0uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50RWw6IEhUTUxFbGVtZW50O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBjcmVhdGVkIHRoZSBub3RpY2UsIGFzIG9wcG9zZWQgdG8gam9pbmluZyBvbmUgdGhhdCB3YXMgYWxyZWFkeSBvbiBzY3JlZW4uXG4gICAqIE9ubHkgdGhlIGNyZWF0b3IgbWF5IGhpZGUgaXQ7IGEgam9pbmVkIG1lc3NhZ2UgY2FuIG1lcmVseSByZW1vdmUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb3RpY2VPd25lZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5vdGljZSB0aGUgbWVzc2FnZSBpcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGljZTogTm90aWNlO1xufVxuXG5pbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGR1cmF0aW9uSW5NaWxsaXNlY29uZHM6IG51bGwgfCBudW1iZXI7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG4gIHJlYWRvbmx5IG1vZGU6IFBsdWdpbk5vdGljZU1vZGU7XG4gIHJlYWRvbmx5IG9uQ2xvc2VDbGljazogKCgkZXZlbnQ6IFBsdWdpbk5vdGljZUNsb3NlQ2xpY2tFdmVudCkgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9uSGlkZTogKChpbmZvOiBQbHVnaW5Ob3RpY2VIaWRlSW5mbykgPT4gUHJvbWlzYWJsZTx2b2lkPikgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IHJlcXVpcmVzRXhwbGljaXRDbG9zZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQnkgZGVmYXVsdCBhIG5ldyBub3RpY2UgaGlkZXMgdGhlIHByZXZpb3VzIG9uZSwgc28gb25seSB0aGUgbGF0ZXN0XG4gKiBtZXNzYWdlIGlzIG9uIHNjcmVlbjsge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm1vZGV9IGNob29zZXMgb3RoZXJ3aXNlIOKAlCBzZWVcbiAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlfS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMgPSBuZXcgV2Vha1NldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zID0gbmV3IFNldDwoKSA9PiB2b2lkPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YW5kYWxvbmVOb3RpY2VzID0gbmV3IFNldDxOb3RpY2U+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdXNlckNsaWNrZWROb3RpY2VzID0gbmV3IFdlYWtTZXQ8Tm90aWNlPigpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMucGx1Z2luTmFtZSA9IHBhcmFtcy5wbHVnaW5OYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgcGVybWFuZW50IG5vdGljZSBsZWZ0IG92ZXIgZnJvbSBhIHByZXZpb3VzIGxvYWQgKGUuZy4gYSBwcmV2aW91cyBwbHVnaW4gc2Vzc2lvbikgb24gbG9hZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG4gICAgY29uc3QgcGVybWFuZW50Tm90aWNlID0gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKTtcbiAgICBwZXJtYW5lbnROb3RpY2U/LmhpZGUoKTtcbiAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlcyB0aGUgY3VycmVudCBub3RpY2Ugb24gdW5sb2FkLCB1bmxlc3MgaXQgaXMgdGhlIHBlcm1hbmVudCBub3RpY2UgKHdoaWNoIGlzIG1lYW50IHRvIG91dGxpdmUgdGhlIHBsdWdpbikuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb251bmxvYWQoKTogdm9pZCB7XG4gICAgLy8gQ2FuY2VsIGFueSBkZWxheWVkIG5vdGljZSB3aG9zZSB0aW1lciBoYXMgbm90IGZpcmVkIHlldCwgc28gaXQgbmV2ZXIgYXBwZWFycyBhZnRlciB1bmxvYWQuXG4gICAgZm9yIChjb25zdCBjYW5jZWxQZW5kaW5nVGltZXIgb2Ygc25hcHNob3QodGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zKSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzdGFuZGFsb25lTm90aWNlIG9mIHRoaXMuc3RhbmRhbG9uZU5vdGljZXMpIHtcbiAgICAgIHN0YW5kYWxvbmVOb3RpY2UuaGlkZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YW5kYWxvbmVOb3RpY2VzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LiBUaGUgbm90aWNlIHNob3dzIHRoZSBwbHVnaW4gbmFtZSBhYm92ZSBpdCwgc28gYSBsZWFkaW5nXG4gICAqIGA8cGx1Z2luIG5hbWU+OmAgaW4gdGhlIG1lc3NhZ2UgaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBzaG93biB0d2ljZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgY29uc3QgaXNQZXJtYW5lbnQgPSBvcHRpb25zPy5pc1Blcm1hbmVudCA/PyBmYWxzZTtcbiAgICBjb25zdCBzaG91bGRIaWRlT25DbGljayA9IG9wdGlvbnM/LnNob3VsZEhpZGVPbkNsaWNrID8/IHRydWU7XG4gICAgY29uc3QgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gIXNob3VsZEhpZGVPbkNsaWNrO1xuICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zPy5tb2RlID8/IChyZXF1aXJlc0V4cGxpY2l0Q2xvc2UgPyBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlIDogUGx1Z2luTm90aWNlTW9kZS5SZXBsYWNlKTtcblxuICAgIGlmIChvcHRpb25zPy5tb2RlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5tb2RlICE9PSBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlICYmIHJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vdGljZSB0aGF0IGRvZXMgbm90IGhpZGUgb24gY2xpY2sgbXVzdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUgJiYgaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBwZXJtYW5lbnQgbm90aWNlIGNhbm5vdCBiZSBzaG93biBpbiB0aGUgc2VwYXJhdGUgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID0gaXNQZXJtYW5lbnQgfHwgcmVxdWlyZXNFeHBsaWNpdENsb3NlID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24oe1xuICAgICAgZHVyYXRpb25Jbk1pbGxpc2Vjb25kcyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBtb2RlLFxuICAgICAgb25DbG9zZUNsaWNrOiBvcHRpb25zPy5vbkNsb3NlQ2xpY2ssXG4gICAgICBvbkhpZGU6IG9wdGlvbnM/Lm9uSGlkZSxcbiAgICAgIHJlcXVpcmVzRXhwbGljaXRDbG9zZSxcbiAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGlzUGVybWFuZW50LFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uOiBvcHRpb25zPy5zaG91bGRTaG93Q2xvc2VCdXR0b24gPz8gdHJ1ZVxuICAgIH0pLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBhIG5vdGljZSBkZXNjcmliaW5nIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiwgYnV0IG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGhhcyBydW4gZm9yIGxvbmdlclxuICAgKiB0aGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzfSDigJQgc28gb3BlcmF0aW9uc1xuICAgKiB0aGF0IGZpbmlzaCBzb29uZXIgbmV2ZXIgZmxhc2ggYSBub3RpY2UuIFRoZSBub3RpY2Ugc3RheXMgdW50aWwgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBpc1xuICAgKiBkaXNwb3NlZCAod2hpY2ggYWxzbyBjYW5jZWxzIHRoZSBwZW5kaW5nIHRpbWVyIGlmIGl0IGhhcyBub3QgZmlyZWQgeWV0KSwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiBgdXNpbmdgLiBXaGVuIGFuIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlQWZ0ZXJEZWxheVBhcmFtcy5hYm9ydENvbnRyb2xsZXJ9IGlzIGdpdmVuLCBhXG4gICAqIENhbmNlbCBidXR0b24gdGhhdCBhYm9ydHMgaXQgaXMgYXBwZW5kZWQgKGFuZCwgYmVpbmcgaW50ZXJhY3RpdmUsIGRvZXMgbm90IGRpc21pc3MgdGhlIG5vdGljZSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ub3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgKiAgIGFib3J0Q29udHJvbGxlcixcbiAgICogICBjb250ZW50OiAoKSA9PiBidWlsZFByb2dyZXNzRnJhZ21lbnQoKVxuICAgKiB9KTtcbiAgICogYXdhaXQgcnVuT3BlcmF0aW9uKGFib3J0Q29udHJvbGxlci5zaWduYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlfSB0aGF0IGhpZGVzIHRoZSBub3RpY2UgKG9yIGNhbmNlbHMgdGhlIHBlbmRpbmdcbiAgICogdGltZXIpIHdoZW4gZGlzcG9zZWQgYW5kIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSBpdCBpcyBzaG93bi5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlQWZ0ZXJEZWxheShwYXJhbXM6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZSB7XG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5tb2RlID8/IFBsdWdpbk5vdGljZU1vZGUuUmVwbGFjZTtcbiAgICAvLyBXaGVyZSB0aGlzIG1lc3NhZ2UgZW5kZWQgdXA6IGEgbm90aWNlIG9mIGl0cyBvd24sIG9yIGEgY2h1bmsgaW5zaWRlIG9uZSB0aGF0IHdhcyBhbHJlYWR5IHVwLiBJdFxuICAgIC8vIGRlY2lkZXMgd2hhdCBgc2V0Q29udGVudGAgcmV3cml0ZXMgYW5kIHdoYXQgZGlzcG9zaW5nIHRha2VzIGF3YXkuXG4gICAgbGV0IHNob3duOiBudWxsIHwgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2UgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmVzb2x2aW5nIHRoZSBjb250ZW50IGlzIGFzeW5jaHJvbm91cywgYW5kIHRoZSBvcGVyYXRpb24gdGhlIG5vdGljZSBkZXNjcmliZXMga2VlcHMgcnVubmluZ1xuICAgICAgICAvLyB3aGlsZSBpdCBoYXBwZW5zIOKAlCBzbyBgc2V0Q29udGVudGAgY2FuIGxhbmQgaW4gYmV0d2Vlbi4gSXQgY2Fubm90IHJld3JpdGUgYSBub3RpY2UgdGhhdCBkb2VzXG4gICAgICAgIC8vIG5vdCBleGlzdCB5ZXQsIHNvIHJlc29sdmUgYWdhaW4gd2hlbmV2ZXIgdGhhdCBoYXBwZW5zOiB0aGUgbm90aWNlIG11c3Qgb3BlbiB3aXRoIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIHRoZSBjYWxsZXIgbGFzdCBhc2tlZCBmb3IsIG5vdCB0aGUgb25lIHRoYXQgd2FzIGN1cnJlbnQgd2hlbiByZXNvbHV0aW9uIHN0YXJ0ZWQuXG4gICAgICAgIGxldCByZXF1ZXN0ZWRDb250ZW50OiBWYWx1ZVByb3ZpZGVyPERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc+O1xuICAgICAgICBsZXQgcmVzb2x2ZWRDb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgcmVxdWVzdGVkQ29udGVudCA9IGN1cnJlbnRDb250ZW50O1xuICAgICAgICAgIHJlc29sdmVkQ29udGVudCA9IGF3YWl0IHJlc29sdmVWYWx1ZShyZXF1ZXN0ZWRDb250ZW50LCB7fSk7XG4gICAgICAgICAgLy8gVGhlIGhhbmRsZSBtYXkgaGF2ZSBiZWVuIGRpc3Bvc2VkIHdoaWxlIHRoZSBjb250ZW50IHdhcyBiZWluZyByZXNvbHZlZDsgZG9uJ3Qgc2hvdyBhIHN0YWxlIG5vdGljZS5cbiAgICAgICAgICBpZiAoaXNEaXNwb3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAocmVxdWVzdGVkQ29udGVudCAhPT0gY3VycmVudENvbnRlbnQpO1xuXG4gICAgICAgIHNob3duID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKHtcbiAgICAgICAgICBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBtZXNzYWdlOiBidWlsZERlbGF5ZWRNZXNzYWdlKHJlc29sdmVkQ29udGVudCksXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBvbkNsb3NlQ2xpY2s6IHVuZGVmaW5lZCxcbiAgICAgICAgICBvbkhpZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGZhbHNlLFxuICAgICAgICAgIHNob3VsZFNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIGlmICghc2hvd24pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3dhcHMgVEhJUyBtZXNzYWdlJ3MgZWxlbWVudCBmb3IgYSBmcmVzaGx5IGJ1aWx0IG9uZSwgcmF0aGVyIHRoYW4gcmV3cml0aW5nIHRoZSB3aG9sZSBub3RpY2U6XG4gICAgICAgIC8vIFdoZW4gdGhlIGhhbmRsZSBqb2luZWQgYSBub3RpY2UgdGhhdCB3YXMgYWxyZWFkeSB1cCwgdGhlIG90aGVyIG1lc3NhZ2VzIGluIGl0IGFyZSBub3QgaXRzIHRvXG4gICAgICAgIC8vIG92ZXJ3cml0ZS4gUmVidWlsZGluZyBhbHNvIHJlLWFwcGxpZXMgdGhlIHByZWZpeCwgdGhlIGludGVyYWN0aXZlIGd1YXJkLCBhbmQgdGhlIENhbmNlbCBidXR0b24uXG4gICAgICAgIGNvbnN0IHJlYnVpbHQgPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7XG4gICAgICAgICAgbWVzc2FnZTogYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSxcbiAgICAgICAgICBzaG91bGRQcmVmaXhXaXRoUGx1Z2luTmFtZTogc2hvd24uaXNOb3RpY2VPd25lZFxuICAgICAgICB9KTtcbiAgICAgICAgc2hvd24uY29udGVudEVsLnJlcGxhY2VXaXRoKHJlYnVpbHQuZnJhZ21lbnQpO1xuICAgICAgICBzaG93biA9IHsgLi4uc2hvd24sIGNvbnRlbnRFbDogcmVidWlsdC5jb250ZW50RWwgfTtcbiAgICAgIH0sXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlzRGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgICAgaWYgKCFzaG93bikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIG5vdGljZSB0aGlzIGhhbmRsZSBvcGVuZWQgZ29lcyBhd2F5IHdpdGggaXQ7IGEgbm90aWNlIGl0IG1lcmVseSBqb2luZWQgYmVsb25ncyB0byB3aG9ldmVyXG4gICAgICAgIC8vIG9wZW5lZCBpdCwgc28gb25seSB0aGlzIG1lc3NhZ2UgaXMgdGFrZW4gb3V0IG9mIGl0LlxuICAgICAgICBpZiAoc2hvd24uaXNOb3RpY2VPd25lZCkge1xuICAgICAgICAgIHNob3duLm5vdGljZS5oaWRlKCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUoc2hvd24ubm90aWNlKTtcbiAgICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duLm5vdGljZSkge1xuICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93bi5jb250ZW50RWwucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBjbG9zZSAoWCkgYnV0dG9uIHRvIHRoZSBub3RpY2UgY29udGVudC4gQ2xpY2tpbmcgaXQgZmlyZXNcbiAgICoge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudEFwcGVuZENsb3NlQnV0dG9uUGFyYW1zLm9uQ2xvc2VDbGlja30gKHdoaWNoIG1heSBjYW5jZWwgdGhlIGNsb3NlKTsgaWZcbiAgICogbm90IGNhbmNlbGxlZCwgaXQgaGlkZXMgdGhlIG5vdGljZSBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgc3RhbmRhbG9uZS1ub3RpY2UgdHJhY2tpbmcgc2V0LiBUaGUgaGlkZSBpc1xuICAgKiBtYXJrZWQgYXMgYSBjbG9zZS1idXR0b24gY2xpY2sgc28ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zLm9uSGlkZX0gY2FuXG4gICAqIGRpc3Rpbmd1aXNoIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZENsb3NlQnV0dG9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGNvbnRlbnRFbCwgZ2V0Tm90aWNlLCBvbkNsb3NlQ2xpY2sgfSA9IHBhcmFtcztcbiAgICBjb25zdCBjbG9zZUJ1dHRvbkVsID0gY29udGVudEVsLmNyZWF0ZUVsKCdidXR0b24nLCB7XG4gICAgICBhdHRyOiB7ICdhcmlhLWxhYmVsJzogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmNsb3NlQXJpYUxhYmVsKSB9XG4gICAgfSk7XG4gICAgLy8gUmV1c2UgT2JzaWRpYW4ncyBtb2RhbCBjbG9zZS1idXR0b24gY2xhc3NlcyBzbyB0aGlzIGJ1dHRvbiBtYXRjaGVzIHRoZSBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uXG4gICAgLy8gKGxvb2sgYW5kIGhvdmVyKTsgdGhlIHN0eWxlc2hlZXQgb25seSBwb3NpdGlvbnMgaXQgaW4gdGhlIG5vdGljZSBjb3JuZXIuXG4gICAgYWRkUGx1Z2luQ3NzQ2xhc3NlcyhjbG9zZUJ1dHRvbkVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbik7XG4gICAgY2xvc2VCdXR0b25FbC5hZGRDbGFzc2VzKFtDc3NDbGFzcy5DbGlja2FibGVJY29uLCBDc3NDbGFzcy5Nb2RhbEhlYWRlckJ1dHRvbl0pO1xuICAgIHNldEljb24oY2xvc2VCdXR0b25FbCwgJ3gnKTtcbiAgICBjbG9zZUJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgaXNDYW5jZWxsZWQgPSBmYWxzZTtcbiAgICAgICAgYXdhaXQgb25DbG9zZUNsaWNrPy4oe1xuICAgICAgICAgIGNhbmNlbDogKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIENhbiBiZSBjYW5jZWxsZWQgYnkgdGhlIHVzZXIuXG4gICAgICAgIGlmIChpc0NhbmNlbGxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3RpY2UgPSBlbnN1cmVOb25OdWxsYWJsZShnZXROb3RpY2UoKSk7XG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b25DbGlja2VkTm90aWNlcy5hZGQobm90aWNlKTtcbiAgICAgICAgbm90aWNlLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBtZXNzYWdlIHRvIHRoZSBub3RpY2UgY3VycmVudGx5IGluIHRoZSBwZXItcGx1Z2luIHNsb3QsIHNvIGJvdGggbWVzc2FnZXMgc3RheSBvbiBzY3JlZW4gaW4gYVxuICAgKiBzaW5nbGUgbm90aWNlLlxuICAgKlxuICAgKiBUaGUgYXBwZW5kZWQgbWVzc2FnZSBjYXJyaWVzIG5vIHBsdWdpbi1uYW1lIHByZWZpeCDigJQgdGhlIG5vdGljZSBhbHJlYWR5IG9wZW5zIHdpdGggb25lLCBhbmRcbiAgICogcmVwZWF0aW5nIGl0IG9uIGV2ZXJ5IGxpbmUgcmVhZHMgYXMgbm9pc2UuIEl0IGlzIHdyYXBwZWQgbGlrZSBhbnkgb3RoZXIgbm90aWNlIGNvbnRlbnQsIHNvIGEgbGluayBvclxuICAgKiBidXR0b24gaW5zaWRlIGl0IHN0aWxsIGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEFwcGVuZGluZyByZXN0YXJ0cyB0aGUgbm90aWNlJ3MgY291bnRkb3duICh7QGxpbmsgTm90aWNlLnNldEF1dG9IaWRlfSksIHNvIHRoZSBuZXcgbWVzc2FnZSBnZXRzIGFcbiAgICogZnVsbCBkdXJhdGlvbiBpbnN0ZWFkIG9mIGluaGVyaXRpbmcgd2hhdCB3YXMgbGVmdCBvZiB0aGUgY3VycmVudCBvbmUg4oCUIGEgbGluZSBhcHBlbmRlZCBhIG1vbWVudFxuICAgKiBiZWZvcmUgdGhlIG5vdGljZSBleHBpcmVzIHdvdWxkIG90aGVyd2lzZSBmbGFzaCBhbmQgdmFuaXNoLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd25Ob3RpY2V9IGRlc2NyaWJpbmcgdGhlIGpvaW5lZCBub3RpY2UsIG9yIGBudWxsYCB3aGVuXG4gICAqIHRoZXJlIGlzIG5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0byDigJQgdGhlIHNsb3QgaXMgZW1wdHksIG9yIGl0cyBub3RpY2UgaGFzIHNpbmNlIGJlZW4gZGlzbWlzc2VkXG4gICAqIOKAlCBhbmQgdGhlIGNhbGxlciBzaG91bGQgc2hvdyBhIG5ldyBub3RpY2UgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgYXBwZW5kVG9DdXJyZW50Tm90aWNlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zKTogbnVsbCB8IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG9uSGlkZSwgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGN1cnJlbnROb3RpY2UgPSB0aGlzLm5vdGljZTtcbiAgICAvLyBgaXNTaG93bmAgaXMgdGhlIHNhbWUgY2hlY2sgT2JzaWRpYW4ncyBvd24gYE5vdGljZS5oaWRlYCBtYWtlcyBiZWZvcmUgYW5pbWF0aW5nIGEgbm90aWNlIGF3YXksIHNvXG4gICAgLy8gaXQgaXMgZXhhY3RseSBcInN0aWxsIG9uIHNjcmVlblwiOiBhIG5vdGljZSB0aGF0IGV4cGlyZWQgb3Igd2FzIGRpc21pc3NlZCBoYXMgYmVlbiBkZXRhY2hlZC5cbiAgICBpZiAoIWN1cnJlbnROb3RpY2U/LmNvbnRhaW5lckVsLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudCh7IG1lc3NhZ2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lOiBmYWxzZSB9KTtcbiAgICBjdXJyZW50Tm90aWNlLm1lc3NhZ2VFbC5hcHBlbmQoZnJhZ21lbnQpO1xuICAgIC8vIEEgYG51bGxgIGR1cmF0aW9uIG1lYW5zIFwiT2JzaWRpYW4ncyBvd24gZGVmYXVsdFwiLCB3aGljaCBvbmx5IHRoZSBjb25zdHJ1Y3RvciBhcHBsaWVzIOKAlCBzbyByZXN0YXJ0XG4gICAgLy8gdGhlIGNvdW50ZG93biB3aXRoIHRoYXQgc2FtZSBkZWZhdWx0IHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlIGN1cnJlbnQgb25lIHJ1bm5pbmcuXG4gICAgY3VycmVudE5vdGljZS5zZXRBdXRvSGlkZShkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IE9CU0lESUFOX0RFRkFVTFRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyk7XG4gICAgdGhpcy53aXJlT25IaWRlKGN1cnJlbnROb3RpY2UsIG9uSGlkZSk7XG4gICAgLy8gT25seSBldmVyIHJlZ2lzdGVycywgbmV2ZXIgY2xlYXJzOiB0aGUgbm90aWNlIGJlaW5nIGFwcGVuZGVkIHRvIG1heSBhbHJlYWR5IGJlIHRoaXMgcGx1Z2luJ3NcbiAgICAvLyBwZXJtYW5lbnQgbm90aWNlLCBhbmQgYSBsYXRlciBhcHBlbmRlZCBtZXNzYWdlIGlzIG5vIHJlYXNvbiB0byBmb3JnZXQgdGhhdC5cbiAgICBpZiAoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCkge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UoY3VycmVudE5vdGljZSk7XG4gICAgfVxuICAgIHJldHVybiB7IGNvbnRlbnRFbCwgaXNOb3RpY2VPd25lZDogZmFsc2UsIG5vdGljZTogY3VycmVudE5vdGljZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbWVzc2FnZSBmb3IgYSBkZWxheWVkIG5vdGljZTogdGhlIHJlc29sdmVkIGNvbnRlbnQsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSBDYW5jZWxcbiAgICogYnV0dG9uIHRoYXQgYWJvcnRzIHRoZSBwcm92aWRlZCBjb250cm9sbGVyIHdoZW4gY2xpY2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSBob2xkaW5nIHRoZSBjb250ZW50IGFuZCwgaWYgcmVxdWVzdGVkLCBhIENhbmNlbCBidXR0b24uXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGVsYXllZE5vdGljZU1lc3NhZ2UocGFyYW1zOiBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgeyBhYm9ydENvbnRyb2xsZXIsIGNhbmNlbEJ1dHRvblRleHQsIGNvbnRlbnQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gZGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNhbmNlbEJ1dHRvbi5idXR0b25FbCwgQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgICAgIC8vIFRoZSBjbGljayBpcyB3aXJlZCB2aWEgYGFkZEV2ZW50TGlzdGVuZXJgIHJhdGhlciB0aGFuIGBCdXR0b25Db21wb25lbnQub25DbGlja2Agc28gaXRcbiAgICAgIC8vIGJ1YmJsZXMgdGhyb3VnaCB0aGUgaW50ZXJhY3RpdmUtZWxlbWVudCBndWFyZCAoa2VlcGluZyB0aGUgbm90aWNlIG9wZW4pIGFuZCBzdGF5c1xuICAgICAgLy8gZGlyZWN0bHkgZXhlcmNpc2FibGUgdmlhIGEgZGlzcGF0Y2hlZCBET00gZXZlbnQgaW4gdW5pdCB0ZXN0cy5cbiAgICAgIGNhbmNlbEJ1dHRvbi5idXR0b25FbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB9KTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChjYW5jZWxCdXR0b24uYnV0dG9uRWwpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCB3cmFwcGVkIGluIGEgY29udGFpbmVyIHRoYXQga2VlcHMgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW4gaW50ZXJhY3RpdmVcbiAgICogZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC4gT2JzaWRpYW4gZGlzbWlzc2VzIGEgbm90aWNlIG9uIGFueSBjbGljayB0aGF0IGJ1YmJsZXMgdXAgdG8gaXRzXG4gICAqIGVsZW1lbnQ7IHRoZSBjb250YWluZXIgaW50ZXJjZXB0cyBjbGlja3Mgb3JpZ2luYXRpbmcgb24gYW4gaW50ZXJhY3RpdmUgZWxlbWVudCAoYSBsaW5rLCBidXR0b24sXG4gICAqIGlucHV0LCBldGMuKSBhbmQgc3RvcHMgdGhlbSB0aGVyZSwgc28gdGhlIGVsZW1lbnQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIGJ1dCB0aGUgbm90aWNlIHN0YXlzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudH0gaG9sZGluZyB0aGUgd3JhcHBlZCBub3RpY2UgY29udGVudC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROb3RpY2VDb250ZW50KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zKTogUGx1Z2luTm90aWNlQ29tcG9uZW50Tm90aWNlQ29udGVudCB7XG4gICAgY29uc3QgeyBnZXROb3RpY2UsIG9uQ2xvc2VDbGljaywgcmVxdWlyZXNFeHBsaWNpdENsb3NlID0gZmFsc2UsIHNob3VsZFByZWZpeFdpdGhQbHVnaW5OYW1lID0gdHJ1ZSwgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uID0gdHJ1ZSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLnN0cmlwUGx1Z2luTmFtZVByZWZpeChwYXJhbXMubWVzc2FnZSk7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IGNvbnRlbnRFbCA9IGZyYWdtZW50LmNyZWF0ZURpdigpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY29udGVudEVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VDb250ZW50KTtcbiAgICBpZiAoc2hvdWxkUHJlZml4V2l0aFBsdWdpbk5hbWUpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmQodGhpcy5idWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRlbnRFbC5hcHBlbmRUZXh0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50RWwuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICBjb250ZW50RWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAvLyBBIGhhcmQtdG8tY2xvc2Ugbm90aWNlIG11c3Qgbm90IGRpc21pc3Mgb24gYW55IHN0cmF5IGNsaWNrOyBvbmx5IGl0cyBjbG9zZSBidXR0b24gbWF5IGhpZGUgaXQuXG4gICAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlKSB7XG4gICAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCRldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmICRldmVudC50YXJnZXQuY2xvc2VzdChJTlRFUkFDVElWRV9FTEVNRU5UX1NFTEVDVE9SKSkge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocmVxdWlyZXNFeHBsaWNpdENsb3NlICYmIHNob3VsZFNob3dDbG9zZUJ1dHRvbikge1xuICAgICAgdGhpcy5hcHBlbmRDbG9zZUJ1dHRvbihub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kQ2xvc2VCdXR0b25QYXJhbXM+KHtcbiAgICAgICAgY29udGVudEVsLFxuICAgICAgICBnZXROb3RpY2U6IGVuc3VyZU5vbk51bGxhYmxlKGdldE5vdGljZSksXG4gICAgICAgIG9uQ2xvc2VDbGlja1xuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4geyBjb250ZW50RWwsIGZyYWdtZW50IH07XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBub3RpY2UgY29udGVudCwgcHJlZml4aW5nIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBsdWdpbiBuYW1lIGluIGEgc3R5bGVkIGVsZW1lbnQgc28gaXQgaXNcbiAgICogdmlzdWFsbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSBtZXNzYWdlIGJvZHkuXG4gICAqXG4gICAqIFRoZSBuYW1lIGlzIHJlbmRlcmVkIGFzIGlubGluZSBjb2RlLCB0aGUgd2F5IGV2ZXJ5IHBsdWdpbiBuYW1lIGluIHRoZSBVSSBpcywgaW5zaWRlIGEgc3BhbiB0aGF0IGtlZXBzXG4gICAqIHRoZSBwcmVmaXgncyBvd24gbGF5b3V0IGFuZCBhY2NlbnQgY29sb3IuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhZnRlciB0aGUgcGx1Z2luIG5hbWUgcHJlZml4LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB3aXRoIHRoZSBzdHlsZWQgcGx1Z2luIG5hbWUgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBtZXNzYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFByZWZpeGVkTWVzc2FnZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGNvbnN0IG5hbWVFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgICBhcHBlbmRDb2RlQmxvY2sobmFtZUVsLCB0aGlzLnBsdWdpbk5hbWUpO1xuICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMobmFtZUVsLCBDc3NDbGFzcy5QbHVnaW5Ob3RpY2VOYW1lKTtcbiAgICBmcmFnbWVudC5hcHBlbmQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldFBlcm1hbmVudE5vdGljZSgpOiBOb3RpY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQZXJtYW5lbnROb3RpY2VzKCkuZ2V0KHRoaXMucGx1Z2luTmFtZSkgPz8gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlcygpOiBNYXA8c3RyaW5nLCBOb3RpY2U+IHtcbiAgICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZTxNYXA8c3RyaW5nLCBOb3RpY2U+PihQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBOb3RpY2U+KCkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lYXN1cmVzIGEgbGVhZGluZyBgPHBsdWdpbiBuYW1lPjpgIGluIGEgbWVzc2FnZSwgdG9nZXRoZXIgd2l0aCB0aGUgd2hpdGVzcGFjZSBhcm91bmQgdGhlIGNvbG9uIGFuZFxuICAgKiBhZnRlciBpdC5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgbWVzc2FnZSB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXgsIG9yIGAwYCB3aGVuIHRoZSB0ZXh0IGRvZXMgbm90IG9wZW4gd2l0aCB0aGlzIHBsdWdpbidzIG5hbWUgYW5kIGFcbiAgICogY29sb24uXG4gICAqL1xuICBwcml2YXRlIGdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgodGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMucGx1Z2luTmFtZSB8fCAhdGV4dC5zdGFydHNXaXRoKHRoaXMucGx1Z2luTmFtZSkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBzZXBhcmF0b3JNYXRjaCA9IC9eXFxzKjpcXHMqLy5leGVjKHRleHQuc2xpY2UodGhpcy5wbHVnaW5OYW1lLmxlbmd0aCkpO1xuICAgIHJldHVybiBzZXBhcmF0b3JNYXRjaCA/IHRoaXMucGx1Z2luTmFtZS5sZW5ndGggKyBzZXBhcmF0b3JNYXRjaFswXS5sZW5ndGggOiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgbm90aWNlIGhhcmQgdG8gY2xvc2U6IG1hcmtzIGl0cyBvdXRlciBlbGVtZW50IChzbyB0aGUgQ1NTIG5ldXRyYWxpemVzIGl0cyBwYWRkaW5nKSBhbmRcbiAgICogaW5zdGFsbHMgYSBjYXB0dXJlLXBoYXNlIGNsaWNrIGd1YXJkIHRoYXQgc3RvcHMgZXZlcnkgY2xpY2sgZXhjZXB0IG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGFcbiAgICogYnV0dG9uLCBsaW5rLCB0aGUgY2xvc2UgYnV0dG9uLCBldGMuKSBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3Mgb3duIGRpc21pc3MgaGFuZGxlciDigJQgc28gYW5cbiAgICogaW50ZXJhY3RpdmUgY2hpbGQncyBvd24gaGFuZGxlciBzdGlsbCBydW5zIHdoaWxlIGEgc3RyYXkgY2xpY2sgY2Fubm90IGRpc21pc3MgdGhlIG5vdGljZS5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2UgdG8gZ3VhcmQuXG4gICAqIEBwYXJhbSByZXF1aXJlc0V4cGxpY2l0Q2xvc2UgLSBXaGV0aGVyIHRoZSBub3RpY2UgcmVxdWlyZXMgZXhwbGljaXQgY2xvc2U7IHdoZW4gYGZhbHNlYCwgbm90aGluZyBpc1xuICAgKiBpbnN0YWxsZWQuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKG5vdGljZTogTm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXJlcXVpcmVzRXhwbGljaXRDbG9zZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBUaGUgb3V0ZXIgYC5ub3RpY2VgIGVsZW1lbnQgKGBjb250YWluZXJFbGApIGNhcnJpZXMgT2JzaWRpYW4ncyBkaXNtaXNzLW9uLWNsaWNrIGhhbmRsZXIgYW5kIHRoZVxuICAgIC8vIHBhZGRpbmcgYSBzdHJheSBjbGljayBjb3VsZCBsYW5kIG9uOyBtYXJrIGl0IHNvIHRoZSBzdHlsZXNoZWV0IGRyb3BzIHRoYXQgcGFkZGluZy5cbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5vdGljZS5jb250YWluZXJFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICAvLyBTdG9wIGV2ZXJ5IGNsaWNrIG9uIHRoZSBub3RpY2Ug4oCUIGV4Y2VwdCBvbiBhbiBpbnRlcmFjdGl2ZSBlbGVtZW50IOKAlCBmcm9tIHJlYWNoaW5nIE9ic2lkaWFuJ3NcbiAgICAvLyBkaXNtaXNzIGhhbmRsZXIuIFJlZ2lzdGVyZWQgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugb24gdGhlIG91dGVybW9zdCBlbGVtZW50IHNvIGl0IGFsd2F5cyBydW5zIGZpcnN0LlxuICAgIC8vIExldHRpbmcgYSBjbGljayByZWFjaCBhbiBpbnRlcmFjdGl2ZSBjaGlsZCAoYSBidXR0b24sIGxpbmssIHRoZSBjbG9zZSBidXR0b24sIGV0Yy4pIGlzIHdoYXQga2VlcHNcbiAgICAvLyBpdHMgb3duIGhhbmRsZXIgd29ya2luZzsgdGhlIGJ1YmJsZS1waGFzZSBndWFyZCBvbiB0aGUgY29udGVudCB3cmFwcGVyIHRoZW4gc3RvcHMgdGhhdCBjbGljayBmcm9tXG4gICAgLy8gYnViYmxpbmcgdXAgdG8gT2JzaWRpYW4ncyBkaXNtaXNzIGhhbmRsZXIsIHNvIHRoZSBub3RpY2Ugc3RpbGwgc3RheXMgb3Blbi5cbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgJGV2ZW50LnRhcmdldC5jbG9zZXN0KElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9LCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgY2xpY2sgb24gdGhlIG5vdGljZSBzbyB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMub25IaWRlfSBjYW4gcmVwb3J0IGFcbiAgICogdXNlciBkaXNtaXNzYWwuIE9ic2lkaWFuIGhpZGVzIGEgZGlzbWlzc2libGUgbm90aWNlIHN5bmNocm9ub3VzbHkgZHVyaW5nIHRoZSBjbGljaywgc28gYVxuICAgKiBjYXB0dXJlLXBoYXNlIGxpc3RlbmVyIG1hcmtzIHRoZSBub3RpY2UgYmVmb3JlIHRoYXQgaGlkZSBydW5zOyB0aGUgbWFyayBpcyBjbGVhcmVkIGFmdGVyIHRoZSBldmVudFxuICAgKiBzbyBhIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlIGlzIG5vdCBtaXNhdHRyaWJ1dGVkLiBBIGNsb3NlLWJ1dHRvbiBjbGljayBpcyB0cmFja2VkIHNlcGFyYXRlbHkgKHNlZVxuICAgKiB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LmFwcGVuZENsb3NlQnV0dG9ufSkuXG4gICAqXG4gICAqIEBwYXJhbSBub3RpY2UgLSBUaGUgbm90aWNlIHRvIHRyYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcobm90aWNlOiBOb3RpY2UpOiB2b2lkIHtcbiAgICBub3RpY2UuY29udGFpbmVyRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBPYnNpZGlhbiBkaXNtaXNzZXMgYSBkaXNtaXNzaWJsZSBub3RpY2Ugc3luY2hyb25vdXNseSBkdXJpbmcgdGhpcyBjbGljaywgc28gbWFyayBpdCBub3cgKGJlZm9yZVxuICAgICAgLy8gdGhhdCBoaWRlIHJ1bnMpIGFuZCBjbGVhciBpdCBvbiB0aGUgbmV4dCBtaWNyb3Rhc2sg4oCUIGFmdGVyIGFueSBzeW5jaHJvbm91cyBkaXNtaXNzLCBidXQgYmVmb3JlIGFcbiAgICAgIC8vIGxhdGVyIHByb2dyYW1tYXRpYyBoaWRlLCBzbyB0aGF0IGhpZGUgaXMgbm90IG1pc2F0dHJpYnV0ZWQgYXMgYSB1c2VyIGFjdGlvbi5cbiAgICAgIHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmFkZChub3RpY2UpO1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB0aGlzLnVzZXJDbGlja2VkTm90aWNlcy5kZWxldGUobm90aWNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHsgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLCBwbGFjaW5nIGl0IGFjY29yZGluZyB0byBpdHMge0BsaW5rIFBsdWdpbk5vdGljZU1vZGV9OiBhXG4gICAqIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlJlcGxhY2V9IG5vdGljZSB0YWtlcyB0aGUgcGVyLXBsdWdpbiBzbG90IChoaWRpbmcgd2hhdGV2ZXIgd2FzIGluIGl0LCBhbmRcbiAgICogb3B0aW9uYWxseSByZWdpc3RlcmluZyBhcyB0aGlzIHBsdWdpbidzIHBlcm1hbmVudCBub3RpY2UpLCBhbiB7QGxpbmsgUGx1Z2luTm90aWNlTW9kZS5BcHBlbmR9IG9uZVxuICAgKiBqb2lucyB0aGUgbm90aWNlIGFscmVhZHkgaW4gdGhlIHNsb3QsIGFuZCBhIHtAbGluayBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlfSBvbmUgaXMgdHJhY2tlZCBvbiBpdHNcbiAgICogb3duLCBsZWF2aW5nIHRoZSBzbG90IHVudG91Y2hlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlfSBkZXNjcmliaW5nIHdoZXJlIHRoZSBtZXNzYWdlIGVuZGVkIHVwLlxuICAgKi9cbiAgcHJpdmF0ZSBzaG93Tm90aWNlV2l0aER1cmF0aW9uKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZVdpdGhEdXJhdGlvblBhcmFtcyk6IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3duTm90aWNlIHtcbiAgICBjb25zdCB7IGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsIG1lc3NhZ2UsIG1vZGUsIG9uQ2xvc2VDbGljaywgb25IaWRlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQsIHNob3VsZFNob3dDbG9zZUJ1dHRvbiB9ID0gcGFyYW1zO1xuICAgIC8vIE9ic2lkaWFuJ3MgYE5vdGljZWAgdHJlYXRzIGFuIG9taXR0ZWQgZHVyYXRpb24gYXMgaXRzIGRlZmF1bHQsIHNvIG1hcCB0aGUgYG51bGxgIFwibm8gZXhwbGljaXRcbiAgICAvLyBkdXJhdGlvblwiIHZhbHVlIHRvIGB1bmRlZmluZWRgLlxuICAgIGNvbnN0IG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMgPSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzID8/IHVuZGVmaW5lZDtcblxuICAgIGlmIChtb2RlID09PSBQbHVnaW5Ob3RpY2VNb2RlLkFwcGVuZCkge1xuICAgICAgY29uc3QgYXBwZW5kZWROb3RpY2UgPSB0aGlzLmFwcGVuZFRvQ3VycmVudE5vdGljZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QXBwZW5kVG9DdXJyZW50Tm90aWNlUGFyYW1zPih7XG4gICAgICAgIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG9uSGlkZSxcbiAgICAgICAgc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudFxuICAgICAgfSkpO1xuICAgICAgaWYgKGFwcGVuZGVkTm90aWNlKSB7XG4gICAgICAgIHJldHVybiBhcHBlbmRlZE5vdGljZTtcbiAgICAgIH1cbiAgICAgIC8vIE5vdGhpbmcgb24gc2NyZWVuIHRvIGFwcGVuZCB0bywgc28gdGhpcyBtZXNzYWdlIGJlY29tZXMgdGhlIHNsb3QncyBub3RpY2UgaW5zdGVhZC5cbiAgICB9XG5cbiAgICBjb25zdCBoYXNDbG9zZUJ1dHRvbiA9IHJlcXVpcmVzRXhwbGljaXRDbG9zZSAmJiBzaG91bGRTaG93Q2xvc2VCdXR0b247XG4gICAgLy8gVGhlIGNsb3NlIGJ1dHRvbidzIGNsaWNrIGhhbmRsZXIgbmVlZHMgdGhlIGBOb3RpY2VgLCB3aGljaCBkb2VzIG5vdCBleGlzdCB1bnRpbCBpdCBpcyBidWlsdCBmcm9tXG4gICAgLy8gdGhpcyBjb250ZW50OyBjYXB0dXJlIGl0IGxhemlseSB2aWEgYSBob2xkZXIgcmVzb2x2ZWQgYXQgY2xpY2sgdGltZS4gVGhlIGdldHRlciBpcyBjcmVhdGVkIG9ubHlcbiAgICAvLyB3aGVuIGEgY2xvc2UgYnV0dG9uIGlzIHNob3duLlxuICAgIGxldCBidWlsdE5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgeyBjb250ZW50RWwsIGZyYWdtZW50IH0gPSB0aGlzLmJ1aWxkTm90aWNlQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGROb3RpY2VDb250ZW50UGFyYW1zPih7XG4gICAgICBnZXROb3RpY2U6IGhhc0Nsb3NlQnV0dG9uID8gKCk6IE5vdGljZSB8IG51bGwgPT4gYnVpbHROb3RpY2UgOiB1bmRlZmluZWQsXG4gICAgICBtZXNzYWdlLFxuICAgICAgb25DbG9zZUNsaWNrLFxuICAgICAgcmVxdWlyZXNFeHBsaWNpdENsb3NlLFxuICAgICAgc2hvdWxkU2hvd0Nsb3NlQnV0dG9uXG4gICAgfSkpO1xuXG4gICAgaWYgKG1vZGUgPT09IFBsdWdpbk5vdGljZU1vZGUuU2VwYXJhdGUpIHtcbiAgICAgIGJ1aWx0Tm90aWNlID0gbmV3IE5vdGljZShmcmFnbWVudCwgbm90aWNlRHVyYXRpb25Jbk1pbGxpc2Vjb25kcyk7XG4gICAgICB0aGlzLmluc3RhbGxFeHBsaWNpdENsb3NlR3VhcmRzKGJ1aWx0Tm90aWNlLCByZXF1aXJlc0V4cGxpY2l0Q2xvc2UpO1xuICAgICAgdGhpcy5pbnN0YWxsVXNlckNsaWNrVHJhY2tpbmcoYnVpbHROb3RpY2UpO1xuICAgICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuICAgICAgdGhpcy5zdGFuZGFsb25lTm90aWNlcy5hZGQoYnVpbHROb3RpY2UpO1xuICAgICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICBidWlsdE5vdGljZSA9IG5ldyBOb3RpY2UoZnJhZ21lbnQsIG5vdGljZUR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuICAgIHRoaXMubm90aWNlID0gYnVpbHROb3RpY2U7XG4gICAgdGhpcy5pbnN0YWxsRXhwbGljaXRDbG9zZUd1YXJkcyhidWlsdE5vdGljZSwgcmVxdWlyZXNFeHBsaWNpdENsb3NlKTtcbiAgICB0aGlzLmluc3RhbGxVc2VyQ2xpY2tUcmFja2luZyhidWlsdE5vdGljZSk7XG4gICAgdGhpcy53aXJlT25IaWRlKGJ1aWx0Tm90aWNlLCBvbkhpZGUpO1xuXG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2Uoc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCA/IGJ1aWx0Tm90aWNlIDogbnVsbCk7XG4gICAgcmV0dXJuIHsgY29udGVudEVsLCBpc05vdGljZU93bmVkOiB0cnVlLCBub3RpY2U6IGJ1aWx0Tm90aWNlIH07XG4gIH1cblxuICAvKipcbiAgICogRHJvcHMgYSBsZWFkaW5nIGA8cGx1Z2luIG5hbWU+OmAgZnJvbSBhIG1lc3NhZ2UuIFRoZSBub3RpY2UgYWxyZWFkeSBvcGVucyB3aXRoIHRoZSBwbHVnaW4gbmFtZSBpbiBpdHNcbiAgICogb3duIHN0eWxlZCBoZWFkZXIsIHNvIGEgbWVzc2FnZSB0aGF0IHJlcGVhdHMgaXQgcmVhZHMgYXMgdGhlIG5hbWUgdHdpY2UuXG4gICAqXG4gICAqIEEgZnJhZ21lbnQgaXMgbWF0Y2hlZCBvbiBpdHMgdGV4dCwgc28gYSBuYW1lIHdyYXBwZWQgaW4gYW4gZWxlbWVudCAoc3VjaCBhcyBpbmxpbmUgY29kZSkgc3RpbGxcbiAgICogY291bnRzOyB0aGUgcHJlZml4IGlzIGN1dCBvdXQgb2YgaXRzIHRleHQgbm9kZXMsIGFuZCBhbiBlbGVtZW50IGl0IGxlYXZlcyBlbXB0eSBpcyByZW1vdmVkLiBUaGUgbmFtZVxuICAgKiBpcyBtYXRjaGVkIGV4YWN0bHksIGFuZCBvbmx5IGF0IHRoZSBzdGFydDogYSBtZXNzYWdlIHRoYXQgbWVyZWx5IG1lbnRpb25zIHRoZSBuYW1lIGxhdGVyIGlzIGxlZnRcbiAgICogYWxvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIFRoZSBtZXNzYWdlIHdpdGhvdXQgdGhlIHByZWZpeC4gQSBmcmFnbWVudCBpcyBjaGFuZ2VkIGluIHBsYWNlIGFuZCByZXR1cm5lZC5cbiAgICovXG4gIHByaXZhdGUgc3RyaXBQbHVnaW5OYW1lUHJlZml4KG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZS5zbGljZSh0aGlzLmdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgobWVzc2FnZSkpO1xuICAgIH1cblxuICAgIGxldCByZW1haW5pbmdMZW5ndGggPSB0aGlzLmdldFBsdWdpbk5hbWVQcmVmaXhMZW5ndGgobWVzc2FnZS50ZXh0Q29udGVudCk7XG4gICAgaWYgKHJlbWFpbmluZ0xlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0ZXh0Tm9kZSBvZiBnZXRUZXh0Tm9kZXMobWVzc2FnZSkpIHtcbiAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhLmxlbmd0aCA+IHJlbWFpbmluZ0xlbmd0aCkge1xuICAgICAgICB0ZXh0Tm9kZS5kYXRhID0gdGV4dE5vZGUuZGF0YS5zbGljZShyZW1haW5pbmdMZW5ndGgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlbWFpbmluZ0xlbmd0aCAtPSB0ZXh0Tm9kZS5kYXRhLmxlbmd0aDtcbiAgICAgIC8vIENsaW1iIHRvIHRoZSBvdXRlcm1vc3QgZWxlbWVudCBob2xkaW5nIG5vdGhpbmcgYnV0IHRoaXMgdGV4dCwgc28gbm8gZW1wdHkgd3JhcHBlciBpcyBsZWZ0IGJlaGluZC5cbiAgICAgIC8vIEEgbm9kZSBkaXJlY3RseSBpbiB0aGUgZnJhZ21lbnQgaGFzIG5vIHBhcmVudCBlbGVtZW50LCB3aGljaCBpcyB3aGVyZSB0aGUgY2xpbWIgc3RvcHMuXG4gICAgICBsZXQgZW1wdGllZE5vZGU6IENoaWxkTm9kZSA9IHRleHROb2RlO1xuICAgICAgd2hpbGUgKGVtcHRpZWROb2RlLnBhcmVudEVsZW1lbnQ/LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGVtcHRpZWROb2RlID0gZW1wdGllZE5vZGUucGFyZW50RWxlbWVudDtcbiAgICAgIH1cbiAgICAgIGVtcHRpZWROb2RlLnJlbW92ZSgpO1xuICAgICAgaWYgKHJlbWFpbmluZ0xlbmd0aCA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYSBub3RpY2UncyBgaGlkZWAgc28gdGhlIGdpdmVuIGNhbGxiYWNrIHJ1bnMgdGhlIGZpcnN0IHRpbWUgdGhlIG5vdGljZSBpcyBoaWRkZW4g4oCUIGJ5IHRoZVxuICAgKiB1c2VyLCBieSBhIHJlcGxhY2luZyBub3RpY2UsIGJ5IGl0cyBkdXJhdGlvbiBlbGFwc2luZywgb3Igb24gdW5sb2FkLiBEb2VzIG5vdGhpbmcgd2hlbiBubyBjYWxsYmFja1xuICAgKiBpcyBnaXZlbi5cbiAgICpcbiAgICogQHBhcmFtIG5vdGljZSAtIFRoZSBub3RpY2Ugd2hvc2UgYGhpZGVgIHRvIHdyYXAuXG4gICAqIEBwYXJhbSBvbkhpZGUgLSBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIG9uIHRoZSBmaXJzdCBoaWRlLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIHdyYXBwaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSB3aXJlT25IaWRlKG5vdGljZTogTm90aWNlLCBvbkhpZGU6ICgoaW5mbzogUGx1Z2luTm90aWNlSGlkZUluZm8pID0+IFByb21pc2FibGU8dm9pZD4pIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFvbkhpZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUnVuIGBvbkhpZGVgIHRoZSBmaXJzdCB0aW1lIHRoZSBub3RpY2UgaXMgaGlkZGVuLiBBIGBvbmNlYCBwYXRjaCBvbiBgaGlkZWAgaW50ZXJjZXB0cyBleGFjdGx5IG9uZVxuICAgIC8vIGNhbGwgdGhlbiB1bmluc3RhbGxzIGl0c2VsZiAodW5sb2FkaW5nIHRoaXMgZGVkaWNhdGVkIGNvbXBvbmVudCksIHNvIHRoZXJlIGlzIG5vIG1hbnVhbFxuICAgIC8vIHNpbmdsZS1maXJlIGJvb2trZWVwaW5nIGFuZCBubyBsaW5nZXJpbmcgcGF0Y2ggb24gdGhlIHRyYW5zaWVudCBub3RpY2UuIFRoZSB1c2VyLWNsb3NlIGZsYWdzIHdlcmVcbiAgICAvLyBzZXQgYmVmb3JlIGBoaWRlKClgIHdhcyBpbnZva2VkIChzZWUgYGFwcGVuZENsb3NlQnV0dG9uYCAvIGBpbnN0YWxsVXNlckNsaWNrVHJhY2tpbmdgKSwgc28gdGhleVxuICAgIC8vIHN0aWxsIGhvbGQgd2hlbiByZWFkIGhlcmUgYWZ0ZXIgYGZhbGxiYWNrKClgLlxuICAgIGNvbnN0IHBhdGNoQ29tcG9uZW50ID0gbmV3IE1vbmtleUFyb3VuZENvbXBvbmVudCgpO1xuICAgIHBhdGNoQ29tcG9uZW50LmxvYWQoKTtcbiAgICBwYXRjaENvbXBvbmVudC5yZWdpc3Rlck1ldGhvZFBhdGNoKHtcbiAgICAgICRvYmplY3Q6IG5vdGljZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdoaWRlJyxcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrIH0pID0+IHtcbiAgICAgICAgZmFsbGJhY2soKTtcbiAgICAgICAgY29uc3QgaXNDbG9zZUJ1dHRvbkNsaWNrZWQgPSB0aGlzLmNsb3NlQnV0dG9uQ2xpY2tlZE5vdGljZXMuaGFzKG5vdGljZSk7XG4gICAgICAgIGNvbnN0IGlzVXNlckFjdGlvbiA9IGlzQ2xvc2VCdXR0b25DbGlja2VkIHx8IHRoaXMudXNlckNsaWNrZWROb3RpY2VzLmhhcyhub3RpY2UpO1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgb25IaWRlKHsgaXNDbG9zZUJ1dHRvbkNsaWNrZWQsIGlzVXNlckFjdGlvbiB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0cyB0aGUgdGV4dCBub2RlcyB1bmRlciBhIG5vZGUsIGluIGRvY3VtZW50IG9yZGVyLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gd2Fsay5cbiAqIEByZXR1cm5zIFRoZSB0ZXh0IG5vZGVzLlxuICovXG5mdW5jdGlvbiBnZXRUZXh0Tm9kZXMobm9kZTogTm9kZSk6IFRleHRbXSB7XG4gIGNvbnN0IHRleHROb2RlczogVGV4dFtdID0gW107XG4gIGZvciAoY29uc3QgY2hpbGROb2RlIG9mIG5vZGUuY2hpbGROb2Rlcykge1xuICAgIGlmIChpc1RleHROb2RlKGNoaWxkTm9kZSkpIHtcbiAgICAgIHRleHROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHROb2Rlcy5wdXNoKC4uLmdldFRleHROb2RlcyhjaGlsZE5vZGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRleHROb2Rlcztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSB0ZXh0IG5vZGUuIEl0IHJlYWRzIHRoZSBub2RlIHR5cGUgcmF0aGVyIHRoYW4gYGluc3RhbmNlb2YgVGV4dGAsIHdoaWNoIGlzXG4gKiBmYWxzZSBmb3IgYSBub2RlIGZyb20gYSBwb3BvdXQgd2luZG93J3MgcmVhbG0uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSB0ZXh0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUobm9kZTogTm9kZSk6IG5vZGUgaXMgVGV4dCB7XG4gIHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLFNBQVM7QUFDbEIsU0FBUywyQkFBMkI7QUFDcEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxtQkFBbUI7QUFDNUIsU0FBUyw2QkFBNkI7QUFFdEMsTUFBTSw4QkFBOEI7QUFDcEMsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSw0Q0FBNEM7QUFJbEQsTUFBTSxtREFBbUQ7QUFJekQsTUFBTSwrQkFBK0I7QUFTOUIsSUFBSyxtQkFBTCxrQkFBS0Esc0JBQUw7QUFTTCxFQUFBQSxrQkFBQSxZQUFTO0FBTVQsRUFBQUEsa0JBQUEsYUFBVTtBQU9WLEVBQUFBLGtCQUFBLGNBQVc7QUF0QkQsU0FBQUE7QUFBQSxHQUFBO0FBaVVM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
@@ -89,9 +89,6 @@ class StyleSheetComponent extends ComponentEx {
89
89
  }
90
90
  }
91
91
  attach(win) {
92
- if (this.styleSheetsByWindow.has(win)) {
93
- return;
94
- }
95
92
  const styleSheet = new (castTo(win)).CSSStyleSheet();
96
93
  styleSheet.replaceSync(this._css);
97
94
  win.document.adoptedStyleSheets = [...win.document.adoptedStyleSheets, styleSheet];
@@ -106,4 +103,4 @@ export {
106
103
  StyleSheetComponent,
107
104
  registerStyle
108
105
  };
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0eWxlLXNoZWV0LWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXR0YWNoZXMgYSBwbHVnaW4gc3R5bGVzaGVldCB0byB0aGUgbWFpbiB3aW5kb3cgYW5kIGV2ZXJ5IHBvcG91dCB3aW5kb3csIGluY2x1ZGluZyBwb3BvdXRzIG9wZW5lZCBsYXRlciwgYW5kXG4gKiByZW1vdmVzIGl0IG9uIHVubG9hZC5cbiAqXG4gKiBUaGUgc3R5bGVzaGVldCBpcyBhIGNvbnN0cnVjdGVkIGBDU1NTdHlsZVNoZWV0YCBhZG9wdGVkIHRocm91Z2ggYGRvY3VtZW50LmFkb3B0ZWRTdHlsZVNoZWV0c2AsIHNvIHRoZSBwbHVnaW5cbiAqIGNyZWF0ZXMgbm8gYDxzdHlsZT5gIGVsZW1lbnQgKHdoaWNoIHRoZSBjb21tdW5pdHkgcmV2aWV3IGZsYWdzKSBhbmQgYWRkcyBubyBDU1Mgc25pcHBldCB0byB0aGUgdXNlcidzIGxpc3QuXG4gKiBBIGNvbnN0cnVjdGVkIHNoZWV0IGNhbiBiZSBhZG9wdGVkIG9ubHkgYnkgYSBkb2N1bWVudCBvZiB0aGUgcmVhbG0gdGhhdCBjb25zdHJ1Y3RlZCBpdCwgc28gZWFjaCB3aW5kb3cgZ2V0cyBpdHNcbiAqIG93biBzaGVldCwgYnVpbHQgd2l0aCB0aGF0IHdpbmRvdydzIGBDU1NTdHlsZVNoZWV0YCBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0YWJsZSBzdHlsZXNoZWV0cyBuZWVkIEVsZWN0cm9uIDI4IG9yXG4gKiBpT1MgMTYuNCwgYm90aCBiZWxvdyB0aGUgb2xkZXN0IHJ1bnRpbWUgT2JzaWRpYW4gc3VwcG9ydHMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuXG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJTdHlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJTdHlsZVBhcmFtcyBleHRlbmRzIFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHRoYXQgb3ducyB0aGUgc3R5bGVzaGVldDogdGhlIHN0eWxlc2hlZXQgaXMgcmVtb3ZlZCB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFN0eWxlU2hlZXRDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgdG8gYXR0YWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXR0YWNoZXMgYSBzdHlsZXNoZWV0IHRvIHRoZSBtYWluIHdpbmRvdyBhbmQgZXZlcnkgcG9wb3V0IHdpbmRvdyB3aGlsZSBsb2FkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZVNoZWV0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIENTUyBjdXJyZW50bHkgYXR0YWNoZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBDU1MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICBwcml2YXRlIF9jc3M6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdHlsZVNoZWV0c0J5V2luZG93ID0gbmV3IE1hcDxXaW5kb3csIENTU1N0eWxlU2hlZXQ+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBTdHlsZVNoZWV0Q29tcG9uZW50YCBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgU3R5bGVTaGVldENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zfS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuX2NzcyA9IHBhcmFtcy5jc3M7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgdGhlIHN0eWxlc2hlZXQgdG8gZXZlcnkgd2luZG93LCBub3cgYW5kIGFzIHBvcG91dHMgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgW3dpbiwgc3R5bGVTaGVldF0gb2YgdGhpcy5zdHlsZVNoZWV0c0J5V2luZG93KSB7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZG9wdGVkU3R5bGVTaGVldHMgPSB3aW4uZG9jdW1lbnQuYWRvcHRlZFN0eWxlU2hlZXRzLmZpbHRlcigoc2hlZXQpID0+IHNoZWV0ICE9PSBzdHlsZVNoZWV0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGVTaGVldHNCeVdpbmRvdy5jbGVhcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignd2luZG93LWNsb3NlJywgKF93b3Jrc3BhY2VXaW5kb3csIHdpbikgPT4ge1xuICAgICAgdGhpcy5zdHlsZVNoZWV0c0J5V2luZG93LmRlbGV0ZSh3aW4pO1xuICAgIH0pKTtcblxuICAgIGNvbnN0IGFsbFdpbmRvd3NFdmVudENvbXBvbmVudCA9IHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NIYW5kbGVyKCh3aW4pID0+IHtcbiAgICAgIHRoaXMuYXR0YWNoKHdpbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIGF0dGFjaGVkIENTUyBpbiBldmVyeSB3aW5kb3cuXG4gICAqXG4gICAqIEBwYXJhbSBjc3MgLSBUaGUgbmV3IENTUy5cbiAgICovXG4gIHB1YmxpYyBzZXRDc3MoY3NzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3MgPSBjc3M7XG4gICAgZm9yIChjb25zdCBzdHlsZVNoZWV0IG9mIHRoaXMuc3R5bGVTaGVldHNCeVdpbmRvdy52YWx1ZXMoKSkge1xuICAgICAgc3R5bGVTaGVldC5yZXBsYWNlU3luYyhjc3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoKHdpbjogV2luZG93KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3R5bGVTaGVldHNCeVdpbmRvdy5oYXMod2luKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlU2hlZXQgPSBuZXcgKGNhc3RUbzx0eXBlb2Ygd2luZG93Pih3aW4pLkNTU1N0eWxlU2hlZXQpKCk7XG4gICAgc3R5bGVTaGVldC5yZXBsYWNlU3luYyh0aGlzLl9jc3MpO1xuICAgIHdpbi5kb2N1bWVudC5hZG9wdGVkU3R5bGVTaGVldHMgPSBbLi4ud2luLmRvY3VtZW50LmFkb3B0ZWRTdHlsZVNoZWV0cywgc3R5bGVTaGVldF07XG4gICAgdGhpcy5zdHlsZVNoZWV0c0J5V2luZG93LnNldCh3aW4sIHN0eWxlU2hlZXQpO1xuICB9XG59XG5cbi8qKlxuICogQXR0YWNoZXMgYSBzdHlsZXNoZWV0IHRvIHRoZSBtYWluIHdpbmRvdyBhbmQgZXZlcnkgcG9wb3V0IHdpbmRvdywgaW5jbHVkaW5nIHBvcG91dHMgb3BlbmVkIGxhdGVyLCB1bnRpbCB0aGVcbiAqIG93bmluZyBjb21wb25lbnQgdW5sb2Fkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZWdpc3RlclN0eWxlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgU3R5bGVTaGVldENvbXBvbmVudH0sIHdob3NlIHtAbGluayBTdHlsZVNoZWV0Q29tcG9uZW50LnNldENzc30gcmVwbGFjZXMgdGhlIENTUy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3R5bGUocGFyYW1zOiBSZWdpc3RlclN0eWxlUGFyYW1zKTogU3R5bGVTaGVldENvbXBvbmVudCB7XG4gIGNvbnN0IHsgYXBwLCBjb21wb25lbnQsIGNzcyB9ID0gcGFyYW1zO1xuICByZXR1cm4gY29tcG9uZW50LmFkZENoaWxkKG5ldyBTdHlsZVNoZWV0Q29tcG9uZW50KHsgYXBwLCBjc3MgfSkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQSxTQUFTLGNBQWM7QUFFdkIsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyxtQkFBbUI7QUE4QnJCLE1BQU0sNEJBQTRCLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNbkQsSUFBVyxNQUFjO0FBQ3ZCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUttQjtBQUFBLEVBRVg7QUFBQSxFQUNTLHNCQUFzQixvQkFBSSxJQUEyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU8vRCxZQUFZLFFBQThDO0FBQy9ELFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLE9BQU8sT0FBTztBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFFYixTQUFLLFNBQVMsTUFBTTtBQUNsQixpQkFBVyxDQUFDLEtBQUssVUFBVSxLQUFLLEtBQUsscUJBQXFCO0FBQ3hELFlBQUksU0FBUyxxQkFBcUIsSUFBSSxTQUFTLG1CQUFtQixPQUFPLENBQUMsVUFBVSxVQUFVLFVBQVU7QUFBQSxNQUMxRztBQUNBLFdBQUssb0JBQW9CLE1BQU07QUFBQSxJQUNqQyxDQUFDO0FBRUQsU0FBSyxjQUFjLEtBQUssSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLFFBQVE7QUFDbEYsV0FBSyxvQkFBb0IsT0FBTyxHQUFHO0FBQUEsSUFDckMsQ0FBQyxDQUFDO0FBRUYsVUFBTSwyQkFBMkIsS0FBSyxTQUFTLElBQUkseUJBQXlCLEtBQUssR0FBRyxDQUFDO0FBQ3JGLDZCQUF5QiwwQkFBMEIsQ0FBQyxRQUFRO0FBQzFELFdBQUssT0FBTyxHQUFHO0FBQUEsSUFDakIsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxPQUFPLEtBQW1CO0FBQy9CLFNBQUssT0FBTztBQUNaLGVBQVcsY0FBYyxLQUFLLG9CQUFvQixPQUFPLEdBQUc7QUFDMUQsaUJBQVcsWUFBWSxHQUFHO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUEsRUFFUSxPQUFPLEtBQW1CO0FBQ2hDLFFBQUksS0FBSyxvQkFBb0IsSUFBSSxHQUFHLEdBQUc7QUFDckM7QUFBQSxJQUNGO0FBRUEsVUFBTSxhQUFhLEtBQUssT0FBc0IsR0FBRyxHQUFFLGNBQWU7QUFDbEUsZUFBVyxZQUFZLEtBQUssSUFBSTtBQUNoQyxRQUFJLFNBQVMscUJBQXFCLENBQUMsR0FBRyxJQUFJLFNBQVMsb0JBQW9CLFVBQVU7QUFDakYsU0FBSyxvQkFBb0IsSUFBSSxLQUFLLFVBQVU7QUFBQSxFQUM5QztBQUNGO0FBU08sU0FBUyxjQUFjLFFBQWtEO0FBQzlFLFFBQU0sRUFBRSxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQ2hDLFNBQU8sVUFBVSxTQUFTLElBQUksb0JBQW9CLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNqRTsiLCJuYW1lcyI6W119
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0eWxlLXNoZWV0LWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXR0YWNoZXMgYSBwbHVnaW4gc3R5bGVzaGVldCB0byB0aGUgbWFpbiB3aW5kb3cgYW5kIGV2ZXJ5IHBvcG91dCB3aW5kb3csIGluY2x1ZGluZyBwb3BvdXRzIG9wZW5lZCBsYXRlciwgYW5kXG4gKiByZW1vdmVzIGl0IG9uIHVubG9hZC5cbiAqXG4gKiBUaGUgc3R5bGVzaGVldCBpcyBhIGNvbnN0cnVjdGVkIGBDU1NTdHlsZVNoZWV0YCBhZG9wdGVkIHRocm91Z2ggYGRvY3VtZW50LmFkb3B0ZWRTdHlsZVNoZWV0c2AsIHNvIHRoZSBwbHVnaW5cbiAqIGNyZWF0ZXMgbm8gYDxzdHlsZT5gIGVsZW1lbnQgKHdoaWNoIHRoZSBjb21tdW5pdHkgcmV2aWV3IGZsYWdzKSBhbmQgYWRkcyBubyBDU1Mgc25pcHBldCB0byB0aGUgdXNlcidzIGxpc3QuXG4gKiBBIGNvbnN0cnVjdGVkIHNoZWV0IGNhbiBiZSBhZG9wdGVkIG9ubHkgYnkgYSBkb2N1bWVudCBvZiB0aGUgcmVhbG0gdGhhdCBjb25zdHJ1Y3RlZCBpdCwgc28gZWFjaCB3aW5kb3cgZ2V0cyBpdHNcbiAqIG93biBzaGVldCwgYnVpbHQgd2l0aCB0aGF0IHdpbmRvdydzIGBDU1NTdHlsZVNoZWV0YCBjb25zdHJ1Y3Rvci4gQ29uc3RydWN0YWJsZSBzdHlsZXNoZWV0cyBuZWVkIEVsZWN0cm9uIDI4IG9yXG4gKiBpT1MgMTYuNCwgYm90aCBiZWxvdyB0aGUgb2xkZXN0IHJ1bnRpbWUgT2JzaWRpYW4gc3VwcG9ydHMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuXG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJTdHlsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJTdHlsZVBhcmFtcyBleHRlbmRzIFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHRoYXQgb3ducyB0aGUgc3R5bGVzaGVldDogdGhlIHN0eWxlc2hlZXQgaXMgcmVtb3ZlZCB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFN0eWxlU2hlZXRDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBDU1MgdG8gYXR0YWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgY3NzOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXR0YWNoZXMgYSBzdHlsZXNoZWV0IHRvIHRoZSBtYWluIHdpbmRvdyBhbmQgZXZlcnkgcG9wb3V0IHdpbmRvdyB3aGlsZSBsb2FkZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHlsZVNoZWV0Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIENTUyBjdXJyZW50bHkgYXR0YWNoZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBDU1MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICBwcml2YXRlIF9jc3M6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdHlsZVNoZWV0c0J5V2luZG93ID0gbmV3IE1hcDxXaW5kb3csIENTU1N0eWxlU2hlZXQ+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBTdHlsZVNoZWV0Q29tcG9uZW50YCBjbGFzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgU3R5bGVTaGVldENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zfS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFN0eWxlU2hlZXRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMuX2NzcyA9IHBhcmFtcy5jc3M7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgdGhlIHN0eWxlc2hlZXQgdG8gZXZlcnkgd2luZG93LCBub3cgYW5kIGFzIHBvcG91dHMgb3Blbi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgW3dpbiwgc3R5bGVTaGVldF0gb2YgdGhpcy5zdHlsZVNoZWV0c0J5V2luZG93KSB7XG4gICAgICAgIHdpbi5kb2N1bWVudC5hZG9wdGVkU3R5bGVTaGVldHMgPSB3aW4uZG9jdW1lbnQuYWRvcHRlZFN0eWxlU2hlZXRzLmZpbHRlcigoc2hlZXQpID0+IHNoZWV0ICE9PSBzdHlsZVNoZWV0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3R5bGVTaGVldHNCeVdpbmRvdy5jbGVhcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignd2luZG93LWNsb3NlJywgKF93b3Jrc3BhY2VXaW5kb3csIHdpbikgPT4ge1xuICAgICAgdGhpcy5zdHlsZVNoZWV0c0J5V2luZG93LmRlbGV0ZSh3aW4pO1xuICAgIH0pKTtcblxuICAgIGNvbnN0IGFsbFdpbmRvd3NFdmVudENvbXBvbmVudCA9IHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpO1xuICAgIGFsbFdpbmRvd3NFdmVudENvbXBvbmVudC5yZWdpc3RlckFsbFdpbmRvd3NIYW5kbGVyKCh3aW4pID0+IHtcbiAgICAgIHRoaXMuYXR0YWNoKHdpbik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIGF0dGFjaGVkIENTUyBpbiBldmVyeSB3aW5kb3cuXG4gICAqXG4gICAqIEBwYXJhbSBjc3MgLSBUaGUgbmV3IENTUy5cbiAgICovXG4gIHB1YmxpYyBzZXRDc3MoY3NzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jc3MgPSBjc3M7XG4gICAgZm9yIChjb25zdCBzdHlsZVNoZWV0IG9mIHRoaXMuc3R5bGVTaGVldHNCeVdpbmRvdy52YWx1ZXMoKSkge1xuICAgICAgc3R5bGVTaGVldC5yZXBsYWNlU3luYyhjc3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoKHdpbjogV2luZG93KTogdm9pZCB7XG4gICAgY29uc3Qgc3R5bGVTaGVldCA9IG5ldyAoY2FzdFRvPHR5cGVvZiB3aW5kb3c+KHdpbikuQ1NTU3R5bGVTaGVldCkoKTtcbiAgICBzdHlsZVNoZWV0LnJlcGxhY2VTeW5jKHRoaXMuX2Nzcyk7XG4gICAgd2luLmRvY3VtZW50LmFkb3B0ZWRTdHlsZVNoZWV0cyA9IFsuLi53aW4uZG9jdW1lbnQuYWRvcHRlZFN0eWxlU2hlZXRzLCBzdHlsZVNoZWV0XTtcbiAgICB0aGlzLnN0eWxlU2hlZXRzQnlXaW5kb3cuc2V0KHdpbiwgc3R5bGVTaGVldCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRhY2hlcyBhIHN0eWxlc2hlZXQgdG8gdGhlIG1haW4gd2luZG93IGFuZCBldmVyeSBwb3BvdXQgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cyBvcGVuZWQgbGF0ZXIsIHVudGlsIHRoZVxuICogb3duaW5nIGNvbXBvbmVudCB1bmxvYWRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlZ2lzdGVyU3R5bGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHtAbGluayBTdHlsZVNoZWV0Q29tcG9uZW50fSwgd2hvc2Uge0BsaW5rIFN0eWxlU2hlZXRDb21wb25lbnQuc2V0Q3NzfSByZXBsYWNlcyB0aGUgQ1NTLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdHlsZShwYXJhbXM6IFJlZ2lzdGVyU3R5bGVQYXJhbXMpOiBTdHlsZVNoZWV0Q29tcG9uZW50IHtcbiAgY29uc3QgeyBhcHAsIGNvbXBvbmVudCwgY3NzIH0gPSBwYXJhbXM7XG4gIHJldHVybiBjb21wb25lbnQuYWRkQ2hpbGQobmV3IFN0eWxlU2hlZXRDb21wb25lbnQoeyBhcHAsIGNzcyB9KSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLFNBQVMsY0FBYztBQUV2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLG1CQUFtQjtBQThCckIsTUFBTSw0QkFBNEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1uRCxJQUFXLE1BQWM7QUFDdkIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS21CO0FBQUEsRUFFWDtBQUFBLEVBQ1Msc0JBQXNCLG9CQUFJLElBQTJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTy9ELFlBQVksUUFBOEM7QUFDL0QsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssT0FBTyxPQUFPO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLFVBQU0sT0FBTztBQUViLFNBQUssU0FBUyxNQUFNO0FBQ2xCLGlCQUFXLENBQUMsS0FBSyxVQUFVLEtBQUssS0FBSyxxQkFBcUI7QUFDeEQsWUFBSSxTQUFTLHFCQUFxQixJQUFJLFNBQVMsbUJBQW1CLE9BQU8sQ0FBQyxVQUFVLFVBQVUsVUFBVTtBQUFBLE1BQzFHO0FBQ0EsV0FBSyxvQkFBb0IsTUFBTTtBQUFBLElBQ2pDLENBQUM7QUFFRCxTQUFLLGNBQWMsS0FBSyxJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxrQkFBa0IsUUFBUTtBQUNsRixXQUFLLG9CQUFvQixPQUFPLEdBQUc7QUFBQSxJQUNyQyxDQUFDLENBQUM7QUFFRixVQUFNLDJCQUEyQixLQUFLLFNBQVMsSUFBSSx5QkFBeUIsS0FBSyxHQUFHLENBQUM7QUFDckYsNkJBQXlCLDBCQUEwQixDQUFDLFFBQVE7QUFDMUQsV0FBSyxPQUFPLEdBQUc7QUFBQSxJQUNqQixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQU8sS0FBbUI7QUFDL0IsU0FBSyxPQUFPO0FBQ1osZUFBVyxjQUFjLEtBQUssb0JBQW9CLE9BQU8sR0FBRztBQUMxRCxpQkFBVyxZQUFZLEdBQUc7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLE9BQU8sS0FBbUI7QUFDaEMsVUFBTSxhQUFhLEtBQUssT0FBc0IsR0FBRyxHQUFFLGNBQWU7QUFDbEUsZUFBVyxZQUFZLEtBQUssSUFBSTtBQUNoQyxRQUFJLFNBQVMscUJBQXFCLENBQUMsR0FBRyxJQUFJLFNBQVMsb0JBQW9CLFVBQVU7QUFDakYsU0FBSyxvQkFBb0IsSUFBSSxLQUFLLFVBQVU7QUFBQSxFQUM5QztBQUNGO0FBU08sU0FBUyxjQUFjLFFBQWtEO0FBQzlFLFFBQU0sRUFBRSxLQUFLLFdBQVcsSUFBSSxJQUFJO0FBQ2hDLFNBQU8sVUFBVSxTQUFTLElBQUksb0JBQW9CLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztBQUNqRTsiLCJuYW1lcyI6W119
@@ -0,0 +1,60 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ * Append-only, anchored discovery of history-preserving transport transitions.
5
+ */
6
+ import type { DataStoreTransportConstructorParams } from './data-store-transport.mjs';
7
+ import { DataStoreTransport } from './data-store-transport.mjs';
8
+ /**
9
+ A transport destination. Keep the original open parameters as the discovery anchor.
10
+ */
11
+ export interface DataStoreLocation {
12
+ /**
13
+ Vault-relative parent of the plugin/store subtree.
14
+ */
15
+ readonly folder: string;
16
+ /**
17
+ * New document encoding.
18
+ *
19
+ * @default `'markdown'`
20
+ */
21
+ readonly format?: 'json' | 'markdown';
22
+ }
23
+ /**
24
+ Anchored relocation coordinator; source histories are never removed.
25
+ */
26
+ export declare class DataStoreLocations {
27
+ private readonly params;
28
+ /**
29
+ All readers, oldest first; the last transport is the active writer.
30
+ *
31
+ * @returns All retained reader transports in transition order.
32
+ */
33
+ get transports(): DataStoreTransport[];
34
+ private readonly anchor;
35
+ private readonly initial;
36
+ private locations;
37
+ /**
38
+ * Creates a coordinator without adapter calls.
39
+ *
40
+ * @param params - Permanent discovery anchor and store identity.
41
+ */
42
+ constructor(params: DataStoreTransportConstructorParams);
43
+ /**
44
+ * Discovers and finishes pending copies before allowing a writer to switch destinations.
45
+ * Conflicting branches and reordered incomplete chains fail closed until delivery is complete.
46
+ *
47
+ * @returns A promise that resolves after discovery and verification.
48
+ */
49
+ refresh(): Promise<void>;
50
+ /**
51
+ * Announces a transition durably at the anchor, then copies and verifies before activation.
52
+ * Retrying the same destination finishes an interrupted copy.
53
+ *
54
+ * @param location - Requested destination.
55
+ * @returns A promise that resolves when the new writer is ready.
56
+ */
57
+ relocate(location: DataStoreLocation): Promise<void>;
58
+ private createTransport;
59
+ private validateLocation;
60
+ }