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
@@ -17,9 +17,9 @@ import {
17
17
  parseVersionSpec,
18
18
  resolveVersionFromManifest
19
19
  } from "./obsidian-version.mjs";
20
+ import { buildCatalystAsarUrl } from "./release-catalog.mjs";
20
21
  const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
21
22
  const PUBLIC_ASAR_RELEASE_BASE_URL = "https://github.com/obsidianmd/obsidian-releases/releases/download";
22
- const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
23
23
  const CACHE_ROOT = join(tmpdir(), "obsidian-integration-testing");
24
24
  const ASAR_CACHE_DIR = join(CACHE_ROOT, "asar-cache");
25
25
  const ASAR_FILE_PATTERN = /^obsidian-(?<version>\d+\.\d+\.\d+)\.asar$/;
@@ -103,7 +103,7 @@ function getAsarDownloadUrls(version) {
103
103
  const asarGzFileName = `${getVersionAsarFileName(version)}.gz`;
104
104
  const fallbackUrls = [
105
105
  `${PUBLIC_ASAR_RELEASE_BASE_URL}/v${version}/${asarGzFileName}`,
106
- `${CATALYST_ASAR_RELEASE_BASE_URL}/${asarGzFileName}`
106
+ buildCatalystAsarUrl(version)
107
107
  ];
108
108
  const bakedUrl = getVersionMetadata(version)?.downloads?.asar;
109
109
  return bakedUrl ? [bakedUrl, ...fallbackUrls] : fallbackUrls;
@@ -116,4 +116,4 @@ export {
116
116
  getCachedAsarPath,
117
117
  resolveConcreteVersion
118
118
  };
119
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYHgueS56YCB2ZXJzaW9uIHBhcnNlZCBmcm9tIHRoZSBmaWxlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29waWVzIGFuIGFzYXIgZmlsZSBpbnRvIGEgdXNlci1kYXRhIGRpcmVjdG9yeSB1bmRlciBpdHMgY2Fub25pY2FsXG4gKiBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIG5hbWUuXG4gKlxuICogQHBhcmFtIGFzYXJQYXRoIC0gU291cmNlIGFzYXIgcGF0aC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGFzYXIncyB2ZXJzaW9uICh1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lKS5cbiAqIEBwYXJhbSB1c2VyRGF0YURpcmVjdG9yeSAtIERlc3RpbmF0aW9uIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXNhckludG9Vc2VyRGF0YShhc2FyUGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKHVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBqb2luKHVzZXJEYXRhRGlyZWN0b3J5LCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0aW5hdGlvbik7XG4gIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBQcm92aXNpb25lZCAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9IGludG8gJHt1c2VyRGF0YURpcmVjdG9yeX0uYCk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYXNhciBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gdGhlIGxvY2FsIGNhY2hlLFxuICogZG93bmxvYWRpbmcgYW5kIGRlY29tcHJlc3NpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkIGFzYXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFzYXJDYWNoZWQodmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbWtkaXJTeW5jKEFTQVJfQ0FDSEVfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb24pO1xuICBpZiAoZXhpc3RzU3luYyhjYWNoZWRQYXRoKSkge1xuICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBVc2luZyBjYWNoZWQgYXNhciBmb3IgJHt2ZXJzaW9ufS5gKTtcbiAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgfVxuXG4gIC8vIEEgdmVyc2lvbidzIGFzYXIuZ3ogbGl2ZXMgb24gZXhhY3RseSBvbmUgaG9zdCBkZXBlbmRpbmcgb24gaXRzIGNoYW5uZWxcbiAgLy8gKHB1YmxpYyBcdTIxOTIgR2l0SHViIHJlbGVhc2UgYXNzZXRzLCBjYXRhbHlzdCBcdTIxOTIgdGhlIE9ic2lkaWFuIENETikuIFRoZSBjb25jcmV0ZVxuICAvLyBWZXJzaW9uIGFsb25lIGRvZXMgbm90IHRlbGwgdXMgd2hpY2gsIHNvIHRyeSBib3RoIGFuZCB1c2UgdGhlIGZpcnN0IHRoYXRcbiAgLy8gUmV0dXJucyBhIHZhbGlkIGFyY2hpdmUuXG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB1cmwgb2YgZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc2FyID0gYXdhaXQgZG93bmxvYWRBbmREZWNvbXByZXNzQXNhcih1cmwpO1xuICAgICAgd3JpdGVGaWxlU3luYyhjYWNoZWRQYXRoLCBhc2FyKTtcbiAgICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBDYWNoZWQgYXNhciAke3ZlcnNpb259ICgke1N0cmluZyhhc2FyLmxlbmd0aCl9IGJ5dGVzKSAtPiAke2NhY2hlZFBhdGh9YCk7XG4gICAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goYCR7dXJsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgT2JzaWRpYW4gYXNhciAke3ZlcnNpb259LiBBdHRlbXB0czogJHtlcnJvcnMuam9pbignOyAnKX1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbWFuaWZlc3QuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgZmV0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QoKTogUHJvbWlzZTxEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3Q6IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERlc2t0b3BSZWxlYXNlc01hbmlmZXN0O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXdlc3QgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBpbiBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBzY2FuIChlLmcuIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnIGRpcmVjdG9yeSkuXG4gKiBAcmV0dXJucyBUaGUgbmV3ZXN0IGRpc2NvdmVyZWQgYXNhciwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSAvIHRoZSBkaXJlY3RvcnkgaXMgdW5yZWFkYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmROZXdlc3RBc2FyKGRpcmVjdG9yeTogc3RyaW5nKTogRGlzY292ZXJlZEFzYXIgfCB1bmRlZmluZWQge1xuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgbmV3ZXN0OiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBBU0FSX0ZJTEVfUEFUVEVSTi5leGVjKGVudHJ5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbiA9IG1hdGNoLmdyb3Vwcz8uWyd2ZXJzaW9uJ10gPz8gJyc7XG4gICAgaWYgKCFuZXdlc3QgfHwgY29tcGFyZVZlcnNpb25zKHZlcnNpb24sIG5ld2VzdC52ZXJzaW9uKSA+IDApIHtcbiAgICAgIG5ld2VzdCA9IHsgcGF0aDogam9pbihkaXJlY3RvcnksIGVudHJ5KSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3ZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsIGNhY2hlIHBhdGggZm9yIGEgY29uY3JldGUgdmVyc2lvbidzIGFzYXIgKHRoZSBmaWxlIG1heSBub3RcbiAqIHlldCBleGlzdCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRoZSBhc2FyIGlzIGNhY2hlZCBhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKEFTQVJfQ0FDSEVfRElSLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHZlcnNpb24gc3BlY2lmaWVyIChleHBsaWNpdCBvciBjaGFubmVsIGFsaWFzKSB0byBhIGNvbmNyZXRlXG4gKiBgeC55LnpgIHZlcnNpb24sIGZldGNoaW5nIHRoZSBtYW5pZmVzdCBvbmx5IHdoZW4gYSBjaGFubmVsIGFsaWFzIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHNwZWMgLSBUaGUgdmVyc2lvbiBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyBUaGUgY29uY3JldGUgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb25jcmV0ZVZlcnNpb24oc3BlYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpO1xuICByZXR1cm4gcmVzb2x2ZVZlcnNpb25Gcm9tTWFuaWZlc3QobWFuaWZlc3QsIHBhcnNlZC5jaGFubmVsKTtcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgYSBnemlwLWNvbXByZXNzZWQgYXNhciBmcm9tIGEgVVJMIGFuZCBkZWNvbXByZXNzZXMgaXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBgLmFzYXIuZ3pgIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgYXNhciBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMsIHRoZSBib2R5IGlzIGVtcHR5LCBvciBkZWNvbXByZXNzaW9uIGZhaWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIERvd25sb2FkaW5nIGFzYXIgZnJvbSAke3VybH0gLi4uYCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiBET1dOTE9BRF9VU0VSX0FHRU5UIH0gfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGd6ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChnei5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IHJlc3BvbnNlIGJvZHknKTtcbiAgfVxuICByZXR1cm4gZ3VuemlwU3luYyhneik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FuZGlkYXRlIGAuYXNhci5nemAgZG93bmxvYWQgVVJMcyBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uLlxuICpcbiAqIFRoZSB2ZXJzaW9uJ3MgZXhhY3QgVVJMIGJha2VkIGludG8gdGhlIGBtZXRhZGF0YS5qc29uYCBjYXRhbG9nIChmcm9tIHVwc3RyZWFtXG4gKiBgb2JzaWRpYW4tdmVyc2lvbnMuanNvbmApIGlzIHRyaWVkIGZpcnN0IHdoZW4gcHJlc2VudDsgdGhlIGhhbmQtcm9sbGVkIHB1YmxpY1xuICogKEdpdEh1YikgYW5kIGNhdGFseXN0IChDRE4pIGd1ZXNzZXMgZm9sbG93IGFzIGEgZmFsbGJhY2sgZm9yIHZlcnNpb25zIGFic2VudFxuICogZnJvbSB0aGUgY2F0YWxvZyAob3IgYSBzdGFsZSBjYXRhbG9nKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIFVSTHMgdG8gdHJ5LCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzYXJHekZpbGVOYW1lID0gYCR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0uZ3pgO1xuICBjb25zdCBmYWxsYmFja1VybHMgPSBbXG4gICAgYCR7UFVCTElDX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHthc2FyR3pGaWxlTmFtZX1gLFxuICAgIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHthc2FyR3pGaWxlTmFtZX1gXG4gIF07XG5cbiAgY29uc3QgYmFrZWRVcmwgPSBnZXRWZXJzaW9uTWV0YWRhdGEodmVyc2lvbik/LmRvd25sb2Fkcz8uYXNhcjtcbiAgcmV0dXJuIGJha2VkVXJsID8gW2Jha2VkVXJsLCAuLi5mYWxsYmFja1VybHNdIDogZmFsbGJhY2tVcmxzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUkzQixTQUFTLFdBQVc7QUFDcEIsU0FBUywwQkFBMEI7QUFDbkM7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
119
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IGJ1aWxkQ2F0YWx5c3RBc2FyVXJsIH0gZnJvbSAnLi9yZWxlYXNlLWNhdGFsb2cubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gVGhlIHNhbWUgVUEgdGhlIGNhdGFsb2cgcmVmcmVzaCBzZW5kcyB3aGVuIHByb2JpbmcgdGhlIENETi5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBBU0FSX0NBQ0hFX0RJUiA9IGpvaW4oQ0FDSEVfUk9PVCwgJ2FzYXItY2FjaGUnKTtcbmNvbnN0IEFTQVJfRklMRV9QQVRURVJOID0gL15vYnNpZGlhbi0oPzx2ZXJzaW9uPlxcZCtcXC5cXGQrXFwuXFxkKylcXC5hc2FyJC87XG5cbi8qKlxuICogQSBkaXNjb3ZlcmVkIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgYW4gYXNhciBmaWxlIGludG8gYSB1c2VyLWRhdGEgZGlyZWN0b3J5IHVuZGVyIGl0cyBjYW5vbmljYWxcbiAqIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgbmFtZS5cbiAqXG4gKiBAcGFyYW0gYXNhclBhdGggLSBTb3VyY2UgYXNhciBwYXRoLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgYXNhcidzIHZlcnNpb24gKHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUpLlxuICogQHBhcmFtIHVzZXJEYXRhRGlyZWN0b3J5IC0gRGVzdGluYXRpb24gdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBc2FySW50b1VzZXJEYXRhKGFzYXJQYXRoOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBta2RpclN5bmModXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IGpvaW4odXNlckRhdGFEaXJlY3RvcnksIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xuICBjb3B5RmlsZVN5bmMoYXNhclBhdGgsIGRlc3RpbmF0aW9uKTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyZWN0b3J5fS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyZWN0b3J5KS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpcmVjdG9yeSBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyZWN0b3J5OiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpcmVjdG9yeSwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24uXG4gKlxuICogVGhlIHZlcnNpb24ncyBleGFjdCBVUkwgYmFrZWQgaW50byB0aGUgYG1ldGFkYXRhLmpzb25gIGNhdGFsb2cgKGZyb20gdGhlXG4gKiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AgYXNzZXRzKSBpcyB0cmllZCBmaXJzdCB3aGVuIHByZXNlbnQ7IHRoZSBoYW5kLXJvbGxlZCBwdWJsaWNcbiAqIChHaXRIdWIpIGFuZCBjYXRhbHlzdCAoQ0ROKSBndWVzc2VzIGZvbGxvdyBhcyBhIGZhbGxiYWNrIGZvciB2ZXJzaW9ucyBhYnNlbnRcbiAqIGZyb20gdGhlIGNhdGFsb2cgKG9yIGEgc3RhbGUgY2F0YWxvZykuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBVUkxzIHRvIHRyeSwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEFzYXJEb3dubG9hZFVybHModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhc2FyR3pGaWxlTmFtZSA9IGAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9Lmd6YDtcbiAgY29uc3QgZmFsbGJhY2tVcmxzID0gW1xuICAgIGAke1BVQkxJQ19BU0FSX1JFTEVBU0VfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7YXNhckd6RmlsZU5hbWV9YCxcbiAgICBidWlsZENhdGFseXN0QXNhclVybCh2ZXJzaW9uKVxuICBdO1xuXG4gIGNvbnN0IGJha2VkVXJsID0gZ2V0VmVyc2lvbk1ldGFkYXRhKHZlcnNpb24pPy5kb3dubG9hZHM/LmFzYXI7XG4gIHJldHVybiBiYWtlZFVybCA/IFtiYWtlZFVybCwgLi4uZmFsbGJhY2tVcmxzXSA6IGZhbGxiYWNrVXJscztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw0QkFBNEI7QUFPckMsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSwrQkFBK0I7QUFFckMsTUFBTSxhQUFhLEtBQUssT0FBTyxHQUFHLDhCQUE4QjtBQUNoRSxNQUFNLGlCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNwRCxNQUFNLG9CQUFvQjtBQXlCbkIsU0FBUyxxQkFBcUIsVUFBa0IsU0FBaUIsbUJBQWlDO0FBQ3ZHLFlBQVUsbUJBQW1CLEVBQUUsV0FBVyxLQUFL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
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure helpers for building the repo-root `metadata.json` catalog from Obsidian's
5
+ * **own** publication endpoints, with no third-party catalog in the loop.
6
+ *
7
+ * `scripts/refresh-metadata.ts` drives the network side (the
8
+ * `obsidianmd/obsidian-releases` GitHub Releases API, `obsidian.md/changelog.xml`
9
+ * and `desktop-releases.json`); everything decidable without the network lives
10
+ * here so it stays unit-tested.
11
+ *
12
+ * Three decisions are encoded:
13
+ *
14
+ * - **Which release assets become `downloads` keys.** A release's real asset list
15
+ * is matched rather than templated, reusing {@link selectInstallerAssetName} for
16
+ * the desktop installers so the historical dot-vs-hyphen separator rename (and
17
+ * the `-universal` dmg infix) is handled in exactly one place. The 32-bit,
18
+ * arm64, AppImage, deb and snap siblings are deliberately not carried — this
19
+ * harness downloads only the x64 installer, the app asar and the Android apk.
20
+ * - **Which channel a version belongs to**, derived from which changelog pages
21
+ * the feed published for it (see {@link resolveReleaseChannel}).
22
+ * - **Where a catalyst asar lives** ({@link buildCatalystAsarUrl}) — the one asset
23
+ * with no listing API behind it, so its URL must be constructed and probed.
24
+ */
25
+ import type { ObsidianVersionDownloads } from './obsidian-metadata.mjs';
26
+ /**
27
+ * Base URL for **catalyst** (early access / insider) release asars, served from
28
+ * the Obsidian CDN as `.../release/obsidian-<version>.asar.gz`. Public versions
29
+ * are NOT hosted here (the CDN returns an empty body for them), and the endpoint
30
+ * is Cloudflare-gated against non-browser clients, so a probe needs a browser
31
+ * `User-Agent`.
32
+ */
33
+ export declare const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
34
+ /**
35
+ * One asset of a GitHub release, reduced to what the catalog needs.
36
+ */
37
+ export interface ReleaseAsset {
38
+ /**
39
+ The published asset file name, e.g. `Obsidian-1.13.7.exe`.
40
+ */
41
+ readonly name: string;
42
+ /**
43
+ The asset's direct download URL (`browser_download_url`).
44
+ */
45
+ readonly url: string;
46
+ }
47
+ /**
48
+ * Parameters for {@link resolveReleaseChannel}.
49
+ */
50
+ export interface ResolveReleaseChannelParams {
51
+ /**
52
+ Whether the changelog feed published a catalyst ("Early access") desktop page.
53
+ */
54
+ readonly hasCatalystPage: boolean;
55
+ /**
56
+ Whether the changelog feed published a public desktop page.
57
+ */
58
+ readonly hasPublicPage: boolean;
59
+ /**
60
+ * Whether the version was published as a GitHub release — the evidence that it
61
+ * shipped on the public channel, since catalyst builds are served only from
62
+ * the `releases.obsidian.md` CDN.
63
+ */
64
+ readonly hasPublicRelease: boolean;
65
+ }
66
+ /**
67
+ * Parameters for {@link selectReleaseDownloads}.
68
+ */
69
+ export interface SelectReleaseDownloadsParams {
70
+ /**
71
+ The release's published assets.
72
+ */
73
+ readonly assets: readonly ReleaseAsset[];
74
+ /**
75
+ The concrete `x.y.z` version the release publishes.
76
+ */
77
+ readonly version: string;
78
+ }
79
+ /**
80
+ * Builds the catalyst asar URL for a version.
81
+ *
82
+ * Catalyst builds are not published as GitHub release assets, and the CDN that
83
+ * serves them has no listing API, so this URL is constructed rather than
84
+ * discovered — the caller probes it before recording it.
85
+ *
86
+ * @param version - The concrete `x.y.z` version.
87
+ * @returns The `releases.obsidian.md` asar URL for the version.
88
+ */
89
+ export declare function buildCatalystAsarUrl(version: string): string;
90
+ /**
91
+ * Derives a version's release channel from where it was published and which
92
+ * changelog pages the feed carries for it.
93
+ *
94
+ * **Publication is the primary evidence, not the feed's title marker.** The feed
95
+ * tags each entry `(Public)` or `(Early access)`, but through the pre-1.0 era it
96
+ * tagged *everything* early-access — the whole app was — so 61 versions that
97
+ * shipped as ordinary GitHub releases carry only a catalyst page. Trusting the
98
+ * marker alone therefore relabels a large slice of public history as catalyst.
99
+ * A GitHub release is unambiguous the other way round: catalyst builds are
100
+ * served only from the `releases.obsidian.md` CDN, never as release assets.
101
+ *
102
+ * So a version that was published on GitHub is public, and it is recorded as the
103
+ * combined `'public+catalyst'` only when the feed carries *both* desktop pages —
104
+ * the shape every version already labelled `'public+catalyst'` has.
105
+ *
106
+ * @param params - The publication evidence and the desktop pages the feed published.
107
+ * @returns The channel, or `undefined` when there is no evidence either way (the
108
+ * caller then keeps whatever the version already carries).
109
+ */
110
+ export declare function resolveReleaseChannel(params: ResolveReleaseChannelParams): string | undefined;
111
+ /**
112
+ * Picks the assets this harness downloads out of a GitHub release's real asset
113
+ * list: the x64 desktop installers, the app asar and the Android apk.
114
+ *
115
+ * Assets are matched against the **release's own version**, so an early-access
116
+ * tag whose assets carry the base version instead (`v1.1.8-E21` publishing
117
+ * `Obsidian.1.1.8.exe`, `v1.6.3-e30` publishing `Obsidian.1.6.3.exe`) matches
118
+ * nothing and is skipped — deliberately, since those assets are the base
119
+ * version's, not the tag's.
120
+ *
121
+ * @param params - The release's assets and its version.
122
+ * @returns The distilled download URLs, or `undefined` when the release
123
+ * publishes none of them.
124
+ */
125
+ export declare function selectReleaseDownloads(params: SelectReleaseDownloadsParams): ObsidianVersionDownloads | undefined;
@@ -0,0 +1,46 @@
1
+ import { selectInstallerAssetName } from "./installer-asset.mjs";
2
+ import { getVersionAsarFileName } from "./obsidian-version.mjs";
3
+ const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
4
+ const INSTALLER_KEYS_BY_PLATFORM = [
5
+ ["dmg", "darwin"],
6
+ ["exe", "win32"],
7
+ ["tar", "linux"]
8
+ ];
9
+ function buildCatalystAsarUrl(version) {
10
+ return `${CATALYST_ASAR_RELEASE_BASE_URL}/${getVersionAsarFileName(version)}.gz`;
11
+ }
12
+ function resolveReleaseChannel(params) {
13
+ if (params.hasPublicRelease) {
14
+ return params.hasPublicPage && params.hasCatalystPage ? "public+catalyst" : "public";
15
+ }
16
+ return params.hasCatalystPage ? "catalyst" : void 0;
17
+ }
18
+ function selectReleaseDownloads(params) {
19
+ const { assets, version } = params;
20
+ const assetNames = assets.map((asset) => asset.name);
21
+ const urlByName = new Map(assets.map((asset) => [asset.name, asset.url]));
22
+ const downloads = {};
23
+ const apkUrl = urlByName.get(`Obsidian-${version}.apk`);
24
+ if (apkUrl !== void 0) {
25
+ downloads["apk"] = apkUrl;
26
+ }
27
+ const asarUrl = urlByName.get(`${getVersionAsarFileName(version)}.gz`);
28
+ if (asarUrl !== void 0) {
29
+ downloads["asar"] = asarUrl;
30
+ }
31
+ for (const [key, platform] of INSTALLER_KEYS_BY_PLATFORM) {
32
+ const assetName = selectInstallerAssetName({ assetNames, platform, version });
33
+ const url = assetName === void 0 ? void 0 : urlByName.get(assetName);
34
+ if (url !== void 0) {
35
+ downloads[key] = url;
36
+ }
37
+ }
38
+ return Object.keys(downloads).length > 0 ? downloads : void 0;
39
+ }
40
+ export {
41
+ CATALYST_ASAR_RELEASE_BASE_URL,
42
+ buildCatalystAsarUrl,
43
+ resolveReleaseChannel,
44
+ selectReleaseDownloads
45
+ };
46
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3JlbGVhc2UtY2F0YWxvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFB1cmUgaGVscGVycyBmb3IgYnVpbGRpbmcgdGhlIHJlcG8tcm9vdCBgbWV0YWRhdGEuanNvbmAgY2F0YWxvZyBmcm9tIE9ic2lkaWFuJ3NcbiAqICoqb3duKiogcHVibGljYXRpb24gZW5kcG9pbnRzLCB3aXRoIG5vIHRoaXJkLXBhcnR5IGNhdGFsb2cgaW4gdGhlIGxvb3AuXG4gKlxuICogYHNjcmlwdHMvcmVmcmVzaC1tZXRhZGF0YS50c2AgZHJpdmVzIHRoZSBuZXR3b3JrIHNpZGUgKHRoZVxuICogYG9ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXNgIEdpdEh1YiBSZWxlYXNlcyBBUEksIGBvYnNpZGlhbi5tZC9jaGFuZ2Vsb2cueG1sYFxuICogYW5kIGBkZXNrdG9wLXJlbGVhc2VzLmpzb25gKTsgZXZlcnl0aGluZyBkZWNpZGFibGUgd2l0aG91dCB0aGUgbmV0d29yayBsaXZlc1xuICogaGVyZSBzbyBpdCBzdGF5cyB1bml0LXRlc3RlZC5cbiAqXG4gKiBUaHJlZSBkZWNpc2lvbnMgYXJlIGVuY29kZWQ6XG4gKlxuICogLSAqKldoaWNoIHJlbGVhc2UgYXNzZXRzIGJlY29tZSBgZG93bmxvYWRzYCBrZXlzLioqIEEgcmVsZWFzZSdzIHJlYWwgYXNzZXQgbGlzdFxuICogICBpcyBtYXRjaGVkIHJhdGhlciB0aGFuIHRlbXBsYXRlZCwgcmV1c2luZyB7QGxpbmsgc2VsZWN0SW5zdGFsbGVyQXNzZXROYW1lfSBmb3JcbiAqICAgdGhlIGRlc2t0b3AgaW5zdGFsbGVycyBzbyB0aGUgaGlzdG9yaWNhbCBkb3QtdnMtaHlwaGVuIHNlcGFyYXRvciByZW5hbWUgKGFuZFxuICogICB0aGUgYC11bml2ZXJzYWxgIGRtZyBpbmZpeCkgaXMgaGFuZGxlZCBpbiBleGFjdGx5IG9uZSBwbGFjZS4gVGhlIDMyLWJpdCxcbiAqICAgYXJtNjQsIEFwcEltYWdlLCBkZWIgYW5kIHNuYXAgc2libGluZ3MgYXJlIGRlbGliZXJhdGVseSBub3QgY2FycmllZCBcdTIwMTQgdGhpc1xuICogICBoYXJuZXNzIGRvd25sb2FkcyBvbmx5IHRoZSB4NjQgaW5zdGFsbGVyLCB0aGUgYXBwIGFzYXIgYW5kIHRoZSBBbmRyb2lkIGFway5cbiAqIC0gKipXaGljaCBjaGFubmVsIGEgdmVyc2lvbiBiZWxvbmdzIHRvKiosIGRlcml2ZWQgZnJvbSB3aGljaCBjaGFuZ2Vsb2cgcGFnZXNcbiAqICAgdGhlIGZlZWQgcHVibGlzaGVkIGZvciBpdCAoc2VlIHtAbGluayByZXNvbHZlUmVsZWFzZUNoYW5uZWx9KS5cbiAqIC0gKipXaGVyZSBhIGNhdGFseXN0IGFzYXIgbGl2ZXMqKiAoe0BsaW5rIGJ1aWxkQ2F0YWx5c3RBc2FyVXJsfSkgXHUyMDE0IHRoZSBvbmUgYXNzZXRcbiAqICAgd2l0aCBubyBsaXN0aW5nIEFQSSBiZWhpbmQgaXQsIHNvIGl0cyBVUkwgbXVzdCBiZSBjb25zdHJ1Y3RlZCBhbmQgcHJvYmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5WZXJzaW9uRG93bmxvYWRzIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuXG5pbXBvcnQgeyBzZWxlY3RJbnN0YWxsZXJBc3NldE5hbWUgfSBmcm9tICcuL2luc3RhbGxlci1hc3NldC5tanMnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbkFzYXJGaWxlTmFtZSB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG4vKipcbiAqIEJhc2UgVVJMIGZvciAqKmNhdGFseXN0KiogKGVhcmx5IGFjY2VzcyAvIGluc2lkZXIpIHJlbGVhc2UgYXNhcnMsIHNlcnZlZCBmcm9tXG4gKiB0aGUgT2JzaWRpYW4gQ0ROIGFzIGAuLi4vcmVsZWFzZS9vYnNpZGlhbi08dmVyc2lvbj4uYXNhci5nemAuIFB1YmxpYyB2ZXJzaW9uc1xuICogYXJlIE5PVCBob3N0ZWQgaGVyZSAodGhlIENETiByZXR1cm5zIGFuIGVtcHR5IGJvZHkgZm9yIHRoZW0pLCBhbmQgdGhlIGVuZHBvaW50XG4gKiBpcyBDbG91ZGZsYXJlLWdhdGVkIGFnYWluc3Qgbm9uLWJyb3dzZXIgY2xpZW50cywgc28gYSBwcm9iZSBuZWVkcyBhIGJyb3dzZXJcbiAqIGBVc2VyLUFnZW50YC5cbiAqL1xuZXhwb3J0IGNvbnN0IENBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTCA9ICdodHRwczovL3JlbGVhc2VzLm9ic2lkaWFuLm1kL3JlbGVhc2UnO1xuXG4vKipcbiAqIE9uZSBhc3NldCBvZiBhIEdpdEh1YiByZWxlYXNlLCByZWR1Y2VkIHRvIHdoYXQgdGhlIGNhdGFsb2cgbmVlZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsZWFzZUFzc2V0IHtcbiAgLyoqXG4gIFRoZSBwdWJsaXNoZWQgYXNzZXQgZmlsZSBuYW1lLCBlLmcuIGBPYnNpZGlhbi0xLjEzLjcuZXhlYC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGFzc2V0J3MgZGlyZWN0IGRvd25sb2FkIFVSTCAoYGJyb3dzZXJfZG93bmxvYWRfdXJsYCkuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZVJlbGVhc2VDaGFubmVsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVsZWFzZUNoYW5uZWxQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgY2hhbmdlbG9nIGZlZWQgcHVibGlzaGVkIGEgY2F0YWx5c3QgKFwiRWFybHkgYWNjZXNzXCIpIGRlc2t0b3AgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0NhdGFseXN0UGFnZTogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciB0aGUgY2hhbmdlbG9nIGZlZWQgcHVibGlzaGVkIGEgcHVibGljIGRlc2t0b3AgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1B1YmxpY1BhZ2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZlcnNpb24gd2FzIHB1Ymxpc2hlZCBhcyBhIEdpdEh1YiByZWxlYXNlIFx1MjAxNCB0aGUgZXZpZGVuY2UgdGhhdCBpdFxuICAgKiBzaGlwcGVkIG9uIHRoZSBwdWJsaWMgY2hhbm5lbCwgc2luY2UgY2F0YWx5c3QgYnVpbGRzIGFyZSBzZXJ2ZWQgb25seSBmcm9tXG4gICAqIHRoZSBgcmVsZWFzZXMub2JzaWRpYW4ubWRgIENETi5cbiAgICovXG4gIHJlYWRvbmx5IGhhc1B1YmxpY1JlbGVhc2U6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdFJlbGVhc2VEb3dubG9hZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdFJlbGVhc2VEb3dubG9hZHNQYXJhbXMge1xuICAvKipcbiAgVGhlIHJlbGVhc2UncyBwdWJsaXNoZWQgYXNzZXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZXRzOiByZWFkb25seSBSZWxlYXNlQXNzZXRbXTtcblxuICAvKipcbiAgVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbiB0aGUgcmVsZWFzZSBwdWJsaXNoZXMuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlc2t0b3AtaW5zdGFsbGVyIGBkb3dubG9hZHNgIGtleXMsIHBhaXJlZCB3aXRoIHRoZSBwbGF0Zm9ybSB3aG9zZSBhc3NldFxuICogc2hhcGUge0BsaW5rIHNlbGVjdEluc3RhbGxlckFzc2V0TmFtZX0gcmVzb2x2ZXMgZm9yIHRoZW0uXG4gKi9cbmNvbnN0IElOU1RBTExFUl9LRVlTX0JZX1BMQVRGT1JNOiByZWFkb25seSAocmVhZG9ubHkgW2tleTogJ2RtZycgfCAnZXhlJyB8ICd0YXInLCBwbGF0Zm9ybTogTm9kZUpTLlBsYXRmb3JtXSlbXSA9IFtcbiAgWydkbWcnLCAnZGFyd2luJ10sXG4gIFsnZXhlJywgJ3dpbjMyJ10sXG4gIFsndGFyJywgJ2xpbnV4J11cbl07XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjYXRhbHlzdCBhc2FyIFVSTCBmb3IgYSB2ZXJzaW9uLlxuICpcbiAqIENhdGFseXN0IGJ1aWxkcyBhcmUgbm90IHB1Ymxpc2hlZCBhcyBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGFuZCB0aGUgQ0ROIHRoYXRcbiAqIHNlcnZlcyB0aGVtIGhhcyBubyBsaXN0aW5nIEFQSSwgc28gdGhpcyBVUkwgaXMgY29uc3RydWN0ZWQgcmF0aGVyIHRoYW5cbiAqIGRpc2NvdmVyZWQgXHUyMDE0IHRoZSBjYWxsZXIgcHJvYmVzIGl0IGJlZm9yZSByZWNvcmRpbmcgaXQuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGByZWxlYXNlcy5vYnNpZGlhbi5tZGAgYXNhciBVUkwgZm9yIHRoZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDYXRhbHlzdEFzYXJVcmwodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHtnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pfS5nemA7XG59XG5cbi8qKlxuICogRGVyaXZlcyBhIHZlcnNpb24ncyByZWxlYXNlIGNoYW5uZWwgZnJvbSB3aGVyZSBpdCB3YXMgcHVibGlzaGVkIGFuZCB3aGljaFxuICogY2hhbmdlbG9nIHBhZ2VzIHRoZSBmZWVkIGNhcnJpZXMgZm9yIGl0LlxuICpcbiAqICoqUHVibGljYXRpb24gaXMgdGhlIHByaW1hcnkgZXZpZGVuY2UsIG5vdCB0aGUgZmVlZCdzIHRpdGxlIG1hcmtlci4qKiBUaGUgZmVlZFxuICogdGFncyBlYWNoIGVudHJ5IGAoUHVibGljKWAgb3IgYChFYXJseSBhY2Nlc3MpYCwgYnV0IHRocm91Z2ggdGhlIHByZS0xLjAgZXJhIGl0XG4gKiB0YWdnZWQgKmV2ZXJ5dGhpbmcqIGVhcmx5LWFjY2VzcyBcdTIwMTQgdGhlIHdob2xlIGFwcCB3YXMgXHUyMDE0IHNvIDYxIHZlcnNpb25zIHRoYXRcbiAqIHNoaXBwZWQgYXMgb3JkaW5hcnkgR2l0SHViIHJlbGVhc2VzIGNhcnJ5IG9ubHkgYSBjYXRhbHlzdCBwYWdlLiBUcnVzdGluZyB0aGVcbiAqIG1hcmtlciBhbG9uZSB0aGVyZWZvcmUgcmVsYWJlbHMgYSBsYXJnZSBzbGljZSBvZiBwdWJsaWMgaGlzdG9yeSBhcyBjYXRhbHlzdC5cbiAqIEEgR2l0SHViIHJlbGVhc2UgaXMgdW5hbWJpZ3VvdXMgdGhlIG90aGVyIHdheSByb3VuZDogY2F0YWx5c3QgYnVpbGRzIGFyZVxuICogc2VydmVkIG9ubHkgZnJvbSB0aGUgYHJlbGVhc2VzLm9ic2lkaWFuLm1kYCBDRE4sIG5ldmVyIGFzIHJlbGVhc2UgYXNzZXRzLlxuICpcbiAqIFNvIGEgdmVyc2lvbiB0aGF0IHdhcyBwdWJsaXNoZWQgb24gR2l0SHViIGlzIHB1YmxpYywgYW5kIGl0IGlzIHJlY29yZGVkIGFzIHRoZVxuICogY29tYmluZWQgYCdwdWJsaWMrY2F0YWx5c3QnYCBvbmx5IHdoZW4gdGhlIGZlZWQgY2FycmllcyAqYm90aCogZGVza3RvcCBwYWdlcyBcdTIwMTRcbiAqIHRoZSBzaGFwZSBldmVyeSB2ZXJzaW9uIGFscmVhZHkgbGFiZWxsZWQgYCdwdWJsaWMrY2F0YWx5c3QnYCBoYXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwdWJsaWNhdGlvbiBldmlkZW5jZSBhbmQgdGhlIGRlc2t0b3AgcGFnZXMgdGhlIGZlZWQgcHVibGlzaGVkLlxuICogQHJldHVybnMgVGhlIGNoYW5uZWwsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gZXZpZGVuY2UgZWl0aGVyIHdheSAodGhlXG4gKiAgIGNhbGxlciB0aGVuIGtlZXBzIHdoYXRldmVyIHRoZSB2ZXJzaW9uIGFscmVhZHkgY2FycmllcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVsZWFzZUNoYW5uZWwocGFyYW1zOiBSZXNvbHZlUmVsZWFzZUNoYW5uZWxQYXJhbXMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAocGFyYW1zLmhhc1B1YmxpY1JlbGVhc2UpIHtcbiAgICByZXR1cm4gcGFyYW1zLmhhc1B1YmxpY1BhZ2UgJiYgcGFyYW1zLmhhc0NhdGFseXN0UGFnZSA/ICdwdWJsaWMrY2F0YWx5c3QnIDogJ3B1YmxpYyc7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zLmhhc0NhdGFseXN0UGFnZSA/ICdjYXRhbHlzdCcgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGFzc2V0cyB0aGlzIGhhcm5lc3MgZG93bmxvYWRzIG91dCBvZiBhIEdpdEh1YiByZWxlYXNlJ3MgcmVhbCBhc3NldFxuICogbGlzdDogdGhlIHg2NCBkZXNrdG9wIGluc3RhbGxlcnMsIHRoZSBhcHAgYXNhciBhbmQgdGhlIEFuZHJvaWQgYXBrLlxuICpcbiAqIEFzc2V0cyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSAqKnJlbGVhc2UncyBvd24gdmVyc2lvbioqLCBzbyBhbiBlYXJseS1hY2Nlc3NcbiAqIHRhZyB3aG9zZSBhc3NldHMgY2FycnkgdGhlIGJhc2UgdmVyc2lvbiBpbnN0ZWFkIChgdjEuMS44LUUyMWAgcHVibGlzaGluZ1xuICogYE9ic2lkaWFuLjEuMS44LmV4ZWAsIGB2MS42LjMtZTMwYCBwdWJsaXNoaW5nIGBPYnNpZGlhbi4xLjYuMy5leGVgKSBtYXRjaGVzXG4gKiBub3RoaW5nIGFuZCBpcyBza2lwcGVkIFx1MjAxNCBkZWxpYmVyYXRlbHksIHNpbmNlIHRob3NlIGFzc2V0cyBhcmUgdGhlIGJhc2VcbiAqIHZlcnNpb24ncywgbm90IHRoZSB0YWcncy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlbGVhc2UncyBhc3NldHMgYW5kIGl0cyB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGRpc3RpbGxlZCBkb3dubG9hZCBVUkxzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSByZWxlYXNlXG4gKiAgIHB1Ymxpc2hlcyBub25lIG9mIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RSZWxlYXNlRG93bmxvYWRzKHBhcmFtczogU2VsZWN0UmVsZWFzZURvd25sb2Fkc1BhcmFtcyk6IE9ic2lkaWFuVmVyc2lvbkRvd25sb2FkcyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYXNzZXRzLCB2ZXJzaW9uIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGFzc2V0TmFtZXMgPSBhc3NldHMubWFwKChhc3NldCkgPT4gYXNzZXQubmFtZSk7XG4gIGNvbnN0IHVybEJ5TmFtZSA9IG5ldyBNYXAoYXNzZXRzLm1hcCgoYXNzZXQpID0+IFthc3NldC5uYW1lLCBhc3NldC51cmxdKSk7XG4gIGNvbnN0IGRvd25sb2FkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGNvbnN0IGFwa1VybCA9IHVybEJ5TmFtZS5nZXQoYE9ic2lkaWFuLSR7dmVyc2lvbn0uYXBrYCk7XG4gIGlmIChhcGtVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGRvd25sb2Fkc1snYXBrJ10gPSBhcGtVcmw7XG4gIH1cblxuICBjb25zdCBhc2FyVXJsID0gdXJsQnlOYW1lLmdldChgJHtnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pfS5nemApO1xuICBpZiAoYXNhclVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZG93bmxvYWRzWydhc2FyJ10gPSBhc2FyVXJsO1xuICB9XG5cbiAgZm9yIChjb25zdCBba2V5LCBwbGF0Zm9ybV0gb2YgSU5TVEFMTEVSX0tFWVNfQllfUExBVEZPUk0pIHtcbiAgICBjb25zdCBhc3NldE5hbWUgPSBzZWxlY3RJbnN0YWxsZXJBc3NldE5hbWUoeyBhc3NldE5hbWVzLCBwbGF0Zm9ybSwgdmVyc2lvbiB9KTtcbiAgICBjb25zdCB1cmwgPSBhc3NldE5hbWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHVybEJ5TmFtZS5nZXQoYXNzZXROYW1lKTtcbiAgICBpZiAodXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRvd25sb2Fkc1trZXldID0gdXJsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyhkb3dubG9hZHMpLmxlbmd0aCA+IDAgPyBkb3dubG9hZHMgOiB1bmRlZmluZWQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkEsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyw4QkFBOEI7QUFTaEMsTUFBTSxpQ0FBaUM7QUEwRDlDLE1BQU0sNkJBQTRHO0FBQUEsRUFDaEgsQ0FBQyxPQUFPLFFBQVE7QUFBQSxFQUNoQixDQUFDLE9BQU8sT0FBTztBQUFBLEVBQ2YsQ0FBQyxPQUFPLE9BQU87QUFDakI7QUFZTyxTQUFTLHFCQUFxQixTQUF5QjtBQUM1RCxTQUFPLEdBQUcsOEJBQThCLElBQUksdUJBQXVCLE9BQU8sQ0FBQztBQUM3RTtBQXNCTyxTQUFTLHNCQUFzQixRQUF5RDtBQUM3RixNQUFJLE9BQU8sa0JBQWtCO0FBQzNCLFdBQU8sT0FBTyxpQkFBaUIsT0FBTyxrQkFBa0Isb0JBQW9CO0FBQUEsRUFDOUU7QUFFQSxTQUFPLE9BQU8sa0JBQWtCLGFBQWE7QUFDL0M7QUFnQk8sU0FBUyx1QkFBdUIsUUFBNEU7QUFDakgsUUFBTSxFQUFFLFFBQVEsUUFBUSxJQUFJO0FBQzVCLFFBQU0sYUFBYSxPQUFPLElBQUksQ0FBQyxVQUFVLE1BQU0sSUFBSTtBQUNuRCxRQUFNLFlBQVksSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUN4RSxRQUFNLFlBQW9DLENBQUM7QUFFM0MsUUFBTSxTQUFTLFVBQVUsSUFBSSxZQUFZLE9BQU8sTUFBTTtBQUN0RCxNQUFJLFdBQVcsUUFBVztBQUN4QixjQUFVLEtBQUssSUFBSTtBQUFBLEVBQ3JCO0FBRUEsUUFBTSxVQUFVLFVBQVUsSUFBSSxHQUFHLHVCQUF1QixPQUFPLENBQUMsS0FBSztBQUNyRSxNQUFJLFlBQVksUUFBVztBQUN6QixjQUFVLE1BQU0sSUFBSTtBQUFBLEVBQ3RCO0FBRUEsYUFBVyxDQUFDLEtBQUssUUFBUSxLQUFLLDRCQUE0QjtBQUN4RCxVQUFNLFlBQVkseUJBQXlCLEVBQUUsWUFBWSxVQUFVLFFBQVEsQ0FBQztBQUM1RSxVQUFNLE1BQU0sY0FBYyxTQUFZLFNBQVksVUFBVSxJQUFJLFNBQVM7QUFDekUsUUFBSSxRQUFRLFFBQVc7QUFDckIsZ0JBQVUsR0FBRyxJQUFJO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBRUEsU0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFLFNBQVMsSUFBSSxZQUFZO0FBQ3pEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -143,6 +143,20 @@ export declare class AppiumTransport implements ObsidianTransport {
143
143
  private readonly appId;
144
144
  private readonly browser;
145
145
  private readonly deviceId;
146
+ /**
147
+ * The `process.on('exit')` handler that tears the channel down when nothing else will.
148
+ */
149
+ private disposeInputChannelOnExit;
150
+ /**
151
+ * The host half of the trusted-input channel: a CDP connection to the WebView, independent of the
152
+ * Appium session, opened lazily on first evaluate and reused (see **L39**).
153
+ */
154
+ private inputChannel;
155
+ /**
156
+ * Set once the trusted-input channel is known not to be openable here (iOS, a remote hub, no local
157
+ * `adb`), so the attempt is not repeated on every evaluate.
158
+ */
159
+ private isInputChannelUnavailable;
146
160
  /**
147
161
  * Tracks whether the driver is currently switched to the WebView context.
148
162
  *
@@ -201,6 +215,14 @@ export declare class AppiumTransport implements ObsidianTransport {
201
215
  * deletion so the session remains available for the owning process.
202
216
  */
203
217
  dispose(): Promise<void>;
218
+ /**
219
+ * Synchronous teardown for `process.on('exit')` handlers.
220
+ *
221
+ * Only the trusted-input channel needs it: the Appium session is the owning process's to end, and an
222
+ * abrupt exit is exactly when the async {@link AppiumTransport.dispose} never runs — which would strand
223
+ * the adb port forward on the device.
224
+ */
225
+ disposeSync(): void;
204
226
  /**
205
227
  * Evaluates a JavaScript expression inside Obsidian Mobile's WebView.
206
228
  *
@@ -287,6 +309,19 @@ export declare class AppiumTransport implements ObsidianTransport {
287
309
  * @param vaultPath - The absolute path to the vault on the host machine.
288
310
  */
289
311
  unregisterVault(vaultPath: string): Promise<void>;
312
+ /**
313
+ * Closes the trusted-input channel, if one is open.
314
+ */
315
+ private disposeInputChannel;
316
+ /**
317
+ * Opens the trusted-input channel if it is not already open, and re-opens it if the WebView went away.
318
+ *
319
+ * Installs a `Runtime.addBinding` function on the page and services every call to it for the life of the
320
+ * connection. The binding is exposed on *every* execution context of the page, so it survives the
321
+ * `location.reload()` that {@link AppiumTransport.registerVault} performs; only a full app restart, which
322
+ * destroys the WebView target, needs the reconnect below.
323
+ */
324
+ private ensureInputChannel;
290
325
  /**
291
326
  * Switches the driver to the `WEBVIEW_md.obsidian` context.
292
327
  *
@@ -306,6 +341,17 @@ export declare class AppiumTransport implements ObsidianTransport {
306
341
  * @returns The device-side vault path.
307
342
  */
308
343
  private getDeviceVaultPath;
344
+ /**
345
+ * Services one input request from the renderer: inject, then resolve the renderer's promise.
346
+ *
347
+ * Every failure path still resolves that promise — with an error message the renderer re-throws — because
348
+ * a request that is silently dropped would hang the closure until the whole run times out, and report
349
+ * nothing about why.
350
+ *
351
+ * @param connection - The channel the request arrived on.
352
+ * @param payload - The raw JSON payload the binding was called with.
353
+ */
354
+ private handleInputRequest;
309
355
  /**
310
356
  * Pushes the minimal `.obsidian/app.json` vault marker via `adb push`.
311
357
  *
@@ -334,6 +380,11 @@ export declare class AppiumTransport implements ObsidianTransport {
334
380
  * @param deviceVaultPath - The device-side vault directory path.
335
381
  */
336
382
  private removeDeviceVaultDirectory;
383
+ /**
384
+ * Drops the `process.on('exit')` handler that would otherwise close an already-closed channel, and would
385
+ * stack a listener per reconnect.
386
+ */
387
+ private unregisterInputChannelExitHandler;
337
388
  /**
338
389
  * Polls until `app.workspace.layoutReady` is `true` in the WebView.
339
390
  */