obsidian-integration-testing 11.0.0 → 12.0.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 (99) hide show
  1. package/dist/lib/cjs/appium-server-marker.cjs +115 -0
  2. package/dist/lib/cjs/appium-server-marker.d.cts +81 -0
  3. package/dist/lib/cjs/cli.cjs +104 -19
  4. package/dist/lib/cjs/cli.d.cts +16 -8
  5. package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
  6. package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
  7. package/dist/lib/cjs/context-provider.cjs +12 -1
  8. package/dist/lib/cjs/context-provider.d.cts +26 -3
  9. package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
  10. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +113 -0
  11. package/dist/lib/cjs/demo-vault-populate.cjs +36 -9
  12. package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
  13. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  14. package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
  15. package/dist/lib/cjs/index.cjs +13 -1
  16. package/dist/lib/cjs/index.d.cts +8 -4
  17. package/dist/lib/cjs/installer-asset.cjs +1 -1
  18. package/dist/lib/cjs/installer-asset.d.cts +1 -1
  19. package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
  20. package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
  21. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  22. package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
  23. package/dist/lib/cjs/kill-process-tree.cjs +18 -7
  24. package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
  25. package/dist/lib/cjs/library.cjs +1 -1
  26. package/dist/lib/cjs/mobile-input.cjs +161 -0
  27. package/dist/lib/cjs/mobile-input.d.cts +160 -0
  28. package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
  29. package/dist/lib/cjs/obsidian-installer.cjs +1 -1
  30. package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
  31. package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
  32. package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
  33. package/dist/lib/cjs/release-catalog.cjs +73 -0
  34. package/dist/lib/cjs/release-catalog.d.cts +125 -0
  35. package/dist/lib/cjs/transport-appium.cjs +122 -1
  36. package/dist/lib/cjs/transport-appium.d.cts +51 -0
  37. package/dist/lib/cjs/transport-desktop-cdp.cjs +7 -1
  38. package/dist/lib/cjs/transport-desktop-cdp.d.cts +1 -0
  39. package/dist/lib/cjs/transport-factory.cjs +237 -32
  40. package/dist/lib/cjs/transport-factory.d.cts +10 -1
  41. package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
  42. package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
  43. package/dist/lib/cjs/vitest/setup.cjs +2 -1
  44. package/dist/lib/cjs/vitest/setup.d.cts +5 -0
  45. package/dist/lib/cjs/vitest/typings.d.cts +6 -4
  46. package/dist/lib/cjs/webview-cdp.cjs +264 -0
  47. package/dist/lib/cjs/webview-cdp.d.cts +152 -0
  48. package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
  49. package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
  50. package/dist/lib/esm/appium-server-marker.d.mts +81 -0
  51. package/dist/lib/esm/appium-server-marker.mjs +83 -0
  52. package/dist/lib/esm/cli.d.mts +16 -8
  53. package/dist/lib/esm/cli.mjs +110 -19
  54. package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
  55. package/dist/lib/esm/community-plugin-registry.mjs +23 -0
  56. package/dist/lib/esm/context-provider.d.mts +26 -3
  57. package/dist/lib/esm/context-provider.mjs +10 -1
  58. package/dist/lib/esm/demo-vault-bootstrap.d.mts +113 -0
  59. package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
  60. package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
  61. package/dist/lib/esm/demo-vault-populate.mjs +33 -8
  62. package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
  63. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  64. package/dist/lib/esm/index.d.mts +8 -4
  65. package/dist/lib/esm/index.mjs +16 -2
  66. package/dist/lib/esm/installer-asset.d.mts +1 -1
  67. package/dist/lib/esm/installer-asset.mjs +1 -1
  68. package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
  69. package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
  70. package/dist/lib/esm/jest/global-setup.d.mts +5 -1
  71. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  72. package/dist/lib/esm/kill-process-tree.d.mts +10 -2
  73. package/dist/lib/esm/kill-process-tree.mjs +16 -6
  74. package/dist/lib/esm/library.mjs +1 -1
  75. package/dist/lib/esm/mobile-input.d.mts +160 -0
  76. package/dist/lib/esm/mobile-input.mjs +132 -0
  77. package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
  78. package/dist/lib/esm/obsidian-installer.mjs +1 -1
  79. package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
  80. package/dist/lib/esm/obsidian-metadata.mjs +123 -17
  81. package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
  82. package/dist/lib/esm/release-catalog.d.mts +125 -0
  83. package/dist/lib/esm/release-catalog.mjs +46 -0
  84. package/dist/lib/esm/transport-appium.d.mts +51 -0
  85. package/dist/lib/esm/transport-appium.mjs +126 -1
  86. package/dist/lib/esm/transport-desktop-cdp.d.mts +1 -0
  87. package/dist/lib/esm/transport-desktop-cdp.mjs +7 -1
  88. package/dist/lib/esm/transport-factory.d.mts +10 -1
  89. package/dist/lib/esm/transport-factory.mjs +249 -35
  90. package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
  91. package/dist/lib/esm/vitest/global-setup.mjs +14 -7
  92. package/dist/lib/esm/vitest/setup.d.mts +5 -0
  93. package/dist/lib/esm/vitest/setup.mjs +3 -1
  94. package/dist/lib/esm/vitest/typings.d.mts +6 -4
  95. package/dist/lib/esm/webview-cdp.d.mts +152 -0
  96. package/dist/lib/esm/webview-cdp.mjs +236 -0
  97. package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
  98. package/dist/lib/esm/wedged-appium-server.mjs +86 -0
  99. package/package.json +2 -1
@@ -18,20 +18,29 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var context_provider_exports = {};
20
20
  __export(context_provider_exports, {
21
+ getSetupError: () => getSetupError,
21
22
  getTransportOptions: () => getTransportOptions,
22
23
  getVaultPath: () => getVaultPath,
24
+ setSetupErrorResolver: () => setSetupErrorResolver,
23
25
  setTransportOptionsResolver: () => setTransportOptionsResolver,
24
26
  setVaultPathResolver: () => setVaultPathResolver
25
27
  });
26
28
  module.exports = __toCommonJS(context_provider_exports);
29
+ let setupErrorResolver;
27
30
  let transportOptionsResolver;
28
31
  let vaultPathResolver;
32
+ function getSetupError() {
33
+ return setupErrorResolver?.();
34
+ }
29
35
  function getTransportOptions() {
30
36
  return transportOptionsResolver?.();
31
37
  }
32
38
  function getVaultPath() {
33
39
  return vaultPathResolver?.();
34
40
  }
41
+ function setSetupErrorResolver(callback) {
42
+ setupErrorResolver = callback;
43
+ }
35
44
  function setTransportOptionsResolver(callback) {
36
45
  transportOptionsResolver = callback;
37
46
  }
@@ -40,9 +49,11 @@ function setVaultPathResolver(callback) {
40
49
  }
41
50
  // Annotate the CommonJS export names for ESM import in node:
42
51
  0 && (module.exports = {
52
+ getSetupError,
43
53
  getTransportOptions,
44
54
  getVaultPath,
55
+ setSetupErrorResolver,
45
56
  setTransportOptionsResolver,
46
57
  setVaultPathResolver
47
58
  });
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtcHJvdmlkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBGcmFtZXdvcmstbmV1dHJhbCBjb250ZXh0IHByb3ZpZGVyIGZvciBpbnRlZ3JhdGlvbiB0ZXN0IHN0YXRlLlxuICpcbiAqIEVhY2ggZnJhbWV3b3JrIGFkYXB0ZXIgKHZpdGVzdCwgamVzdCkgcmVnaXN0ZXJzIHJlc29sdmVycyB2aWFcbiAqIHtAbGluayBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXJ9IGFuZCB7QGxpbmsgc2V0VmF1bHRQYXRoUmVzb2x2ZXJ9XG4gKiBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uLiBDb3JlIG1vZHVsZXMgY2FsbCB0aGUgY29ycmVzcG9uZGluZ1xuICogZ2V0dGVycyB0byByZXRyaWV2ZSBzdGF0ZSB3aXRob3V0IGRlcGVuZGluZyBvbiBhbnkgc3BlY2lmaWMgdGVzdCBmcmFtZXdvcmsuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBjdXJyZW50IHRyYW5zcG9ydCBvcHRpb25zLlxuICovXG5leHBvcnQgdHlwZSBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIgPSAoKSA9PiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBjdXJyZW50IHZhdWx0IHBhdGguXG4gKi9cbmV4cG9ydCB0eXBlIFZhdWx0UGF0aFJlc29sdmVyID0gKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5sZXQgdHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyOiBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIgfCB1bmRlZmluZWQ7XG5sZXQgdmF1bHRQYXRoUmVzb2x2ZXI6IHVuZGVmaW5lZCB8IFZhdWx0UGF0aFJlc29sdmVyO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zcG9ydCBvcHRpb25zIHJlc29sdmVkIGJ5IHRoZSByZWdpc3RlcmVkIGZyYW1ld29yayBhZGFwdGVyLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucywgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXI/LigpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhdWx0IHBhdGggcmVzb2x2ZWQgYnkgdGhlIHJlZ2lzdGVyZWQgZnJhbWV3b3JrIGFkYXB0ZXIuXG4gKlxuICogQHJldHVybnMgVGhlIHZhdWx0IHBhdGgsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBjb25maWd1cmVkIChmYWxscyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYXVsdFBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhdWx0UGF0aFJlc29sdmVyPy4oKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdHJhbnNwb3J0IG9wdGlvbnMuIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoY2FsbGJhY2s6IFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcik6IHZvaWQge1xuICB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdGhlIHZhdWx0IHBhdGguIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYXVsdFBhdGhSZXNvbHZlcihjYWxsYmFjazogVmF1bHRQYXRoUmVzb2x2ZXIpOiB2b2lkIHtcbiAgdmF1bHRQYXRoUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1QkEsSUFBSTtBQUNKLElBQUk7QUFPRyxTQUFTLHNCQUE0RDtBQUMxRSxTQUFPLDJCQUEyQjtBQUNwQztBQU9PLFNBQVMsZUFBbUM7QUFDakQsU0FBTyxvQkFBb0I7QUFDN0I7QUFRTyxTQUFTLDRCQUE0QixVQUEwQztBQUNwRiw2QkFBMkI7QUFDN0I7QUFRTyxTQUFTLHFCQUFxQixVQUFtQztBQUN0RSxzQkFBb0I7QUFDdEI7IiwKICAibmFtZXMiOiBbXQp9Cg==
59
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtcHJvdmlkZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBGcmFtZXdvcmstbmV1dHJhbCBjb250ZXh0IHByb3ZpZGVyIGZvciBpbnRlZ3JhdGlvbiB0ZXN0IHN0YXRlLlxuICpcbiAqIEVhY2ggZnJhbWV3b3JrIGFkYXB0ZXIgKHZpdGVzdCwgamVzdCkgcmVnaXN0ZXJzIHJlc29sdmVycyB2aWFcbiAqIHtAbGluayBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXJ9LCB7QGxpbmsgc2V0VmF1bHRQYXRoUmVzb2x2ZXJ9IGFuZFxuICoge0BsaW5rIHNldFNldHVwRXJyb3JSZXNvbHZlcn0gZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbi4gQ29yZSBtb2R1bGVzIGNhbGwgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGdldHRlcnMgdG8gcmV0cmlldmUgc3RhdGUgd2l0aG91dCBkZXBlbmRpbmcgb24gYW55IHNwZWNpZmljIHRlc3QgZnJhbWV3b3JrLlxuICovXG5cbmltcG9ydCB0eXBlIHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5janMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLmNqcyc7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIHRoZSBmYWlsdXJlIG9mIHRoaXMgcHJvamVjdCdzIGdsb2JhbCBzZXR1cCwgaWYgaXQgZmFpbGVkLlxuICovXG5leHBvcnQgdHlwZSBTZXR1cEVycm9yUmVzb2x2ZXIgPSAoKSA9PiBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIGN1cnJlbnQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciA9ICgpID0+IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIGN1cnJlbnQgdmF1bHQgcGF0aC5cbiAqL1xuZXhwb3J0IHR5cGUgVmF1bHRQYXRoUmVzb2x2ZXIgPSAoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmxldCBzZXR1cEVycm9yUmVzb2x2ZXI6IFNldHVwRXJyb3JSZXNvbHZlciB8IHVuZGVmaW5lZDtcbmxldCB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXI6IFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlciB8IHVuZGVmaW5lZDtcbmxldCB2YXVsdFBhdGhSZXNvbHZlcjogdW5kZWZpbmVkIHwgVmF1bHRQYXRoUmVzb2x2ZXI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmFpbHVyZSBvZiB0aGlzIHByb2plY3QncyBnbG9iYWwgc2V0dXAsIGFzIHB1Ymxpc2hlZCBieSB0aGUgcmVnaXN0ZXJlZFxuICogZnJhbWV3b3JrIGFkYXB0ZXIuIEEgdGVzdCB3b3JrZXIgbXVzdCBmYWlsIHdpdGggdGhpcyByYXRoZXIgdGhhbiBidWlsZCBhIHRyYW5zcG9ydFxuICogb2YgaXRzIG93bjogd2l0aCBubyBvcHRpb25zIHB1Ymxpc2hlZCwgdGhlIGRlZmF1bHQgaXMgdGhlIG93bmVkICoqZGVza3RvcCoqIENEUFxuICogaW5zdGFuY2UsIHdoYXRldmVyIHBsYXRmb3JtIHRoZSBwcm9qZWN0IGFza2VkIGZvci5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgZmFpbHVyZSwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHNldHVwIHN1Y2NlZWRlZCAob3IgbmV2ZXIgcmFuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNldHVwRXJyb3IoKTogSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2V0dXBFcnJvclJlc29sdmVyPy4oKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFuc3BvcnQgb3B0aW9ucyByZXNvbHZlZCBieSB0aGUgcmVnaXN0ZXJlZCBmcmFtZXdvcmsgYWRhcHRlci5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdHJhbnNwb3J0IG9wdGlvbnMsIG9yIGB1bmRlZmluZWRgIGlmIG5vdCBjb25maWd1cmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0T3B0aW9ucygpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyPy4oKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YXVsdCBwYXRoIHJlc29sdmVkIGJ5IHRoZSByZWdpc3RlcmVkIGZyYW1ld29yayBhZGFwdGVyLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YXVsdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBub3QgY29uZmlndXJlZCAoZmFsbHMgYmFjayB0byBgcHJvY2Vzcy5jd2QoKWApLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YXVsdFBhdGhSZXNvbHZlcj8uKCk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgcmVzb2x2ZXIgZnVuY3Rpb24gZm9yIHRoaXMgcHJvamVjdCdzIHNldHVwIGZhaWx1cmUuIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcyBcdTIwMTQgbW9zdFxuICogaW1wb3J0YW50bHkgaW4gdGhlICoqcGVyLXdvcmtlcioqIHNldHVwIGZpbGUsIHdoaWNoIGlzIHdoZXJlIHRoZSBmYWlsdXJlIGhhcyB0byBiZVxuICogc2VlbiAoc2VlIGB2aXRlc3Qvc2V0dXAudHNgKS5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRTZXR1cEVycm9yUmVzb2x2ZXIoY2FsbGJhY2s6IFNldHVwRXJyb3JSZXNvbHZlcik6IHZvaWQge1xuICBzZXR1cEVycm9yUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdHJhbnNwb3J0IG9wdGlvbnMuIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoY2FsbGJhY2s6IFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcik6IHZvaWQge1xuICB0cmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSByZXNvbHZlciBmdW5jdGlvbiBmb3IgdGhlIHZhdWx0IHBhdGguIENhbGxlZCBieSBmcmFtZXdvcmtcbiAqIGFkYXB0ZXJzIGF0IG1vZHVsZSBsb2FkIHRpbWUgdG8gYnJpZGdlIHRoZWlyIG5hdGl2ZSBpbmplY3Rpb24gbWVjaGFuaXNtcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYXVsdFBhdGhSZXNvbHZlcihjYWxsYmFjazogVmF1bHRQYXRoUmVzb2x2ZXIpOiB2b2lkIHtcbiAgdmF1bHRQYXRoUmVzb2x2ZXIgPSBjYWxsYmFjaztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkJBLElBQUk7QUFDSixJQUFJO0FBQ0osSUFBSTtBQVVHLFNBQVMsZ0JBQTBFO0FBQ3hGLFNBQU8scUJBQXFCO0FBQzlCO0FBT08sU0FBUyxzQkFBNEQ7QUFDMUUsU0FBTywyQkFBMkI7QUFDcEM7QUFPTyxTQUFTLGVBQW1DO0FBQ2pELFNBQU8sb0JBQW9CO0FBQzdCO0FBVU8sU0FBUyxzQkFBc0IsVUFBb0M7QUFDeEUsdUJBQXFCO0FBQ3ZCO0FBUU8sU0FBUyw0QkFBNEIsVUFBMEM7QUFDcEYsNkJBQTJCO0FBQzdCO0FBUU8sU0FBUyxxQkFBcUIsVUFBbUM7QUFDdEUsc0JBQW9CO0FBQ3RCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -4,11 +4,16 @@
4
4
  * Framework-neutral context provider for integration test state.
5
5
  *
6
6
  * Each framework adapter (vitest, jest) registers resolvers via
7
- * {@link setTransportOptionsResolver} and {@link setVaultPathResolver}
8
- * during module initialization. Core modules call the corresponding
9
- * getters to retrieve state without depending on any specific test framework.
7
+ * {@link setTransportOptionsResolver}, {@link setVaultPathResolver} and
8
+ * {@link setSetupErrorResolver} during module initialization. Core modules call the
9
+ * corresponding getters to retrieve state without depending on any specific test framework.
10
10
  */
11
+ import type { IntegrationSetupFailedErrorConstructorParams } from './integration-setup-failed-error.cjs';
11
12
  import type { ObsidianTransportOptions } from './transport-options.cjs';
13
+ /**
14
+ * A function that resolves the failure of this project's global setup, if it failed.
15
+ */
16
+ export type SetupErrorResolver = () => IntegrationSetupFailedErrorConstructorParams | undefined;
12
17
  /**
13
18
  * A function that resolves the current transport options.
14
19
  */
@@ -17,6 +22,15 @@ export type TransportOptionsResolver = () => ObsidianTransportOptions | undefine
17
22
  * A function that resolves the current vault path.
18
23
  */
19
24
  export type VaultPathResolver = () => string | undefined;
25
+ /**
26
+ * Returns the failure of this project's global setup, as published by the registered
27
+ * framework adapter. A test worker must fail with this rather than build a transport
28
+ * of its own: with no options published, the default is the owned **desktop** CDP
29
+ * instance, whatever platform the project asked for.
30
+ *
31
+ * @returns The setup failure, or `undefined` if the setup succeeded (or never ran).
32
+ */
33
+ export declare function getSetupError(): IntegrationSetupFailedErrorConstructorParams | undefined;
20
34
  /**
21
35
  * Returns the transport options resolved by the registered framework adapter.
22
36
  *
@@ -29,6 +43,15 @@ export declare function getTransportOptions(): ObsidianTransportOptions | undefi
29
43
  * @returns The vault path, or `undefined` if not configured (falls back to `process.cwd()`).
30
44
  */
31
45
  export declare function getVaultPath(): string | undefined;
46
+ /**
47
+ * Registers a resolver function for this project's setup failure. Called by framework
48
+ * adapters at module load time to bridge their native injection mechanisms — most
49
+ * importantly in the **per-worker** setup file, which is where the failure has to be
50
+ * seen (see `vitest/setup.ts`).
51
+ *
52
+ * @param callback - The resolver function.
53
+ */
54
+ export declare function setSetupErrorResolver(callback: SetupErrorResolver): void;
32
55
  /**
33
56
  * Registers a resolver function for transport options. Called by framework
34
57
  * adapters at module load time to bridge their native injection mechanisms.
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var demo_vault_bootstrap_exports = {};
30
+ __export(demo_vault_bootstrap_exports, {
31
+ bootstrapDemoVaultPlugins: () => bootstrapDemoVaultPlugins,
32
+ buildDemoVaultPopulateAsync: () => buildDemoVaultPopulateAsync
33
+ });
34
+ module.exports = __toCommonJS(demo_vault_bootstrap_exports);
35
+ var import_node_fs = require("node:fs");
36
+ var import_node_path = require("node:path");
37
+ var import_node_process = __toESM(require("node:process"), 1);
38
+ var import_community_plugin_registry = require("./community-plugin-registry.cjs");
39
+ var import_demo_vault_populate = require("./demo-vault-populate.cjs");
40
+ var import_log = require("./log.cjs");
41
+ const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
42
+ const HTTP_NOT_FOUND = 404;
43
+ let registryPromise;
44
+ async function bootstrapDemoVaultPlugins(params) {
45
+ const { demoVaultPath, injectPlugins, shouldForce = false } = params;
46
+ const bootstrappable = injectPlugins.filter((plugin) => plugin.sourceDirectory === void 0);
47
+ const targets = shouldForce ? bootstrappable : (0, import_demo_vault_populate.resolveMissingInjectedPlugins)({ demoVaultPath, injectPlugins });
48
+ const targetPluginIds = new Set(targets.map((plugin) => plugin.pluginId));
49
+ const installed = [];
50
+ for (const plugin of targets) {
51
+ installed.push(await installPlugin(demoVaultPath, plugin));
52
+ }
53
+ return {
54
+ installed,
55
+ skippedPluginIds: injectPlugins.map((plugin) => plugin.pluginId).filter((pluginId) => !targetPluginIds.has(pluginId))
56
+ };
57
+ }
58
+ async function buildDemoVaultPopulateAsync(params) {
59
+ if (params.injectPlugins !== void 0) {
60
+ await bootstrapDemoVaultPlugins({ demoVaultPath: params.demoVaultPath, injectPlugins: params.injectPlugins });
61
+ }
62
+ return (0, import_demo_vault_populate.buildDemoVaultPopulate)(params);
63
+ }
64
+ function buildGitHubHeaders() {
65
+ const headers = new Headers({ "User-Agent": DOWNLOAD_USER_AGENT });
66
+ const token = import_node_process.default.env["GITHUB_TOKEN"] ?? import_node_process.default.env["GH_TOKEN"];
67
+ if (token) {
68
+ headers.set("Authorization", `Bearer ${token}`);
69
+ }
70
+ return headers;
71
+ }
72
+ async function downloadAsset(url, isRequired) {
73
+ const response = await fetch(url, { headers: buildGitHubHeaders() });
74
+ if (!response.ok) {
75
+ if (!isRequired && response.status === HTTP_NOT_FOUND) {
76
+ return void 0;
77
+ }
78
+ throw new Error(`Failed to download ${url}: HTTP ${String(response.status)} ${response.statusText}`);
79
+ }
80
+ return Buffer.from(await response.arrayBuffer());
81
+ }
82
+ async function fetchCommunityPluginRegistry() {
83
+ registryPromise ??= (async () => {
84
+ (0, import_log.log)(`[demo-vault-bootstrap] Fetching Obsidian's community plugin registry from ${import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL}...`);
85
+ const response = await fetch(import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL, { headers: buildGitHubHeaders() });
86
+ if (!response.ok) {
87
+ throw new Error(
88
+ `Failed to fetch Obsidian's community plugin registry (${import_community_plugin_registry.COMMUNITY_PLUGINS_REGISTRY_URL}): HTTP ${String(response.status)} ${response.statusText}. Pass an explicit \`repo\` on the injected plugin to skip the registry lookup.`
89
+ );
90
+ }
91
+ return await response.json();
92
+ })();
93
+ try {
94
+ return await registryPromise;
95
+ } catch (error) {
96
+ registryPromise = void 0;
97
+ throw error;
98
+ }
99
+ }
100
+ async function installPlugin(demoVaultPath, plugin) {
101
+ const { pluginId, version } = plugin;
102
+ const repo = await resolvePluginRepo(plugin);
103
+ const targetDirectory = (0, import_demo_vault_populate.resolveInjectedPluginSourceDirectory)({ demoVaultPath, plugin });
104
+ (0, import_log.log)(`[demo-vault-bootstrap] Installing "${pluginId}" from ${repo}@${version ?? "latest"} into ${targetDirectory}...`);
105
+ const downloads = await Promise.all([
106
+ ...import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES.map(async (assetName) => ({
107
+ assetName,
108
+ content: await downloadAsset((0, import_community_plugin_registry.buildPluginAssetUrl)({ assetName, repo, version }), true)
109
+ })),
110
+ ...import_community_plugin_registry.OPTIONAL_PLUGIN_ASSET_NAMES.map(async (assetName) => ({
111
+ assetName,
112
+ content: await downloadAsset((0, import_community_plugin_registry.buildPluginAssetUrl)({ assetName, repo, version }), false)
113
+ }))
114
+ ]);
115
+ (0, import_node_fs.mkdirSync)(targetDirectory, { recursive: true });
116
+ const assetNames = [];
117
+ for (const { assetName, content } of downloads) {
118
+ if (content === void 0) {
119
+ continue;
120
+ }
121
+ (0, import_node_fs.writeFileSync)((0, import_node_path.join)(targetDirectory, assetName), content);
122
+ assetNames.push(assetName);
123
+ }
124
+ (0, import_log.log)(`[demo-vault-bootstrap] Installed "${pluginId}": ${assetNames.join(", ")}.`);
125
+ return { assetNames, pluginId, repo, version };
126
+ }
127
+ async function resolvePluginRepo(plugin) {
128
+ const { pluginId, repo } = plugin;
129
+ if (repo !== void 0) {
130
+ if (!(0, import_community_plugin_registry.isValidRepoReference)(repo)) {
131
+ throw new Error(`Invalid \`repo\` for community plugin "${pluginId}": ${repo}. Expected an \`owner/name\` reference.`);
132
+ }
133
+ return repo;
134
+ }
135
+ const registryRepo = (0, import_community_plugin_registry.selectPluginRepo)({ entries: await fetchCommunityPluginRegistry(), pluginId });
136
+ if (registryRepo === void 0) {
137
+ throw new Error(
138
+ `Community plugin "${pluginId}" is not listed in Obsidian's community plugin registry, so its GitHub repository cannot be resolved. Pass an explicit \`repo\` (\`owner/name\`) on the injected plugin.`
139
+ );
140
+ }
141
+ return registryRepo;
142
+ }
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ bootstrapDemoVaultPlugins,
146
+ buildDemoVaultPopulateAsync
147
+ });
148
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtYm9vdHN0cmFwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBkZW1vIHZhdWx0J3MgKippbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyoqIGhlYWRsZXNzbHksIGJ5IGRvd25sb2FkaW5nXG4gKiB0aGVpciBwdWJsaXNoZWQgR2l0SHViIHJlbGVhc2UgYXNzZXRzIHN0cmFpZ2h0IGludG9cbiAqIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYC5cbiAqXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgZWFjaCBpbmplY3RlZCBwbHVnaW4ncyBgbWFpbi5qc2AgL1xuICogYG1hbmlmZXN0Lmpzb25gIHRvIGFscmVhZHkgYmUgb24gZGlzaywgYW5kIHRocm93cyB3aGVuIHRoZXkgYXJlIG5vdC4gVW50aWwgdGhpc1xuICogbW9kdWxlIGV4aXN0ZWQgdGhlIG9ubHkgZG9jdW1lbnRlZCByZW1lZHkgd2FzIGEgKipHVUkgc3RlcCoqIFx1MjAxNCBvcGVuIGBkZW1vLXZhdWx0L2BcbiAqIGluIE9ic2lkaWFuIG9uY2UgYW5kIGxldCBgZGVtby12YXVsdC1oZWxwZXJgIGluc3RhbGwgdGhlIHBsdWdpbiBhdCBydW50aW1lLlxuICogYC5vYnNpZGlhbi9wbHVnaW5zLypgIGlzIGdpdGlnbm9yZWQgaW4gZXZlcnkgZmxlZXQgcGx1Z2luIHJlcG8sIHNvIHRoYXQgc3RhdGVcbiAqIGV4aXN0cyBvbiBleGFjdGx5IHRoZSBvbmUgbWFjaGluZSB0aGF0IGRpZCBpdCBhbmQgaXMgaW52aXNpYmxlIHRvIGEgZnJlc2ggY2xvbmUsXG4gKiBhIG5ldyBtYWNoaW5lLCBvciBDSS4gU2luY2UgYSBwbHVnaW4gcmVwbydzIHJlbGVhc2UgcHJlZmxpZ2h0IHJ1bnMgaXRzXG4gKiBpbnRlZ3JhdGlvbiB0ZXN0cywgdGhhdCBtYWRlICpjdXR0aW5nIGEgcmVsZWFzZSBmcm9tIGEgY2xlYW4gY2xvbmUqIGltcG9zc2libGVcbiAqIHdpdGhvdXQgYSBodW1hbiBvcGVuaW5nIGEgR1VJLlxuICpcbiAqIERvd25sb2FkaW5nIHRoZSByZWxlYXNlIGFzc2V0cyBpcyB0aGUgZXhhY3QgaGVhZGxlc3MgZXF1aXZhbGVudDogdGhlIHJlc3VsdGluZ1xuICogZm9sZGVyIGlzIHdoYXQgT2JzaWRpYW4gaXRzZWxmIHdvdWxkIGhhdmUgaW5zdGFsbGVkLCBzbyB0aGUgc2hpcHBlZFxuICogYCotZGVtby12YXVsdC08dmVyc2lvbj4uemlwYCBzdGF5cyB0aGUgZmxlZXQtc3RhbmRhcmQgYXJ0aWZhY3QuXG4gKlxuICogVHdvIGVudHJ5IHBvaW50cywgcGx1cyB0aGUgYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkgc3ViY29tbWFuZDpcbiAqXG4gKiAtIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfSBcdTIwMTQgaW5zdGFsbCB0aGUgbWlzc2luZyBvbmVzLCBleHBsaWNpdGx5LlxuICogLSB7QGxpbmsgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jfSBcdTIwMTQgZG8gdGhhdCBhbmQgdGhlbiBidWlsZCB0aGUgcG9wdWxhdGUgbWFwLFxuICogICBzbyBhIGdsb2JhbCBzZXR1cCBzZWxmLWhlYWxzIHdpdGggbm8gbWFudWFsIHN0ZXAgYXQgYWxsLlxuICpcbiAqIFRoZSBzeW5jIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCBkZWxpYmVyYXRlbHkga2VlcHMgdGhyb3dpbmc6IGBmZXRjaGAgaGFzIG5vXG4gKiBzeW5jaHJvbm91cyBmb3JtLCBzbyBhdXRvLWhlYWxpbmcgY2FuIG9ubHkgbGl2ZSBvbiBhbiBhc3luYyBzaWJsaW5nLiBJdHMgbWVzc2FnZVxuICogbm93IG5hbWVzIGJvdGggcmVtZWRpZXMgYWJvdmUgaW5zdGVhZCBvZiB0aGUgR1VJIHN0ZXAuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnkgfSBmcm9tICcuL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyxcbiAgSW5qZWN0UGx1Z2luUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5janMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQuY2pzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRQbHVnaW5Bc3NldFVybCxcbiAgQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMLFxuICBpc1ZhbGlkUmVwb1JlZmVyZW5jZSxcbiAgT1BUSU9OQUxfUExVR0lOX0FTU0VUX05BTUVTLFxuICBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMsXG4gIHNlbGVjdFBsdWdpblJlcG9cbn0gZnJvbSAnLi9jb21tdW5pdHktcGx1Z2luLXJlZ2lzdHJ5LmNqcyc7XG5pbXBvcnQge1xuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlLFxuICByZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnksXG4gIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcblxuLyoqXG4gKiBCcm93c2VyIGBVc2VyLUFnZW50YCBmb3IgdGhlIGFzc2V0IGRvd25sb2FkcywgbWF0Y2hpbmcgYG9ic2lkaWFuLWluc3RhbGxlci50c2AgXHUyMDE0XG4gKiBhIHBsYWluIE5vZGUgZmV0Y2ggaXMgcmVqZWN0ZWQgYnkgc29tZSBDRE4gZWRnZXMuXG4gKi9cbmNvbnN0IERPV05MT0FEX1VTRVJfQUdFTlQgPSAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNC4wLjAuMCBTYWZhcmkvNTM3LjM2JztcblxuY29uc3QgSFRUUF9OT1RfRk9VTkQgPSA0MDQ7XG5cbi8qKlxuICogVGhlIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnksIGZldGNoZWQgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLiBFdmVyeSBpbmplY3RlZFxuICogcGx1Z2luIG9mIGV2ZXJ5IGRlbW8tdmF1bHQgcHJvamVjdCBpbiBhIHJ1biByZXNvbHZlcyBhZ2FpbnN0IHRoZSBzYW1lIHRhYmxlLCBhbmRcbiAqIGl0IGlzIGEgbXVsdGktbWVnYWJ5dGUgZG9jdW1lbnQuXG4gKi9cbmxldCByZWdpc3RyeVByb21pc2U6IFByb21pc2U8cmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBpbnN0YWxsIFx1MjAxNCB0aGUgc2FtZSBsaXN0IHBhc3NlZCB0byBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAuIFBsdWdpbnMgd2hvc2VcbiAgICogYmluYXJpZXMgYXJlIGFscmVhZHkgcHJlc2VudCBhcmUgc2tpcHBlZCAodW5sZXNzIHtAbGluayBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUGFyYW1zLnNob3VsZEZvcmNlfSksXG4gICAqIGFzIGFyZSBwbHVnaW5zIGNhcnJ5aW5nIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2luczogcmVhZG9ubHkgSW5qZWN0UGx1Z2luUGFyYW1zW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmUtZG93bmxvYWQgcGx1Z2lucyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZCwgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgY3VycmVudCByZWxlYXNlLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIFx1MjAxNCB0aGUgbm9ybWFsIHBhdGggaW5zdGFsbHMgb25seSB3aGF0IGlzIG1pc3NpbmcsIHNvIGEgd2FybSBjaGVja291dCBkb2VzIG5vXG4gICAqIG5ldHdvcmsgSS9PIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBhIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfSBydW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCB7XG4gIC8qKlxuICBUaGUgcGx1Z2lucyB0aGF0IHdlcmUgZG93bmxvYWRlZCBhbmQgd3JpdHRlbiwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBpbnN0YWxsZWQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZWQ6IHJlYWRvbmx5IEluc3RhbGxlZFBsdWdpbkluZm9bXTtcblxuICAvKipcbiAgVGhlIGlkcyBvZiBwbHVnaW5zIGxlZnQgdW50b3VjaGVkIFx1MjAxNCBhbHJlYWR5IGluc3RhbGxlZCwgb3Igb3B0ZWQgb3V0IHZpYSBhbiBleHBsaWNpdCBgc291cmNlRGlyZWN0b3J5YC5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWRQbHVnaW5JZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSBwbHVnaW4gaW5zdGFsbGVkIGJ5IHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsZWRQbHVnaW5JbmZvIHtcbiAgLyoqXG4gIFRoZSBhc3NldCBmaWxlIG5hbWVzIGFjdHVhbGx5IHdyaXR0ZW4sIGUuZy4gYFsnbWFpbi5qcycsICdtYW5pZmVzdC5qc29uJywgJ3N0eWxlcy5jc3MnXWAuXG4gICAqL1xuICByZWFkb25seSBhc3NldE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIEdpdEh1YiByZXBvc2l0b3J5IHRoZSBhc3NldHMgY2FtZSBmcm9tLCBhcyBgb3duZXIvbmFtZWAuXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSByZWxlYXNlIHRhZyBkb3dubG9hZGVkIGZyb20sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSB3YXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBldmVyeSBpbmplY3RlZCBjb21tdW5pdHkgcGx1Z2luIHdob3NlIGJ1aWx0IGZpbGVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQsIGJ5XG4gKiBkb3dubG9hZGluZyBpdHMgcHVibGlzaGVkIHJlbGVhc2UgYXNzZXRzIGludG8gYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gLlxuICpcbiAqIEVhY2ggcGx1Z2luJ3MgcmVwb3NpdG9yeSBjb21lcyBmcm9tIGl0cyB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnJlcG99IHdoZW4gZ2l2ZW4sIG90aGVyd2lzZSBmcm9tXG4gKiBPYnNpZGlhbidzIG93biBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5IFx1MjAxNCB0aGUgc2FtZSBgaWRgIFx1MjE5MiBgcmVwb2AgdGFibGUgdGhlIGluLWFwcCBjb21tdW5pdHkgYnJvd3NlclxuICogaW5zdGFsbHMgZnJvbSwgc28gbm8gcGx1Z2luLXNwZWNpZmljIG1hcHBpbmcgaXMgaGFyZGNvZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXN9LlxuICogQHJldHVybnMgV2hhdCB3YXMgaW5zdGFsbGVkIGFuZCB3aGF0IHdhcyBza2lwcGVkLlxuICogQHRocm93cyBFcnJvciBpZiBhIHBsdWdpbidzIHJlcG9zaXRvcnkgY2Fubm90IGJlIHJlc29sdmVkLCBvciBhIHJlcXVpcmVkIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyhwYXJhbXM6IEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNSZXN1bHQ+IHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zLCBzaG91bGRGb3JjZSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYm9vdHN0cmFwcGFibGUgPSBpbmplY3RQbHVnaW5zLmZpbHRlcigocGx1Z2luKSA9PiBwbHVnaW4uc291cmNlRGlyZWN0b3J5ID09PSB1bmRlZmluZWQpO1xuICBjb25zdCB0YXJnZXRzID0gc2hvdWxkRm9yY2UgPyBib290c3RyYXBwYWJsZSA6IHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zKHsgZGVtb1ZhdWx0UGF0aCwgaW5qZWN0UGx1Z2lucyB9KTtcbiAgY29uc3QgdGFyZ2V0UGx1Z2luSWRzID0gbmV3IFNldCh0YXJnZXRzLm1hcCgocGx1Z2luKSA9PiBwbHVnaW4ucGx1Z2luSWQpKTtcblxuICBjb25zdCBpbnN0YWxsZWQ6IEluc3RhbGxlZFBsdWdpbkluZm9bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0YXJnZXRzKSB7XG4gICAgLy8gU2VxdWVudGlhbCBvbiBwdXJwb3NlOiB0aGUgaW5zdGFsbHMgc2hhcmUgb25lIG1lbW9pc2VkIHJlZ2lzdHJ5IGZldGNoLlxuICAgIC8vIFBhcmFsbGVsaXNtIHdvdWxkIGJ1eSBub3RoaW5nIGJ1dCBpbnRlcmxlYXZlZCBsb2dzIGZvciB0aGUgaGFuZGZ1bCBvZiBwbHVnaW5zIGEgZGVtbyB2YXVsdCBpbmplY3RzLlxuICAgIGluc3RhbGxlZC5wdXNoKGF3YWl0IGluc3RhbGxQbHVnaW4oZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluc3RhbGxlZCxcbiAgICBza2lwcGVkUGx1Z2luSWRzOiBpbmplY3RQbHVnaW5zLm1hcCgocGx1Z2luKSA9PiBwbHVnaW4ucGx1Z2luSWQpLmZpbHRlcigocGx1Z2luSWQpID0+ICF0YXJnZXRQbHVnaW5JZHMuaGFzKHBsdWdpbklkKSlcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2VsZi1oZWFsaW5nIGNvdW50ZXJwYXJ0IG9mIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYDogaW5zdGFsbHMgYW55IGluamVjdGVkIGNvbW11bml0eSBwbHVnaW4gd2hvc2VcbiAqIGJpbmFyaWVzIGFyZSBtaXNzaW5nIChzZWUge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9KSwgdGhlbiBidWlsZHMgdGhlIHBvcHVsYXRlIG1hcCBleGFjdGx5IGFzIHRoZVxuICogc3luY2hyb25vdXMgYnVpbGRlciBkb2VzLlxuICpcbiAqIFVzZSB0aGlzIGZyb20gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIHRodW5rIFx1MjAxNCBib3RoIHRoZSBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgYWNjZXB0IGEgdGh1bmtcbiAqIHJldHVybmluZyBhIHByb21pc2UgXHUyMDE0IHNvIGEgZnJlc2ggY2xvbmUsIGEgbmV3IG1hY2hpbmUsIG9yIENJIG5lZWRzIG5vIG1hbnVhbCBpbnN0YWxsIHN0ZXAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzYW1lIGBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zYCB0aGUgc3luY2hyb25vdXMgYnVpbGRlciB0YWtlcy5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIGBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmMocGFyYW1zOiBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zKTogUHJvbWlzZTxQb3B1bGF0ZUZpbGVzUGFyYW1zPiB7XG4gIGlmIChwYXJhbXMuaW5qZWN0UGx1Z2lucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXdhaXQgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyh7IGRlbW9WYXVsdFBhdGg6IHBhcmFtcy5kZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zOiBwYXJhbXMuaW5qZWN0UGx1Z2lucyB9KTtcbiAgfVxuXG4gIHJldHVybiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtcyk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBOZXR3b3JrIGRvd25sb2FkIGdsdWUsIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVxdWVzdCBoZWFkZXJzIGZvciBhIEdpdEh1YiBkb3dubG9hZCwgc2VuZGluZyBhIGBHSVRIVUJfVE9LRU5gIC8gYEdIX1RPS0VOYCBiZWFyZXIgd2hlbiBvbmVcbiAqIGlzIGluIHRoZSBlbnZpcm9ubWVudCBcdTIwMTQgd2l0aG91dCBpdCB0aGUgYW5vbnltb3VzIHF1b3RhIHJldHVybnMgSFRUUCA0MDMgb24gc2hhcmVkIENJIHJ1bm5lciBJUHMuXG4gKlxuICogQHJldHVybnMgVGhlIGhlYWRlcnMgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRHaXRIdWJIZWFkZXJzKCk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSk7XG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9UT0tFTiddID8/IHByb2Nlc3MuZW52WydHSF9UT0tFTiddO1xuICBpZiAodG9rZW4pIHtcbiAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgb25lIHJlbGVhc2UgYXNzZXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCdzIGRvd25sb2FkIFVSTC5cbiAqIEBwYXJhbSBpc1JlcXVpcmVkIC0gV2hldGhlciBhIG1pc3NpbmcgYXNzZXQgKEhUVFAgNDA0KSBpcyBhbiBlcnJvciByYXRoZXIgdGhhbiBhbiBhYnNlbnQgb3B0aW9uYWwgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCdzIGJ5dGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFuIG9wdGlvbmFsIGFzc2V0IGlzIG5vdCBwdWJsaXNoZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscyBhbmQgdGhlIGFzc2V0IGlzIHJlcXVpcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFzc2V0KHVybDogc3RyaW5nLCBpc1JlcXVpcmVkOiBib29sZWFuKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogYnVpbGRHaXRIdWJIZWFkZXJzKCkgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBpZiAoIWlzUmVxdWlyZWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBIVFRQX05PVF9GT1VORCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgJHt1cmx9OiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnksIG1lbW9pc2VkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMgVGhlIHJlZ2lzdHJ5IHJvd3MuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSByZWdpc3RyeSBjYW5ub3QgYmUgZmV0Y2hlZCBvciBwYXJzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnkoKTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+IHtcbiAgcmVnaXN0cnlQcm9taXNlID8/PSAoYXN5bmMgKCk6IFByb21pc2U8cmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdPiA9PiB7XG4gICAgbG9nKGBbZGVtby12YXVsdC1ib290c3RyYXBdIEZldGNoaW5nIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSBmcm9tICR7Q09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMfS4uLmApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMLCB7IGhlYWRlcnM6IGJ1aWxkR2l0SHViSGVhZGVycygpIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkgKCR7Q09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMfSk6IGBcbiAgICAgICAgICArIGBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0uIGBcbiAgICAgICAgICArICdQYXNzIGFuIGV4cGxpY2l0IGByZXBvYCBvbiB0aGUgaW5qZWN0ZWQgcGx1Z2luIHRvIHNraXAgdGhlIHJlZ2lzdHJ5IGxvb2t1cC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHJlYWRvbmx5IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnlbXTtcbiAgfSkoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWdpc3RyeVByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLy8gRG8gbm90IG1lbW9pc2UgYSBmYWlsdXJlOiBhIHRyYW5zaWVudCBuZXR3b3JrIGVycm9yIG11c3Qgbm90IHBvaXNvbiBldmVyeSBsYXRlciBsb29rdXAuXG4gICAgcmVnaXN0cnlQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIG9uZSBwbHVnaW4ncyByZWxlYXNlIGFzc2V0cyBhbmQgd3JpdGVzIHRoZW0gaW50byB0aGUgZGVtbyB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBpbnN0YWxsLlxuICogQHJldHVybnMgV2hhdCB3YXMgaW5zdGFsbGVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgYSByZXF1aXJlZCBhc3NldCBjYW5ub3QgYmUgZG93bmxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdpbihkZW1vVmF1bHRQYXRoOiBzdHJpbmcsIHBsdWdpbjogSW5qZWN0UGx1Z2luUGFyYW1zKTogUHJvbWlzZTxJbnN0YWxsZWRQbHVnaW5JbmZvPiB7XG4gIGNvbnN0IHsgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBsdWdpbjtcbiAgY29uc3QgcmVwbyA9IGF3YWl0IHJlc29sdmVQbHVnaW5SZXBvKHBsdWdpbik7XG4gIGNvbnN0IHRhcmdldERpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcblxuICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gSW5zdGFsbGluZyBcIiR7cGx1Z2luSWR9XCIgZnJvbSAke3JlcG99QCR7dmVyc2lvbiA/PyAnbGF0ZXN0J30gaW50byAke3RhcmdldERpcmVjdG9yeX0uLi5gKTtcblxuICBjb25zdCBkb3dubG9hZHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLi4uUkVRVUlSRURfUExVR0lOX0FTU0VUX05BTUVTLm1hcChhc3luYyAoYXNzZXROYW1lKSA9PiAoe1xuICAgICAgYXNzZXROYW1lLFxuICAgICAgY29udGVudDogYXdhaXQgZG93bmxvYWRBc3NldChidWlsZFBsdWdpbkFzc2V0VXJsKHsgYXNzZXROYW1lLCByZXBvLCB2ZXJzaW9uIH0pLCB0cnVlKVxuICAgIH0pKSxcbiAgICAuLi5PUFRJT05BTF9QTFVHSU5fQVNTRVRfTkFNRVMubWFwKGFzeW5jIChhc3NldE5hbWUpID0+ICh7XG4gICAgICBhc3NldE5hbWUsXG4gICAgICBjb250ZW50OiBhd2FpdCBkb3dubG9hZEFzc2V0KGJ1aWxkUGx1Z2luQXNzZXRVcmwoeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSksIGZhbHNlKVxuICAgIH0pKVxuICBdKTtcblxuICBta2RpclN5bmModGFyZ2V0RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBhc3NldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHsgYXNzZXROYW1lLCBjb250ZW50IH0gb2YgZG93bmxvYWRzKSB7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXJlY3RvcnksIGFzc2V0TmFtZSksIGNvbnRlbnQpO1xuICAgIGFzc2V0TmFtZXMucHVzaChhc3NldE5hbWUpO1xuICB9XG5cbiAgbG9nKGBbZGVtby12YXVsdC1ib290c3RyYXBdIEluc3RhbGxlZCBcIiR7cGx1Z2luSWR9XCI6ICR7YXNzZXROYW1lcy5qb2luKCcsICcpfS5gKTtcblxuICByZXR1cm4geyBhc3NldE5hbWVzLCBwbHVnaW5JZCwgcmVwbywgdmVyc2lvbiB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBwdWJsaXNoaW5nIGEgcGx1Z2luIFx1MjAxNCB0aGUgZXhwbGljaXQgb3ZlcnJpZGUgd2hlbiBnaXZlbiwgb3RoZXJ3aXNlXG4gKiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAqIEByZXR1cm5zIFRoZSBgb3duZXIvbmFtZWAgcmVwb3NpdG9yeSByZWZlcmVuY2UuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFuIGV4cGxpY2l0IG92ZXJyaWRlIGlzIG1hbGZvcm1lZCwgb3IgdGhlIGlkIGlzIG5vdCBhIHJlZ2lzdGVyZWQgY29tbXVuaXR5IHBsdWdpbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpblJlcG8ocGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHBsdWdpbklkLCByZXBvIH0gPSBwbHVnaW47XG5cbiAgaWYgKHJlcG8gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghaXNWYWxpZFJlcG9SZWZlcmVuY2UocmVwbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBcXGByZXBvXFxgIGZvciBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIjogJHtyZXBvfS4gRXhwZWN0ZWQgYW4gXFxgb3duZXIvbmFtZVxcYCByZWZlcmVuY2UuYCk7XG4gICAgfVxuICAgIHJldHVybiByZXBvO1xuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlSZXBvID0gc2VsZWN0UGx1Z2luUmVwbyh7IGVudHJpZXM6IGF3YWl0IGZldGNoQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnkoKSwgcGx1Z2luSWQgfSk7XG4gIGlmIChyZWdpc3RyeVJlcG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgc28gaXRzIEdpdEh1YiBgXG4gICAgICAgICsgJ3JlcG9zaXRvcnkgY2Fubm90IGJlIHJlc29sdmVkLiBQYXNzIGFuIGV4cGxpY2l0IGByZXBvYCAoYG93bmVyL25hbWVgKSBvbiB0aGUgaW5qZWN0ZWQgcGx1Z2luLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2lzdHJ5UmVwbztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQ0EscUJBR087QUFDUCx1QkFBcUI7QUFDckIsMEJBQW9CO0FBU3BCLHVDQU9PO0FBQ1AsaUNBSU87QUFDUCxpQkFBb0I7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
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Installs a demo vault's **injected community plugins** headlessly, by downloading
5
+ * their published GitHub release assets straight into
6
+ * `demo-vault/.obsidian/plugins/<id>/`.
7
+ *
8
+ * `buildDemoVaultPopulate` requires each injected plugin's `main.js` /
9
+ * `manifest.json` to already be on disk, and throws when they are not. Until this
10
+ * module existed the only documented remedy was a **GUI step** — open `demo-vault/`
11
+ * in Obsidian once and let `demo-vault-helper` install the plugin at runtime.
12
+ * `.obsidian/plugins/*` is gitignored in every fleet plugin repo, so that state
13
+ * exists on exactly the one machine that did it and is invisible to a fresh clone,
14
+ * a new machine, or CI. Since a plugin repo's release preflight runs its
15
+ * integration tests, that made *cutting a release from a clean clone* impossible
16
+ * without a human opening a GUI.
17
+ *
18
+ * Downloading the release assets is the exact headless equivalent: the resulting
19
+ * folder is what Obsidian itself would have installed, so the shipped
20
+ * `*-demo-vault-<version>.zip` stays the fleet-standard artifact.
21
+ *
22
+ * Two entry points, plus the `bootstrap-demo-vault` CLI subcommand:
23
+ *
24
+ * - {@link bootstrapDemoVaultPlugins} — install the missing ones, explicitly.
25
+ * - {@link buildDemoVaultPopulateAsync} — do that and then build the populate map,
26
+ * so a global setup self-heals with no manual step at all.
27
+ *
28
+ * The sync `buildDemoVaultPopulate` deliberately keeps throwing: `fetch` has no
29
+ * synchronous form, so auto-healing can only live on an async sibling. Its message
30
+ * now names both remedies above instead of the GUI step.
31
+ */
32
+ import type { BuildDemoVaultPopulateParams, InjectPluginParams } from './demo-vault-populate.cjs';
33
+ import type { PopulateFilesParams } from './temporary-vault.cjs';
34
+ /**
35
+ * Parameters for {@link bootstrapDemoVaultPlugins}.
36
+ */
37
+ export interface BootstrapDemoVaultPluginsParams {
38
+ /**
39
+ Absolute path to the plugin repo's `demo-vault/` directory.
40
+ */
41
+ readonly demoVaultPath: string;
42
+ /**
43
+ * The injected plugins to install — the same list passed to `buildDemoVaultPopulate`. Plugins whose
44
+ * binaries are already present are skipped (unless {@link BootstrapDemoVaultPluginsParams.shouldForce}),
45
+ * as are plugins carrying an explicit `sourceDirectory`.
46
+ */
47
+ readonly injectPlugins: readonly InjectPluginParams[];
48
+ /**
49
+ * Whether to re-download plugins that are already installed, replacing them with the current release.
50
+ * Defaults to `false` — the normal path installs only what is missing, so a warm checkout does no
51
+ * network I/O at all.
52
+ */
53
+ readonly shouldForce?: boolean | undefined;
54
+ }
55
+ /**
56
+ * The outcome of a {@link bootstrapDemoVaultPlugins} run.
57
+ */
58
+ export interface BootstrapDemoVaultPluginsResult {
59
+ /**
60
+ The plugins that were downloaded and written, in the order they were installed.
61
+ */
62
+ readonly installed: readonly InstalledPluginInfo[];
63
+ /**
64
+ The ids of plugins left untouched — already installed, or opted out via an explicit `sourceDirectory`.
65
+ */
66
+ readonly skippedPluginIds: readonly string[];
67
+ }
68
+ /**
69
+ * One plugin installed by {@link bootstrapDemoVaultPlugins}.
70
+ */
71
+ export interface InstalledPluginInfo {
72
+ /**
73
+ The asset file names actually written, e.g. `['main.js', 'manifest.json', 'styles.css']`.
74
+ */
75
+ readonly assetNames: readonly string[];
76
+ /**
77
+ The plugin's id.
78
+ */
79
+ readonly pluginId: string;
80
+ /**
81
+ The GitHub repository the assets came from, as `owner/name`.
82
+ */
83
+ readonly repo: string;
84
+ /**
85
+ The release tag downloaded from, or `undefined` when the repository's latest release was used.
86
+ */
87
+ readonly version: string | undefined;
88
+ }
89
+ /**
90
+ * Installs every injected community plugin whose built files are missing from the demo vault, by
91
+ * downloading its published release assets into `demo-vault/.obsidian/plugins/<id>/`.
92
+ *
93
+ * Each plugin's repository comes from its {@link InjectPluginParams.repo} when given, otherwise from
94
+ * Obsidian's own community plugin registry — the same `id` → `repo` table the in-app community browser
95
+ * installs from, so no plugin-specific mapping is hardcoded.
96
+ *
97
+ * @param params - The {@link BootstrapDemoVaultPluginsParams}.
98
+ * @returns What was installed and what was skipped.
99
+ * @throws Error if a plugin's repository cannot be resolved, or a required asset cannot be downloaded.
100
+ */
101
+ export declare function bootstrapDemoVaultPlugins(params: BootstrapDemoVaultPluginsParams): Promise<BootstrapDemoVaultPluginsResult>;
102
+ /**
103
+ * The self-healing counterpart of `buildDemoVaultPopulate`: installs any injected community plugin whose
104
+ * binaries are missing (see {@link bootstrapDemoVaultPlugins}), then builds the populate map exactly as the
105
+ * synchronous builder does.
106
+ *
107
+ * Use this from a global setup's `populate` thunk — both the Vitest and Jest adapters accept a thunk
108
+ * returning a promise — so a fresh clone, a new machine, or CI needs no manual install step.
109
+ *
110
+ * @param params - The same `BuildDemoVaultPopulateParams` the synchronous builder takes.
111
+ * @returns The populate map, ready to hand to a global setup's `populate` or `TemporaryVault.populate`.
112
+ */
113
+ export declare function buildDemoVaultPopulateAsync(params: BuildDemoVaultPopulateParams): Promise<PopulateFilesParams>;
@@ -18,18 +18,19 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var demo_vault_populate_exports = {};
20
20
  __export(demo_vault_populate_exports, {
21
- buildDemoVaultPopulate: () => buildDemoVaultPopulate
21
+ buildDemoVaultPopulate: () => buildDemoVaultPopulate,
22
+ resolveInjectedPluginSourceDirectory: () => resolveInjectedPluginSourceDirectory,
23
+ resolveMissingInjectedPlugins: () => resolveMissingInjectedPlugins
22
24
  });
23
25
  module.exports = __toCommonJS(demo_vault_populate_exports);
24
26
  var import_node_fs = require("node:fs");
25
27
  var import_node_path = require("node:path");
28
+ var import_community_plugin_registry = require("./community-plugin-registry.cjs");
26
29
  var import_demo_vault_tree = require("./demo-vault-tree.cjs");
27
30
  var import_type_guards = require("./type-guards.cjs");
28
31
  const OBSIDIAN_CONFIG_DIR = ".obsidian";
29
32
  const PLUGINS_DIR = "plugins";
30
33
  const DATA_JSON = "data.json";
31
- const MANIFEST_JSON = "manifest.json";
32
- const MAIN_JS = "main.js";
33
34
  const DATA_JSON_INDENT = 2;
34
35
  const DEFAULT_OBSIDIAN_CONFIG_FILES = ["app.json", "appearance.json", "core-plugins.json"];
35
36
  function buildDemoVaultPopulate(params) {
@@ -46,15 +47,39 @@ function buildDemoVaultPopulate(params) {
46
47
  }
47
48
  return map;
48
49
  }
50
+ function resolveInjectedPluginSourceDirectory(params) {
51
+ const { demoVaultPath, plugin } = params;
52
+ return plugin.sourceDirectory ?? (0, import_node_path.join)(demoVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, plugin.pluginId);
53
+ }
54
+ function resolveMissingInjectedPlugins(params) {
55
+ const { demoVaultPath } = params;
56
+ return params.injectPlugins.filter((plugin) => {
57
+ if (plugin.sourceDirectory !== void 0) {
58
+ return false;
59
+ }
60
+ const fileNames = readPluginFileNames(resolveInjectedPluginSourceDirectory({ demoVaultPath, plugin }));
61
+ return import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES.some((assetName) => !fileNames.includes(assetName));
62
+ });
63
+ }
64
+ function buildMissingPluginRemedy(demoVaultPath, plugin) {
65
+ if (plugin.sourceDirectory !== void 0) {
66
+ return "It was read from an explicit `sourceDirectory`, which opts it out of the headless bootstrap \u2014 build it into that directory, or drop `sourceDirectory` to install it from its published release.";
67
+ }
68
+ return `Install it headlessly with \`npx obsidian-integration-testing bootstrap-demo-vault --demo-vault "${demoVaultPath}"\`, or switch this setup to \`buildDemoVaultPopulateAsync\`, which installs missing plugins itself. Opening demo-vault/ in Obsidian once so demo-vault-helper installs it also works.`;
69
+ }
70
+ function readPluginFileNames(sourceDirectory) {
71
+ return (0, import_node_fs.existsSync)(sourceDirectory) ? (0, import_node_fs.readdirSync)(sourceDirectory, { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => entry.name) : [];
72
+ }
49
73
  function seedPlugin(demoVaultPath, plugin, map) {
50
74
  const { data, pluginId } = plugin;
51
- const sourceDirectory = plugin.sourceDirectory ?? (0, import_node_path.join)(demoVaultPath, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
75
+ const sourceDirectory = resolveInjectedPluginSourceDirectory({ demoVaultPath, plugin });
52
76
  const pluginPrefix = `${OBSIDIAN_CONFIG_DIR}/${PLUGINS_DIR}/${pluginId}`;
53
- const fileNames = (0, import_node_fs.existsSync)(sourceDirectory) ? (0, import_node_fs.readdirSync)(sourceDirectory, { withFileTypes: true }).filter((entry) => entry.isFile()).map((entry) => entry.name) : [];
54
- for (const requiredFile of [MAIN_JS, MANIFEST_JSON]) {
77
+ const fileNames = readPluginFileNames(sourceDirectory);
78
+ for (const requiredFile of import_community_plugin_registry.REQUIRED_PLUGIN_ASSET_NAMES) {
55
79
  if (!fileNames.includes(requiredFile)) {
80
+ const remedy = buildMissingPluginRemedy(demoVaultPath, plugin);
56
81
  throw new Error(
57
- `Community plugin "${pluginId}" is not installed in the demo vault (${(0, import_node_path.join)(sourceDirectory, requiredFile)} missing). Open demo-vault/ in Obsidian once so demo-vault-helper installs it, then re-run.`
82
+ `Community plugin "${pluginId}" is not installed in the demo vault (${(0, import_node_path.join)(sourceDirectory, requiredFile)} missing). ${remedy}`
58
83
  );
59
84
  }
60
85
  }
@@ -72,6 +97,8 @@ function seedPlugin(demoVaultPath, plugin, map) {
72
97
  }
73
98
  // Annotate the CommonJS export names for ESM import in node:
74
99
  0 && (module.exports = {
75
- buildDemoVaultPopulate
100
+ buildDemoVaultPopulate,
101
+ resolveInjectedPluginSourceDirectory,
102
+ resolveMissingInjectedPlugins
76
103
  });
77
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0LmNqcyc7XG5cbmltcG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnLi90eXBlLWd1YXJkcy5janMnO1xuXG5jb25zdCBPQlNJRElBTl9DT05GSUdfRElSID0gJy5vYnNpZGlhbic7XG5jb25zdCBQTFVHSU5TX0RJUiA9ICdwbHVnaW5zJztcbmNvbnN0IERBVEFfSlNPTiA9ICdkYXRhLmpzb24nO1xuY29uc3QgTUFOSUZFU1RfSlNPTiA9ICdtYW5pZmVzdC5qc29uJztcbmNvbnN0IE1BSU5fSlMgPSAnbWFpbi5qcyc7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSB0byByZWFkIHRoZSBwbHVnaW4ncyBidWlsdCBmaWxlcyBmcm9tLiBFdmVyeSBmaWxlIGRpcmVjdGx5IGluc2lkZSBpdCBpcyBjb3BpZWQgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9gOyBgbWFpbi5qc2AgYW5kIGBtYW5pZmVzdC5qc29uYCBhcmUgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA8ZGVtb1ZhdWx0UGF0aD4vLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPmBcbiAgICovXG5cbiAgcmVhZG9ubHkgc291cmNlRGlyZWN0b3J5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFNlZWRzIG9uZSBpbmplY3RlZCBwbHVnaW4ncyBiaW5hcmllcyAoYW5kIG9wdGlvbmFsIGBkYXRhLmpzb25gKSBpbnRvIHRoZSBwb3B1bGF0ZSBtYXAuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LCB1c2VkIHRvIHJlc29sdmUgdGhlIGRlZmF1bHQgc291cmNlIGRpcmVjdG9yeS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIHNlZWQuXG4gKiBAcGFyYW0gbWFwIC0gVGhlIHBvcHVsYXRlIG1hcCB0byB3cml0ZSBpbnRvLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICBjb25zdCBwbHVnaW5QcmVmaXggPSBgJHtPQlNJRElBTl9DT05GSUdfRElSfS8ke1BMVUdJTlNfRElSfS8ke3BsdWdpbklkfWA7XG5cbiAgY29uc3QgZmlsZU5hbWVzID0gZXhpc3RzU3luYyhzb3VyY2VEaXJlY3RvcnkpXG4gICAgPyByZWFkZGlyU3luYyhzb3VyY2VEaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSkubWFwKChlbnRyeSkgPT4gZW50cnkubmFtZSlcbiAgICA6IFtdO1xuXG4gIGZvciAoY29uc3QgcmVxdWlyZWRGaWxlIG9mIFtNQUlOX0pTLCBNQU5JRkVTVF9KU09OXSkge1xuICAgIGlmICghZmlsZU5hbWVzLmluY2x1ZGVzKHJlcXVpcmVkRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiBgXG4gICAgICAgICAgKyAnT3BlbiBkZW1vLXZhdWx0LyBpbiBPYnNpZGlhbiBvbmNlIHNvIGRlbW8tdmF1bHQtaGVscGVyIGluc3RhbGxzIGl0LCB0aGVuIHJlLXJ1bi4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBYUEscUJBSU87QUFDUCx1QkFBcUI7QUFJckIsNkJBQWtDO0FBQ2xDLHlCQUFrQztBQUVsQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sZ0JBQWdCO0FBQ3RCLE1BQU0sVUFBVTtBQUNoQixNQUFNLG1CQUFtQjtBQUV6QixNQUFNLGdDQUFnQyxDQUFDLFlBQVksbUJBQW1CLG1CQUFtQjtBQW1FbEYsU0FBUyx1QkFBdUIsUUFBMkQ7QUFDaEcsUUFBTSxFQUFFLGVBQWUsZUFBZSxnQkFBZ0IsQ0FBQyxHQUFHLHNCQUFzQiw4QkFBOEIsSUFBSTtBQUVsSCxRQUFNLFVBQU0sMENBQWtCLGtCQUFrQixTQUFZLEVBQUUsY0FBYyxJQUFJLEVBQUUsZUFBZSxjQUFjLENBQUM7QUFFaEgsYUFBVyxjQUFjLHFCQUFxQjtBQUM1QyxVQUFNLGlCQUFhLHVCQUFLLGVBQWUscUJBQXFCLFVBQVU7QUFDdEUsWUFBSSwyQkFBVyxVQUFVLEdBQUc7QUFDMUIsVUFBSSxHQUFHLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxRQUFJLDZCQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTQSxTQUFTLFdBQVcsZUFBdUIsUUFBNEIsS0FBZ0M7QUFDckcsUUFBTSxFQUFFLE1BQU0sU0FBUyxJQUFJO0FBQzNCLFFBQU0sa0JBQWtCLE9BQU8sdUJBQW1CLHVCQUFLLGVBQWUscUJBQXFCLGFBQWEsUUFBUTtBQUNoSCxRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLGdCQUFZLDJCQUFXLGVBQWUsUUFDeEMsNEJBQVksaUJBQWlCLEVBQUUsZUFBZSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxNQUFNLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSSxJQUNqSCxDQUFDO0FBRUwsYUFBVyxnQkFBZ0IsQ0FBQyxTQUFTLGFBQWEsR0FBRztBQUNuRCxRQUFJLENBQUMsVUFBVSxTQUFTLFlBQVksR0FBRztBQUNyQyxZQUFNLElBQUk7QUFBQSxRQUNSLHFCQUFxQixRQUFRLDZDQUF5Qyx1QkFBSyxpQkFBaUIsWUFBWSxDQUFDO0FBQUEsTUFFM0c7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLGFBQVcsWUFBWSxXQUFXO0FBRWhDLFFBQUksYUFBYSxhQUFhLFNBQVMsUUFBVztBQUNoRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLEdBQUcsWUFBWSxJQUFJLFFBQVEsRUFBRSxRQUFJLGlDQUFhLHVCQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sZUFBbUIsc0NBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
104
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0LmNqcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHsgcmVhZERlbW9WYXVsdFRyZWUgfSBmcm9tICcuL2RlbW8tdmF1bHQtdHJlZS5janMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLmNqcyc7XG5cbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1CQSxxQkFJTztBQUNQLHVCQUFxQjtBQUlyQix1Q0FBNEM7QUFDNUMsNkJBQWtDO0FBQ2xDLHlCQUFrQztBQUVsQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sZ0NBQWdDLENBQUMsWUFBWSxtQkFBbUIsbUJBQW1CO0FBb0hsRixTQUFTLHVCQUF1QixRQUEyRDtBQUNoRyxRQUFNLEVBQUUsZUFBZSxlQUFlLGdCQUFnQixDQUFDLEdBQUcsc0JBQXNCLDhCQUE4QixJQUFJO0FBRWxILFFBQU0sVUFBTSwwQ0FBa0Isa0JBQWtCLFNBQVksRUFBRSxjQUFjLElBQUksRUFBRSxlQUFlLGNBQWMsQ0FBQztBQUVoSCxhQUFXLGNBQWMscUJBQXFCO0FBQzVDLFVBQU0saUJBQWEsdUJBQUssZUFBZSxxQkFBcUIsVUFBVTtBQUN0RSxZQUFJLDJCQUFXLFVBQVUsR0FBRztBQUMxQixVQUFJLEdBQUcsbUJBQW1CLElBQUksVUFBVSxFQUFFLFFBQUksNkJBQWEsVUFBVTtBQUFBLElBQ3ZFO0FBQUEsRUFDRjtBQUVBLGFBQVcsVUFBVSxlQUFlO0FBQ2xDLGVBQVcsZUFBZSxRQUFRLEdBQUc7QUFBQSxFQUN2QztBQUVBLFNBQU87QUFDVDtBQVNPLFNBQVMscUNBQXFDLFFBQTREO0FBQy9HLFFBQU0sRUFBRSxlQUFlLE9BQU8sSUFBSTtBQUNsQyxTQUFPLE9BQU8sdUJBQW1CLHVCQUFLLGVBQWUscUJBQXFCLGFBQWEsT0FBTyxRQUFRO0FBQ3hHO0FBY08sU0FBUyw4QkFBOEIsUUFBbUU7QUFDL0csUUFBTSxFQUFFLGNBQWMsSUFBSTtBQUMxQixTQUFPLE9BQU8sY0FBYyxPQUFPLENBQUMsV0FBVztBQUM3QyxRQUFJLE9BQU8sb0JBQW9CLFFBQVc7QUFDeEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFlBQVksb0JBQW9CLHFDQUFxQyxFQUFFLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFDckcsV0FBTyw2REFBNEIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDdkYsQ0FBQztBQUNIO0FBWUEsU0FBUyx5QkFBeUIsZUFBdUIsUUFBb0M7QUFDM0YsTUFBSSxPQUFPLG9CQUFvQixRQUFXO0FBQ3hDLFdBQU87QUFBQSxFQUVUO0FBRUEsU0FBTyxvR0FBb0csYUFBYTtBQUcxSDtBQVFBLFNBQVMsb0JBQW9CLGlCQUFtQztBQUM5RCxhQUFPLDJCQUFXLGVBQWUsUUFDN0IsNEJBQVksaUJBQWlCLEVBQUUsZUFBZSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsVUFBVSxNQUFNLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSSxJQUNqSCxDQUFDO0FBQ1A7QUFVQSxTQUFTLFdBQVcsZUFBdUIsUUFBNEIsS0FBZ0M7QUFDckcsUUFBTSxFQUFFLE1BQU0sU0FBUyxJQUFJO0FBQzNCLFFBQU0sa0JBQWtCLHFDQUFxQyxFQUFFLGVBQWUsT0FBTyxDQUFDO0FBQ3RGLFFBQU0sZUFBZSxHQUFHLG1CQUFtQixJQUFJLFdBQVcsSUFBSSxRQUFRO0FBRXRFLFFBQU0sWUFBWSxvQkFBb0IsZUFBZTtBQUVyRCxhQUFXLGdCQUFnQiw4REFBNkI7QUFDdEQsUUFBSSxDQUFDLFVBQVUsU0FBUyxZQUFZLEdBQUc7QUFDckMsWUFBTSxTQUFTLHlCQUF5QixlQUFlLE1BQU07QUFDN0QsWUFBTSxJQUFJO0FBQUEsUUFDUixxQkFBcUIsUUFBUSw2Q0FBeUMsdUJBQUssaUJBQWlCLFlBQVksQ0FBQyxjQUFjLE1BQU07QUFBQSxNQUMvSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLFFBQUksaUNBQWEsdUJBQUssaUJBQWlCLFFBQVEsQ0FBQztBQUFBLEVBQ25GO0FBRUEsTUFBSSxTQUFTLFFBQVc7QUFDdEIsVUFBTSxlQUFtQixzQ0FBa0IsS0FBSyxVQUFVLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RixRQUFJLEdBQUcsWUFBWSxJQUFJLFNBQVMsRUFBRSxJQUFJLEdBQUcsUUFBUTtBQUFBO0FBQUEsRUFDbkQ7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K