obsidian-integration-testing 12.0.0 → 12.1.1

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 (212) 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/adb.cjs +61 -0
  4. package/dist/lib/cjs/adb.d.cts +61 -0
  5. package/dist/lib/cjs/android-sdk.cjs +52 -0
  6. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  7. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  8. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  9. package/dist/lib/cjs/appium-server-marker.cjs +29 -32
  10. package/dist/lib/cjs/appium-server-marker.d.cts +22 -0
  11. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  12. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  13. package/dist/lib/cjs/community-plugin-registry.cjs +1 -1
  14. package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
  15. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  16. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  17. package/dist/lib/cjs/config-directory.cjs +46 -0
  18. package/dist/lib/cjs/config-directory.d.cts +45 -0
  19. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  20. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  21. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  22. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
  23. package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
  24. package/dist/lib/cjs/device-readiness.cjs +38 -3
  25. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  26. package/dist/lib/cjs/device-screenshot.cjs +42 -0
  27. package/dist/lib/cjs/device-screenshot.d.cts +36 -0
  28. package/dist/lib/cjs/device-setting-restore.cjs +45 -0
  29. package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
  30. package/dist/lib/cjs/device-settings-command.cjs +49 -0
  31. package/dist/lib/cjs/device-settings-command.d.cts +76 -0
  32. package/dist/lib/cjs/device-settings.cjs +88 -0
  33. package/dist/lib/cjs/device-settings.d.cts +94 -0
  34. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  35. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  36. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  37. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  38. package/dist/lib/cjs/emulator-device-id.cjs +32 -0
  39. package/dist/lib/cjs/emulator-device-id.d.cts +49 -0
  40. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  41. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  42. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  43. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  44. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  45. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  46. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  47. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  48. package/dist/lib/cjs/index.cjs +67 -3
  49. package/dist/lib/cjs/index.d.cts +24 -1
  50. package/dist/lib/cjs/library.cjs +1 -1
  51. package/dist/lib/cjs/mobile-input.cjs +14 -2
  52. package/dist/lib/cjs/mobile-input.d.cts +5 -9
  53. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  54. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  55. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  56. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  57. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  58. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  59. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  60. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  61. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  62. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  63. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  64. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  65. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  66. package/dist/lib/cjs/port-owner.cjs +61 -0
  67. package/dist/lib/cjs/port-owner.d.cts +47 -0
  68. package/dist/lib/cjs/process-capture.cjs +62 -0
  69. package/dist/lib/cjs/process-capture.d.cts +83 -0
  70. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  71. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  72. package/dist/lib/cjs/process-liveness.cjs +51 -0
  73. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  74. package/dist/lib/cjs/resolve-emulator-device-id.cjs +54 -0
  75. package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -0
  76. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  77. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  78. package/dist/lib/cjs/soft-keyboard-geometry.cjs +75 -0
  79. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
  80. package/dist/lib/cjs/soft-keyboard.cjs +118 -0
  81. package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
  82. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  83. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  84. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  85. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  86. package/dist/lib/cjs/transport-appium.cjs +102 -17
  87. package/dist/lib/cjs/transport-appium.d.cts +53 -3
  88. package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
  89. package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
  90. package/dist/lib/cjs/transport-factory.cjs +951 -133
  91. package/dist/lib/cjs/transport-options.cjs +11 -3
  92. package/dist/lib/cjs/transport-options.d.cts +131 -12
  93. package/dist/lib/cjs/transport.cjs +1 -1
  94. package/dist/lib/cjs/transport.d.cts +7 -1
  95. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  96. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  97. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  98. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  99. package/dist/lib/cjs/version-matrix.cjs +1 -1
  100. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  101. package/dist/lib/cjs/webview-cdp.cjs +6 -7
  102. package/dist/lib/cjs/webview-cdp.d.cts +5 -1
  103. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  104. package/dist/lib/esm/adb-device-list.mjs +28 -0
  105. package/dist/lib/esm/adb.d.mts +61 -0
  106. package/dist/lib/esm/adb.mjs +35 -0
  107. package/dist/lib/esm/android-sdk.d.mts +29 -0
  108. package/dist/lib/esm/android-sdk.mjs +18 -0
  109. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  110. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  111. package/dist/lib/esm/appium-server-marker.d.mts +22 -0
  112. package/dist/lib/esm/appium-server-marker.mjs +28 -22
  113. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  114. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  115. package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
  116. package/dist/lib/esm/community-plugin-registry.mjs +1 -1
  117. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  118. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  119. package/dist/lib/esm/config-directory.d.mts +45 -0
  120. package/dist/lib/esm/config-directory.mjs +21 -0
  121. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  122. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  123. package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
  124. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  125. package/dist/lib/esm/demo-vault-populate.mjs +3 -2
  126. package/dist/lib/esm/device-readiness.d.mts +83 -9
  127. package/dist/lib/esm/device-readiness.mjs +34 -2
  128. package/dist/lib/esm/device-screenshot.d.mts +36 -0
  129. package/dist/lib/esm/device-screenshot.mjs +18 -0
  130. package/dist/lib/esm/device-setting-restore.d.mts +60 -0
  131. package/dist/lib/esm/device-setting-restore.mjs +20 -0
  132. package/dist/lib/esm/device-settings-command.d.mts +76 -0
  133. package/dist/lib/esm/device-settings-command.mjs +23 -0
  134. package/dist/lib/esm/device-settings.d.mts +94 -0
  135. package/dist/lib/esm/device-settings.mjs +67 -0
  136. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  137. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  138. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  139. package/dist/lib/esm/emulator-backend.mjs +45 -0
  140. package/dist/lib/esm/emulator-device-id.d.mts +49 -0
  141. package/dist/lib/esm/emulator-device-id.mjs +8 -0
  142. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  143. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  144. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  145. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  146. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  147. package/dist/lib/esm/global-setup-core.mjs +34 -35
  148. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  149. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  150. package/dist/lib/esm/index.d.mts +24 -1
  151. package/dist/lib/esm/index.mjs +68 -2
  152. package/dist/lib/esm/library.mjs +1 -1
  153. package/dist/lib/esm/mobile-input.d.mts +5 -9
  154. package/dist/lib/esm/mobile-input.mjs +14 -2
  155. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  156. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  157. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  158. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  159. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  160. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  161. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  162. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  163. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  164. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  165. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  166. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  167. package/dist/lib/esm/parent-liveness.mjs +42 -5
  168. package/dist/lib/esm/port-owner.d.mts +47 -0
  169. package/dist/lib/esm/port-owner.mjs +36 -0
  170. package/dist/lib/esm/process-capture.d.mts +83 -0
  171. package/dist/lib/esm/process-capture.mjs +38 -0
  172. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  173. package/dist/lib/esm/process-exit-message.mjs +13 -8
  174. package/dist/lib/esm/process-liveness.d.mts +18 -0
  175. package/dist/lib/esm/process-liveness.mjs +17 -0
  176. package/dist/lib/esm/resolve-emulator-device-id.d.mts +28 -0
  177. package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -0
  178. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  179. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  180. package/dist/lib/esm/soft-keyboard-geometry.d.mts +156 -0
  181. package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
  182. package/dist/lib/esm/soft-keyboard.d.mts +82 -0
  183. package/dist/lib/esm/soft-keyboard.mjs +91 -0
  184. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  185. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  186. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  187. package/dist/lib/esm/temporary-vault.mjs +43 -8
  188. package/dist/lib/esm/transport-appium.d.mts +53 -3
  189. package/dist/lib/esm/transport-appium.mjs +108 -17
  190. package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
  191. package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
  192. package/dist/lib/esm/transport-factory.mjs +995 -138
  193. package/dist/lib/esm/transport-options.d.mts +131 -12
  194. package/dist/lib/esm/transport-options.mjs +9 -2
  195. package/dist/lib/esm/transport.d.mts +7 -1
  196. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  197. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  198. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  199. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  200. package/dist/lib/esm/version-matrix.d.mts +2 -2
  201. package/dist/lib/esm/version-matrix.mjs +1 -1
  202. package/dist/lib/esm/webview-cdp.d.mts +5 -1
  203. package/dist/lib/esm/webview-cdp.mjs +6 -7
  204. package/package.json +26 -24
  205. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  206. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  207. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  208. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  209. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  210. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  211. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  212. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -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/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG4gICAgaWYgKCF0cmFuc3BvcnQucHVzaEZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyh0aGlzLnBhdGgpO1xuICAgIGF3YWl0IHRyYW5zcG9ydC5wdXNoRmlsZXModGhpcy5wYXRoLCBmaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgcmVhZHMgYWxsIGZpbGVzIGZyb20gYSBkaXJlY3RvcnkgaW50byBhIGZsYXQgbWFwLlxuICAgKlxuICAgKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byByZWFkLlxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiByZWxhdGl2ZSBmaWxlIHBhdGhzIHRvIGNvbnRlbnQgYnVmZmVycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBVaW50OEFycmF5Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4gPSB7fTtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihkaXJlY3RvcnksIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpcmVjdG9yeSwgZW50cnkubmFtZSk7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZSh0aGlzLnBhdGgsIGZ1bGxQYXRoKTtcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGZ1bGxQYXRoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbcmVsYXRpdmVQYXRoXSA9IGF3YWl0IHJlYWRGaWxlKGZ1bGxQYXRoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG5cbi8qKlxuICogUmV0cmllcyBgcm1gIHVudGlsIGl0IHN1Y2NlZWRzIG9yIHRpbWVzIG91dC5cbiAqIE9ic2lkaWFuIG1heSBob2xkIGZpbGUgbG9ja3MgYnJpZWZseSBhZnRlciBhIHdpbmRvdyBpcyBkZXN0cm95ZWQuXG4gKlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRvIHJlbW92ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpcmVjdG9yeSBpcyByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXRyeVJtKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBSTV9SRVRSWV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIFJNX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWwgYXR0ZW1wdCBcdTIwMTQgbGV0IGl0IHRocm93LlxuICBhd2FpdCBybShwYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBSVAsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBb0NQLE1BQU0saUNBQWlDO0FBQ3ZDLE1BQU0sbUNBQW1DO0FBWWxDLE1BQU0sZUFBZTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVY7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRRixZQUFZLE1BQWUsU0FBaUM7QUFDakUsU0FBSyxPQUFPLFFBQVEsWUFBWSxLQUFLLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQztBQUNyRSxTQUFLLGtDQUFrQyxTQUFTLGtDQUFrQyxTQUFT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
@@ -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
  }