obsidian-integration-testing 12.0.0 → 12.1.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 (176) hide show
  1. package/dist/lib/cjs/adb-device-list.cjs +54 -0
  2. package/dist/lib/cjs/adb-device-list.d.cts +72 -0
  3. package/dist/lib/cjs/android-sdk.cjs +52 -0
  4. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  5. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  6. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  7. package/dist/lib/cjs/appium-server-marker.cjs +29 -32
  8. package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
  9. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  10. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  11. package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
  12. package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
  13. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  14. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  15. package/dist/lib/cjs/config-directory.cjs +46 -0
  16. package/dist/lib/cjs/config-directory.d.cts +45 -0
  17. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  18. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  19. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  20. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
  21. package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
  22. package/dist/lib/cjs/device-readiness.cjs +38 -3
  23. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  24. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  25. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  26. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  27. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  28. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  29. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  30. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  31. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  32. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  33. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  34. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  35. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  36. package/dist/lib/cjs/index.cjs +12 -1
  37. package/dist/lib/cjs/index.d.cts +6 -1
  38. package/dist/lib/cjs/library.cjs +1 -1
  39. package/dist/lib/cjs/mobile-input.cjs +14 -2
  40. package/dist/lib/cjs/mobile-input.d.cts +5 -9
  41. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  42. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  43. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  44. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  45. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  46. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  47. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  48. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  49. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  50. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  51. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  52. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  53. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  54. package/dist/lib/cjs/port-owner.cjs +61 -0
  55. package/dist/lib/cjs/port-owner.d.cts +47 -0
  56. package/dist/lib/cjs/process-capture.cjs +62 -0
  57. package/dist/lib/cjs/process-capture.d.cts +83 -0
  58. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  59. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  60. package/dist/lib/cjs/process-liveness.cjs +51 -0
  61. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  62. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  63. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  64. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  65. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  66. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  67. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  68. package/dist/lib/cjs/transport-appium.cjs +102 -17
  69. package/dist/lib/cjs/transport-appium.d.cts +53 -3
  70. package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
  71. package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
  72. package/dist/lib/cjs/transport-factory.cjs +951 -133
  73. package/dist/lib/cjs/transport-options.cjs +11 -3
  74. package/dist/lib/cjs/transport-options.d.cts +131 -12
  75. package/dist/lib/cjs/transport.cjs +1 -1
  76. package/dist/lib/cjs/transport.d.cts +7 -1
  77. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  78. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  79. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  80. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  81. package/dist/lib/cjs/version-matrix.cjs +1 -1
  82. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  83. package/dist/lib/cjs/webview-cdp.cjs +6 -7
  84. package/dist/lib/cjs/webview-cdp.d.cts +5 -1
  85. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  86. package/dist/lib/esm/adb-device-list.mjs +28 -0
  87. package/dist/lib/esm/android-sdk.d.mts +29 -0
  88. package/dist/lib/esm/android-sdk.mjs +18 -0
  89. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  90. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  91. package/dist/lib/esm/appium-server-marker.d.mts +22 -0
  92. package/dist/lib/esm/appium-server-marker.mjs +28 -22
  93. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  94. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  95. package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
  96. package/dist/lib/esm/community-plugin-registry.mjs +1 -1
  97. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  98. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  99. package/dist/lib/esm/config-directory.d.mts +45 -0
  100. package/dist/lib/esm/config-directory.mjs +21 -0
  101. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  102. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  103. package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
  104. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  105. package/dist/lib/esm/demo-vault-populate.mjs +3 -2
  106. package/dist/lib/esm/device-readiness.d.mts +83 -9
  107. package/dist/lib/esm/device-readiness.mjs +34 -2
  108. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  109. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  110. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  111. package/dist/lib/esm/emulator-backend.mjs +45 -0
  112. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  113. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  114. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  115. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  116. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  117. package/dist/lib/esm/global-setup-core.mjs +34 -35
  118. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  119. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  120. package/dist/lib/esm/index.d.mts +6 -1
  121. package/dist/lib/esm/index.mjs +11 -1
  122. package/dist/lib/esm/library.mjs +1 -1
  123. package/dist/lib/esm/mobile-input.d.mts +5 -9
  124. package/dist/lib/esm/mobile-input.mjs +14 -2
  125. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  126. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  127. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  128. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  129. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  130. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  131. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  132. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  133. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  134. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  135. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  136. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  137. package/dist/lib/esm/parent-liveness.mjs +42 -5
  138. package/dist/lib/esm/port-owner.d.mts +47 -0
  139. package/dist/lib/esm/port-owner.mjs +36 -0
  140. package/dist/lib/esm/process-capture.d.mts +83 -0
  141. package/dist/lib/esm/process-capture.mjs +38 -0
  142. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  143. package/dist/lib/esm/process-exit-message.mjs +13 -8
  144. package/dist/lib/esm/process-liveness.d.mts +18 -0
  145. package/dist/lib/esm/process-liveness.mjs +17 -0
  146. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  147. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  148. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  149. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  150. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  151. package/dist/lib/esm/temporary-vault.mjs +43 -8
  152. package/dist/lib/esm/transport-appium.d.mts +53 -3
  153. package/dist/lib/esm/transport-appium.mjs +108 -17
  154. package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
  155. package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
  156. package/dist/lib/esm/transport-factory.mjs +995 -138
  157. package/dist/lib/esm/transport-options.d.mts +131 -12
  158. package/dist/lib/esm/transport-options.mjs +9 -2
  159. package/dist/lib/esm/transport.d.mts +7 -1
  160. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  161. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  162. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  163. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  164. package/dist/lib/esm/version-matrix.d.mts +2 -2
  165. package/dist/lib/esm/version-matrix.mjs +1 -1
  166. package/dist/lib/esm/webview-cdp.d.mts +5 -1
  167. package/dist/lib/esm/webview-cdp.mjs +6 -7
  168. package/package.json +24 -23
  169. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  170. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  171. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  172. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  173. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  174. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  175. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  176. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Cheap, synchronous "is this PID still running?" probe.
5
+ *
6
+ * Signal `0` performs the permission and existence checks without delivering a
7
+ * signal, on Windows as well as POSIX, so it costs nothing at teardown-poll
8
+ * frequency. `EPERM` means the process exists but is owned by another user —
9
+ * still alive, and the distinction matters: reading it as dead is how a
10
+ * teardown convinces itself a process it could not touch is gone.
11
+ */
12
+ /**
13
+ * Checks whether a process is still running.
14
+ *
15
+ * @param pid - The PID to probe.
16
+ * @returns `true` when the process exists.
17
+ */
18
+ export declare function checkIsProcessAlive(pid: number): boolean;
@@ -0,0 +1,17 @@
1
+ import process from "node:process";
2
+ const PROCESS_EXISTENCE_PROBE_SIGNAL = 0;
3
+ function checkIsProcessAlive(pid) {
4
+ try {
5
+ process.kill(pid, PROCESS_EXISTENCE_PROBE_SIGNAL);
6
+ return true;
7
+ } catch (error) {
8
+ return getErrorCode(error) === "EPERM";
9
+ }
10
+ }
11
+ function getErrorCode(error) {
12
+ return typeof error === "object" && error !== null && "code" in error ? String(error.code) : void 0;
13
+ }
14
+ export {
15
+ checkIsProcessAlive
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Byb2Nlc3MtbGl2ZW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDaGVhcCwgc3luY2hyb25vdXMgXCJpcyB0aGlzIFBJRCBzdGlsbCBydW5uaW5nP1wiIHByb2JlLlxuICpcbiAqIFNpZ25hbCBgMGAgcGVyZm9ybXMgdGhlIHBlcm1pc3Npb24gYW5kIGV4aXN0ZW5jZSBjaGVja3Mgd2l0aG91dCBkZWxpdmVyaW5nIGFcbiAqIHNpZ25hbCwgb24gV2luZG93cyBhcyB3ZWxsIGFzIFBPU0lYLCBzbyBpdCBjb3N0cyBub3RoaW5nIGF0IHRlYXJkb3duLXBvbGxcbiAqIGZyZXF1ZW5jeS4gYEVQRVJNYCBtZWFucyB0aGUgcHJvY2VzcyBleGlzdHMgYnV0IGlzIG93bmVkIGJ5IGFub3RoZXIgdXNlciBcdTIwMTRcbiAqIHN0aWxsIGFsaXZlLCBhbmQgdGhlIGRpc3RpbmN0aW9uIG1hdHRlcnM6IHJlYWRpbmcgaXQgYXMgZGVhZCBpcyBob3cgYVxuICogdGVhcmRvd24gY29udmluY2VzIGl0c2VsZiBhIHByb2Nlc3MgaXQgY291bGQgbm90IHRvdWNoIGlzIGdvbmUuXG4gKi9cblxuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuY29uc3QgUFJPQ0VTU19FWElTVEVOQ0VfUFJPQkVfU0lHTkFMID0gMDtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHByb2Nlc3MgaXMgc3RpbGwgcnVubmluZy5cbiAqXG4gKiBAcGFyYW0gcGlkIC0gVGhlIFBJRCB0byBwcm9iZS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBwcm9jZXNzIGV4aXN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNQcm9jZXNzQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocGlkLCBQUk9DRVNTX0VYSVNURU5DRV9QUk9CRV9TSUdOQUwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHJldHVybiBnZXRFcnJvckNvZGUoZXJyb3IpID09PSAnRVBFUk0nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEVycm9yQ29kZShlcnJvcjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsICYmICdjb2RlJyBpbiBlcnJvciA/IFN0cmluZyhlcnJvci5jb2RlKSA6IHVuZGVmaW5lZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBLE9BQU8sYUFBYTtBQUVwQixNQUFNLGlDQUFpQztBQVFoQyxTQUFTLG9CQUFvQixLQUFzQjtBQUN4RCxNQUFJO0FBQ0YsWUFBUSxLQUFLLEtBQUssOEJBQThCO0FBQ2hELFdBQU87QUFBQSxFQUNULFNBQVMsT0FBZ0I7QUFDdkIsV0FBTyxhQUFhLEtBQUssTUFBTTtBQUFBLEVBQ2pDO0FBQ0Y7QUFFQSxTQUFTLGFBQWEsT0FBb0M7QUFDeEQsU0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsVUFBVSxRQUFRLE9BQU8sTUFBTSxJQUFJLElBQUk7QUFDL0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -32,7 +32,7 @@ export interface RunObsidianVersionMatrixParams {
32
32
  * so an env var can be passed straight through.
33
33
  *
34
34
  * Each accepts an explicit `'x.y.z'`, `'public-latest'`, or `'catalyst-latest'`.
35
- * Defaults to both ends of the supported range (G99) when omitted or empty, and
35
+ * Defaults to both ends of the supported range when omitted or empty, and
36
36
  * the list is always de-duplicated on the **resolved** version — so when public
37
37
  * has caught up to catalyst, the suites run once.
38
38
  */
@@ -45,4 +45,4 @@ function logPlan(resolvedSpecs, entries) {
45
45
  export {
46
46
  runObsidianVersionMatrix
47
47
  };
48
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3J1bi12ZXJzaW9uLW1hdHJpeC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgcnVubmVyIHRoYXQgZXhlY3V0ZXMgYSBzdWl0ZSBvbmNlIHBlciAqKmRpc3RpbmN0Kiogc3VwcG9ydGVkXG4gKiBPYnNpZGlhbiB2ZXJzaW9uLlxuICpcbiAqIFRoaW4gZ2x1ZSBvdmVyIHRoZSBwdXJlIGB2ZXJzaW9uLW1hdHJpeC50c2AgZGVjaXNpb24gbGF5ZXI6IHRoZSBvbmx5IHRoaW5nc1xuICogdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIHNpbmdsZSBtYW5pZmVzdCBmZXRjaCBhbmQgdGhlIGxvZ2dpbmcuIEV2ZXJ5dGhpbmdcbiAqIHRoYXQgZGVjaWRlcyBcdTIwMTQgbm9ybWFsaXppbmcgdGhlIHJlcXVlc3RlZCBzcGVjaWZpZXJzLCByZXNvbHZpbmcgdGhlbSxcbiAqIGRlLWR1cGxpY2F0aW5nIG9uIHRoZSByZXNvbHZlZCB2ZXJzaW9uLCBzZXF1ZW5jaW5nIHRoZSBydW5zLCBhbmQgYnVpbGRpbmcgdGhlXG4gKiBmYWlsdXJlIHN1bW1hcnkgXHUyMDE0IGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkIG5leHQgZG9vci5cbiAqXG4gKiBUaGUgbG9vcCBsaXZlcyBhYm92ZSB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIGluc2lkZSBpdCBiZWNhdXNlIGEgdGVzdFxuICogZnJhbWV3b3JrJ3MgZ2xvYmFsIHNldHVwIGNhbm5vdCByZS1ydW4gaXRzIG93biB0ZXN0IGZpbGVzOiBpdCBsYXVuY2hlcyBvbmVcbiAqIGluc3RhbmNlIGZvciBvbmUgcnVuLiBLZWVwaW5nIHRoZSBsb29wIGZyYW1ld29yay1hZ25vc3RpYyAodGhlIGNhbGxlciBzdXBwbGllc1xuICogYHJ1bmApIGlzIHdoYXQgbGV0cyBWaXRlc3QsIEplc3QsIGFuZCBtYW51YWwgY29uc3VtZXJzIGFsbCBpbmhlcml0IGl0IChMNikuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZ2x1ZSAobmV0d29yayBmZXRjaCArIGxvZ2dpbmcpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5LFxuICBSZXNvbHZlZFZlcnNpb25TcGVjXG59IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFZlcnNpb25NYXRyaXgsXG4gIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFuLFxuICBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyLFxuICBoYXNDaGFubmVsU3BlYyxcbiAgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzLFxuICByZXNvbHZlVmVyc2lvblNwZWNzLFxuICBydW5WZXJzaW9uTWF0cml4RW50cmllc1xufSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IG9uZSBjb25jcmV0ZSBPYnNpZGlhbiB2ZXJzaW9uLCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBUaGUgZW50cnkncyBgdmVyc2lvbmAgaXMgdGhlIGNvbmNyZXRlIGB4LnkuemAgdG8gcGluIFx1MjAxNCB0eXBpY2FsbHkgZm9yd2FyZGVkIHRvXG4gICAqIHRoZSB0ZXN0LXJ1bm5lciBjaGlsZCBhcyBgT0JTSURJQU5fVkVSU0lPTmAuXG4gICAqL1xuICByZWFkb25seSBydW46IChlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXJzIHRvIHJ1biBhZ2FpbnN0OiBhbiBhcnJheSwgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAqIHNvIGFuIGVudiB2YXIgY2FuIGJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoLlxuICAgKlxuICAgKiBFYWNoIGFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogRGVmYXVsdHMgdG8gYm90aCBlbmRzIG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2UgKEc5OSkgd2hlbiBvbWl0dGVkIG9yIGVtcHR5LCBhbmRcbiAgICogdGhlIGxpc3QgaXMgYWx3YXlzIGRlLWR1cGxpY2F0ZWQgb24gdGhlICoqcmVzb2x2ZWQqKiB2ZXJzaW9uIFx1MjAxNCBzbyB3aGVuIHB1YmxpY1xuICAgKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0LCB0aGUgc3VpdGVzIHJ1biBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3VpdGUgb25jZSBwZXIgZGlzdGluY3Qgc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwZXItdmVyc2lvbiBydW5uZXIgYW5kIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgdmVyc2lvbiBoYXMgcnVuIHN1Y2Nlc3NmdWxseS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdmVyc2lvbiBjb3VsZCBiZSByZXNvbHZlZCwgb3IgYW4ge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfVxuICogICBuYW1pbmcgZXZlcnkgdmVyc2lvbiB3aG9zZSBydW4gZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4KHBhcmFtczogUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVuLCB2ZXJzaW9ucyB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHsgaXNEZWZhdWx0LCBzcGVjcyB9ID0gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBoYXNDaGFubmVsU3BlYyhzcGVjcykgPyBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgZHJvcHBlZFNwZWNzLCByZXNvbHZlZFNwZWNzIH0gPSByZXNvbHZlVmVyc2lvblNwZWNzKHtcbiAgICBtYW5pZmVzdCxcbiAgICAvLyBUaGUgZGVmYXVsdCBsaXN0IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSB3aGVuIGEgY2hhbm5lbCBpc1xuICAgIC8vIE1vbWVudGFyaWx5IGFic2VudCBmcm9tIHRoZSBtYW5pZmVzdDsgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgc3BlY2lmaWVyXG4gICAgLy8gVGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWwgZXJyb3IuXG4gICAgc2hvdWxkVG9sZXJhdGVVbnJlc29sdmFibGVTcGVjczogaXNEZWZhdWx0LFxuICAgIHNwZWNzXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgeyByZWFzb24sIHNwZWMgfSBvZiBkcm9wcGVkU3BlY3MpIHtcbiAgICBsb2dNYXRyaXgoYFNraXBwaW5nIFwiJHtzcGVjfVwiOiAke3JlYXNvbn1gKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjcyk7XG4gIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjcywgZW50cmllcyk7XG5cbiAgYXdhaXQgcnVuVmVyc2lvbk1hdHJpeEVudHJpZXMoe1xuICAgIGVudHJpZXMsXG4gICAgb25FbnRyeVN0YXJ0OiAoaGVhZGVyUGFyYW1zKSA9PiB7XG4gICAgICBsb2dNYXRyaXgoZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcihoZWFkZXJQYXJhbXMpKTtcbiAgICB9LFxuICAgIHJ1blxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dzIGEgbWF0cml4IG1lc3NhZ2UgdW5kZXIgYSBjb25zaXN0ZW50IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAqL1xuZnVuY3Rpb24gbG9nTWF0cml4KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBsb2coYFt2ZXJzaW9uLW1hdHJpeF0gJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIExvZ3Mgd2hhdCB0aGUgc3BlY2lmaWVycyByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyB0aGF0IGltcGxpZXMuXG4gKlxuICogQHBhcmFtIHJlc29sdmVkU3BlY3MgLSBUaGUgcmVzb2x2ZWQgc3BlY2lmaWVycywgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXguXG4gKi9cbmZ1bmN0aW9uIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdLCBlbnRyaWVzOiByZWFkb25seSBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbih7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSkpIHtcbiAgICBsb2dNYXRyaXgobGluZSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQSxTQUFTLFdBQVc7QUFDcEIsU0FBUyxvQ0FBb0M7QUFDN0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBRTFCLFFBQU0sRUFBRSxXQUFXLE1BQU0sSUFBSSxzQkFBc0IsUUFBUTtBQUMzRCxRQUFNLFdBQVcsZUFBZSxLQUFLLElBQUksTUFBTSw2QkFBNkIsSUFBSTtBQUNoRixRQUFNLEVBQUUsY0FBYyxjQUFjLElBQUksb0JBQW9CO0FBQUEsSUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLGlDQUFpQztBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsYUFBVyxFQUFFLFFBQVEsS0FBSyxLQUFLLGNBQWM7QUFDM0MsY0FBVSxhQUFhLElBQUksTUFBTSxNQUFNLEVBQUU7QUFBQSxFQUMzQztBQUVBLFFBQU0sVUFBVSxtQkFBbUIsYUFBYTtBQUNoRCxVQUFRLGVBQWUsT0FBTztBQUU5QixRQUFNLHdCQUF3QjtBQUFBLElBQzVCO0FBQUEsSUFDQSxjQUFjLENBQUMsaUJBQWlCO0FBQzlCLGdCQUFVLDZCQUE2QixZQUFZLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQU9BLFNBQVMsVUFBVSxTQUF1QjtBQUN4QyxNQUFJLG9CQUFvQixPQUFPLEVBQUU7QUFDbkM7QUFRQSxTQUFTLFFBQVEsZUFBK0MsU0FBc0Q7QUFDcEgsYUFBVyxRQUFRLHdCQUF3QixFQUFFLFNBQVMsY0FBYyxDQUFDLEdBQUc7QUFDdEUsY0FBVSxJQUFJO0FBQUEsRUFDaEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3J1bi12ZXJzaW9uLW1hdHJpeC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEludGVncmF0aW9uLXRpbWUgcnVubmVyIHRoYXQgZXhlY3V0ZXMgYSBzdWl0ZSBvbmNlIHBlciAqKmRpc3RpbmN0Kiogc3VwcG9ydGVkXG4gKiBPYnNpZGlhbiB2ZXJzaW9uLlxuICpcbiAqIFRoaW4gZ2x1ZSBvdmVyIHRoZSBwdXJlIGB2ZXJzaW9uLW1hdHJpeC50c2AgZGVjaXNpb24gbGF5ZXI6IHRoZSBvbmx5IHRoaW5nc1xuICogdGhhdCBoYXBwZW4gaGVyZSBhcmUgdGhlIHNpbmdsZSBtYW5pZmVzdCBmZXRjaCBhbmQgdGhlIGxvZ2dpbmcuIEV2ZXJ5dGhpbmdcbiAqIHRoYXQgZGVjaWRlcyBcdTIwMTQgbm9ybWFsaXppbmcgdGhlIHJlcXVlc3RlZCBzcGVjaWZpZXJzLCByZXNvbHZpbmcgdGhlbSxcbiAqIGRlLWR1cGxpY2F0aW5nIG9uIHRoZSByZXNvbHZlZCB2ZXJzaW9uLCBzZXF1ZW5jaW5nIHRoZSBydW5zLCBhbmQgYnVpbGRpbmcgdGhlXG4gKiBmYWlsdXJlIHN1bW1hcnkgXHUyMDE0IGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkIG5leHQgZG9vci5cbiAqXG4gKiBUaGUgbG9vcCBsaXZlcyBhYm92ZSB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIGluc2lkZSBpdCBiZWNhdXNlIGEgdGVzdFxuICogZnJhbWV3b3JrJ3MgZ2xvYmFsIHNldHVwIGNhbm5vdCByZS1ydW4gaXRzIG93biB0ZXN0IGZpbGVzOiBpdCBsYXVuY2hlcyBvbmVcbiAqIGluc3RhbmNlIGZvciBvbmUgcnVuLiBLZWVwaW5nIHRoZSBsb29wIGZyYW1ld29yay1hZ25vc3RpYyAodGhlIGNhbGxlciBzdXBwbGllc1xuICogYHJ1bmApIGlzIHdoYXQgbGV0cyBWaXRlc3QsIEplc3QsIGFuZCBtYW51YWwgY29uc3VtZXJzIGFsbCBpbmhlcml0IGl0IChMNikuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZ2x1ZSAobmV0d29yayBmZXRjaCArIGxvZ2dpbmcpIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5LFxuICBSZXNvbHZlZFZlcnNpb25TcGVjXG59IGZyb20gJy4vdmVyc2lvbi1tYXRyaXgubWpzJztcblxuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFZlcnNpb25NYXRyaXgsXG4gIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFuLFxuICBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyLFxuICBoYXNDaGFubmVsU3BlYyxcbiAgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzLFxuICByZXNvbHZlVmVyc2lvblNwZWNzLFxuICBydW5WZXJzaW9uTWF0cml4RW50cmllc1xufSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zIHtcbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IG9uZSBjb25jcmV0ZSBPYnNpZGlhbiB2ZXJzaW9uLCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKlxuICAgKiBUaGUgZW50cnkncyBgdmVyc2lvbmAgaXMgdGhlIGNvbmNyZXRlIGB4LnkuemAgdG8gcGluIFx1MjAxNCB0eXBpY2FsbHkgZm9yd2FyZGVkIHRvXG4gICAqIHRoZSB0ZXN0LXJ1bm5lciBjaGlsZCBhcyBgT0JTSURJQU5fVkVSU0lPTmAuXG4gICAqL1xuICByZWFkb25seSBydW46IChlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBzcGVjaWZpZXJzIHRvIHJ1biBhZ2FpbnN0OiBhbiBhcnJheSwgb3IgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAqIHNvIGFuIGVudiB2YXIgY2FuIGJlIHBhc3NlZCBzdHJhaWdodCB0aHJvdWdoLlxuICAgKlxuICAgKiBFYWNoIGFjY2VwdHMgYW4gZXhwbGljaXQgYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC5cbiAgICogRGVmYXVsdHMgdG8gYm90aCBlbmRzIG9mIHRoZSBzdXBwb3J0ZWQgcmFuZ2Ugd2hlbiBvbWl0dGVkIG9yIGVtcHR5LCBhbmRcbiAgICogdGhlIGxpc3QgaXMgYWx3YXlzIGRlLWR1cGxpY2F0ZWQgb24gdGhlICoqcmVzb2x2ZWQqKiB2ZXJzaW9uIFx1MjAxNCBzbyB3aGVuIHB1YmxpY1xuICAgKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0LCB0aGUgc3VpdGVzIHJ1biBvbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSdW5zIGEgc3VpdGUgb25jZSBwZXIgZGlzdGluY3Qgc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwZXItdmVyc2lvbiBydW5uZXIgYW5kIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbnMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgdmVyc2lvbiBoYXMgcnVuIHN1Y2Nlc3NmdWxseS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgbm8gdmVyc2lvbiBjb3VsZCBiZSByZXNvbHZlZCwgb3IgYW4ge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfVxuICogICBuYW1pbmcgZXZlcnkgdmVyc2lvbiB3aG9zZSBydW4gZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4KHBhcmFtczogUnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcnVuLCB2ZXJzaW9ucyB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHsgaXNEZWZhdWx0LCBzcGVjcyB9ID0gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBoYXNDaGFubmVsU3BlYyhzcGVjcykgPyBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgZHJvcHBlZFNwZWNzLCByZXNvbHZlZFNwZWNzIH0gPSByZXNvbHZlVmVyc2lvblNwZWNzKHtcbiAgICBtYW5pZmVzdCxcbiAgICAvLyBUaGUgZGVmYXVsdCBsaXN0IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSB3aGVuIGEgY2hhbm5lbCBpc1xuICAgIC8vIE1vbWVudGFyaWx5IGFic2VudCBmcm9tIHRoZSBtYW5pZmVzdDsgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgc3BlY2lmaWVyXG4gICAgLy8gVGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWwgZXJyb3IuXG4gICAgc2hvdWxkVG9sZXJhdGVVbnJlc29sdmFibGVTcGVjczogaXNEZWZhdWx0LFxuICAgIHNwZWNzXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgeyByZWFzb24sIHNwZWMgfSBvZiBkcm9wcGVkU3BlY3MpIHtcbiAgICBsb2dNYXRyaXgoYFNraXBwaW5nIFwiJHtzcGVjfVwiOiAke3JlYXNvbn1gKTtcbiAgfVxuXG4gIGNvbnN0IGVudHJpZXMgPSBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjcyk7XG4gIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjcywgZW50cmllcyk7XG5cbiAgYXdhaXQgcnVuVmVyc2lvbk1hdHJpeEVudHJpZXMoe1xuICAgIGVudHJpZXMsXG4gICAgb25FbnRyeVN0YXJ0OiAoaGVhZGVyUGFyYW1zKSA9PiB7XG4gICAgICBsb2dNYXRyaXgoZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcihoZWFkZXJQYXJhbXMpKTtcbiAgICB9LFxuICAgIHJ1blxuICB9KTtcbn1cblxuLyoqXG4gKiBMb2dzIGEgbWF0cml4IG1lc3NhZ2UgdW5kZXIgYSBjb25zaXN0ZW50IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAqL1xuZnVuY3Rpb24gbG9nTWF0cml4KG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBsb2coYFt2ZXJzaW9uLW1hdHJpeF0gJHttZXNzYWdlfWApO1xufVxuXG4vKipcbiAqIExvZ3Mgd2hhdCB0aGUgc3BlY2lmaWVycyByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyB0aGF0IGltcGxpZXMuXG4gKlxuICogQHBhcmFtIHJlc29sdmVkU3BlY3MgLSBUaGUgcmVzb2x2ZWQgc3BlY2lmaWVycywgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICogQHBhcmFtIGVudHJpZXMgLSBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXguXG4gKi9cbmZ1bmN0aW9uIGxvZ1BsYW4ocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdLCBlbnRyaWVzOiByZWFkb25seSBPYnNpZGlhblZlcnNpb25NYXRyaXhFbnRyeVtdKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbGluZSBvZiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbih7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSkpIHtcbiAgICBsb2dNYXRyaXgobGluZSk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQSxTQUFTLFdBQVc7QUFDcEIsU0FBUyxvQ0FBb0M7QUFDN0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQix5QkFBeUIsUUFBdUQ7QUFDcEcsUUFBTSxFQUFFLEtBQUssU0FBUyxJQUFJO0FBRTFCLFFBQU0sRUFBRSxXQUFXLE1BQU0sSUFBSSxzQkFBc0IsUUFBUTtBQUMzRCxRQUFNLFdBQVcsZUFBZSxLQUFLLElBQUksTUFBTSw2QkFBNkIsSUFBSTtBQUNoRixRQUFNLEVBQUUsY0FBYyxjQUFjLElBQUksb0JBQW9CO0FBQUEsSUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlBLGlDQUFpQztBQUFBLElBQ2pDO0FBQUEsRUFDRixDQUFDO0FBRUQsYUFBVyxFQUFFLFFBQVEsS0FBSyxLQUFLLGNBQWM7QUFDM0MsY0FBVSxhQUFhLElBQUksTUFBTSxNQUFNLEVBQUU7QUFBQSxFQUMzQztBQUVBLFFBQU0sVUFBVSxtQkFBbUIsYUFBYTtBQUNoRCxVQUFRLGVBQWUsT0FBTztBQUU5QixRQUFNLHdCQUF3QjtBQUFBLElBQzVCO0FBQUEsSUFDQSxjQUFjLENBQUMsaUJBQWlCO0FBQzlCLGdCQUFVLDZCQUE2QixZQUFZLENBQUM7QUFBQSxJQUN0RDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQU9BLFNBQVMsVUFBVSxTQUF1QjtBQUN4QyxNQUFJLG9CQUFvQixPQUFPLEVBQUU7QUFDbkM7QUFRQSxTQUFTLFFBQVEsZUFBK0MsU0FBc0Q7QUFDcEgsYUFBVyxRQUFRLHdCQUF3QixFQUFFLFNBQVMsY0FBYyxDQUFDLEdBQUc7QUFDdEUsY0FBVSxJQUFJO0FBQUEsRUFDaEI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure verdict + message building for the auto-started-process teardown.
5
+ *
6
+ * The teardown used to log `Auto-started Appium server stopped.` on the
7
+ * **attempt** — printed unconditionally right after the kill was issued, with
8
+ * nothing asserting the process had actually exited. On 2026-09-02 both the
9
+ * server and the emulator were still serving ten minutes after that line was
10
+ * written, and the next run adopted them and died two seconds into its session
11
+ * as they finally finished dying. A log that says the machine is clean when it
12
+ * is not does not merely fail to help — it sends the next reader away from the
13
+ * cause.
14
+ *
15
+ * So a stop is a claim that has to be earned: only {@link resolveTeardownOutcome}
16
+ * may decide one was, and only the `stopped` outcomes are allowed to say so.
17
+ */
18
+ /**
19
+ * Parameters for {@link buildTeardownMessage}.
20
+ */
21
+ export interface BuildTeardownMessageParams {
22
+ /**
23
+ What was checked, as a noun phrase — e.g. `port 4723`, `AVD "obsidian_test" on device emulator-5554`.
24
+ */
25
+ readonly evidence: string;
26
+ /**
27
+ The verdict from {@link resolveTeardownOutcome}.
28
+ */
29
+ readonly outcome: TeardownOutcome;
30
+ /**
31
+ What was being stopped — e.g. `Auto-started Appium server`.
32
+ */
33
+ readonly subject: string;
34
+ /**
35
+ The budget the stop was given, in milliseconds.
36
+ */
37
+ readonly timeoutInMilliseconds: number;
38
+ }
39
+ /**
40
+ * Parameters for {@link resolveTeardownOutcome}.
41
+ */
42
+ export interface ResolveTeardownOutcomeParams {
43
+ /**
44
+ Whether the first kill was followed by a second, harder one.
45
+ */
46
+ readonly hasEscalated: boolean;
47
+ /**
48
+ Whether the process was **observed** to be gone, rather than merely asked to go.
49
+ */
50
+ readonly isStopped: boolean;
51
+ }
52
+ /**
53
+ * What the teardown actually achieved.
54
+ */
55
+ export type TeardownOutcome = 'still-running' | 'stopped-after-escalation' | 'stopped';
56
+ /**
57
+ * Builds the line the teardown logs for an outcome.
58
+ *
59
+ * @param params - The outcome plus what was being stopped and what proved it.
60
+ * @returns The log line.
61
+ */
62
+ export declare function buildTeardownMessage(params: BuildTeardownMessageParams): string;
63
+ /**
64
+ * Decides what the teardown achieved, from what was observed after the kill.
65
+ *
66
+ * @param params - Whether the process is gone, and whether it took an escalation.
67
+ * @returns The outcome.
68
+ */
69
+ export declare function resolveTeardownOutcome(params: ResolveTeardownOutcomeParams): TeardownOutcome;
@@ -0,0 +1,28 @@
1
+ import { assertNever } from "./type-guards.mjs";
2
+ function buildTeardownMessage(params) {
3
+ switch (params.outcome) {
4
+ case "still-running": {
5
+ return `WARNING: ${params.subject} did not exit within ${String(params.timeoutInMilliseconds)}ms and still holds ${params.evidence}; a later run may adopt it. Kill it before the next Android run.`;
6
+ }
7
+ case "stopped": {
8
+ return `${params.subject} stopped (verified: ${params.evidence} released).`;
9
+ }
10
+ case "stopped-after-escalation": {
11
+ return `${params.subject} stopped after escalation (verified: ${params.evidence} released).`;
12
+ }
13
+ default: {
14
+ return assertNever(params.outcome);
15
+ }
16
+ }
17
+ }
18
+ function resolveTeardownOutcome(params) {
19
+ if (!params.isStopped) {
20
+ return "still-running";
21
+ }
22
+ return params.hasEscalated ? "stopped-after-escalation" : "stopped";
23
+ }
24
+ export {
25
+ buildTeardownMessage,
26
+ resolveTeardownOutcome
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlYXJkb3duLXZlcmRpY3QudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIHZlcmRpY3QgKyBtZXNzYWdlIGJ1aWxkaW5nIGZvciB0aGUgYXV0by1zdGFydGVkLXByb2Nlc3MgdGVhcmRvd24uXG4gKlxuICogVGhlIHRlYXJkb3duIHVzZWQgdG8gbG9nIGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBzdG9wcGVkLmAgb24gdGhlXG4gKiAqKmF0dGVtcHQqKiBcdTIwMTQgcHJpbnRlZCB1bmNvbmRpdGlvbmFsbHkgcmlnaHQgYWZ0ZXIgdGhlIGtpbGwgd2FzIGlzc3VlZCwgd2l0aFxuICogbm90aGluZyBhc3NlcnRpbmcgdGhlIHByb2Nlc3MgaGFkIGFjdHVhbGx5IGV4aXRlZC4gT24gMjAyNi0wOS0wMiBib3RoIHRoZVxuICogc2VydmVyIGFuZCB0aGUgZW11bGF0b3Igd2VyZSBzdGlsbCBzZXJ2aW5nIHRlbiBtaW51dGVzIGFmdGVyIHRoYXQgbGluZSB3YXNcbiAqIHdyaXR0ZW4sIGFuZCB0aGUgbmV4dCBydW4gYWRvcHRlZCB0aGVtIGFuZCBkaWVkIHR3byBzZWNvbmRzIGludG8gaXRzIHNlc3Npb25cbiAqIGFzIHRoZXkgZmluYWxseSBmaW5pc2hlZCBkeWluZy4gQSBsb2cgdGhhdCBzYXlzIHRoZSBtYWNoaW5lIGlzIGNsZWFuIHdoZW4gaXRcbiAqIGlzIG5vdCBkb2VzIG5vdCBtZXJlbHkgZmFpbCB0byBoZWxwIFx1MjAxNCBpdCBzZW5kcyB0aGUgbmV4dCByZWFkZXIgYXdheSBmcm9tIHRoZVxuICogY2F1c2UuXG4gKlxuICogU28gYSBzdG9wIGlzIGEgY2xhaW0gdGhhdCBoYXMgdG8gYmUgZWFybmVkOiBvbmx5IHtAbGluayByZXNvbHZlVGVhcmRvd25PdXRjb21lfVxuICogbWF5IGRlY2lkZSBvbmUgd2FzLCBhbmQgb25seSB0aGUgYHN0b3BwZWRgIG91dGNvbWVzIGFyZSBhbGxvd2VkIHRvIHNheSBzby5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnROZXZlciB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRUZWFyZG93bk1lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkVGVhcmRvd25NZXNzYWdlUGFyYW1zIHtcbiAgLyoqXG4gIFdoYXQgd2FzIGNoZWNrZWQsIGFzIGEgbm91biBwaHJhc2UgXHUyMDE0IGUuZy4gYHBvcnQgNDcyM2AsIGBBVkQgXCJvYnNpZGlhbl90ZXN0XCIgb24gZGV2aWNlIGVtdWxhdG9yLTU1NTRgLlxuICAgKi9cbiAgcmVhZG9ubHkgZXZpZGVuY2U6IHN0cmluZztcblxuICAvKipcbiAgVGhlIHZlcmRpY3QgZnJvbSB7QGxpbmsgcmVzb2x2ZVRlYXJkb3duT3V0Y29tZX0uXG4gICAqL1xuICByZWFkb25seSBvdXRjb21lOiBUZWFyZG93bk91dGNvbWU7XG5cbiAgLyoqXG4gIFdoYXQgd2FzIGJlaW5nIHN0b3BwZWQgXHUyMDE0IGUuZy4gYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyYC5cbiAgICovXG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGJ1ZGdldCB0aGUgc3RvcCB3YXMgZ2l2ZW4sIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlVGVhcmRvd25PdXRjb21lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVGVhcmRvd25PdXRjb21lUGFyYW1zIHtcbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGZpcnN0IGtpbGwgd2FzIGZvbGxvd2VkIGJ5IGEgc2Vjb25kLCBoYXJkZXIgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzRXNjYWxhdGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoZSBwcm9jZXNzIHdhcyAqKm9ic2VydmVkKiogdG8gYmUgZ29uZSwgcmF0aGVyIHRoYW4gbWVyZWx5IGFza2VkIHRvIGdvLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTdG9wcGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHRlYXJkb3duIGFjdHVhbGx5IGFjaGlldmVkLlxuICovXG5leHBvcnQgdHlwZSBUZWFyZG93bk91dGNvbWUgPSAnc3RpbGwtcnVubmluZycgfCAnc3RvcHBlZC1hZnRlci1lc2NhbGF0aW9uJyB8ICdzdG9wcGVkJztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGxpbmUgdGhlIHRlYXJkb3duIGxvZ3MgZm9yIGFuIG91dGNvbWUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBvdXRjb21lIHBsdXMgd2hhdCB3YXMgYmVpbmcgc3RvcHBlZCBhbmQgd2hhdCBwcm92ZWQgaXQuXG4gKiBAcmV0dXJucyBUaGUgbG9nIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRlYXJkb3duTWVzc2FnZShwYXJhbXM6IEJ1aWxkVGVhcmRvd25NZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwYXJhbXMub3V0Y29tZSkge1xuICAgIGNhc2UgJ3N0aWxsLXJ1bm5pbmcnOiB7XG4gICAgICByZXR1cm4gYFdBUk5JTkc6ICR7cGFyYW1zLnN1YmplY3R9IGRpZCBub3QgZXhpdCB3aXRoaW4gJHtTdHJpbmcocGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgYW5kIHN0aWxsIGhvbGRzICR7cGFyYW1zLmV2aWRlbmNlfTsgYSBsYXRlciBydW4gbWF5IGFkb3B0IGl0LiBLaWxsIGl0IGJlZm9yZSB0aGUgbmV4dCBBbmRyb2lkIHJ1bi5gO1xuICAgIH1cbiAgICBjYXNlICdzdG9wcGVkJzoge1xuICAgICAgcmV0dXJuIGAke3BhcmFtcy5zdWJqZWN0fSBzdG9wcGVkICh2ZXJpZmllZDogJHtwYXJhbXMuZXZpZGVuY2V9IHJlbGVhc2VkKS5gO1xuICAgIH1cbiAgICBjYXNlICdzdG9wcGVkLWFmdGVyLWVzY2FsYXRpb24nOiB7XG4gICAgICByZXR1cm4gYCR7cGFyYW1zLnN1YmplY3R9IHN0b3BwZWQgYWZ0ZXIgZXNjYWxhdGlvbiAodmVyaWZpZWQ6ICR7cGFyYW1zLmV2aWRlbmNlfSByZWxlYXNlZCkuYDtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKHBhcmFtcy5vdXRjb21lKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoYXQgdGhlIHRlYXJkb3duIGFjaGlldmVkLCBmcm9tIHdoYXQgd2FzIG9ic2VydmVkIGFmdGVyIHRoZSBraWxsLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBXaGV0aGVyIHRoZSBwcm9jZXNzIGlzIGdvbmUsIGFuZCB3aGV0aGVyIGl0IHRvb2sgYW4gZXNjYWxhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRjb21lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRlYXJkb3duT3V0Y29tZShwYXJhbXM6IFJlc29sdmVUZWFyZG93bk91dGNvbWVQYXJhbXMpOiBUZWFyZG93bk91dGNvbWUge1xuICBpZiAoIXBhcmFtcy5pc1N0b3BwZWQpIHtcbiAgICByZXR1cm4gJ3N0aWxsLXJ1bm5pbmcnO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5oYXNFc2NhbGF0ZWQgPyAnc3RvcHBlZC1hZnRlci1lc2NhbGF0aW9uJyA6ICdzdG9wcGVkJztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQWtCQSxTQUFTLG1CQUFtQjtBQXFEckIsU0FBUyxxQkFBcUIsUUFBNEM7QUFDL0UsVUFBUSxPQUFPLFNBQVM7QUFBQSxJQUN0QixLQUFLLGlCQUFpQjtBQUNwQixhQUFPLFlBQVksT0FBTyxPQUFPLHdCQUF3QixPQUFPLE9BQU8scUJBQXFCLENBQUMsc0JBQXNCLE9BQU8sUUFBUTtBQUFBLElBQ3BJO0FBQUEsSUFDQSxLQUFLLFdBQVc7QUFDZCxhQUFPLEdBQUcsT0FBTyxPQUFPLHVCQUF1QixPQUFPLFFBQVE7QUFBQSxJQUNoRTtBQUFBLElBQ0EsS0FBSyw0QkFBNEI7QUFDL0IsYUFBTyxHQUFHLE9BQU8sT0FBTyx3Q0FBd0MsT0FBTyxRQUFRO0FBQUEsSUFDakY7QUFBQSxJQUNBLFNBQVM7QUFDUCxhQUFPLFlBQVksT0FBTyxPQUFPO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBQ0Y7QUFRTyxTQUFTLHVCQUF1QixRQUF1RDtBQUM1RixNQUFJLENBQUMsT0FBTyxXQUFXO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLGVBQWUsNkJBQTZCO0FBQzVEOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -21,13 +21,32 @@ export type PopulateFileContent = string | Uint8Array | undefined;
21
21
  * All other paths are written as files.
22
22
  */
23
23
  export type PopulateFilesParams = Record<string, PopulateFileContent>;
24
+ /**
25
+ * Options for the {@link TemporaryVault} constructor.
26
+ */
27
+ export interface TemporaryVaultOptions {
28
+ /**
29
+ * Whether {@link TemporaryVault.dispose} removes the vault **directory**.
30
+ *
31
+ * When omitted, defaults to whether this instance created that directory — `true` for a temp
32
+ * directory the constructor made (no `path` argument), `false` for a directory handed to it as an
33
+ * explicit `path`. A handle over somebody else's directory unregisters the vault but leaves the
34
+ * files alone, so wrapping a directory cannot destroy it. Set explicitly to override.
35
+ */
36
+ readonly shouldRemoveDirectoryOnDispose?: boolean;
37
+ }
24
38
  /**
25
39
  * A temporary Obsidian vault for integration tests.
26
40
  *
27
41
  * Creates a temp directory and registers it in the running Obsidian instance
28
42
  * so that the Obsidian CLI can target it via `cwd`.
43
+ *
44
+ * A handle **owns** the directory only when it created it. {@link TemporaryVault.dispose} deletes an
45
+ * owned directory and leaves a borrowed one in place — see
46
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose}, which overrides that default.
29
47
  */
30
48
  export declare class TemporaryVault {
49
+ #private;
31
50
  /**
32
51
  * The absolute path to the temporary vault.
33
52
  */
@@ -36,29 +55,50 @@ export declare class TemporaryVault {
36
55
  * Creates a new temp vault.
37
56
  *
38
57
  * @param path - An explicit vault path. If omitted, a temp directory is created.
58
+ * @param options - Vault options.
39
59
  */
40
- constructor(path?: string);
60
+ constructor(path?: string, options?: TemporaryVaultOptions);
41
61
  /**
42
- * Unregisters the vault from Obsidian and deletes the temp directory.
62
+ * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
63
+ *
64
+ * The directory is removed only when this instance created it, or when
65
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
66
+ * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
67
+ * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
43
68
  *
44
69
  * @param transportOverride - An explicit transport to use when unregistering.
45
70
  * When omitted, falls back to the transport configured via the context provider.
46
71
  */
47
72
  dispose(transportOverride?: ObsidianTransport): Promise<void>;
48
73
  /**
49
- * Writes files and folders into the vault directory.
74
+ * Writes files and folders into the vault directory **on the host**.
50
75
  * Parent directories are created automatically.
51
76
  *
52
77
  * - `string` values are written as UTF-8 text files.
53
78
  * - `Uint8Array` values (including `Buffer`) are written as binary files.
54
79
  * - Paths ending with `/` are treated as empty folders (value must be `undefined`).
55
80
  *
81
+ * The write is always host-local — {@link TemporaryVault.path} is a host path, and on a mobile
82
+ * transport the vault the app opens lives on the device instead. {@link TemporaryVault.register}
83
+ * carries the directory across before it registers, so populate-then-register is all a caller
84
+ * needs; {@link TemporaryVault.syncToDevice} is the seam that does the carrying.
85
+ *
56
86
  * @param files - Map of file/folder paths to content.
57
87
  */
58
88
  populate(files: PopulateFilesParams): void;
59
89
  /**
60
90
  * Registers this vault in the running Obsidian instance so the CLI can target it.
61
91
  *
92
+ * Pushes the vault directory to the target device first, via
93
+ * {@link TemporaryVault.syncToDevice} — a no-op on a transport whose app already reads the host
94
+ * filesystem. That ordering used to be the caller's to remember, and a caller who forgot got a
95
+ * silently **empty** vault rather than an error: every pre-registration
96
+ * {@link TemporaryVault.populate} write stayed on the host while the app opened the device's copy.
97
+ * Folding it in here makes populate-then-register correct on every transport.
98
+ *
99
+ * The transport is resolved once and handed to both steps, so a push and the registration that
100
+ * follows it can never land on two different transports.
101
+ *
62
102
  * @param transportOverride - An explicit transport to use. When omitted,
63
103
  * falls back to the transport configured via the context provider.
64
104
  */
@@ -76,8 +116,10 @@ export declare class TemporaryVault {
76
116
  * On desktop transports this is a no-op (files are already local).
77
117
  * On mobile transports (Appium) this pushes files to the device.
78
118
  *
79
- * Call this after {@link populate} and before {@link register} when using
80
- * a mobile transport.
119
+ * {@link TemporaryVault.register} calls this itself, so a populate-then-register sequence needs
120
+ * nothing extra. Call it directly only to carry across files written **after** registration: the
121
+ * host directory is not mirrored, so a later write into {@link TemporaryVault.path} stays on the
122
+ * host until this runs again.
81
123
  *
82
124
  * @param transportOverride - An explicit transport to use. When omitted,
83
125
  * falls back to the transport configured via the context provider.
@@ -16,6 +16,7 @@ import {
16
16
  } from "node:path";
17
17
  import { getTransportOptions } from "./context-provider.mjs";
18
18
  import { TEMP_VAULT_DIR_PREFIX } from "./leftover-cleanup.mjs";
19
+ import { log } from "./log.mjs";
19
20
  import { getOrCreateTransport } from "./transport-factory.mjs";
20
21
  import {
21
22
  registerVault,
@@ -28,16 +29,27 @@ class TemporaryVault {
28
29
  * The absolute path to the temporary vault.
29
30
  */
30
31
  path;
32
+ /**
33
+ * Whether {@link TemporaryVault.dispose} removes {@link TemporaryVault.path} from disk.
34
+ */
35
+ #shouldRemoveDirectoryOnDispose;
31
36
  /**
32
37
  * Creates a new temp vault.
33
38
  *
34
39
  * @param path - An explicit vault path. If omitted, a temp directory is created.
40
+ * @param options - Vault options.
35
41
  */
36
- constructor(path) {
42
+ constructor(path, options) {
37
43
  this.path = path ?? mkdtempSync(join(tmpdir(), TEMP_VAULT_DIR_PREFIX));
44
+ this.#shouldRemoveDirectoryOnDispose = options?.shouldRemoveDirectoryOnDispose ?? path === void 0;
38
45
  }
39
46
  /**
40
- * Unregisters the vault from Obsidian and deletes the temp directory.
47
+ * Unregisters the vault from Obsidian and, when this handle owns the directory, deletes it.
48
+ *
49
+ * The directory is removed only when this instance created it, or when
50
+ * {@link TemporaryVaultOptions.shouldRemoveDirectoryOnDispose} said so explicitly. That is what
51
+ * makes a handle over a directory somebody else owns — the run's shared setup vault, say, which
52
+ * `getTemporaryVault()` wraps — safe to dispose from a consumer's `afterAll`.
41
53
  *
42
54
  * @param transportOverride - An explicit transport to use when unregistering.
43
55
  * When omitted, falls back to the transport configured via the context provider.
@@ -46,17 +58,26 @@ class TemporaryVault {
46
58
  try {
47
59
  await unregisterVault(this.path, transportOverride);
48
60
  } finally {
49
- await retryRm(this.path);
61
+ if (this.#shouldRemoveDirectoryOnDispose) {
62
+ await retryRm(this.path);
63
+ } else {
64
+ log(`[temporary-vault] Unregistered but kept the vault directory, which this handle does not own: ${this.path}`);
65
+ }
50
66
  }
51
67
  }
52
68
  /**
53
- * Writes files and folders into the vault directory.
69
+ * Writes files and folders into the vault directory **on the host**.
54
70
  * Parent directories are created automatically.
55
71
  *
56
72
  * - `string` values are written as UTF-8 text files.
57
73
  * - `Uint8Array` values (including `Buffer`) are written as binary files.
58
74
  * - Paths ending with `/` are treated as empty folders (value must be `undefined`).
59
75
  *
76
+ * The write is always host-local — {@link TemporaryVault.path} is a host path, and on a mobile
77
+ * transport the vault the app opens lives on the device instead. {@link TemporaryVault.register}
78
+ * carries the directory across before it registers, so populate-then-register is all a caller
79
+ * needs; {@link TemporaryVault.syncToDevice} is the seam that does the carrying.
80
+ *
60
81
  * @param files - Map of file/folder paths to content.
61
82
  */
62
83
  populate(files) {
@@ -79,11 +100,23 @@ class TemporaryVault {
79
100
  /**
80
101
  * Registers this vault in the running Obsidian instance so the CLI can target it.
81
102
  *
103
+ * Pushes the vault directory to the target device first, via
104
+ * {@link TemporaryVault.syncToDevice} — a no-op on a transport whose app already reads the host
105
+ * filesystem. That ordering used to be the caller's to remember, and a caller who forgot got a
106
+ * silently **empty** vault rather than an error: every pre-registration
107
+ * {@link TemporaryVault.populate} write stayed on the host while the app opened the device's copy.
108
+ * Folding it in here makes populate-then-register correct on every transport.
109
+ *
110
+ * The transport is resolved once and handed to both steps, so a push and the registration that
111
+ * follows it can never land on two different transports.
112
+ *
82
113
  * @param transportOverride - An explicit transport to use. When omitted,
83
114
  * falls back to the transport configured via the context provider.
84
115
  */
85
116
  async register(transportOverride) {
86
- await registerVault(this.path, transportOverride);
117
+ const transport = transportOverride ?? await getOrCreateTransport(getTransportOptions());
118
+ await this.syncToDevice(transport);
119
+ await registerVault(this.path, transport);
87
120
  }
88
121
  /**
89
122
  * Async disposable support for `await using`.
@@ -101,8 +134,10 @@ class TemporaryVault {
101
134
  * On desktop transports this is a no-op (files are already local).
102
135
  * On mobile transports (Appium) this pushes files to the device.
103
136
  *
104
- * Call this after {@link populate} and before {@link register} when using
105
- * a mobile transport.
137
+ * {@link TemporaryVault.register} calls this itself, so a populate-then-register sequence needs
138
+ * nothing extra. Call it directly only to carry across files written **after** registration: the
139
+ * host directory is not mirrored, so a later write into {@link TemporaryVault.path} stays on the
140
+ * host until this runs again.
106
141
  *
107
142
  * @param transportOverride - An explicit transport to use. When omitted,
108
143
  * falls back to the transport configured via the context provider.
@@ -154,4 +189,4 @@ async function retryRm(path) {
154
189
  export {
155
190
  TemporaryVault
156
191
  };
157
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5pbXBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuXG4vKipcbiAqIENvbnRlbnQgdmFsdWUgZm9yIGEgc2luZ2xlIGVudHJ5IGluIGEge0BsaW5rIFBvcHVsYXRlRmlsZXN9IG1hcC5cbiAqXG4gKiAtIGBzdHJpbmdgIFx1MjAxNCB0ZXh0IGZpbGUgKHdyaXR0ZW4gYXMgVVRGLTgpLlxuICogLSBgVWludDhBcnJheWAgXHUyMDE0IGJpbmFyeSBmaWxlICh3cml0dGVuIGFzIHJhdyBieXRlczsgYEJ1ZmZlcmAgaXMgYWNjZXB0ZWRcbiAqICAgYmVjYXVzZSBgQnVmZmVyIGV4dGVuZHMgVWludDhBcnJheWApLlxuICogLSBgdW5kZWZpbmVkYCBcdTIwMTQgZW1wdHkgZm9sZGVyICh0aGUga2V5ICoqbXVzdCoqIGVuZCB3aXRoIGAvYCkuXG4gKi9cbmV4cG9ydCB0eXBlIFBvcHVsYXRlRmlsZUNvbnRlbnQgPSBzdHJpbmcgfCBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgbWFwIG9mIHZhdWx0LXJlbGF0aXZlIHBhdGhzIHRvIHRoZWlyIGNvbnRlbnQsIHVzZWQgYnlcbiAqIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKlxuICogUGF0aHMgZW5kaW5nIHdpdGggYC9gIGRlbm90ZSBmb2xkZXJzIGFuZCAqKm11c3QqKiBoYXZlIGFuIGB1bmRlZmluZWRgIHZhbHVlLlxuICogQWxsIG90aGVyIHBhdGhzIGFyZSB3cml0dGVuIGFzIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVzUGFyYW1zID0gUmVjb3JkPHN0cmluZywgUG9wdWxhdGVGaWxlQ29udGVudD47XG5cbmNvbnN0IFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEEgdGVtcG9yYXJ5IE9ic2lkaWFuIHZhdWx0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBDcmVhdGVzIGEgdGVtcCBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogc28gdGhhdCB0aGUgT2JzaWRpYW4gQ0xJIGNhbiB0YXJnZXQgaXQgdmlhIGBjd2RgLlxuICovXG5leHBvcnQgY2xhc3MgVGVtcG9yYXJ5VmF1bHQge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgdGVtcCB2YXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBbiBleHBsaWNpdCB2YXVsdCBwYXRoLiBJZiBvbWl0dGVkLCBhIHRlbXAgZGlyZWN0b3J5IGlzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGF0aD86IHN0cmluZykge1xuICAgIHRoaXMucGF0aCA9IHBhdGggPz8gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgVEVNUF9WQVVMVF9ESVJfUFJFRklYKSk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kIGRlbGV0ZXMgdGhlIHRlbXAgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlIHdoZW4gdW5yZWdpc3RlcmluZy5cbiAgICogICBXaGVuIG9taXR0ZWQsIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdW5yZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0T3ZlcnJpZGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCByZXRyeVJtKHRoaXMucGF0aCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBmaWxlcyBhbmQgZm9sZGVycyBpbnRvIHRoZSB2YXVsdCBkaXJlY3RvcnkuXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiAtIGBzdHJpbmdgIHZhbHVlcyBhcmUgd3JpdHRlbiBhcyBVVEYtOCB0ZXh0IGZpbGVzLlxuICAgKiAtIGBVaW50OEFycmF5YCB2YWx1ZXMgKGluY2x1ZGluZyBgQnVmZmVyYCkgYXJlIHdyaXR0ZW4gYXMgYmluYXJ5IGZpbGVzLlxuICAgKiAtIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBhcmUgdHJlYXRlZCBhcyBlbXB0eSBmb2xkZXJzICh2YWx1ZSBtdXN0IGJlIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVzIC0gTWFwIG9mIGZpbGUvZm9sZGVyIHBhdGhzIHRvIGNvbnRlbnQuXG4gICAqL1xuICBwdWJsaWMgcG9wdWxhdGUoZmlsZXM6IFBvcHVsYXRlRmlsZXNQYXJhbXMpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoZmlsZXMpKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4odGhpcy5wYXRoLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoZmlsZVBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGb2xkZXIgcGF0aCBcIiR7ZmlsZVBhdGh9XCIgbXVzdCBoYXZlIHVuZGVmaW5lZCBjb250ZW50YCk7XG4gICAgICAgIH1cbiAgICAgICAgbWtkaXJTeW5jKGZ1bGxQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgcGF0aCBcIiR7ZmlsZVBhdGh9XCIgbXVzdCBoYXZlIGRlZmluZWQgY29udGVudDsgdXNlIGEgdHJhaWxpbmcgXCIvXCIgZm9yIGZvbGRlcnNgKTtcbiAgICAgICAgfVxuICAgICAgICBta2RpclN5bmMoZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB3cml0ZUZpbGVTeW5jKGZ1bGxQYXRoLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoaXMgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2Ugc28gdGhlIENMSSBjYW4gdGFyZ2V0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlLiBXaGVuIG9taXR0ZWQsXG4gICAqICAgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyKHRyYW5zcG9ydE92ZXJyaWRlPzogT2JzaWRpYW5UcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCByZWdpc3RlclZhdWx0KHRoaXMucGF0aCwgdHJhbnNwb3J0T3ZlcnJpZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGRpc3Bvc2FibGUgc3VwcG9ydCBmb3IgYGF3YWl0IHVzaW5nYC5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmF1bHQgaXMgZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgdGhhdCByZXF1aXJlcyBhIHJ1bm5pbmcgdHJhbnNwb3J0LiAqL1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgYWxsIGZpbGVzIGZyb20gdGhlIGxvY2FsIHN0YWdpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlXG4gICAqIHZpYSB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIGBwdXNoRmlsZXMoKWAuXG4gICAqXG4gICAqIE9uIGRlc2t0b3AgdHJhbnNwb3J0cyB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSBhbHJlYWR5IGxvY2FsKS5cbiAgICogT24gbW9iaWxlIHRyYW5zcG9ydHMgKEFwcGl1bSkgdGhpcyBwdXNoZXMgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICogQ2FsbCB0aGlzIGFmdGVyIHtAbGluayBwb3B1bGF0ZX0gYW5kIGJlZm9yZSB7QGxpbmsgcmVnaXN0ZXJ9IHdoZW4gdXNpbmdcbiAgICogYSBtb2JpbGUgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNwb3J0T3ZlcnJpZGUgLSBBbiBleHBsaWNpdCB0cmFuc3BvcnQgdG8gdXNlLiBXaGVuIG9taXR0ZWQsXG4gICAqICAgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bmNUb0RldmljZSh0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcbiAgICBpZiAoIXRyYW5zcG9ydC5wdXNoRmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKHRoaXMucGF0aCk7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnB1c2hGaWxlcyh0aGlzLnBhdGgsIGZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSByZWFkcyBhbGwgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeSBpbnRvIGEgZmxhdCBtYXAuXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHJlYWQuXG4gICAqIEByZXR1cm5zIEEgbWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb2xsZWN0RmlsZXMoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5PiA9IHt9O1xuICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oZGlyZWN0b3J5LCBlbnRyeS5uYW1lKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHRoaXMucGF0aCwgZnVsbFBhdGgpO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgYXdhaXQgdGhpcy5jb2xsZWN0RmlsZXMoZnVsbFBhdGgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdFtyZWxhdGl2ZVBhdGhdID0gYXdhaXQgcmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbn1cblxuLyoqXG4gKiBSZXRyaWVzIGBybWAgdW50aWwgaXQgc3VjY2VlZHMgb3IgdGltZXMgb3V0LlxuICogT2JzaWRpYW4gbWF5IGhvbGQgZmlsZSBsb2NrcyBicmllZmx5IGFmdGVyIGEgd2luZG93IGlzIGRlc3Ryb3llZC5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGlyZWN0b3J5IGlzIHJlbW92ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJldHJ5Um0ocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgUk1fUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbCBhdHRlbXB0IFx1MjAxNCBsZXQgaXQgdGhyb3cuXG4gIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQU1BO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLDRCQUE0QjtBQUNyQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFCUCxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLG1DQUFtQztBQVFsQyxNQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlWO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxNQUFlO0FBQ2hDLFNBQUssT0FBTyxRQUFRLFlBQVksS0FBSyxPQUFPLEdBQUcscUJBQXFCLENBQUM7QUFBQSxFQUN2RTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYSxRQUFRLG1CQUFzRDtBQUN6RSxRQUFJO0FBQ0YsWUFBTSxnQkFBZ0IsS0FBSyxNQUFNLGlCQUFpQjtBQUFBLElBQ3BELFVBQUU7QUFDQSxZQUFNLFFBQVEsS0FBSyxJQUFJO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLFNBQVMsT0FBa0M7QUFDaEQsZUFBVyxDQUFDLFVBQVUsT0FBTyxLQUFLLE9BQU8sUUFBUSxLQUFLLEdBQUc7QUFDdkQsWUFBTSxXQUFXLEtBQUssS0FBSyxNQUFNLFFBQVE7QUFDekMsVUFBSSxTQUFTLFNBQVMsR0FBRyxHQUFHO0FBQzFCLFlBQUksWUFBWSxRQUFXO0FBQ3pCLGdCQUFNLElBQUksTUFBTSxnQkFBZ0IsUUFBUSwrQkFBK0I7QUFBQSxRQUN6RTtBQUNBLGtCQUFVLFVBQVUsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ3pDLE9BQU87QUFDTCxZQUFJLFlBQVksUUFBVztBQUN6QixnQkFBTSxJQUFJLE1BQU0sY0FBYyxRQUFRLDZEQUE2RDtBQUFBLFFBQ3JHO0FBQ0Esa0JBQVUsUUFBUSxRQUFRLEdBQUcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUNoRCxzQkFBYyxVQUFVLE9BQU87QUFBQSxNQUNqQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFhLFNBQVMsbUJBQXNEO0FBQzFFLFVBQU0sY0FBYyxLQUFLLE1BQU0saUJBQWlCO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUJBLE1BQWEsYUFBYSxtQkFBc0Q7QUFDOUUsVUFBTSxZQUFZLHFCQUFxQixNQUFNLHFCQUFxQixvQkFBb0IsQ0FBQztBQUN2RixRQUFJLENBQUMsVUFBVSxXQUFXO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUSxNQUFNLEtBQUssYUFBYSxLQUFLLElBQUk7QUFDL0MsVUFBTSxVQUFVLFVBQVUsS0FBSyxNQUFNLEtBQUs7QUFBQSxFQUM1QztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUEsTUFBYyxhQUFhLFdBQXdEO0FBQ2pGLFVBQU0sU0FBcUMsQ0FBQztBQUM1QyxVQUFNLFVBQVUsTUFBTSxRQUFRLFdBQVcsRUFBRSxlQUFlLEtBQUssQ0FBQztBQUVoRSxlQUFXLFNBQVMsU0FBUztBQUMzQixZQUFNLFdBQVcsS0FBSyxXQUFXLE1BQU0sSUFBSTtBQUMzQyxZQUFNLGVBQWUsU0FBUyxLQUFLLE1BQU0sUUFBUTtBQUVqRCxVQUFJLE1BQU0sWUFBWSxHQUFHO0FBQ3ZCLGVBQU8sT0FBTyxRQUFRLE1BQU0sS0FBSyxhQUFhLFFBQVEsQ0FBQztBQUFBLE1BQ3pELE9BQU87QUFDTCxlQUFPLFlBQVksSUFBSSxNQUFNLFNBQVMsUUFBUTtBQUFBLE1BQ2hEO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFFRjtBQVNBLGVBQWUsUUFBUSxNQUE2QjtBQUNsRCxRQUFNLFdBQVcsS0FBSyxJQUFJLElBQUk7QUFDOUIsU0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFFBQUk7QUFDRixZQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUMvQztBQUFBLElBQ0YsUUFBUTtBQUNOLFlBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixtQkFBVyxTQUFTLDhCQUE4QjtBQUFBLE1BQ3BELENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLFFBQU0sR0FBRyxNQUFNLEVBQUUsT0FBTyxNQUFNLFdBQVcsS0FBSyxDQUFDO0FBQ2pEOyIsCiAgIm5hbWVzIjogW10KfQo=
192
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RlbXBvcmFyeS12YXVsdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1hbmFnZXMgdGVtcG9yYXJ5IHZhdWx0IGxpZmVjeWNsZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICBybVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHtcbiAgZGlybmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdldFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuaW1wb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcblxuLyoqXG4gKiBDb250ZW50IHZhbHVlIGZvciBhIHNpbmdsZSBlbnRyeSBpbiBhIHtAbGluayBQb3B1bGF0ZUZpbGVzfSBtYXAuXG4gKlxuICogLSBgc3RyaW5nYCBcdTIwMTQgdGV4dCBmaWxlICh3cml0dGVuIGFzIFVURi04KS5cbiAqIC0gYFVpbnQ4QXJyYXlgIFx1MjAxNCBiaW5hcnkgZmlsZSAod3JpdHRlbiBhcyByYXcgYnl0ZXM7IGBCdWZmZXJgIGlzIGFjY2VwdGVkXG4gKiAgIGJlY2F1c2UgYEJ1ZmZlciBleHRlbmRzIFVpbnQ4QXJyYXlgKS5cbiAqIC0gYHVuZGVmaW5lZGAgXHUyMDE0IGVtcHR5IGZvbGRlciAodGhlIGtleSAqKm11c3QqKiBlbmQgd2l0aCBgL2ApLlxuICovXG5leHBvcnQgdHlwZSBQb3B1bGF0ZUZpbGVDb250ZW50ID0gc3RyaW5nIHwgVWludDhBcnJheSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIG1hcCBvZiB2YXVsdC1yZWxhdGl2ZSBwYXRocyB0byB0aGVpciBjb250ZW50LCB1c2VkIGJ5XG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucG9wdWxhdGV9LlxuICpcbiAqIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBkZW5vdGUgZm9sZGVycyBhbmQgKiptdXN0KiogaGF2ZSBhbiBgdW5kZWZpbmVkYCB2YWx1ZS5cbiAqIEFsbCBvdGhlciBwYXRocyBhcmUgd3JpdHRlbiBhcyBmaWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUG9wdWxhdGVGaWxlc1BhcmFtcyA9IFJlY29yZDxzdHJpbmcsIFBvcHVsYXRlRmlsZUNvbnRlbnQ+O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSB7QGxpbmsgVGVtcG9yYXJ5VmF1bHR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBvcmFyeVZhdWx0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSByZW1vdmVzIHRoZSB2YXVsdCAqKmRpcmVjdG9yeSoqLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBjcmVhdGVkIHRoYXQgZGlyZWN0b3J5IFx1MjAxNCBgdHJ1ZWAgZm9yIGEgdGVtcFxuICAgKiBkaXJlY3RvcnkgdGhlIGNvbnN0cnVjdG9yIG1hZGUgKG5vIGBwYXRoYCBhcmd1bWVudCksIGBmYWxzZWAgZm9yIGEgZGlyZWN0b3J5IGhhbmRlZCB0byBpdCBhcyBhblxuICAgKiBleHBsaWNpdCBgcGF0aGAuIEEgaGFuZGxlIG92ZXIgc29tZWJvZHkgZWxzZSdzIGRpcmVjdG9yeSB1bnJlZ2lzdGVycyB0aGUgdmF1bHQgYnV0IGxlYXZlcyB0aGVcbiAgICogZmlsZXMgYWxvbmUsIHNvIHdyYXBwaW5nIGEgZGlyZWN0b3J5IGNhbm5vdCBkZXN0cm95IGl0LiBTZXQgZXhwbGljaXRseSB0byBvdmVycmlkZS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZT86IGJvb2xlYW47XG59XG5cbmNvbnN0IFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFJNX1JFVFJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEEgdGVtcG9yYXJ5IE9ic2lkaWFuIHZhdWx0IGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBDcmVhdGVzIGEgdGVtcCBkaXJlY3RvcnkgYW5kIHJlZ2lzdGVycyBpdCBpbiB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogc28gdGhhdCB0aGUgT2JzaWRpYW4gQ0xJIGNhbiB0YXJnZXQgaXQgdmlhIGBjd2RgLlxuICpcbiAqIEEgaGFuZGxlICoqb3ducyoqIHRoZSBkaXJlY3Rvcnkgb25seSB3aGVuIGl0IGNyZWF0ZWQgaXQuIHtAbGluayBUZW1wb3JhcnlWYXVsdC5kaXNwb3NlfSBkZWxldGVzIGFuXG4gKiBvd25lZCBkaXJlY3RvcnkgYW5kIGxlYXZlcyBhIGJvcnJvd2VkIG9uZSBpbiBwbGFjZSBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHRPcHRpb25zLnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZX0sIHdoaWNoIG92ZXJyaWRlcyB0aGF0IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wb3JhcnlWYXVsdCB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdGVtcG9yYXJ5IHZhdWx0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQuZGlzcG9zZX0gcmVtb3ZlcyB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucGF0aH0gZnJvbSBkaXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB0ZW1wIHZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIEFuIGV4cGxpY2l0IHZhdWx0IHBhdGguIElmIG9taXR0ZWQsIGEgdGVtcCBkaXJlY3RvcnkgaXMgY3JlYXRlZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBWYXVsdCBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg/OiBzdHJpbmcsIG9wdGlvbnM/OiBUZW1wb3JhcnlWYXVsdE9wdGlvbnMpIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoID8/IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFRFTVBfVkFVTFRfRElSX1BSRUZJWCkpO1xuICAgIHRoaXMuI3Nob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA9IG9wdGlvbnM/LnNob3VsZFJlbW92ZURpcmVjdG9yeU9uRGlzcG9zZSA/PyBwYXRoID09PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIHZhdWx0IGZyb20gT2JzaWRpYW4gYW5kLCB3aGVuIHRoaXMgaGFuZGxlIG93bnMgdGhlIGRpcmVjdG9yeSwgZGVsZXRlcyBpdC5cbiAgICpcbiAgICogVGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiB0aGlzIGluc3RhbmNlIGNyZWF0ZWQgaXQsIG9yIHdoZW5cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0T3B0aW9ucy5zaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2V9IHNhaWQgc28gZXhwbGljaXRseS4gVGhhdCBpcyB3aGF0XG4gICAqIG1ha2VzIGEgaGFuZGxlIG92ZXIgYSBkaXJlY3Rvcnkgc29tZWJvZHkgZWxzZSBvd25zIFx1MjAxNCB0aGUgcnVuJ3Mgc2hhcmVkIHNldHVwIHZhdWx0LCBzYXksIHdoaWNoXG4gICAqIGBnZXRUZW1wb3JhcnlWYXVsdCgpYCB3cmFwcyBcdTIwMTQgc2FmZSB0byBkaXNwb3NlIGZyb20gYSBjb25zdW1lcidzIGBhZnRlckFsbGAuXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc3BvcnRPdmVycmlkZSAtIEFuIGV4cGxpY2l0IHRyYW5zcG9ydCB0byB1c2Ugd2hlbiB1bnJlZ2lzdGVyaW5nLlxuICAgKiAgIFdoZW4gb21pdHRlZCwgZmFsbHMgYmFjayB0byB0aGUgdHJhbnNwb3J0IGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB1bnJlZ2lzdGVyVmF1bHQodGhpcy5wYXRoLCB0cmFuc3BvcnRPdmVycmlkZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLiNzaG91bGRSZW1vdmVEaXJlY3RvcnlPbkRpc3Bvc2UpIHtcbiAgICAgICAgYXdhaXQgcmV0cnlSbSh0aGlzLnBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGBbdGVtcG9yYXJ5LXZhdWx0XSBVbnJlZ2lzdGVyZWQgYnV0IGtlcHQgdGhlIHZhdWx0IGRpcmVjdG9yeSwgd2hpY2ggdGhpcyBoYW5kbGUgZG9lcyBub3Qgb3duOiAke3RoaXMucGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGZpbGVzIGFuZCBmb2xkZXJzIGludG8gdGhlIHZhdWx0IGRpcmVjdG9yeSAqKm9uIHRoZSBob3N0KiouXG4gICAqIFBhcmVudCBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiAtIGBzdHJpbmdgIHZhbHVlcyBhcmUgd3JpdHRlbiBhcyBVVEYtOCB0ZXh0IGZpbGVzLlxuICAgKiAtIGBVaW50OEFycmF5YCB2YWx1ZXMgKGluY2x1ZGluZyBgQnVmZmVyYCkgYXJlIHdyaXR0ZW4gYXMgYmluYXJ5IGZpbGVzLlxuICAgKiAtIFBhdGhzIGVuZGluZyB3aXRoIGAvYCBhcmUgdHJlYXRlZCBhcyBlbXB0eSBmb2xkZXJzICh2YWx1ZSBtdXN0IGJlIGB1bmRlZmluZWRgKS5cbiAgICpcbiAgICogVGhlIHdyaXRlIGlzIGFsd2F5cyBob3N0LWxvY2FsIFx1MjAxNCB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucGF0aH0gaXMgYSBob3N0IHBhdGgsIGFuZCBvbiBhIG1vYmlsZVxuICAgKiB0cmFuc3BvcnQgdGhlIHZhdWx0IHRoZSBhcHAgb3BlbnMgbGl2ZXMgb24gdGhlIGRldmljZSBpbnN0ZWFkLiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQucmVnaXN0ZXJ9XG4gICAqIGNhcnJpZXMgdGhlIGRpcmVjdG9yeSBhY3Jvc3MgYmVmb3JlIGl0IHJlZ2lzdGVycywgc28gcG9wdWxhdGUtdGhlbi1yZWdpc3RlciBpcyBhbGwgYSBjYWxsZXJcbiAgICogbmVlZHM7IHtAbGluayBUZW1wb3JhcnlWYXVsdC5zeW5jVG9EZXZpY2V9IGlzIHRoZSBzZWFtIHRoYXQgZG9lcyB0aGUgY2FycnlpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlcyAtIE1hcCBvZiBmaWxlL2ZvbGRlciBwYXRocyB0byBjb250ZW50LlxuICAgKi9cbiAgcHVibGljIHBvcHVsYXRlKGZpbGVzOiBQb3B1bGF0ZUZpbGVzUGFyYW1zKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVzKSkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKHRoaXMucGF0aCwgZmlsZVBhdGgpO1xuICAgICAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm9sZGVyIHBhdGggXCIke2ZpbGVQYXRofVwiIG11c3QgaGF2ZSB1bmRlZmluZWQgY29udGVudGApO1xuICAgICAgICB9XG4gICAgICAgIG1rZGlyU3luYyhmdWxsUGF0aCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIHBhdGggXCIke2ZpbGVQYXRofVwiIG11c3QgaGF2ZSBkZWZpbmVkIGNvbnRlbnQ7IHVzZSBhIHRyYWlsaW5nIFwiL1wiIGZvciBmb2xkZXJzYCk7XG4gICAgICAgIH1cbiAgICAgICAgbWtkaXJTeW5jKGRpcm5hbWUoZnVsbFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgd3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgY29udGVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGlzIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHNvIHRoZSBDTEkgY2FuIHRhcmdldCBpdC5cbiAgICpcbiAgICogUHVzaGVzIHRoZSB2YXVsdCBkaXJlY3RvcnkgdG8gdGhlIHRhcmdldCBkZXZpY2UgZmlyc3QsIHZpYVxuICAgKiB7QGxpbmsgVGVtcG9yYXJ5VmF1bHQuc3luY1RvRGV2aWNlfSBcdTIwMTQgYSBuby1vcCBvbiBhIHRyYW5zcG9ydCB3aG9zZSBhcHAgYWxyZWFkeSByZWFkcyB0aGUgaG9zdFxuICAgKiBmaWxlc3lzdGVtLiBUaGF0IG9yZGVyaW5nIHVzZWQgdG8gYmUgdGhlIGNhbGxlcidzIHRvIHJlbWVtYmVyLCBhbmQgYSBjYWxsZXIgd2hvIGZvcmdvdCBnb3QgYVxuICAgKiBzaWxlbnRseSAqKmVtcHR5KiogdmF1bHQgcmF0aGVyIHRoYW4gYW4gZXJyb3I6IGV2ZXJ5IHByZS1yZWdpc3RyYXRpb25cbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBvcHVsYXRlfSB3cml0ZSBzdGF5ZWQgb24gdGhlIGhvc3Qgd2hpbGUgdGhlIGFwcCBvcGVuZWQgdGhlIGRldmljZSdzIGNvcHkuXG4gICAqIEZvbGRpbmcgaXQgaW4gaGVyZSBtYWtlcyBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIGNvcnJlY3Qgb24gZXZlcnkgdHJhbnNwb3J0LlxuICAgKlxuICAgKiBUaGUgdHJhbnNwb3J0IGlzIHJlc29sdmVkIG9uY2UgYW5kIGhhbmRlZCB0byBib3RoIHN0ZXBzLCBzbyBhIHB1c2ggYW5kIHRoZSByZWdpc3RyYXRpb24gdGhhdFxuICAgKiBmb2xsb3dzIGl0IGNhbiBuZXZlciBsYW5kIG9uIHR3byBkaWZmZXJlbnQgdHJhbnNwb3J0cy5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZS4gV2hlbiBvbWl0dGVkLFxuICAgKiAgIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3Rlcih0cmFuc3BvcnRPdmVycmlkZT86IE9ic2lkaWFuVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGF3YWl0IHJlZ2lzdGVyVmF1bHQodGhpcy5wYXRoLCB0cmFuc3BvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIGRpc3Bvc2FibGUgc3VwcG9ydCBmb3IgYGF3YWl0IHVzaW5nYC5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmF1bHQgaXMgZGlzcG9zZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgdGhhdCByZXF1aXJlcyBhIHJ1bm5pbmcgdHJhbnNwb3J0LiAqL1xuXG4gIC8qKlxuICAgKiBQdXNoZXMgYWxsIGZpbGVzIGZyb20gdGhlIGxvY2FsIHN0YWdpbmcgZGlyZWN0b3J5IHRvIHRoZSB0YXJnZXQgZGV2aWNlXG4gICAqIHZpYSB0aGUgYWN0aXZlIHRyYW5zcG9ydCdzIGBwdXNoRmlsZXMoKWAuXG4gICAqXG4gICAqIE9uIGRlc2t0b3AgdHJhbnNwb3J0cyB0aGlzIGlzIGEgbm8tb3AgKGZpbGVzIGFyZSBhbHJlYWR5IGxvY2FsKS5cbiAgICogT24gbW9iaWxlIHRyYW5zcG9ydHMgKEFwcGl1bSkgdGhpcyBwdXNoZXMgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICpcbiAgICoge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnJlZ2lzdGVyfSBjYWxscyB0aGlzIGl0c2VsZiwgc28gYSBwb3B1bGF0ZS10aGVuLXJlZ2lzdGVyIHNlcXVlbmNlIG5lZWRzXG4gICAqIG5vdGhpbmcgZXh0cmEuIENhbGwgaXQgZGlyZWN0bHkgb25seSB0byBjYXJyeSBhY3Jvc3MgZmlsZXMgd3JpdHRlbiAqKmFmdGVyKiogcmVnaXN0cmF0aW9uOiB0aGVcbiAgICogaG9zdCBkaXJlY3RvcnkgaXMgbm90IG1pcnJvcmVkLCBzbyBhIGxhdGVyIHdyaXRlIGludG8ge0BsaW5rIFRlbXBvcmFyeVZhdWx0LnBhdGh9IHN0YXlzIG9uIHRoZVxuICAgKiBob3N0IHVudGlsIHRoaXMgcnVucyBhZ2Fpbi5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zcG9ydE92ZXJyaWRlIC0gQW4gZXhwbGljaXQgdHJhbnNwb3J0IHRvIHVzZS4gV2hlbiBvbWl0dGVkLFxuICAgKiAgIGZhbGxzIGJhY2sgdG8gdGhlIHRyYW5zcG9ydCBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jVG9EZXZpY2UodHJhbnNwb3J0T3ZlcnJpZGU/OiBPYnNpZGlhblRyYW5zcG9ydCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgaWYgKCF0cmFuc3BvcnQucHVzaEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyh0aGlzLnBhdGgpO1xuICAgIGF3YWl0IHRyYW5zcG9ydC5wdXNoRmlsZXModGhpcy5wYXRoLCBmaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgcmVhZHMgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgaW50byBhIGZsYXQgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZWFkLlxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzIHRvIGNvbnRlbnQgYnVmZmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZSh0aGlzLnBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGZ1bGxQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbcmVsYXRpdmVQYXRoXSA9IGF3YWl0IHJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogUmV0cmllcyBgcm1gIHVudGlsIGl0IHN1Y2NlZWRzIG9yIHRpbWVzIG91dC5cbiAqIE9ic2lkaWFuIG1heSBob2xkIGZpbGUgbG9ja3MgYnJpZWZseSBhZnRlciBhIHdpbmRvdyBpcyBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXRyeVJtKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSTV9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWwgYXR0ZW1wdCBcdTIwMTQgbGV0IGl0IHRocm93LlxuICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBb0NQLE1BQU0saUNBQWlDO0FBQ3ZDLE1BQU0sbUNBQW1DO0FBWWxDLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRRixZQUFZLE1BQWUsU0FBaUM7QUFDakUsU0FBSyxPQUFPLFFBQVEsWUFBWSxLQUFLLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztBQUNyRSxTQUFLLGtDQUFrQyxTQUFTLGtDQUFrQyxTQUFTO0FBQUEsRUFDN0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhQSxNQUFhLFFBQVEsbUJBQXNEO0FBQ3pFLFFBQUk7QUFDRixZQUFNLGdCQUFnQixLQUFLLE1BQU0saUJBQWlCO0FBQUEsSUFDcEQsVUFBRTtBQUNBLFVBQUksS0FBSyxpQ0FBaUM7QUFDeEMsY0FBTSxRQUFRLEtBQUssSUFBSTtBQUFBLE1BQ3pCLE9BQU87QUFDTCxZQUFJLGdHQUFnRyxLQUFLLElBQUksRUFBRTtBQUFBLE1BQ2pIO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCTyxTQUFTLE9BQWtDO0FBQ2hELGVBQVcsQ0FBQyxVQUFVLE9BQU8sS0FBSyxPQUFPLFFBQVEsS0FBSyxHQUFHO0FBQ3ZELFlBQU0sV0FBVyxLQUFLLEtBQUssTUFBTSxRQUFRO0FBQ3pDLFVBQUksU0FBUyxTQUFTLEdBQUcsR0FBRztBQUMxQixZQUFJLFlBQVksUUFBVztBQUN6QixnQkFBTSxJQUFJLE1BQU0sZ0JBQWdCLFFBQVEsK0JBQStCO0FBQUEsUUFDekU7QUFDQSxrQkFBVSxVQUFVLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFBQSxNQUN6QyxPQUFPO0FBQ0wsWUFBSSxZQUFZLFFBQVc7QUFDekIsZ0JBQU0sSUFBSSxNQUFNLGNBQWMsUUFBUSw2REFBNkQ7QUFBQSxRQUNyRztBQUNBLGtCQUFVLFFBQVEsUUFBUSxHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDaEQsc0JBQWMsVUFBVSxPQUFPO0FBQUEsTUFDakM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFrQkEsTUFBYSxTQUFTLG1CQUFzRDtBQUMxRSxVQUFNLFlBQVkscUJBQXFCLE1BQU0scUJBQXFCLG9CQUFvQixDQUFDO0FBQ3ZGLFVBQU0sS0FBSyxhQUFhLFNBQVM7QUFDakMsVUFBTSxjQUFjLEtBQUssTUFBTSxTQUFTO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxXQUFPLEtBQUssUUFBUTtBQUFBLEVBQ3RCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW1CQSxNQUFhLGFBQWEsbUJBQXNEO0FBQzlFLFVBQU0sWUFBWSxxQkFBcUIsTUFBTSxxQkFBcUIsb0JBQW9CLENBQUM7QUFDdkYsUUFBSSxDQUFDLFVBQVUsV0FBVztBQUN4QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFFBQVEsTUFBTSxLQUFLLGFBQWEsS0FBSyxJQUFJO0FBQy9DLFVBQU0sVUFBVSxVQUFVLEtBQUssTUFBTSxLQUFLO0FBQUEsRUFDNUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE1BQWMsYUFBYSxXQUF3RDtBQUNqRixVQUFNLFNBQXFDLENBQUM7QUFDNUMsVUFBTSxVQUFVLE1BQU0sUUFBUSxXQUFXLEVBQUUsZUFBZSxLQUFLLENBQUM7QUFFaEUsZUFBVyxTQUFTLFNBQVM7QUFDM0IsWUFBTSxXQUFXLEtBQUssV0FBVyxNQUFNLElBQUk7QUFDM0MsWUFBTSxlQUFlLFNBQVMsS0FBSyxNQUFNLFFBQVE7QUFFakQsVUFBSSxNQUFNLFlBQVksR0FBRztBQUN2QixlQUFPLE9BQU8sUUFBUSxNQUFNLEtBQUssYUFBYSxRQUFRLENBQUM7QUFBQSxNQUN6RCxPQUFPO0FBQ0wsZUFBTyxZQUFZLElBQUksTUFBTSxTQUFTLFFBQVE7QUFBQSxNQUNoRDtBQUFBLElBQ0Y7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBRUY7QUFTQSxlQUFlLFFBQVEsTUFBNkI7QUFDbEQsUUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJO0FBQzlCLFNBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixRQUFJO0FBQ0YsWUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDL0M7QUFBQSxJQUNGLFFBQVE7QUFDTixZQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsbUJBQVcsU0FBUyw4QkFBOEI7QUFBQSxNQUNwRCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUNqRDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -63,6 +63,14 @@ export interface AppiumTransportConfig {
63
63
  * Defaults to `'md.obsidian'`.
64
64
  */
65
65
  appId?: string;
66
+ /**
67
+ * Timeout in milliseconds for Obsidian Mobile to get as far as `globalThis.app`
68
+ * existing after the vault is (re)opened, before the tighter
69
+ * {@link layoutReadyTimeoutInMilliseconds} clock starts.
70
+ *
71
+ * @default `180000`
72
+ */
73
+ appStartTimeoutInMilliseconds?: number;
66
74
  /**
67
75
  * The Appium browser/driver instance.
68
76
  * Created by the consumer via e.g. WebDriverIO's `remote()`.
@@ -84,8 +92,9 @@ export interface AppiumTransportConfig {
84
92
  */
85
93
  isSessionOwner?: boolean;
86
94
  /**
87
- * Timeout in milliseconds for waiting for `app.workspace.layoutReady` after
88
- * the vault is (re)opened.
95
+ * Timeout in milliseconds for waiting for `app.workspace.layoutReady`, counted
96
+ * from the moment {@link appStartTimeoutInMilliseconds} is satisfied — not from
97
+ * the reload, so a cold app start is not charged against it.
89
98
  *
90
99
  * @default `90000`
91
100
  */
@@ -141,6 +150,7 @@ export declare class AppiumTransport implements ObsidianTransport {
141
150
  */
142
151
  readonly isMobile = true;
143
152
  private readonly appId;
153
+ private readonly appStartTimeoutInMilliseconds;
144
154
  private readonly browser;
145
155
  private readonly deviceId;
146
156
  /**
@@ -280,7 +290,8 @@ export declare class AppiumTransport implements ObsidianTransport {
280
290
  * 3. Add the vault to localStorage (`mobile-external-vaults`, `mobile-selected-vault`,
281
291
  * `enable-plugin-<path>`)
282
292
  * 4. Trigger `location.reload()` so Obsidian re-reads localStorage and opens the vault
283
- * 5. Wait for `app.workspace.layoutReady`
293
+ * 5. Wait for `globalThis.app` to exist (the app's cold start), then — on a
294
+ * separate, tighter budget — for `app.workspace.layoutReady`
284
295
  *
285
296
  * Existing vault registrations in localStorage are preserved (append, not
286
297
  * overwrite) — except the **harness's own** `temp-vault-*` registrations from
@@ -352,6 +363,16 @@ export declare class AppiumTransport implements ObsidianTransport {
352
363
  * @param payload - The raw JSON payload the binding was called with.
353
364
  */
354
365
  private handleInputRequest;
366
+ /**
367
+ * Probes the WebView once for how far Obsidian's startup has got.
368
+ *
369
+ * A probe that throws is reported as `undefined` rather than propagated: the
370
+ * page is mid-`location.reload()` for most of the app-start phase, and a
371
+ * WebView that cannot answer yet is the *expected* reading there, not an error.
372
+ *
373
+ * @returns What the probe saw, or `undefined` when it could not run.
374
+ */
375
+ private probeStartup;
355
376
  /**
356
377
  * Pushes the minimal `.obsidian/app.json` vault marker via `adb push`.
357
378
  *
@@ -385,8 +406,37 @@ export declare class AppiumTransport implements ObsidianTransport {
385
406
  * stack a listener per reconnect.
386
407
  */
387
408
  private unregisterInputChannelExitHandler;
409
+ /**
410
+ * Polls until `globalThis.app` exists in the WebView — the app has finished
411
+ * its cold start and Obsidian's own boot has begun.
412
+ *
413
+ * This is the **first** of the two budgets spent after `location.reload()`,
414
+ * and the generous one. Everything it pays for is outside Obsidian's control:
415
+ * the WebView reloading, and a guest that may still be optimizing packages.
416
+ * Keeping it separate is the point of the split — the old single wall clock
417
+ * started here and left the tight layout budget paying for a cold start.
418
+ */
419
+ private waitForAppStarted;
388
420
  /**
389
421
  * Polls until `app.workspace.layoutReady` is `true` in the WebView.
422
+ *
423
+ * The **second** budget, and the tight one: by the time it starts, the app is
424
+ * already up, so all it covers is Obsidian opening the vault and loading
425
+ * plugins — ~1s in practice, ≤8.4s under heavy host stress (**L19**).
390
426
  */
391
427
  private waitForLayoutReady;
428
+ /**
429
+ * Polls the WebView until a startup phase's milestone is satisfied, tracking
430
+ * the evidence that tells a slow Obsidian from a contended guest.
431
+ *
432
+ * Each poll costs exactly one `browser.execute` round-trip — deliberately not
433
+ * an {@link ensureWebViewContext} call, whose `getContexts()` runs
434
+ * `adb shell cat /proc/net/unix` and was measured at ~17s per **L19**. The
435
+ * round-trip is timed, and the slowest one is reported on timeout: a phase
436
+ * that ran out after a handful of probes each taking tens of seconds was
437
+ * starved by the guest, not by Obsidian.
438
+ *
439
+ * @param params - The phase, its budget, and the predicate that ends it.
440
+ */
441
+ private waitForStartupMilestone;
392
442
  }