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
@@ -124,4 +124,4 @@ export {
124
124
  bootstrapDemoVaultPlugins,
125
125
  buildDemoVaultPopulateAsync
126
126
  };
127
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtYm9vdHN0cmFwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBkZW1vIHZhdWx0J3MgKippbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyoqIGhlYWRsZXNzbHksIGJ5IGRvd25sb2FkaW5nXG4gKiB0aGVpciBwdWJsaXNoZWQgR2l0SHViIHJlbGVhc2UgYXNzZXRzIHN0cmFpZ2h0IGludG9cbiAqIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYC5cbiAqXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgZWFjaCBpbmplY3RlZCBwbHVnaW4ncyBgbWFpbi5qc2AgL1xuICogYG1hbmlmZXN0Lmpzb25gIHRvIGFscmVhZHkgYmUgb24gZGlzaywgYW5kIHRocm93cyB3aGVuIHRoZXkgYXJlIG5vdC4gVW50aWwgdGhpc1xuICogbW9kdWxlIGV4aXN0ZWQgdGhlIG9ubHkgZG9jdW1lbnRlZCByZW1lZHkgd2FzIGEgKipHVUkgc3RlcCoqIFx1MjAxNCBvcGVuIGBkZW1vLXZhdWx0L2BcbiAqIGluIE9ic2lkaWFuIG9uY2UgYW5kIGxldCBgZGVtby12YXVsdC1oZWxwZXJgIGluc3RhbGwgdGhlIHBsdWdpbiBhdCBydW50aW1lLlxuICogYC5vYnNpZGlhbi9wbHVnaW5zLypgIGlzIGdpdGlnbm9yZWQgaW4gZXZlcnkgZmxlZXQgcGx1Z2luIHJlcG8sIHNvIHRoYXQgc3RhdGVcbiAqIGV4aXN0cyBvbiBleGFjdGx5IHRoZSBvbmUgbWFjaGluZSB0aGF0IGRpZCBpdCBhbmQgaXMgaW52aXNpYmxlIHRvIGEgZnJlc2ggY2xvbmUsXG4gKiBhIG5ldyBtYWNoaW5lLCBvciBDSS4gU2luY2UgYSBwbHVnaW4gcmVwbydzIHJlbGVhc2UgcHJlZmxpZ2h0IHJ1bnMgaXRzXG4gKiBpbnRlZ3JhdGlvbiB0ZXN0cywgdGhhdCBtYWRlICpjdXR0aW5nIGEgcmVsZWFzZSBmcm9tIGEgY2xlYW4gY2xvbmUqIGltcG9zc2libGVcbiAqIHdpdGhvdXQgYSBodW1hbiBvcGVuaW5nIGEgR1VJLlxuICpcbiAqIERvd25sb2FkaW5nIHRoZSByZWxlYXNlIGFzc2V0cyBpcyB0aGUgZXhhY3QgaGVhZGxlc3MgZXF1aXZhbGVudDogdGhlIHJlc3VsdGluZ1xuICogZm9sZGVyIGlzIHdoYXQgT2JzaWRpYW4gaXRzZWxmIHdvdWxkIGhhdmUgaW5zdGFsbGVkLCBzbyB0aGUgc2hpcHBlZFxuICogYCotZGVtby12YXVsdC08dmVyc2lvbj4uemlwYCBzdGF5cyB0aGUgZmxlZXQtc3RhbmRhcmQgYXJ0aWZhY3QuXG4gKlxuICogVHdvIGVudHJ5IHBvaW50cywgcGx1cyB0aGUgYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkgc3ViY29tbWFuZDpcbiAqXG4gKiAtIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfSBcdTIwMTQgaW5zdGFsbCB0aGUgbWlzc2luZyBvbmVzLCBleHBsaWNpdGx5LlxuICogLSB7QGxpbmsgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jfSBcdTIwMTQgZG8gdGhhdCBhbmQgdGhlbiBidWlsZCB0aGUgcG9wdWxhdGUgbWFwLFxuICogICBzbyBhIGdsb2JhbCBzZXR1cCBzZWxmLWhlYWxzIHdpdGggbm8gbWFudWFsIHN0ZXAgYXQgYWxsLlxuICpcbiAqIFRoZSBzeW5jIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCBkZWxpYmVyYXRlbHkga2VlcHMgdGhyb3dpbmc6IGBmZXRjaGAgaGFzIG5vXG4gKiBzeW5jaHJvbm91cyBmb3JtLCBzbyBhdXRvLWhlYWxpbmcgY2FuIG9ubHkgbGl2ZSBvbiBhbiBhc3luYyBzaWJsaW5nLiBJdHMgbWVzc2FnZVxuICogbm93IG5hbWVzIGJvdGggcmVtZWRpZXMgYWJvdmUgaW5zdGVhZCBvZiB0aGUgR1VJIHN0ZXAuXG4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnkgfSBmcm9tICcuL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyxcbiAgSW5qZWN0UGx1Z2luUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wb3JhcnktdmF1bHQubWpzJztcblxuaW1wb3J0IHtcbiAgYnVpbGRQbHVnaW5Bc3NldFVybCxcbiAgQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMLFxuICBpc1ZhbGlkUmVwb1JlZmVyZW5jZSxcbiAgT1BUSU9OQUxfUExVR0lOX0FTU0VUX05BTUVTLFxuICBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMsXG4gIHNlbGVjdFBsdWdpblJlcG9cbn0gZnJvbSAnLi9jb21tdW5pdHktcGx1Z2luLXJlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQge1xuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlLFxuICByZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnksXG4gIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIGBVc2VyLUFnZW50YCBmb3IgdGhlIGFzc2V0IGRvd25sb2FkcywgbWF0Y2hpbmcgYG9ic2lkaWFuLWluc3RhbGxlci50c2AgXHUyMDE0XG4gKiBhIHBsYWluIE5vZGUgZmV0Y2ggaXMgcmVqZWN0ZWQgYnkgc29tZSBDRE4gZWRnZXMuXG4gKi9cbmNvbnN0IERPV05MT0FEX1VTRVJfQUdFTlQgPSAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNC4wLjAuMCBTYWZhcmkvNTM3LjM2JztcblxuY29uc3QgSFRUUF9OT1RfRk9VTkQgPSA0MDQ7XG5cbi8qKlxuICogVGhlIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnksIGZldGNoZWQgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLiBFdmVyeSBpbmplY3RlZFxuICogcGx1Z2luIG9mIGV2ZXJ5IGRlbW8tdmF1bHQgcHJvamVjdCBpbiBhIHJ1biByZXNvbHZlcyBhZ2FpbnN0IHRoZSBzYW1lIHRhYmxlLCBhbmRcbiAqIGl0IGlzIGEgbXVsdGktbWVnYWJ5dGUgZG9jdW1lbnQuXG4gKi9cbmxldCByZWdpc3RyeVByb21pc2U6IFByb21pc2U8cmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdPiB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBpbnN0YWxsIFx1MjAxNCB0aGUgc2FtZSBsaXN0IHBhc3NlZCB0byBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAuIFBsdWdpbnMgd2hvc2VcbiAgICogYmluYXJpZXMgYXJlIGFscmVhZHkgcHJlc2VudCBhcmUgc2tpcHBlZCAodW5sZXNzIHtAbGluayBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUGFyYW1zLnNob3VsZEZvcmNlfSksXG4gICAqIGFzIGFyZSBwbHVnaW5zIGNhcnJ5aW5nIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2luczogcmVhZG9ubHkgSW5qZWN0UGx1Z2luUGFyYW1zW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmUtZG93bmxvYWQgcGx1Z2lucyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZCwgcmVwbGFjaW5nIHRoZW0gd2l0aCB0aGUgY3VycmVudCByZWxlYXNlLlxuICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIFx1MjAxNCB0aGUgbm9ybWFsIHBhdGggaW5zdGFsbHMgb25seSB3aGF0IGlzIG1pc3NpbmcsIHNvIGEgd2FybSBjaGVja291dCBkb2VzIG5vXG4gICAqIG5ldHdvcmsgSS9PIGF0IGFsbC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiBhIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfSBydW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCB7XG4gIC8qKlxuICBUaGUgcGx1Z2lucyB0aGF0IHdlcmUgZG93bmxvYWRlZCBhbmQgd3JpdHRlbiwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBpbnN0YWxsZWQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsZWQ6IHJlYWRvbmx5IEluc3RhbGxlZFBsdWdpbkluZm9bXTtcblxuICAvKipcbiAgVGhlIGlkcyBvZiBwbHVnaW5zIGxlZnQgdW50b3VjaGVkIFx1MjAxNCBhbHJlYWR5IGluc3RhbGxlZCwgb3Igb3B0ZWQgb3V0IHZpYSBhbiBleHBsaWNpdCBgc291cmNlRGlyZWN0b3J5YC5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWRQbHVnaW5JZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE9uZSBwbHVnaW4gaW5zdGFsbGVkIGJ5IHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0YWxsZWRQbHVnaW5JbmZvIHtcbiAgLyoqXG4gIFRoZSBhc3NldCBmaWxlIG5hbWVzIGFjdHVhbGx5IHdyaXR0ZW4sIGUuZy4gYFsnbWFpbi5qcycsICdtYW5pZmVzdC5qc29uJywgJ3N0eWxlcy5jc3MnXWAuXG4gICAqL1xuICByZWFkb25seSBhc3NldE5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgVGhlIHBsdWdpbidzIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIEdpdEh1YiByZXBvc2l0b3J5IHRoZSBhc3NldHMgY2FtZSBmcm9tLCBhcyBgb3duZXIvbmFtZWAuXG4gICAqL1xuICByZWFkb25seSByZXBvOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSByZWxlYXNlIHRhZyBkb3dubG9hZGVkIGZyb20sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSB3YXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbnN0YWxscyBldmVyeSBpbmplY3RlZCBjb21tdW5pdHkgcGx1Z2luIHdob3NlIGJ1aWx0IGZpbGVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQsIGJ5XG4gKiBkb3dubG9hZGluZyBpdHMgcHVibGlzaGVkIHJlbGVhc2UgYXNzZXRzIGludG8gYGRlbW8tdmF1bHQvLm9ic2lkaWFuL3BsdWdpbnMvPGlkPi9gLlxuICpcbiAqIEVhY2ggcGx1Z2luJ3MgcmVwb3NpdG9yeSBjb21lcyBmcm9tIGl0cyB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnJlcG99IHdoZW4gZ2l2ZW4sIG90aGVyd2lzZSBmcm9tXG4gKiBPYnNpZGlhbidzIG93biBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5IFx1MjAxNCB0aGUgc2FtZSBgaWRgIFx1MjE5MiBgcmVwb2AgdGFibGUgdGhlIGluLWFwcCBjb21tdW5pdHkgYnJvd3NlclxuICogaW5zdGFsbHMgZnJvbSwgc28gbm8gcGx1Z2luLXNwZWNpZmljIG1hcHBpbmcgaXMgaGFyZGNvZGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXN9LlxuICogQHJldHVybnMgV2hhdCB3YXMgaW5zdGFsbGVkIGFuZCB3aGF0IHdhcyBza2lwcGVkLlxuICogQHRocm93cyBFcnJvciBpZiBhIHBsdWdpbidzIHJlcG9zaXRvcnkgY2Fubm90IGJlIHJlc29sdmVkLCBvciBhIHJlcXVpcmVkIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyhwYXJhbXM6IEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNSZXN1bHQ+IHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zLCBzaG91bGRGb3JjZSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYm9vdHN0cmFwcGFibGUgPSBpbmplY3RQbHVnaW5zLmZpbHRlcigocGx1Z2luKSA9PiBwbHVnaW4uc291cmNlRGlyZWN0b3J5ID09PSB1bmRlZmluZWQpO1xuICBjb25zdCB0YXJnZXRzID0gc2hvdWxkRm9yY2UgPyBib290c3RyYXBwYWJsZSA6IHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zKHsgZGVtb1ZhdWx0UGF0aCwgaW5qZWN0UGx1Z2lucyB9KTtcbiAgY29uc3QgdGFyZ2V0UGx1Z2luSWRzID0gbmV3IFNldCh0YXJnZXRzLm1hcCgocGx1Z2luKSA9PiBwbHVnaW4ucGx1Z2luSWQpKTtcblxuICBjb25zdCBpbnN0YWxsZWQ6IEluc3RhbGxlZFBsdWdpbkluZm9bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0YXJnZXRzKSB7XG4gICAgLy8gU2VxdWVudGlhbCBvbiBwdXJwb3NlOiB0aGUgaW5zdGFsbHMgc2hhcmUgb25lIG1lbW9pc2VkIHJlZ2lzdHJ5IGZldGNoLlxuICAgIC8vIFBhcmFsbGVsaXNtIHdvdWxkIGJ1eSBub3RoaW5nIGJ1dCBpbnRlcmxlYXZlZCBsb2dzIGZvciB0aGUgaGFuZGZ1bCBvZiBwbHVnaW5zIGEgZGVtbyB2YXVsdCBpbmplY3RzLlxuICAgIGluc3RhbGxlZC5wdXNoKGF3YWl0IGluc3RhbGxQbHVnaW4oZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGluc3RhbGxlZCxcbiAgICBza2lwcGVkUGx1Z2luSWRzOiBpbmplY3RQbHVnaW5zLm1hcCgocGx1Z2luKSA9PiBwbHVnaW4ucGx1Z2luSWQpLmZpbHRlcigocGx1Z2luSWQpID0+ICF0YXJnZXRQbHVnaW5JZHMuaGFzKHBsdWdpbklkKSlcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgc2VsZi1oZWFsaW5nIGNvdW50ZXJwYXJ0IG9mIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYDogaW5zdGFsbHMgYW55IGluamVjdGVkIGNvbW11bml0eSBwbHVnaW4gd2hvc2VcbiAqIGJpbmFyaWVzIGFyZSBtaXNzaW5nIChzZWUge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9KSwgdGhlbiBidWlsZHMgdGhlIHBvcHVsYXRlIG1hcCBleGFjdGx5IGFzIHRoZVxuICogc3luY2hyb25vdXMgYnVpbGRlciBkb2VzLlxuICpcbiAqIFVzZSB0aGlzIGZyb20gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIHRodW5rIFx1MjAxNCBib3RoIHRoZSBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgYWNjZXB0IGEgdGh1bmtcbiAqIHJldHVybmluZyBhIHByb21pc2UgXHUyMDE0IHNvIGEgZnJlc2ggY2xvbmUsIGEgbmV3IG1hY2hpbmUsIG9yIENJIG5lZWRzIG5vIG1hbnVhbCBpbnN0YWxsIHN0ZXAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzYW1lIGBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zYCB0aGUgc3luY2hyb25vdXMgYnVpbGRlciB0YWtlcy5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIGBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmMocGFyYW1zOiBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zKTogUHJvbWlzZTxQb3B1bGF0ZUZpbGVzUGFyYW1zPiB7XG4gIGlmIChwYXJhbXMuaW5qZWN0UGx1Z2lucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXdhaXQgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyh7IGRlbW9WYXVsdFBhdGg6IHBhcmFtcy5kZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zOiBwYXJhbXMuaW5qZWN0UGx1Z2lucyB9KTtcbiAgfVxuXG4gIHJldHVybiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtcyk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBOZXR3b3JrIGRvd25sb2FkIGdsdWUsIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcmVxdWVzdCBoZWFkZXJzIGZvciBhIEdpdEh1YiBkb3dubG9hZCwgc2VuZGluZyBhIGBHSVRIVUJfVE9LRU5gIC8gYEdIX1RPS0VOYCBiZWFyZXIgd2hlbiBvbmVcbiAqIGlzIGluIHRoZSBlbnZpcm9ubWVudCBcdTIwMTQgd2l0aG91dCBpdCB0aGUgYW5vbnltb3VzIHF1b3RhIHJldHVybnMgSFRUUCA0MDMgb24gc2hhcmVkIENJIHJ1bm5lciBJUHMuXG4gKlxuICogQHJldHVybnMgVGhlIGhlYWRlcnMgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRHaXRIdWJIZWFkZXJzKCk6IEhlYWRlcnMge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSk7XG4gIGNvbnN0IHRva2VuID0gcHJvY2Vzcy5lbnZbJ0dJVEhVQl9UT0tFTiddID8/IHByb2Nlc3MuZW52WydHSF9UT0tFTiddO1xuICBpZiAodG9rZW4pIHtcbiAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgb25lIHJlbGVhc2UgYXNzZXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBhc3NldCdzIGRvd25sb2FkIFVSTC5cbiAqIEBwYXJhbSBpc1JlcXVpcmVkIC0gV2hldGhlciBhIG1pc3NpbmcgYXNzZXQgKEhUVFAgNDA0KSBpcyBhbiBlcnJvciByYXRoZXIgdGhhbiBhbiBhYnNlbnQgb3B0aW9uYWwgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBhc3NldCdzIGJ5dGVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFuIG9wdGlvbmFsIGFzc2V0IGlzIG5vdCBwdWJsaXNoZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscyBhbmQgdGhlIGFzc2V0IGlzIHJlcXVpcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFzc2V0KHVybDogc3RyaW5nLCBpc1JlcXVpcmVkOiBib29sZWFuKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogYnVpbGRHaXRIdWJIZWFkZXJzKCkgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBpZiAoIWlzUmVxdWlyZWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBIVFRQX05PVF9GT1VORCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgJHt1cmx9OiBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuICByZXR1cm4gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG59XG5cbi8qKlxuICogRmV0Y2hlcyBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnksIG1lbW9pc2VkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMgVGhlIHJlZ2lzdHJ5IHJvd3MuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSByZWdpc3RyeSBjYW5ub3QgYmUgZmV0Y2hlZCBvciBwYXJzZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnkoKTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+IHtcbiAgcmVnaXN0cnlQcm9taXNlID8/PSAoYXN5bmMgKCk6IFByb21pc2U8cmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdPiA9PiB7XG4gICAgbG9nKGBbZGVtby12YXVsdC1ib290c3RyYXBdIEZldGNoaW5nIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSBmcm9tICR7Q09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMfS4uLmApO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goQ09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMLCB7IGhlYWRlcnM6IGJ1aWxkR2l0SHViSGVhZGVycygpIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBmZXRjaCBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkgKCR7Q09NTVVOSVRZX1BMVUdJTlNfUkVHSVNUUllfVVJMfSk6IGBcbiAgICAgICAgICArIGBIVFRQICR7U3RyaW5nKHJlc3BvbnNlLnN0YXR1cyl9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0uIGBcbiAgICAgICAgICArICdQYXNzIGFuIGV4cGxpY2l0IGByZXBvYCBvbiB0aGUgaW5qZWN0ZWQgcGx1Z2luIHRvIHNraXAgdGhlIHJlZ2lzdHJ5IGxvb2t1cC4nXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIHJlYWRvbmx5IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnlbXTtcbiAgfSkoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZWdpc3RyeVByb21pc2U7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgLy8gRG8gbm90IG1lbW9pc2UgYSBmYWlsdXJlOiBhIHRyYW5zaWVudCBuZXR3b3JrIGVycm9yIG11c3Qgbm90IHBvaXNvbiBldmVyeSBsYXRlciBsb29rdXAuXG4gICAgcmVnaXN0cnlQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRG93bmxvYWRzIG9uZSBwbHVnaW4ncyByZWxlYXNlIGFzc2V0cyBhbmQgd3JpdGVzIHRoZW0gaW50byB0aGUgZGVtbyB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBpbnN0YWxsLlxuICogQHJldHVybnMgV2hhdCB3YXMgaW5zdGFsbGVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQgb3IgYSByZXF1aXJlZCBhc3NldCBjYW5ub3QgYmUgZG93bmxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zdGFsbFBsdWdpbihkZW1vVmF1bHRQYXRoOiBzdHJpbmcsIHBsdWdpbjogSW5qZWN0UGx1Z2luUGFyYW1zKTogUHJvbWlzZTxJbnN0YWxsZWRQbHVnaW5JbmZvPiB7XG4gIGNvbnN0IHsgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBsdWdpbjtcbiAgY29uc3QgcmVwbyA9IGF3YWl0IHJlc29sdmVQbHVnaW5SZXBvKHBsdWdpbik7XG4gIGNvbnN0IHRhcmdldERpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcblxuICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gSW5zdGFsbGluZyBcIiR7cGx1Z2luSWR9XCIgZnJvbSAke3JlcG99QCR7dmVyc2lvbiA/PyAnbGF0ZXN0J30gaW50byAke3RhcmdldERpcmVjdG9yeX0uLi5gKTtcblxuICBjb25zdCBkb3dubG9hZHMgPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgLi4uUkVRVUlSRURfUExVR0lOX0FTU0VUX05BTUVTLm1hcChhc3luYyAoYXNzZXROYW1lKSA9PiAoe1xuICAgICAgYXNzZXROYW1lLFxuICAgICAgY29udGVudDogYXdhaXQgZG93bmxvYWRBc3NldChidWlsZFBsdWdpbkFzc2V0VXJsKHsgYXNzZXROYW1lLCByZXBvLCB2ZXJzaW9uIH0pLCB0cnVlKVxuICAgIH0pKSxcbiAgICAuLi5PUFRJT05BTF9QTFVHSU5fQVNTRVRfTkFNRVMubWFwKGFzeW5jIChhc3NldE5hbWUpID0+ICh7XG4gICAgICBhc3NldE5hbWUsXG4gICAgICBjb250ZW50OiBhd2FpdCBkb3dubG9hZEFzc2V0KGJ1aWxkUGx1Z2luQXNzZXRVcmwoeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSksIGZhbHNlKVxuICAgIH0pKVxuICBdKTtcblxuICBta2RpclN5bmModGFyZ2V0RGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBhc3NldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHsgYXNzZXROYW1lLCBjb250ZW50IH0gb2YgZG93bmxvYWRzKSB7XG4gICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHdyaXRlRmlsZVN5bmMoam9pbih0YXJnZXREaXJlY3RvcnksIGFzc2V0TmFtZSksIGNvbnRlbnQpO1xuICAgIGFzc2V0TmFtZXMucHVzaChhc3NldE5hbWUpO1xuICB9XG5cbiAgbG9nKGBbZGVtby12YXVsdC1ib290c3RyYXBdIEluc3RhbGxlZCBcIiR7cGx1Z2luSWR9XCI6ICR7YXNzZXROYW1lcy5qb2luKCcsICcpfS5gKTtcblxuICByZXR1cm4geyBhc3NldE5hbWVzLCBwbHVnaW5JZCwgcmVwbywgdmVyc2lvbiB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSBwdWJsaXNoaW5nIGEgcGx1Z2luIFx1MjAxNCB0aGUgZXhwbGljaXQgb3ZlcnJpZGUgd2hlbiBnaXZlbiwgb3RoZXJ3aXNlXG4gKiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gcmVzb2x2ZS5cbiAqIEByZXR1cm5zIFRoZSBgb3duZXIvbmFtZWAgcmVwb3NpdG9yeSByZWZlcmVuY2UuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFuIGV4cGxpY2l0IG92ZXJyaWRlIGlzIG1hbGZvcm1lZCwgb3IgdGhlIGlkIGlzIG5vdCBhIHJlZ2lzdGVyZWQgY29tbXVuaXR5IHBsdWdpbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBsdWdpblJlcG8ocGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7IHBsdWdpbklkLCByZXBvIH0gPSBwbHVnaW47XG5cbiAgaWYgKHJlcG8gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghaXNWYWxpZFJlcG9SZWZlcmVuY2UocmVwbykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBcXGByZXBvXFxgIGZvciBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIjogJHtyZXBvfS4gRXhwZWN0ZWQgYW4gXFxgb3duZXIvbmFtZVxcYCByZWZlcmVuY2UuYCk7XG4gICAgfVxuICAgIHJldHVybiByZXBvO1xuICB9XG5cbiAgY29uc3QgcmVnaXN0cnlSZXBvID0gc2VsZWN0UGx1Z2luUmVwbyh7IGVudHJpZXM6IGF3YWl0IGZldGNoQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnkoKSwgcGx1Z2luSWQgfSk7XG4gIGlmIChyZWdpc3RyeVJlcG8gPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBpcyBub3QgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgc28gaXRzIEdpdEh1YiBgXG4gICAgICAgICsgJ3JlcG9zaXRvcnkgY2Fubm90IGJlIHJlc29sdmVkLiBQYXNzIGFuIGV4cGxpY2l0IGByZXBvYCAoYG93bmVyL25hbWVgKSBvbiB0aGUgaW5qZWN0ZWQgcGx1Z2luLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJlZ2lzdHJ5UmVwbztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdDQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFTcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVB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
127
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtYm9vdHN0cmFwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW5zdGFsbHMgYSBkZW1vIHZhdWx0J3MgKippbmplY3RlZCBjb21tdW5pdHkgcGx1Z2lucyoqIGhlYWRsZXNzbHksIGJ5IGRvd25sb2FkaW5nXG4gKiB0aGVpciBwdWJsaXNoZWQgR2l0SHViIHJlbGVhc2UgYXNzZXRzIHN0cmFpZ2h0IGludG9cbiAqIGBkZW1vLXZhdWx0Ly5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYC5cbiAqXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWAgcmVxdWlyZXMgZWFjaCBpbmplY3RlZCBwbHVnaW4ncyBgbWFpbi5qc2AgL1xuICogYG1hbmlmZXN0Lmpzb25gIHRvIGFscmVhZHkgYmUgb24gZGlzaywgYW5kIHRocm93cyB3aGVuIHRoZXkgYXJlIG5vdC4gVW50aWwgdGhpc1xuICogbW9kdWxlIGV4aXN0ZWQgdGhlIG9ubHkgZG9jdW1lbnRlZCByZW1lZHkgd2FzIGEgKipHVUkgc3RlcCoqIFx1MjAxNCBvcGVuIGBkZW1vLXZhdWx0L2BcbiAqIGluIE9ic2lkaWFuIG9uY2UgYW5kIGxldCBgZGVtby12YXVsdC1oZWxwZXJgIGluc3RhbGwgdGhlIHBsdWdpbiBhdCBydW50aW1lLlxuICogYC5vYnNpZGlhbi9wbHVnaW5zLypgIGlzIGdpdGlnbm9yZWQgaW4gYSBwbHVnaW4gcmVwbywgc28gdGhhdCBzdGF0ZVxuICogZXhpc3RzIG9uIGV4YWN0bHkgdGhlIG9uZSBtYWNoaW5lIHRoYXQgZGlkIGl0IGFuZCBpcyBpbnZpc2libGUgdG8gYSBmcmVzaCBjbG9uZSxcbiAqIGEgbmV3IG1hY2hpbmUsIG9yIENJLiBTaW5jZSBhIHBsdWdpbiByZXBvJ3MgcmVsZWFzZSBwcmVmbGlnaHQgcnVucyBpdHNcbiAqIGludGVncmF0aW9uIHRlc3RzLCB0aGF0IG1hZGUgKmN1dHRpbmcgYSByZWxlYXNlIGZyb20gYSBjbGVhbiBjbG9uZSogaW1wb3NzaWJsZVxuICogd2l0aG91dCBhIGh1bWFuIG9wZW5pbmcgYSBHVUkuXG4gKlxuICogRG93bmxvYWRpbmcgdGhlIHJlbGVhc2UgYXNzZXRzIGlzIHRoZSBleGFjdCBoZWFkbGVzcyBlcXVpdmFsZW50OiB0aGUgcmVzdWx0aW5nXG4gKiBmb2xkZXIgaXMgd2hhdCBPYnNpZGlhbiBpdHNlbGYgd291bGQgaGF2ZSBpbnN0YWxsZWQsIHNvIHRoZSBzaGlwcGVkXG4gKiBgKi1kZW1vLXZhdWx0LnppcGAgXHUyMDE0IHdoaWNoIHVuemlwcyBpbnRvIGEgc2luZ2xlIGAqLWRlbW8tdmF1bHQtPHZlcnNpb24+YCBmb2xkZXIgXHUyMDE0XG4gKiBzdGF5cyB0aGUgc3RhbmRhcmQgZGVtby12YXVsdCBhcnRpZmFjdC5cbiAqXG4gKiBUd28gZW50cnkgcG9pbnRzLCBwbHVzIHRoZSBgYm9vdHN0cmFwLWRlbW8tdmF1bHRgIENMSSBzdWJjb21tYW5kOlxuICpcbiAqIC0ge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9IFx1MjAxNCBpbnN0YWxsIHRoZSBtaXNzaW5nIG9uZXMsIGV4cGxpY2l0bHkuXG4gKiAtIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmN9IFx1MjAxNCBkbyB0aGF0IGFuZCB0aGVuIGJ1aWxkIHRoZSBwb3B1bGF0ZSBtYXAsXG4gKiAgIHNvIGEgZ2xvYmFsIHNldHVwIHNlbGYtaGVhbHMgd2l0aCBubyBtYW51YWwgc3RlcCBhdCBhbGwuXG4gKlxuICogVGhlIHN5bmMgYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgIGRlbGliZXJhdGVseSBrZWVwcyB0aHJvd2luZzogYGZldGNoYCBoYXMgbm9cbiAqIHN5bmNocm9ub3VzIGZvcm0sIHNvIGF1dG8taGVhbGluZyBjYW4gb25seSBsaXZlIG9uIGFuIGFzeW5jIHNpYmxpbmcuIEl0cyBtZXNzYWdlXG4gKiBub3cgbmFtZXMgYm90aCByZW1lZGllcyBhYm92ZSBpbnN0ZWFkIG9mIHRoZSBHVUkgc3RlcC5cbiAqL1xuXG5pbXBvcnQge1xuICBta2RpclN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHsgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeSB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuXG5pbXBvcnQge1xuICBidWlsZFBsdWdpbkFzc2V0VXJsLFxuICBDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwsXG4gIGlzVmFsaWRSZXBvUmVmZXJlbmNlLFxuICBPUFRJT05BTF9QTFVHSU5fQVNTRVRfTkFNRVMsXG4gIFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyxcbiAgc2VsZWN0UGx1Z2luUmVwb1xufSBmcm9tICcuL2NvbW11bml0eS1wbHVnaW4tcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUsXG4gIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG4vKipcbiAqIEJyb3dzZXIgYFVzZXItQWdlbnRgIGZvciB0aGUgYXNzZXQgZG93bmxvYWRzLCBtYXRjaGluZyBgb2JzaWRpYW4taW5zdGFsbGVyLnRzYCBcdTIwMTRcbiAqIGEgcGxhaW4gTm9kZSBmZXRjaCBpcyByZWplY3RlZCBieSBzb21lIENETiBlZGdlcy5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTI0LjAuMC4wIFNhZmFyaS81MzcuMzYnO1xuXG5jb25zdCBIVFRQX05PVF9GT1VORCA9IDQwNDtcblxuLyoqXG4gKiBUaGUgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgZmV0Y2hlZCBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MuIEV2ZXJ5IGluamVjdGVkXG4gKiBwbHVnaW4gb2YgZXZlcnkgZGVtby12YXVsdCBwcm9qZWN0IGluIGEgcnVuIHJlc29sdmVzIGFnYWluc3QgdGhlIHNhbWUgdGFibGUsIGFuZFxuICogaXQgaXMgYSBtdWx0aS1tZWdhYnl0ZSBkb2N1bWVudC5cbiAqL1xubGV0IHJlZ2lzdHJ5UHJvbWlzZTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbmplY3RlZCBwbHVnaW5zIHRvIGluc3RhbGwgXHUyMDE0IHRoZSBzYW1lIGxpc3QgcGFzc2VkIHRvIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYC4gUGx1Z2lucyB3aG9zZVxuICAgKiBiaW5hcmllcyBhcmUgYWxyZWFkeSBwcmVzZW50IGFyZSBza2lwcGVkICh1bmxlc3Mge0BsaW5rIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMuc2hvdWxkRm9yY2V9KSxcbiAgICogYXMgYXJlIHBsdWdpbnMgY2FycnlpbmcgYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAuXG4gICAqL1xuICByZWFkb25seSBpbmplY3RQbHVnaW5zOiByZWFkb25seSBJbmplY3RQbHVnaW5QYXJhbXNbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZS1kb3dubG9hZCBwbHVnaW5zIHRoYXQgYXJlIGFscmVhZHkgaW5zdGFsbGVkLCByZXBsYWNpbmcgdGhlbSB3aXRoIHRoZSBjdXJyZW50IHJlbGVhc2UuXG4gICAqIERlZmF1bHRzIHRvIGBmYWxzZWAgXHUyMDE0IHRoZSBub3JtYWwgcGF0aCBpbnN0YWxscyBvbmx5IHdoYXQgaXMgbWlzc2luZywgc28gYSB3YXJtIGNoZWNrb3V0IGRvZXMgbm9cbiAgICogbmV0d29yayBJL08gYXQgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIGEge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9IHJ1bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBEZW1vVmF1bHRQbHVnaW5zUmVzdWx0IHtcbiAgLyoqXG4gIFRoZSBwbHVnaW5zIHRoYXQgd2VyZSBkb3dubG9hZGVkIGFuZCB3cml0dGVuLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluc3RhbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxlZDogcmVhZG9ubHkgSW5zdGFsbGVkUGx1Z2luSW5mb1tdO1xuXG4gIC8qKlxuICBUaGUgaWRzIG9mIHBsdWdpbnMgbGVmdCB1bnRvdWNoZWQgXHUyMDE0IGFscmVhZHkgaW5zdGFsbGVkLCBvciBvcHRlZCBvdXQgdmlhIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcHBlZFBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogT25lIHBsdWdpbiBpbnN0YWxsZWQgYnkge0BsaW5rIGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxlZFBsdWdpbkluZm8ge1xuICAvKipcbiAgVGhlIGFzc2V0IGZpbGUgbmFtZXMgYWN0dWFsbHkgd3JpdHRlbiwgZS5nLiBgWydtYWluLmpzJywgJ21hbmlmZXN0Lmpzb24nLCAnc3R5bGVzLmNzcyddYC5cbiAgICovXG4gIHJlYWRvbmx5IGFzc2V0TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgcGx1Z2luJ3MgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgR2l0SHViIHJlcG9zaXRvcnkgdGhlIGFzc2V0cyBjYW1lIGZyb20sIGFzIGBvd25lci9uYW1lYC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcblxuICAvKipcbiAgVGhlIHJlbGVhc2UgdGFnIGRvd25sb2FkZWQgZnJvbSwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgcmVwb3NpdG9yeSdzIGxhdGVzdCByZWxlYXNlIHdhcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEluc3RhbGxzIGV2ZXJ5IGluamVjdGVkIGNvbW11bml0eSBwbHVnaW4gd2hvc2UgYnVpbHQgZmlsZXMgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZGVtbyB2YXVsdCwgYnlcbiAqIGRvd25sb2FkaW5nIGl0cyBwdWJsaXNoZWQgcmVsZWFzZSBhc3NldHMgaW50byBgZGVtby12YXVsdC8ub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AuXG4gKlxuICogRWFjaCBwbHVnaW4ncyByZXBvc2l0b3J5IGNvbWVzIGZyb20gaXRzIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30gd2hlbiBnaXZlbiwgb3RoZXJ3aXNlIGZyb21cbiAqIE9ic2lkaWFuJ3Mgb3duIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkgXHUyMDE0IHRoZSBzYW1lIGBpZGAgXHUyMTkyIGByZXBvYCB0YWJsZSB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyXG4gKiBpbnN0YWxscyBmcm9tLCBzbyBubyBwbHVnaW4tc3BlY2lmaWMgbWFwcGluZyBpcyBoYXJkY29kZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtc30uXG4gKiBAcmV0dXJucyBXaGF0IHdhcyBpbnN0YWxsZWQgYW5kIHdoYXQgd2FzIHNraXBwZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEgcGx1Z2luJ3MgcmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQsIG9yIGEgcmVxdWlyZWQgYXNzZXQgY2Fubm90IGJlIGRvd25sb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zKHBhcmFtczogQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyk6IFByb21pc2U8Qm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdD4ge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGluamVjdFBsdWdpbnMsIHNob3VsZEZvcmNlID0gZmFsc2UgfSA9IHBhcmFtcztcblxuICBjb25zdCBib290c3RyYXBwYWJsZSA9IGluamVjdFBsdWdpbnMuZmlsdGVyKChwbHVnaW4pID0+IHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPT09IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHRhcmdldHMgPSBzaG91bGRGb3JjZSA/IGJvb3RzdHJhcHBhYmxlIDogcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMoeyBkZW1vVmF1bHRQYXRoLCBpbmplY3RQbHVnaW5zIH0pO1xuICBjb25zdCB0YXJnZXRQbHVnaW5JZHMgPSBuZXcgU2V0KHRhcmdldHMubWFwKChwbHVnaW4pID0+IHBsdWdpbi5wbHVnaW5JZCkpO1xuXG4gIGNvbnN0IGluc3RhbGxlZDogSW5zdGFsbGVkUGx1Z2luSW5mb1tdID0gW107XG4gIGZvciAoY29uc3QgcGx1Z2luIG9mIHRhcmdldHMpIHtcbiAgICAvLyBTZXF1ZW50aWFsIG9uIHB1cnBvc2U6IHRoZSBpbnN0YWxscyBzaGFyZSBvbmUgbWVtb2lzZWQgcmVnaXN0cnkgZmV0Y2guXG4gICAgLy8gUGFyYWxsZWxpc20gd291bGQgYnV5IG5vdGhpbmcgYnV0IGludGVybGVhdmVkIGxvZ3MgZm9yIHRoZSBoYW5kZnVsIG9mIHBsdWdpbnMgYSBkZW1vIHZhdWx0IGluamVjdHMuXG4gICAgaW5zdGFsbGVkLnB1c2goYXdhaXQgaW5zdGFsbFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4pKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW5zdGFsbGVkLFxuICAgIHNraXBwZWRQbHVnaW5JZHM6IGluamVjdFBsdWdpbnMubWFwKChwbHVnaW4pID0+IHBsdWdpbi5wbHVnaW5JZCkuZmlsdGVyKChwbHVnaW5JZCkgPT4gIXRhcmdldFBsdWdpbklkcy5oYXMocGx1Z2luSWQpKVxuICB9O1xufVxuXG4vKipcbiAqIFRoZSBzZWxmLWhlYWxpbmcgY291bnRlcnBhcnQgb2YgYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgOiBpbnN0YWxscyBhbnkgaW5qZWN0ZWQgY29tbXVuaXR5IHBsdWdpbiB3aG9zZVxuICogYmluYXJpZXMgYXJlIG1pc3NpbmcgKHNlZSB7QGxpbmsgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc30pLCB0aGVuIGJ1aWxkcyB0aGUgcG9wdWxhdGUgbWFwIGV4YWN0bHkgYXMgdGhlXG4gKiBzeW5jaHJvbm91cyBidWlsZGVyIGRvZXMuXG4gKlxuICogVXNlIHRoaXMgZnJvbSBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgdGh1bmsgXHUyMDE0IGJvdGggdGhlIFZpdGVzdCBhbmQgSmVzdCBhZGFwdGVycyBhY2NlcHQgYSB0aHVua1xuICogcmV0dXJuaW5nIGEgcHJvbWlzZSBcdTIwMTQgc28gYSBmcmVzaCBjbG9uZSwgYSBuZXcgbWFjaGluZSwgb3IgQ0kgbmVlZHMgbm8gbWFudWFsIGluc3RhbGwgc3RlcC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbWUgYEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXNgIHRoZSBzeW5jaHJvbm91cyBidWlsZGVyIHRha2VzLlxuICogQHJldHVybnMgVGhlIHBvcHVsYXRlIG1hcCwgcmVhZHkgdG8gaGFuZCB0byBhIGdsb2JhbCBzZXR1cCdzIGBwb3B1bGF0ZWAgb3IgYFRlbXBvcmFyeVZhdWx0LnBvcHVsYXRlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luYyhwYXJhbXM6IEJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVQYXJhbXMpOiBQcm9taXNlPFBvcHVsYXRlRmlsZXNQYXJhbXM+IHtcbiAgaWYgKHBhcmFtcy5pbmplY3RQbHVnaW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICBhd2FpdCBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zKHsgZGVtb1ZhdWx0UGF0aDogcGFyYW1zLmRlbW9WYXVsdFBhdGgsIGluamVjdFBsdWdpbnM6IHBhcmFtcy5pbmplY3RQbHVnaW5zIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUocGFyYW1zKTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIE5ldHdvcmsgZG93bmxvYWQgZ2x1ZSwgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQnVpbGRzIHRoZSByZXF1ZXN0IGhlYWRlcnMgZm9yIGEgR2l0SHViIGRvd25sb2FkLCBzZW5kaW5nIGEgYEdJVEhVQl9UT0tFTmAgLyBgR0hfVE9LRU5gIGJlYXJlciB3aGVuIG9uZVxuICogaXMgaW4gdGhlIGVudmlyb25tZW50IFx1MjAxNCB3aXRob3V0IGl0IHRoZSBhbm9ueW1vdXMgcXVvdGEgcmV0dXJucyBIVFRQIDQwMyBvbiBzaGFyZWQgQ0kgcnVubmVyIElQcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgaGVhZGVycyB0byBzZW5kLlxuICovXG5mdW5jdGlvbiBidWlsZEdpdEh1YkhlYWRlcnMoKTogSGVhZGVycyB7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7ICdVc2VyLUFnZW50JzogRE9XTkxPQURfVVNFUl9BR0VOVCB9KTtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudlsnR0lUSFVCX1RPS0VOJ10gPz8gcHJvY2Vzcy5lbnZbJ0dIX1RPS0VOJ107XG4gIGlmICh0b2tlbikge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke3Rva2VufWApO1xuICB9XG4gIHJldHVybiBoZWFkZXJzO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBvbmUgcmVsZWFzZSBhc3NldC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGFzc2V0J3MgZG93bmxvYWQgVVJMLlxuICogQHBhcmFtIGlzUmVxdWlyZWQgLSBXaGV0aGVyIGEgbWlzc2luZyBhc3NldCAoSFRUUCA0MDQpIGlzIGFuIGVycm9yIHJhdGhlciB0aGFuIGFuIGFic2VudCBvcHRpb25hbCBmaWxlLlxuICogQHJldHVybnMgVGhlIGFzc2V0J3MgYnl0ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gYW4gb3B0aW9uYWwgYXNzZXQgaXMgbm90IHB1Ymxpc2hlZC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzIGFuZCB0aGUgYXNzZXQgaXMgcmVxdWlyZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQXNzZXQodXJsOiBzdHJpbmcsIGlzUmVxdWlyZWQ6IGJvb2xlYW4pOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBoZWFkZXJzOiBidWlsZEdpdEh1YkhlYWRlcnMoKSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGlmICghaXNSZXF1aXJlZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IEhUVFBfTk9UX0ZPVU5EKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCAke3VybH06IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgbWVtb2lzZWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkgcm93cy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlZ2lzdHJ5IGNhbm5vdCBiZSBmZXRjaGVkIG9yIHBhcnNlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hDb21tdW5pdHlQbHVnaW5SZWdpc3RyeSgpOiBQcm9taXNlPHJlYWRvbmx5IENvbW11bml0eVBsdWdpblJlZ2lzdHJ5RW50cnlbXT4ge1xuICByZWdpc3RyeVByb21pc2UgPz89IChhc3luYyAoKTogUHJvbWlzZTxyZWFkb25seSBDb21tdW5pdHlQbHVnaW5SZWdpc3RyeUVudHJ5W10+ID0+IHtcbiAgICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gRmV0Y2hpbmcgT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5IGZyb20gJHtDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkx9Li4uYCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkwsIHsgaGVhZGVyczogYnVpbGRHaXRIdWJIZWFkZXJzKCkgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGZldGNoIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSAoJHtDT01NVU5JVFlfUExVR0lOU19SRUdJU1RSWV9VUkx9KTogYFxuICAgICAgICAgICsgYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fS4gYFxuICAgICAgICAgICsgJ1Bhc3MgYW4gZXhwbGljaXQgYHJlcG9gIG9uIHRoZSBpbmplY3RlZCBwbHVnaW4gdG8gc2tpcCB0aGUgcmVnaXN0cnkgbG9va3VwLidcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgcmVhZG9ubHkgQ29tbXVuaXR5UGx1Z2luUmVnaXN0cnlFbnRyeVtdO1xuICB9KSgpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlZ2lzdHJ5UHJvbWlzZTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAvLyBEbyBub3QgbWVtb2lzZSBhIGZhaWx1cmU6IGEgdHJhbnNpZW50IG5ldHdvcmsgZXJyb3IgbXVzdCBub3QgcG9pc29uIGV2ZXJ5IGxhdGVyIGxvb2t1cC5cbiAgICByZWdpc3RyeVByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgb25lIHBsdWdpbidzIHJlbGVhc2UgYXNzZXRzIGFuZCB3cml0ZXMgdGhlbSBpbnRvIHRoZSBkZW1vIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBkZW1vVmF1bHRQYXRoIC0gVGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRvIGluc3RhbGwuXG4gKiBAcmV0dXJucyBXaGF0IHdhcyBpbnN0YWxsZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSByZXBvc2l0b3J5IGNhbm5vdCBiZSByZXNvbHZlZCBvciBhIHJlcXVpcmVkIGFzc2V0IGNhbm5vdCBiZSBkb3dubG9hZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbnN0YWxsUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBQcm9taXNlPEluc3RhbGxlZFBsdWdpbkluZm8+IHtcbiAgY29uc3QgeyBwbHVnaW5JZCwgdmVyc2lvbiB9ID0gcGx1Z2luO1xuICBjb25zdCByZXBvID0gYXdhaXQgcmVzb2x2ZVBsdWdpblJlcG8ocGx1Z2luKTtcbiAgY29uc3QgdGFyZ2V0RGlyZWN0b3J5ID0gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHsgZGVtb1ZhdWx0UGF0aCwgcGx1Z2luIH0pO1xuXG4gIGxvZyhgW2RlbW8tdmF1bHQtYm9vdHN0cmFwXSBJbnN0YWxsaW5nIFwiJHtwbHVnaW5JZH1cIiBmcm9tICR7cmVwb31AJHt2ZXJzaW9uID8/ICdsYXRlc3QnfSBpbnRvICR7dGFyZ2V0RGlyZWN0b3J5fS4uLmApO1xuXG4gIGNvbnN0IGRvd25sb2FkcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAuLi5SRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMubWFwKGFzeW5jIChhc3NldE5hbWUpID0+ICh7XG4gICAgICBhc3NldE5hbWUsXG4gICAgICBjb250ZW50OiBhd2FpdCBkb3dubG9hZEFzc2V0KGJ1aWxkUGx1Z2luQXNzZXRVcmwoeyBhc3NldE5hbWUsIHJlcG8sIHZlcnNpb24gfSksIHRydWUpXG4gICAgfSkpLFxuICAgIC4uLk9QVElPTkFMX1BMVUdJTl9BU1NFVF9OQU1FUy5tYXAoYXN5bmMgKGFzc2V0TmFtZSkgPT4gKHtcbiAgICAgIGFzc2V0TmFtZSxcbiAgICAgIGNvbnRlbnQ6IGF3YWl0IGRvd25sb2FkQXNzZXQoYnVpbGRQbHVnaW5Bc3NldFVybCh7IGFzc2V0TmFtZSwgcmVwbywgdmVyc2lvbiB9KSwgZmFsc2UpXG4gICAgfSkpXG4gIF0pO1xuXG4gIG1rZGlyU3luYyh0YXJnZXREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGFzc2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgeyBhc3NldE5hbWUsIGNvbnRlbnQgfSBvZiBkb3dubG9hZHMpIHtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHRhcmdldERpcmVjdG9yeSwgYXNzZXROYW1lKSwgY29udGVudCk7XG4gICAgYXNzZXROYW1lcy5wdXNoKGFzc2V0TmFtZSk7XG4gIH1cblxuICBsb2coYFtkZW1vLXZhdWx0LWJvb3RzdHJhcF0gSW5zdGFsbGVkIFwiJHtwbHVnaW5JZH1cIjogJHthc3NldE5hbWVzLmpvaW4oJywgJyl9LmApO1xuXG4gIHJldHVybiB7IGFzc2V0TmFtZXMsIHBsdWdpbklkLCByZXBvLCB2ZXJzaW9uIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIEdpdEh1YiByZXBvc2l0b3J5IHB1Ymxpc2hpbmcgYSBwbHVnaW4gXHUyMDE0IHRoZSBleHBsaWNpdCBvdmVycmlkZSB3aGVuIGdpdmVuLCBvdGhlcndpc2VcbiAqIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byByZXNvbHZlLlxuICogQHJldHVybnMgVGhlIGBvd25lci9uYW1lYCByZXBvc2l0b3J5IHJlZmVyZW5jZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYW4gZXhwbGljaXQgb3ZlcnJpZGUgaXMgbWFsZm9ybWVkLCBvciB0aGUgaWQgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb21tdW5pdHkgcGx1Z2luLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlUGx1Z2luUmVwbyhwbHVnaW46IEluamVjdFBsdWdpblBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgcGx1Z2luSWQsIHJlcG8gfSA9IHBsdWdpbjtcblxuICBpZiAocmVwbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFpc1ZhbGlkUmVwb1JlZmVyZW5jZShyZXBvKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFxcYHJlcG9cXGAgZm9yIGNvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiOiAke3JlcG99LiBFeHBlY3RlZCBhbiBcXGBvd25lci9uYW1lXFxgIHJlZmVyZW5jZS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcG87XG4gIH1cblxuICBjb25zdCByZWdpc3RyeVJlcG8gPSBzZWxlY3RQbHVnaW5SZXBvKHsgZW50cmllczogYXdhaXQgZmV0Y2hDb21tdW5pdHlQbHVnaW5SZWdpc3RyeSgpLCBwbHVnaW5JZCB9KTtcbiAgaWYgKHJlZ2lzdHJ5UmVwbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LCBzbyBpdHMgR2l0SHViIGBcbiAgICAgICAgKyAncmVwb3NpdG9yeSBjYW5ub3QgYmUgcmVzb2x2ZWQuIFBhc3MgYW4gZXhwbGljaXQgYHJlcG9gIChgb3duZXIvbmFtZWApIG9uIHRoZSBpbmplY3RlZCBwbHVnaW4uJ1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gcmVnaXN0cnlSZXBvO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBaUNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtB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
@@ -5,9 +5,10 @@ import {
5
5
  } from "node:fs";
6
6
  import { join } from "node:path";
7
7
  import { REQUIRED_PLUGIN_ASSET_NAMES } from "./community-plugin-registry.mjs";
8
+ import { DEFAULT_CONFIG_DIRECTORY } from "./config-directory.mjs";
8
9
  import { readDemoVaultTree } from "./demo-vault-tree.mjs";
9
10
  import { ensureNonNullable } from "./type-guards.mjs";
10
- const OBSIDIAN_CONFIG_DIR = ".obsidian";
11
+ const OBSIDIAN_CONFIG_DIR = DEFAULT_CONFIG_DIRECTORY;
11
12
  const PLUGINS_DIR = "plugins";
12
13
  const DATA_JSON = "data.json";
13
14
  const DATA_JSON_INDENT = 2;
@@ -79,4 +80,4 @@ export {
79
80
  resolveInjectedPluginSourceDirectory,
80
81
  resolveMissingInjectedPlugins
81
82
  };
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHsgcmVhZERlbW9WYXVsdFRyZWUgfSBmcm9tICcuL2RlbW8tdmF1bHQtdHJlZS5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBSXJCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMseUJBQXlCO0FBRWxDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLFlBQVk7QUFDbEIsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxnQ0FBZ0MsQ0FBQyxZQUFZLG1CQUFtQixtQkFBbUI7QUFvSGxGLFNBQVMsdUJBQXVCLFFBQTJEO0FBQ2hHLFFBQU0sRUFBRSxlQUFlLGVBQWUsZ0JBQWdCLENBQUMsR0FBRyxzQkFBc0IsOEJBQThCLElBQUk7QUFFbEgsUUFBTSxNQUFNLGtCQUFrQixrQkFBa0IsU0FBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLGVBQWUsY0FBYyxDQUFDO0FBRWhILGFBQVcsY0FBYyxxQkFBcUI7QUFDNUMsVUFBTSxhQUFhLEtBQUssZUFBZSxxQkFBcUIsVUFBVTtBQUN0RSxRQUFJLFdBQVcsVUFBVSxHQUFHO0FBQzFCLFVBQUksR0FBRyxtQkFBbUIsSUFBSSxVQUFVLEVBQUUsSUFBSSxhQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLHFDQUFxQyxRQUE0RDtBQUMvRyxRQUFNLEVBQUUsZUFBZSxPQUFPLElBQUk7QUFDbEMsU0FBTyxPQUFPLG1CQUFtQixLQUFLLGVBQWUscUJBQXFCLGFBQWEsT0FBTyxRQUFRO0FBQ3hHO0FBY08sU0FBUyw4QkFBOEIsUUFBbUU7QUFDL0csUUFBTSxFQUFFLGNBQWMsSUFBSTtBQUMxQixTQUFPLE9BQU8sY0FBYyxPQUFPLENBQUMsV0FBVztBQUM3QyxRQUFJLE9BQU8sb0JBQW9CLFFBQVc7QUFDeEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFlBQVksb0JBQW9CLHFDQUFxQyxFQUFFLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFDckcsV0FBTyw0QkFBNEIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDdkYsQ0FBQztBQUNIO0FBWUEsU0FBUyx5QkFBeUIsZUFBdUIsUUFBb0M7QUFDM0YsTUFBSSxPQUFPLG9CQUFvQixRQUFXO0FBQ3hDLFdBQU87QUFBQSxFQUVUO0FBRUEsU0FBTyxvR0FBb0csYUFBYTtBQUcxSDtBQVFBLFNBQVMsb0JBQW9CLGlCQUFtQztBQUM5RCxTQUFPLFdBQVcsZUFBZSxJQUM3QixZQUFZLGlCQUFpQixFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksSUFDakgsQ0FBQztBQUNQO0FBVUEsU0FBUyxXQUFXLGVBQXVCLFFBQTRCLEtBQWdDO0FBQ3JHLFFBQU0sRUFBRSxNQUFNLFNBQVMsSUFBSTtBQUMzQixRQUFNLGtCQUFrQixxQ0FBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQztBQUN0RixRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLFlBQVksb0JBQW9CLGVBQWU7QUFFckQsYUFBVyxnQkFBZ0IsNkJBQTZCO0FBQ3RELFFBQUksQ0FBQyxVQUFVLFNBQVMsWUFBWSxHQUFHO0FBQ3JDLFlBQU0sU0FBUyx5QkFBeUIsZUFBZSxNQUFNO0FBQzdELFlBQU0sSUFBSTtBQUFBLFFBQ1IscUJBQXFCLFFBQVEseUNBQXlDLEtBQUssaUJBQWlCLFlBQVksQ0FBQyxjQUFjLE1BQU07QUFBQSxNQUMvSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLElBQUksYUFBYSxLQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sV0FBbUIsa0JBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
83
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5Lm1qcyc7XG5pbXBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLypcbiAqIEJvdGggdGhlIGZvbGRlciB0aGUgZGVtbyB2YXVsdCdzIG93biBjb21taXR0ZWQgY29uZmlnIHNpdHMgaW4gb24gZGlzaywgYW5kIHRoZSBkZXN0aW5hdGlvbiB0aGUgbWFwXG4gKiBuYW1lcyBmb3IgaXQuIFRoZSB0d28gY29pbmNpZGUgYnkgY29uc3RydWN0aW9uOiB0aGUgc291cmNlIGlzIGEgcmVwbyBmb2xkZXIgT2JzaWRpYW4gY3JlYXRlZCB1bmRlciBpdHNcbiAqIGRlZmF1bHQsIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlIG9uIHRoZSBydW4gaXMgYXBwbGllZCB0byB0aGUgZGVzdGluYXRpb24ga2V5cyBsYXRlciwgYnlcbiAqIGByZW1hcENvbmZpZ0RpcmVjdG9yeUtleXNgIGluIGBnbG9iYWwtc2V0dXAtY29yZWAsIHdoaWNoIGlzIHdoZXJlIHRoZSBvdmVycmlkZSBpcyBhY3R1YWxseSBrbm93bi5cbiAqL1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9IERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWTtcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBSXJCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMseUJBQXlCO0FBUWxDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixN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
@@ -1,24 +1,41 @@
1
1
  /**
2
2
  * @file
3
3
  *
4
- * Pure helpers for deciding when a freshly-booted Android emulator is idle
5
- * enough to establish an Appium session, plus resolving the idle-wait timeout
6
- * from the transport options. Kept separate from the integration-only
4
+ * Pure helpers for deciding when a freshly-booted Android emulator is ready
5
+ * enough to establish an Appium session, plus resolving the two readiness-wait
6
+ * timeouts from the transport options. Kept separate from the integration-only
7
7
  * `transport-factory` so the parsing and default resolution stay unit-testable
8
8
  * (the factory itself needs a real emulator and is excluded from unit tests).
9
9
  *
10
- * `sys.boot_completed` fires *before* the guest is actually idle: package
11
- * optimization (`dex2oat`) and system services keep churning after it, so a
12
- * session established the instant it fires makes every one of UiAutomator2's
13
- * serialized `adb` round-trips contend with that work and inflate ~3x. Gating
14
- * the session on a later, quieter signal (the boot animation has stopped and
15
- * the package manager is serving) lets it run against an idle guest instead.
10
+ * Readiness is two independent questions, waited on in two phases:
11
+ *
12
+ * 1. **Is the guest idle?** `sys.boot_completed` fires *before* it is: package
13
+ * optimization (`dex2oat`) and system services keep churning after it, so a
14
+ * session established the instant it fires makes every one of UiAutomator2's
15
+ * serialized `adb` round-trips contend with that work and inflate ~3x. Gating
16
+ * the session on a later, quieter signal (the boot animation has stopped and
17
+ * the package manager is serving) lets it run against an idle guest instead.
18
+ * 2. **Does the guest have a network?** Both idle signals are true well *before*
19
+ * the default network is created and validated — that lands ~80s into guest
20
+ * uptime, tens of seconds after the idle gate clears — and neither says
21
+ * anything about connectivity, so an idle-only gate hands the suite a device
22
+ * with no route. See {@link checkNetworkValidated} for the measurement and
23
+ * for why the three obvious connectivity probes are all wrong here.
16
24
  */
17
25
  import type { ObsidianAndroidAppiumTransportOptions } from './transport-options.mjs';
18
26
  /**
19
27
  * Default for {@link ObsidianAndroidAppiumTransportOptions.deviceIdleTimeoutInMilliseconds}.
20
28
  */
21
29
  export declare const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 60000;
30
+ /**
31
+ * Default for {@link ObsidianAndroidAppiumTransportOptions.networkReadyTimeoutInMilliseconds}.
32
+ *
33
+ * The budget starts *after* `sys.boot_completed`, where the measured wait on a
34
+ * cold WHPX emulator is ~30s (validation at ~80s from boot, against a boot flag
35
+ * at ~56s). The default is headroom for the starved/CI regime the other Android
36
+ * budgets are already sized for, not the expected cost.
37
+ */
38
+ export declare const DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS = 120000;
22
39
  /**
23
40
  * Parameters for {@link checkDeviceIdle}.
24
41
  */
@@ -32,6 +49,15 @@ export interface CheckDeviceIdleParams {
32
49
  */
33
50
  readonly packageListOutput: string;
34
51
  }
52
+ /**
53
+ * Parameters for {@link checkNetworkValidated}.
54
+ */
55
+ export interface CheckNetworkValidatedParams {
56
+ /**
57
+ Raw stdout of `adb shell dumpsys connectivity`.
58
+ */
59
+ readonly connectivityOutput: string;
60
+ }
35
61
  /**
36
62
  * Decides whether a booted emulator is idle enough to start an Appium session,
37
63
  * from the raw output of the two probe commands.
@@ -45,6 +71,42 @@ export interface CheckDeviceIdleParams {
45
71
  * @returns `true` when the guest is idle enough to proceed.
46
72
  */
47
73
  export declare function checkDeviceIdle(params: CheckDeviceIdleParams): boolean;
74
+ /**
75
+ * Decides whether a booted emulator has a working network, from the raw output
76
+ * of `adb shell dumpsys connectivity`.
77
+ *
78
+ * Ready means the dump names an **active default network** *and* that network's
79
+ * own agent info reports validation — either an `IS_VALIDATED` score policy or a
80
+ * non-zero `firstValidated` timestamp. Both are required: a default network
81
+ * exists for seconds before it validates, and during that window it carries no
82
+ * usable route.
83
+ *
84
+ * Why this matters at all: the two {@link checkDeviceIdle} signals are satisfied
85
+ * well before this one. Validation lands ~70-80s into guest uptime — measured on
86
+ * `obsidian_test`, `created 70635 firstValidated 72681`, and on a cold boot of
87
+ * `obsidian_screenshots`, `created 66870 firstValidated 79870`, which at 85s
88
+ * uptime still scored `EVER_EVALUATED&IS_UNMETERED` with no `IS_VALIDATED` and
89
+ * no `firstValidated` field at all. Against a boot flag at ~56s that leaves a
90
+ * gap of tens of seconds on a fast host, and more on a slow one. A suite started
91
+ * in that gap does not merely run slowly: a test that reaches the network runs
92
+ * to completion against a silently empty result, which no assertion inside the
93
+ * suite can tell apart from a genuinely empty feed.
94
+ *
95
+ * `dumpsys connectivity` is the honest source, and the three probes that look
96
+ * like better ones are all wrong — each of them misled a full day of
97
+ * investigation before this was understood:
98
+ *
99
+ * - `ip route` shows **no** default route on a healthy device: Android uses
100
+ * per-network policy routing, and the route lives in table 1015, not `main`.
101
+ * - `ping` fails on a healthy device: QEMU user-mode NAT does not forward ICMP
102
+ * on Windows hosts.
103
+ * - `getprop net.dns1` is empty on every modern Android: DNS went per-network
104
+ * in 8/9.
105
+ *
106
+ * @param params - The sampled probe output.
107
+ * @returns `true` when the guest has a validated default network.
108
+ */
109
+ export declare function checkNetworkValidated(params: CheckNetworkValidatedParams): boolean;
48
110
  /**
49
111
  * Resolves the post-boot device-idle wait timeout, applying the default when
50
112
  * the option is omitted.
@@ -57,3 +119,15 @@ export declare function checkDeviceIdle(params: CheckDeviceIdleParams): boolean;
57
119
  * @returns The timeout in milliseconds.
58
120
  */
59
121
  export declare function resolveDeviceIdleTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
122
+ /**
123
+ * Resolves the network-ready wait timeout, applying the default when the option
124
+ * is omitted.
125
+ *
126
+ * This bounds how long the factory waits, after the idle gate, for the guest to
127
+ * report a validated default network (see {@link checkNetworkValidated}) before
128
+ * establishing the session. A value of `0` skips the wait entirely.
129
+ *
130
+ * @param options - The Android Appium transport options.
131
+ * @returns The timeout in milliseconds.
132
+ */
133
+ export declare function resolveNetworkReadyTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
@@ -1,17 +1,49 @@
1
+ const ACTIVE_DEFAULT_NETWORK_PATTERN = /^\s*Active default network:\s*(?<networkId>\S+)/m;
1
2
  const BOOT_ANIMATION_STOPPED_STATE = "stopped";
3
+ const FIRST_VALIDATED_PATTERN = /\bfirstValidated\s+(?<timestamp>\d+)/;
4
+ const NETWORK_AGENT_INFO_MARKER = "NetworkAgentInfo{";
5
+ const NETWORK_ID_PATTERN = /^\d+$/;
2
6
  const PACKAGE_LINE_PREFIX = "package:";
7
+ const VALIDATED_SCORE_POLICY = "IS_VALIDATED";
3
8
  const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 6e4;
9
+ const DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS = 12e4;
4
10
  function checkDeviceIdle(params) {
5
11
  const isBootAnimationStopped = params.bootAnimationProperty.trim() === BOOT_ANIMATION_STOPPED_STATE;
6
12
  const isPackageManagerReady = params.packageListOutput.split("\n").some((line) => line.trimStart().startsWith(PACKAGE_LINE_PREFIX));
7
13
  return isBootAnimationStopped && isPackageManagerReady;
8
14
  }
15
+ function checkNetworkValidated(params) {
16
+ const activeNetworkId = ACTIVE_DEFAULT_NETWORK_PATTERN.exec(params.connectivityOutput)?.groups?.["networkId"] ?? "";
17
+ if (!NETWORK_ID_PATTERN.test(activeNetworkId)) {
18
+ return false;
19
+ }
20
+ const agentInfo = extractNetworkAgentInfo(params.connectivityOutput, activeNetworkId);
21
+ if (agentInfo.includes(VALIDATED_SCORE_POLICY)) {
22
+ return true;
23
+ }
24
+ const firstValidatedTimestamp = Number(FIRST_VALIDATED_PATTERN.exec(agentInfo)?.groups?.["timestamp"] ?? "0");
25
+ return firstValidatedTimestamp > 0;
26
+ }
9
27
  function resolveDeviceIdleTimeoutInMilliseconds(options) {
10
28
  return options.deviceIdleTimeoutInMilliseconds ?? DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS;
11
29
  }
30
+ function resolveNetworkReadyTimeoutInMilliseconds(options) {
31
+ return options.networkReadyTimeoutInMilliseconds ?? DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS;
32
+ }
33
+ function extractNetworkAgentInfo(connectivityOutput, networkId) {
34
+ const startIndex = connectivityOutput.indexOf(`${NETWORK_AGENT_INFO_MARKER}network{${networkId}}`);
35
+ if (startIndex === -1) {
36
+ return "";
37
+ }
38
+ const lineEndIndex = connectivityOutput.indexOf("\n", startIndex);
39
+ return lineEndIndex === -1 ? connectivityOutput.slice(startIndex) : connectivityOutput.slice(startIndex, lineEndIndex);
40
+ }
12
41
  export {
13
42
  DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS,
43
+ DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS,
14
44
  checkDeviceIdle,
15
- resolveDeviceIdleTimeoutInMilliseconds
45
+ checkNetworkValidated,
46
+ resolveDeviceIdleTimeoutInMilliseconds,
47
+ resolveNetworkReadyTimeoutInMilliseconds
16
48
  };
17
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1yZWFkaW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZW4gYSBmcmVzaGx5LWJvb3RlZCBBbmRyb2lkIGVtdWxhdG9yIGlzIGlkbGVcbiAqIGVub3VnaCB0byBlc3RhYmxpc2ggYW4gQXBwaXVtIHNlc3Npb24sIHBsdXMgcmVzb2x2aW5nIHRoZSBpZGxlLXdhaXQgdGltZW91dFxuICogZnJvbSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seVxuICogYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgcGFyc2luZyBhbmQgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXkgdW5pdC10ZXN0YWJsZVxuICogKHRoZSBmYWN0b3J5IGl0c2VsZiBuZWVkcyBhIHJlYWwgZW11bGF0b3IgYW5kIGlzIGV4Y2x1ZGVkIGZyb20gdW5pdCB0ZXN0cykuXG4gKlxuICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAqIG9wdGltaXphdGlvbiAoYGRleDJvYXRgKSBhbmQgc3lzdGVtIHNlcnZpY2VzIGtlZXAgY2h1cm5pbmcgYWZ0ZXIgaXQsIHNvIGFcbiAqIHNlc3Npb24gZXN0YWJsaXNoZWQgdGhlIGluc3RhbnQgaXQgZmlyZXMgbWFrZXMgZXZlcnkgb25lIG9mIFVpQXV0b21hdG9yMidzXG4gKiBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGUgfjN4LiBHYXRpbmdcbiAqIHRoZSBzZXNzaW9uIG9uIGEgbGF0ZXIsIHF1aWV0ZXIgc2lnbmFsICh0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgYW5kXG4gKiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIHNlcnZpbmcpIGxldHMgaXQgcnVuIGFnYWluc3QgYW4gaWRsZSBndWVzdCBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuY29uc3QgQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURSA9ICdzdG9wcGVkJztcbmNvbnN0IFBBQ0tBR0VfTElORV9QUkVGSVggPSAncGFja2FnZTonO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tEZXZpY2VJZGxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0RldmljZUlkbGVQYXJhbXMge1xuICAvKipcbiAgUmF3IHN0ZG91dCBvZiBgYWRiIHNoZWxsIGdldHByb3AgaW5pdC5zdmMuYm9vdGFuaW1gLlxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdEFuaW1hdGlvblByb3BlcnR5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBjbWQgcGFja2FnZSBsaXN0IHBhY2thZ2VzYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VMaXN0T3V0cHV0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGlzIGlkbGUgZW5vdWdoIHRvIHN0YXJ0IGFuIEFwcGl1bSBzZXNzaW9uLFxuICogZnJvbSB0aGUgcmF3IG91dHB1dCBvZiB0aGUgdHdvIHByb2JlIGNvbW1hbmRzLlxuICpcbiAqIFRoZSBndWVzdCBpcyBjb25zaWRlcmVkIGlkbGUgb25jZSB0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgKiphbmQqKiB0aGVcbiAqIHBhY2thZ2UgbWFuYWdlciBpcyBzZXJ2aW5nIChpdCBsaXN0cyBhdCBsZWFzdCBvbmUgcGFja2FnZSkuIEJvdGggYXJlIGJpbmFyeSxcbiAqIGxhdGVyLXRoYW4tYHN5cy5ib290X2NvbXBsZXRlZGAgc2lnbmFscywgc28gdGhpcyByZXR1cm5zIGB0cnVlYCB3ZWxsIGFmdGVyIHRoZVxuICogcHJlbWF0dXJlIGJvb3QtY29tcGxldGVkIGZsYWcgYnV0IHdpdGhvdXQgYW55IGxhdGVuY3kgdGhyZXNob2xkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbXBsZWQgcHJvYmUgb3V0cHV0cy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBndWVzdCBpcyBpZGxlIGVub3VnaCB0byBwcm9jZWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEZXZpY2VJZGxlKHBhcmFtczogQ2hlY2tEZXZpY2VJZGxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzQm9vdEFuaW1hdGlvblN0b3BwZWQgPSBwYXJhbXMuYm9vdEFuaW1hdGlvblByb3BlcnR5LnRyaW0oKSA9PT0gQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURTtcbiAgY29uc3QgaXNQYWNrYWdlTWFuYWdlclJlYWR5ID0gcGFyYW1zLnBhY2thZ2VMaXN0T3V0cHV0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoUEFDS0FHRV9MSU5FX1BSRUZJWCkpO1xuICByZXR1cm4gaXNCb290QW5pbWF0aW9uU3RvcHBlZCAmJiBpc1BhY2thZ2VNYW5hZ2VyUmVhZHk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IHRpbWVvdXQsIGFwcGx5aW5nIHRoZSBkZWZhdWx0IHdoZW5cbiAqIHRoZSBvcHRpb24gaXMgb21pdHRlZC5cbiAqXG4gKiBUaGlzIGJvdW5kcyBob3cgbG9uZyB0aGUgZmFjdG9yeSB3YWl0cyBmb3IgYSBmcmVzaGx5LXN0YXJ0ZWQgZW11bGF0b3IgdG9cbiAqIGJlY29tZSBpZGxlIChzZWUge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGJlZm9yZSBlc3RhYmxpc2hpbmcgdGhlIHNlc3Npb24uIEFcbiAqIHZhbHVlIG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKFxuICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4pOiBudW1iZXIge1xuICByZXR1cm4gb3B0aW9ucy5kZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVWSUNFX0lETEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkEsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxzQkFBc0I7QUFLckIsTUFBTSw4Q0FBOEM7QUE2QnBELFNBQVMsZ0JBQWdCLFFBQXdDO0FBQ3RFLFFBQU0seUJBQXlCLE9BQU8sc0JBQXNCLEtBQUssTUFBTTtBQUN2RSxRQUFNLHdCQUF3QixPQUFPLGtCQUNsQyxNQUFNLElBQUksRUFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxXQUFXLG1CQUFtQixDQUFDO0FBQ2xFLFNBQU8sMEJBQTBCO0FBQ25DO0FBYU8sU0FBUyx1Q0FDZCxTQUNRO0FBQ1IsU0FBTyxRQUFRLG1DQUFtQztBQUNwRDsiLAogICJuYW1lcyI6IFtdCn0K
49
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1yZWFkaW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZW4gYSBmcmVzaGx5LWJvb3RlZCBBbmRyb2lkIGVtdWxhdG9yIGlzIHJlYWR5XG4gKiBlbm91Z2ggdG8gZXN0YWJsaXNoIGFuIEFwcGl1bSBzZXNzaW9uLCBwbHVzIHJlc29sdmluZyB0aGUgdHdvIHJlYWRpbmVzcy13YWl0XG4gKiB0aW1lb3V0cyBmcm9tIHRoZSB0cmFuc3BvcnQgb3B0aW9ucy4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi1vbmx5XG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCBkZWZhdWx0IHJlc29sdXRpb24gc3RheSB1bml0LXRlc3RhYmxlXG4gKiAodGhlIGZhY3RvcnkgaXRzZWxmIG5lZWRzIGEgcmVhbCBlbXVsYXRvciBhbmQgaXMgZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKS5cbiAqXG4gKiBSZWFkaW5lc3MgaXMgdHdvIGluZGVwZW5kZW50IHF1ZXN0aW9ucywgd2FpdGVkIG9uIGluIHR3byBwaGFzZXM6XG4gKlxuICogMS4gKipJcyB0aGUgZ3Vlc3QgaWRsZT8qKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyAqYmVmb3JlKiBpdCBpczogcGFja2FnZVxuICogICAgb3B0aW1pemF0aW9uIChgZGV4Mm9hdGApIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZyBhZnRlciBpdCwgc28gYVxuICogICAgc2Vzc2lvbiBlc3RhYmxpc2hlZCB0aGUgaW5zdGFudCBpdCBmaXJlcyBtYWtlcyBldmVyeSBvbmUgb2YgVWlBdXRvbWF0b3IyJ3NcbiAqICAgIHNlcmlhbGl6ZWQgYGFkYmAgcm91bmQtdHJpcHMgY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZSB+M3guIEdhdGluZ1xuICogICAgdGhlIHNlc3Npb24gb24gYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKHRoZSBib290IGFuaW1hdGlvbiBoYXMgc3RvcHBlZCBhbmRcbiAqICAgIHRoZSBwYWNrYWdlIG1hbmFnZXIgaXMgc2VydmluZykgbGV0cyBpdCBydW4gYWdhaW5zdCBhbiBpZGxlIGd1ZXN0IGluc3RlYWQuXG4gKiAyLiAqKkRvZXMgdGhlIGd1ZXN0IGhhdmUgYSBuZXR3b3JrPyoqIEJvdGggaWRsZSBzaWduYWxzIGFyZSB0cnVlIHdlbGwgKmJlZm9yZSpcbiAqICAgIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkIFx1MjAxNCB0aGF0IGxhbmRzIH44MHMgaW50byBndWVzdFxuICogICAgdXB0aW1lLCB0ZW5zIG9mIHNlY29uZHMgYWZ0ZXIgdGhlIGlkbGUgZ2F0ZSBjbGVhcnMgXHUyMDE0IGFuZCBuZWl0aGVyIHNheXNcbiAqICAgIGFueXRoaW5nIGFib3V0IGNvbm5lY3Rpdml0eSwgc28gYW4gaWRsZS1vbmx5IGdhdGUgaGFuZHMgdGhlIHN1aXRlIGEgZGV2aWNlXG4gKiAgICB3aXRoIG5vIHJvdXRlLiBTZWUge0BsaW5rIGNoZWNrTmV0d29ya1ZhbGlkYXRlZH0gZm9yIHRoZSBtZWFzdXJlbWVudCBhbmRcbiAqICAgIGZvciB3aHkgdGhlIHRocmVlIG9idmlvdXMgY29ubmVjdGl2aXR5IHByb2JlcyBhcmUgYWxsIHdyb25nIGhlcmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuXG5jb25zdCBBQ1RJVkVfREVGQVVMVF9ORVRXT1JLX1BBVFRFUk4gPSAvXlxccypBY3RpdmUgZGVmYXVsdCBuZXR3b3JrOlxccyooPzxuZXR3b3JrSWQ+XFxTKykvbTtcbmNvbnN0IEJPT1RfQU5JTUFUSU9OX1NUT1BQRURfU1RBVEUgPSAnc3RvcHBlZCc7XG5jb25zdCBGSVJTVF9WQUxJREFURURfUEFUVEVSTiA9IC9cXGJmaXJzdFZhbGlkYXRlZFxccysoPzx0aW1lc3RhbXA+XFxkKykvO1xuY29uc3QgTkVUV09SS19BR0VOVF9JTkZPX01BUktFUiA9ICdOZXR3b3JrQWdlbnRJbmZveyc7XG5jb25zdCBORVRXT1JLX0lEX1BBVFRFUk4gPSAvXlxcZCskLztcbmNvbnN0IFBBQ0tBR0VfTElORV9QUkVGSVggPSAncGFja2FnZTonO1xuY29uc3QgVkFMSURBVEVEX1NDT1JFX1BPTElDWSA9ICdJU19WQUxJREFURUQnO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5uZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICpcbiAqIFRoZSBidWRnZXQgc3RhcnRzICphZnRlciogYHN5cy5ib290X2NvbXBsZXRlZGAsIHdoZXJlIHRoZSBtZWFzdXJlZCB3YWl0IG9uIGFcbiAqIGNvbGQgV0hQWCBlbXVsYXRvciBpcyB+MzBzICh2YWxpZGF0aW9uIGF0IH44MHMgZnJvbSBib290LCBhZ2FpbnN0IGEgYm9vdCBmbGFnXG4gKiBhdCB+NTZzKS4gVGhlIGRlZmF1bHQgaXMgaGVhZHJvb20gZm9yIHRoZSBzdGFydmVkL0NJIHJlZ2ltZSB0aGUgb3RoZXIgQW5kcm9pZFxuICogYnVkZ2V0cyBhcmUgYWxyZWFkeSBzaXplZCBmb3IsIG5vdCB0aGUgZXhwZWN0ZWQgY29zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkVUV09SS19SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tEZXZpY2VJZGxlUGFyYW1zIHtcbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBnZXRwcm9wIGluaXQuc3ZjLmJvb3RhbmltYC5cbiAgICovXG4gIHJlYWRvbmx5IGJvb3RBbmltYXRpb25Qcm9wZXJ0eTogc3RyaW5nO1xuXG4gIC8qKlxuICBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgY21kIHBhY2thZ2UgbGlzdCBwYWNrYWdlc2AuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTGlzdE91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja05ldHdvcmtWYWxpZGF0ZWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrTmV0d29ya1ZhbGlkYXRlZFBhcmFtcyB7XG4gIC8qKlxuICBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBjb25uZWN0aXZpdHlgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGl2aXR5T3V0cHV0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGlzIGlkbGUgZW5vdWdoIHRvIHN0YXJ0IGFuIEFwcGl1bSBzZXNzaW9uLFxuICogZnJvbSB0aGUgcmF3IG91dHB1dCBvZiB0aGUgdHdvIHByb2JlIGNvbW1hbmRzLlxuICpcbiAqIFRoZSBndWVzdCBpcyBjb25zaWRlcmVkIGlkbGUgb25jZSB0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgKiphbmQqKiB0aGVcbiAqIHBhY2thZ2UgbWFuYWdlciBpcyBzZXJ2aW5nIChpdCBsaXN0cyBhdCBsZWFzdCBvbmUgcGFja2FnZSkuIEJvdGggYXJlIGJpbmFyeSxcbiAqIGxhdGVyLXRoYW4tYHN5cy5ib290X2NvbXBsZXRlZGAgc2lnbmFscywgc28gdGhpcyByZXR1cm5zIGB0cnVlYCB3ZWxsIGFmdGVyIHRoZVxuICogcHJlbWF0dXJlIGJvb3QtY29tcGxldGVkIGZsYWcgYnV0IHdpdGhvdXQgYW55IGxhdGVuY3kgdGhyZXNob2xkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbXBsZWQgcHJvYmUgb3V0cHV0cy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBndWVzdCBpcyBpZGxlIGVub3VnaCB0byBwcm9jZWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEZXZpY2VJZGxlKHBhcmFtczogQ2hlY2tEZXZpY2VJZGxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzQm9vdEFuaW1hdGlvblN0b3BwZWQgPSBwYXJhbXMuYm9vdEFuaW1hdGlvblByb3BlcnR5LnRyaW0oKSA9PT0gQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURTtcbiAgY29uc3QgaXNQYWNrYWdlTWFuYWdlclJlYWR5ID0gcGFyYW1zLnBhY2thZ2VMaXN0T3V0cHV0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoUEFDS0FHRV9MSU5FX1BSRUZJWCkpO1xuICByZXR1cm4gaXNCb290QW5pbWF0aW9uU3RvcHBlZCAmJiBpc1BhY2thZ2VNYW5hZ2VyUmVhZHk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGhhcyBhIHdvcmtpbmcgbmV0d29yaywgZnJvbSB0aGUgcmF3IG91dHB1dFxuICogb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGNvbm5lY3Rpdml0eWAuXG4gKlxuICogUmVhZHkgbWVhbnMgdGhlIGR1bXAgbmFtZXMgYW4gKiphY3RpdmUgZGVmYXVsdCBuZXR3b3JrKiogKmFuZCogdGhhdCBuZXR3b3JrJ3NcbiAqIG93biBhZ2VudCBpbmZvIHJlcG9ydHMgdmFsaWRhdGlvbiBcdTIwMTQgZWl0aGVyIGFuIGBJU19WQUxJREFURURgIHNjb3JlIHBvbGljeSBvciBhXG4gKiBub24temVybyBgZmlyc3RWYWxpZGF0ZWRgIHRpbWVzdGFtcC4gQm90aCBhcmUgcmVxdWlyZWQ6IGEgZGVmYXVsdCBuZXR3b3JrXG4gKiBleGlzdHMgZm9yIHNlY29uZHMgYmVmb3JlIGl0IHZhbGlkYXRlcywgYW5kIGR1cmluZyB0aGF0IHdpbmRvdyBpdCBjYXJyaWVzIG5vXG4gKiB1c2FibGUgcm91dGUuXG4gKlxuICogV2h5IHRoaXMgbWF0dGVycyBhdCBhbGw6IHRoZSB0d28ge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0gc2lnbmFscyBhcmUgc2F0aXNmaWVkXG4gKiB3ZWxsIGJlZm9yZSB0aGlzIG9uZS4gVmFsaWRhdGlvbiBsYW5kcyB+NzAtODBzIGludG8gZ3Vlc3QgdXB0aW1lIFx1MjAxNCBtZWFzdXJlZCBvblxuICogYG9ic2lkaWFuX3Rlc3RgLCBgY3JlYXRlZCA3MDYzNSBmaXJzdFZhbGlkYXRlZCA3MjY4MWAsIGFuZCBvbiBhIGNvbGQgYm9vdCBvZlxuICogYG9ic2lkaWFuX3NjcmVlbnNob3RzYCwgYGNyZWF0ZWQgNjY4NzAgZmlyc3RWYWxpZGF0ZWQgNzk4NzBgLCB3aGljaCBhdCA4NXNcbiAqIHVwdGltZSBzdGlsbCBzY29yZWQgYEVWRVJfRVZBTFVBVEVEJklTX1VOTUVURVJFRGAgd2l0aCBubyBgSVNfVkFMSURBVEVEYCBhbmRcbiAqIG5vIGBmaXJzdFZhbGlkYXRlZGAgZmllbGQgYXQgYWxsLiBBZ2FpbnN0IGEgYm9vdCBmbGFnIGF0IH41NnMgdGhhdCBsZWF2ZXMgYVxuICogZ2FwIG9mIHRlbnMgb2Ygc2Vjb25kcyBvbiBhIGZhc3QgaG9zdCwgYW5kIG1vcmUgb24gYSBzbG93IG9uZS4gQSBzdWl0ZSBzdGFydGVkXG4gKiBpbiB0aGF0IGdhcCBkb2VzIG5vdCBtZXJlbHkgcnVuIHNsb3dseTogYSB0ZXN0IHRoYXQgcmVhY2hlcyB0aGUgbmV0d29yayBydW5zXG4gKiB0byBjb21wbGV0aW9uIGFnYWluc3QgYSBzaWxlbnRseSBlbXB0eSByZXN1bHQsIHdoaWNoIG5vIGFzc2VydGlvbiBpbnNpZGUgdGhlXG4gKiBzdWl0ZSBjYW4gdGVsbCBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IGZlZWQuXG4gKlxuICogYGR1bXBzeXMgY29ubmVjdGl2aXR5YCBpcyB0aGUgaG9uZXN0IHNvdXJjZSwgYW5kIHRoZSB0aHJlZSBwcm9iZXMgdGhhdCBsb29rXG4gKiBsaWtlIGJldHRlciBvbmVzIGFyZSBhbGwgd3JvbmcgXHUyMDE0IGVhY2ggb2YgdGhlbSBtaXNsZWQgYSBmdWxsIGRheSBvZlxuICogaW52ZXN0aWdhdGlvbiBiZWZvcmUgdGhpcyB3YXMgdW5kZXJzdG9vZDpcbiAqXG4gKiAtIGBpcCByb3V0ZWAgc2hvd3MgKipubyoqIGRlZmF1bHQgcm91dGUgb24gYSBoZWFsdGh5IGRldmljZTogQW5kcm9pZCB1c2VzXG4gKiAgIHBlci1uZXR3b3JrIHBvbGljeSByb3V0aW5nLCBhbmQgdGhlIHJvdXRlIGxpdmVzIGluIHRhYmxlIDEwMTUsIG5vdCBgbWFpbmAuXG4gKiAtIGBwaW5nYCBmYWlscyBvbiBhIGhlYWx0aHkgZGV2aWNlOiBRRU1VIHVzZXItbW9kZSBOQVQgZG9lcyBub3QgZm9yd2FyZCBJQ01QXG4gKiAgIG9uIFdpbmRvd3MgaG9zdHMuXG4gKiAtIGBnZXRwcm9wIG5ldC5kbnMxYCBpcyBlbXB0eSBvbiBldmVyeSBtb2Rlcm4gQW5kcm9pZDogRE5TIHdlbnQgcGVyLW5ldHdvcmtcbiAqICAgaW4gOC85LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2FtcGxlZCBwcm9iZSBvdXRwdXQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZ3Vlc3QgaGFzIGEgdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTmV0d29ya1ZhbGlkYXRlZChwYXJhbXM6IENoZWNrTmV0d29ya1ZhbGlkYXRlZFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmVOZXR3b3JrSWQgPSBBQ1RJVkVfREVGQVVMVF9ORVRXT1JLX1BBVFRFUk4uZXhlYyhwYXJhbXMuY29ubmVjdGl2aXR5T3V0cHV0KT8uZ3JvdXBzPy5bJ25ldHdvcmtJZCddID8/ICcnO1xuICBpZiAoIU5FVFdPUktfSURfUEFUVEVSTi50ZXN0KGFjdGl2ZU5ldHdvcmtJZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhZ2VudEluZm8gPSBleHRyYWN0TmV0d29ya0FnZW50SW5mbyhwYXJhbXMuY29ubmVjdGl2aXR5T3V0cHV0LCBhY3RpdmVOZXR3b3JrSWQpO1xuICBpZiAoYWdlbnRJbmZvLmluY2x1ZGVzKFZBTElEQVRFRF9TQ09SRV9QT0xJQ1kpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBmaXJzdFZhbGlkYXRlZFRpbWVzdGFtcCA9IE51bWJlcihGSVJTVF9WQUxJREFURURfUEFUVEVSTi5leGVjKGFnZW50SW5mbyk/Lmdyb3Vwcz8uWyd0aW1lc3RhbXAnXSA/PyAnMCcpO1xuICByZXR1cm4gZmlyc3RWYWxpZGF0ZWRUaW1lc3RhbXAgPiAwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCB0aW1lb3V0LCBhcHBseWluZyB0aGUgZGVmYXVsdCB3aGVuXG4gKiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBib3VuZHMgaG93IGxvbmcgdGhlIGZhY3Rvcnkgd2FpdHMgZm9yIGEgZnJlc2hseS1zdGFydGVkIGVtdWxhdG9yIHRvXG4gKiBiZWNvbWUgaWRsZSAoc2VlIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBiZWZvcmUgZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uLiBBXG4gKiB2YWx1ZSBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0RFVklDRV9JRExFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBuZXR3b3JrLXJlYWR5IHdhaXQgdGltZW91dCwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uXG4gKiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgYm91bmRzIGhvdyBsb25nIHRoZSBmYWN0b3J5IHdhaXRzLCBhZnRlciB0aGUgaWRsZSBnYXRlLCBmb3IgdGhlIGd1ZXN0IHRvXG4gKiByZXBvcnQgYSB2YWxpZGF0ZWQgZGVmYXVsdCBuZXR3b3JrIChzZWUge0BsaW5rIGNoZWNrTmV0d29ya1ZhbGlkYXRlZH0pIGJlZm9yZVxuICogZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uLiBBIHZhbHVlIG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMoXG4gIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbik6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zLm5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX05FVFdPUktfUkVBRFlfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBOZXR3b3JrQWdlbnRJbmZve1x1MjAyNn1gIGVudHJ5IGZvciBvbmUgbmV0d29yayBpZCBmcm9tIGFcbiAqIGNvbm5lY3Rpdml0eSBkdW1wLlxuICpcbiAqICoqQm91bmRlZCB0byB0aGUgZW50cnkncyBvd24gbGluZSwgYW5kIHRoYXQgYm91bmQgaXMgbG9hZC1iZWFyaW5nLioqIEEgcmVhbFxuICogZHVtcCBsaXN0cyB0aGUgYWN0aXZlIG5ldHdvcmsncyBhZ2VudCB1bmRlciBgQ3VycmVudCBOZXR3b3JrczpgIGFuZCB0aGVuLCBtdWNoXG4gKiBmdXJ0aGVyIGRvd24sIGEgYE5ldHdvcmtPZmZlcmAgcGVyIHByb3ZpZGVyIFx1MjAxNCBhbmQgdGhvc2Ugb2ZmZXJzIGNhcnJ5XG4gKiBgSVNfVkFMSURBVEVEYCBpbiB0aGVpciBzY29yZSBwb2xpY2llcyB3aGF0ZXZlciB0aGUgbGl2ZSBuZXR3b3JrIGlzIGRvaW5nLiBBXG4gKiBkdW1wIHNhbXBsZWQgaGVyZSB3aXRoIGFuIHVudmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayBoZWxkIHNldmVuIHN1Y2ggb2ZmZXJzLFxuICogc28gcmVhZGluZyBwYXN0IHRoZSBhZ2VudCdzIG93biBsaW5lIHJlcG9ydHMgKmV2ZXJ5KiBkdW1wIGFzIHZhbGlkYXRlZC4gT25lXG4gKiBlbnRyeSBpcyBvbmUgbGluZSBpbiB0aGUgb2JzZXJ2ZWQgb3V0cHV0OyBhbiBlbnRyeSB0aGF0IGV2ZXIgd3JhcHMgcmVhZHMgYXNcbiAqIG5vdC1yZWFkeSwgd2hpY2ggaXMgdGhlIHNhZmUgZGlyZWN0aW9uIHRvIGJlIHdyb25nIGluLlxuICpcbiAqIEBwYXJhbSBjb25uZWN0aXZpdHlPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBjb25uZWN0aXZpdHlgLlxuICogQHBhcmFtIG5ldHdvcmtJZCAtIFRoZSBuZXR3b3JrIGlkIHdob3NlIGVudHJ5IHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgZW50cnkncyBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgZHVtcCBoYXMgbm8gc3VjaCBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE5ldHdvcmtBZ2VudEluZm8oY29ubmVjdGl2aXR5T3V0cHV0OiBzdHJpbmcsIG5ldHdvcmtJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbm5lY3Rpdml0eU91dHB1dC5pbmRleE9mKGAke05FVFdPUktfQUdFTlRfSU5GT19NQVJLRVJ9bmV0d29ya3ske25ldHdvcmtJZH19YCk7XG4gIGlmIChzdGFydEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGxpbmVFbmRJbmRleCA9IGNvbm5lY3Rpdml0eU91dHB1dC5pbmRleE9mKCdcXG4nLCBzdGFydEluZGV4KTtcbiAgcmV0dXJuIGxpbmVFbmRJbmRleCA9PT0gLTFcbiAgICA/IGNvbm5lY3Rpdml0eU91dHB1dC5zbGljZShzdGFydEluZGV4KVxuICAgIDogY29ubmVjdGl2aXR5T3V0cHV0LnNsaWNlKHN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkEsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSx5QkFBeUI7QUFLeEIsTUFBTSw4Q0FBOEM7QUFVcEQsTUFBTSxnREFBZ0Q7QUF1Q3RELFNBQVMsZ0JBQWdCLFFBQXdDO0FBQ3RFLFFBQU0seUJBQXlCLE9BQU8sc0JBQXNCLEtBQUssTUFBTTtBQUN2RSxRQUFNLHdCQUF3QixPQUFPLGtCQUNsQyxNQUFNLElBQUksRUFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxXQUFXLG1CQUFtQixDQUFDO0FBQ2xFLFNBQU8sMEJBQTBCO0FBQ25DO0FBcUNPLFNBQVMsc0JBQXNCLFFBQThDO0FBQ2xGLFFBQU0sa0JBQWtCLCtCQUErQixLQUFLLE9BQU8sa0JBQWtCLEdBQUcsU0FBUyxXQUFXLEtBQUs7QUFDakgsTUFBSSxDQUFDLG1CQUFtQixLQUFLLGVBQWUsR0FBRztBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sWUFBWSx3QkFBd0IsT0FBTyxvQkFBb0IsZUFBZTtBQUNwRixNQUFJLFVBQVUsU0FBUyxzQkFBc0IsR0FBRztBQUM5QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sMEJBQTBCLE9BQU8sd0JBQXdCLEtBQUssU0FBUyxHQUFHLFNBQVMsV0FBVyxLQUFLLEdBQUc7QUFDNUcsU0FBTywwQkFBMEI7QUFDbkM7QUFhTyxTQUFTLHVDQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsbUNBQW1DO0FBQ3BEO0FBYU8sU0FBUyx5Q0FDZCxTQUNRO0FBQ1IsU0FBTyxRQUFRLHFDQUFxQztBQUN0RDtBQW1CQSxTQUFTLHdCQUF3QixvQkFBNEIsV0FBMkI7QUFDdEYsUUFBTSxhQUFhLG1CQUFtQixRQUFRLEdBQUcseUJBQXlCLFdBQVcsU0FBUyxHQUFHO0FBQ2pHLE1BQUksZUFBZSxJQUFJO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLG1CQUFtQixRQUFRLE1BQU0sVUFBVTtBQUNoRSxTQUFPLGlCQUFpQixLQUNwQixtQkFBbUIsTUFBTSxVQUFVLElBQ25DLG1CQUFtQixNQUFNLFlBQVksWUFBWTtBQUN2RDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Photographs the DEVICE, not the web page.
5
+ *
6
+ * `captureObsidianScreenshot` goes through Appium in the WebView context, so on
7
+ * Android it captures the page: no status bar, and — the reason this exists —
8
+ * no soft keyboard, because the IME is a system window and not part of the
9
+ * page. A frame that is meant to show what a phone looks like therefore cannot
10
+ * be taken that way.
11
+ *
12
+ * `adb exec-out screencap -p` reads the framebuffer instead, which is the same
13
+ * route the trusted-input passes already use. The trade is deliberate and worth
14
+ * writing down at every call site: a device capture carries the status-bar clock
15
+ * and battery, so it is **not byte-reproducible** the way a page capture is.
16
+ * Reach for this only for the shots that need the keyboard; leave the rest on
17
+ * `captureObsidianScreenshot`.
18
+ */
19
+ /**
20
+ * Parameters for {@link captureDeviceScreenshot}.
21
+ */
22
+ export interface CaptureDeviceScreenshotParams {
23
+ /**
24
+ * The device to photograph.
25
+ */
26
+ readonly deviceId: string;
27
+ }
28
+ /**
29
+ * Captures the device's framebuffer as a PNG.
30
+ *
31
+ * @param params - The device to photograph.
32
+ * @returns A {@link Promise} that resolves to the raw PNG bytes.
33
+ * @throws Error if what came back is not a PNG — which is what a truncated or text-decoded capture looks
34
+ * like, and is far cheaper to catch here than in an image diff.
35
+ */
36
+ export declare function captureDeviceScreenshot(params: CaptureDeviceScreenshotParams): Promise<Uint8Array>;
@@ -0,0 +1,18 @@
1
+ import { runAdbBinary } from "./adb.mjs";
2
+ import { isPng } from "./capture-screenshot.mjs";
3
+ async function captureDeviceScreenshot(params) {
4
+ const bytes = await runAdbBinary({
5
+ commandArguments: ["exec-out", "screencap", "-p"],
6
+ deviceId: params.deviceId
7
+ });
8
+ if (!isPng(bytes)) {
9
+ throw new Error(
10
+ `captureDeviceScreenshot: ${params.deviceId} returned ${String(bytes.length)} bytes that are not a PNG. A device that is still booting, or an adb transport that decoded the stream as text, both look like this.`
11
+ );
12
+ }
13
+ return bytes;
14
+ }
15
+ export {
16
+ captureDeviceScreenshot
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zY3JlZW5zaG90LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUGhvdG9ncmFwaHMgdGhlIERFVklDRSwgbm90IHRoZSB3ZWIgcGFnZS5cbiAqXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAgZ29lcyB0aHJvdWdoIEFwcGl1bSBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBzbyBvblxuICogQW5kcm9pZCBpdCBjYXB0dXJlcyB0aGUgcGFnZTogbm8gc3RhdHVzIGJhciwgYW5kIFx1MjAxNCB0aGUgcmVhc29uIHRoaXMgZXhpc3RzIFx1MjAxNFxuICogbm8gc29mdCBrZXlib2FyZCwgYmVjYXVzZSB0aGUgSU1FIGlzIGEgc3lzdGVtIHdpbmRvdyBhbmQgbm90IHBhcnQgb2YgdGhlXG4gKiBwYWdlLiBBIGZyYW1lIHRoYXQgaXMgbWVhbnQgdG8gc2hvdyB3aGF0IGEgcGhvbmUgbG9va3MgbGlrZSB0aGVyZWZvcmUgY2Fubm90XG4gKiBiZSB0YWtlbiB0aGF0IHdheS5cbiAqXG4gKiBgYWRiIGV4ZWMtb3V0IHNjcmVlbmNhcCAtcGAgcmVhZHMgdGhlIGZyYW1lYnVmZmVyIGluc3RlYWQsIHdoaWNoIGlzIHRoZSBzYW1lXG4gKiByb3V0ZSB0aGUgdHJ1c3RlZC1pbnB1dCBwYXNzZXMgYWxyZWFkeSB1c2UuIFRoZSB0cmFkZSBpcyBkZWxpYmVyYXRlIGFuZCB3b3J0aFxuICogd3JpdGluZyBkb3duIGF0IGV2ZXJ5IGNhbGwgc2l0ZTogYSBkZXZpY2UgY2FwdHVyZSBjYXJyaWVzIHRoZSBzdGF0dXMtYmFyIGNsb2NrXG4gKiBhbmQgYmF0dGVyeSwgc28gaXQgaXMgKipub3QgYnl0ZS1yZXByb2R1Y2libGUqKiB0aGUgd2F5IGEgcGFnZSBjYXB0dXJlIGlzLlxuICogUmVhY2ggZm9yIHRoaXMgb25seSBmb3IgdGhlIHNob3RzIHRoYXQgbmVlZCB0aGUga2V5Ym9hcmQ7IGxlYXZlIHRoZSByZXN0IG9uXG4gKiBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAuXG4gKi9cblxuaW1wb3J0IHsgcnVuQWRiQmluYXJ5IH0gZnJvbSAnLi9hZGIubWpzJztcbmltcG9ydCB7IGlzUG5nIH0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2FwdHVyZURldmljZVNjcmVlbnNob3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcHR1cmVEZXZpY2VTY3JlZW5zaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gcGhvdG9ncmFwaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgKHNoZWxscyBvdXQgdG8gYSByZWFsIGRldmljZSkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogQ2FwdHVyZXMgdGhlIGRldmljZSdzIGZyYW1lYnVmZmVyIGFzIGEgUE5HLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIHBob3RvZ3JhcGguXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgUE5HIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB3aGF0IGNhbWUgYmFjayBpcyBub3QgYSBQTkcgXHUyMDE0IHdoaWNoIGlzIHdoYXQgYSB0cnVuY2F0ZWQgb3IgdGV4dC1kZWNvZGVkIGNhcHR1cmUgbG9va3NcbiAqICAgbGlrZSwgYW5kIGlzIGZhciBjaGVhcGVyIHRvIGNhdGNoIGhlcmUgdGhhbiBpbiBhbiBpbWFnZSBkaWZmLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FwdHVyZURldmljZVNjcmVlbnNob3QocGFyYW1zOiBDYXB0dXJlRGV2aWNlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBieXRlcyA9IGF3YWl0IHJ1bkFkYkJpbmFyeSh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydleGVjLW91dCcsICdzY3JlZW5jYXAnLCAnLXAnXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xuXG4gIGlmICghaXNQbmcoYnl0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGNhcHR1cmVEZXZpY2VTY3JlZW5zaG90OiAke3BhcmFtcy5kZXZpY2VJZH0gcmV0dXJuZWQgJHtTdHJpbmcoYnl0ZXMubGVuZ3RoKX0gYnl0ZXMgdGhhdCBhcmUgbm90IGEgUE5HLiBgXG4gICAgICAgICsgJ0EgZGV2aWNlIHRoYXQgaXMgc3RpbGwgYm9vdGluZywgb3IgYW4gYWRiIHRyYW5zcG9ydCB0aGF0IGRlY29kZWQgdGhlIHN0cmVhbSBhcyB0ZXh0LCBib3RoIGxvb2sgbGlrZSB0aGlzLidcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUJBLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsYUFBYTtBQXNCdEIsZUFBc0Isd0JBQXdCLFFBQTREO0FBQ3hHLFFBQU0sUUFBUSxNQUFNLGFBQWE7QUFBQSxJQUMvQixrQkFBa0IsQ0FBQyxZQUFZLGFBQWEsSUFBSTtBQUFBLElBQ2hELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxNQUFJLENBQUMsTUFBTSxLQUFLLEdBQUc7QUFDakIsVUFBTSxJQUFJO0FBQUEsTUFDUiw0QkFBNEIsT0FBTyxRQUFRLGFBQWEsT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBLElBRTlFO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Decides how a device setting that was changed for a capture gets put back.
5
+ *
6
+ * A suite that flips a setting owes the device its original value back —
7
+ * including the case where it never had one. `settings get` prints the literal
8
+ * `null` for a setting that has never been written, and `settings put … null`
9
+ * does **not** reproduce that state: it writes the four-character string
10
+ * `null`. Restoring an unset setting takes `settings delete`, which is why this
11
+ * is a decision rather than a straight write-back.
12
+ *
13
+ * Pure and unit-tested; the calls that carry it out live in `device-settings`.
14
+ */
15
+ /**
16
+ * How a setting is restored.
17
+ */
18
+ export declare enum DeviceSettingRestoreKind {
19
+ /**
20
+ * The setting had never been written, so restoring it means removing it again.
21
+ */
22
+ Delete = "delete",
23
+ /**
24
+ * The setting held a value, which is written back verbatim.
25
+ */
26
+ Write = "write"
27
+ }
28
+ /**
29
+ * What restoring a setting requires: putting a value back, or removing it again.
30
+ */
31
+ export type DeviceSettingRestore = DeviceSettingRestoreDelete | DeviceSettingRestoreWrite;
32
+ /**
33
+ * Restoring a setting by removing it, because it had never been written.
34
+ */
35
+ export interface DeviceSettingRestoreDelete {
36
+ /**
37
+ * Discriminates the union.
38
+ */
39
+ readonly kind: DeviceSettingRestoreKind.Delete;
40
+ }
41
+ /**
42
+ * Restoring a setting by writing its previous value back.
43
+ */
44
+ export interface DeviceSettingRestoreWrite {
45
+ /**
46
+ * Discriminates the union.
47
+ */
48
+ readonly kind: DeviceSettingRestoreKind.Write;
49
+ /**
50
+ * The value to write back, exactly as it was read.
51
+ */
52
+ readonly value: string;
53
+ }
54
+ /**
55
+ * Decides how a setting read before a change is put back afterwards.
56
+ *
57
+ * @param previousValue - Exactly what `readDeviceSetting` returned before the change.
58
+ * @returns Whether to write the value back or to remove the setting again.
59
+ */
60
+ export declare function resolveDeviceSettingRestore(previousValue: string): DeviceSettingRestore;
@@ -0,0 +1,20 @@
1
+ var DeviceSettingRestoreKind = /* @__PURE__ */ ((DeviceSettingRestoreKind2) => {
2
+ DeviceSettingRestoreKind2["Delete"] = "delete";
3
+ DeviceSettingRestoreKind2["Write"] = "write";
4
+ return DeviceSettingRestoreKind2;
5
+ })(DeviceSettingRestoreKind || {});
6
+ const UNSET_SETTING_VALUE = "null";
7
+ function resolveDeviceSettingRestore(previousValue) {
8
+ if (previousValue === UNSET_SETTING_VALUE) {
9
+ return { kind: "delete" /* Delete */ };
10
+ }
11
+ return {
12
+ kind: "write" /* Write */,
13
+ value: previousValue
14
+ };
15
+ }
16
+ export {
17
+ DeviceSettingRestoreKind,
18
+ resolveDeviceSettingRestore
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1zZXR0aW5nLXJlc3RvcmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIGhvdyBhIGRldmljZSBzZXR0aW5nIHRoYXQgd2FzIGNoYW5nZWQgZm9yIGEgY2FwdHVyZSBnZXRzIHB1dCBiYWNrLlxuICpcbiAqIEEgc3VpdGUgdGhhdCBmbGlwcyBhIHNldHRpbmcgb3dlcyB0aGUgZGV2aWNlIGl0cyBvcmlnaW5hbCB2YWx1ZSBiYWNrIFx1MjAxNFxuICogaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIGl0IG5ldmVyIGhhZCBvbmUuIGBzZXR0aW5ncyBnZXRgIHByaW50cyB0aGUgbGl0ZXJhbFxuICogYG51bGxgIGZvciBhIHNldHRpbmcgdGhhdCBoYXMgbmV2ZXIgYmVlbiB3cml0dGVuLCBhbmQgYHNldHRpbmdzIHB1dCBcdTIwMjYgbnVsbGBcbiAqIGRvZXMgKipub3QqKiByZXByb2R1Y2UgdGhhdCBzdGF0ZTogaXQgd3JpdGVzIHRoZSBmb3VyLWNoYXJhY3RlciBzdHJpbmdcbiAqIGBudWxsYC4gUmVzdG9yaW5nIGFuIHVuc2V0IHNldHRpbmcgdGFrZXMgYHNldHRpbmdzIGRlbGV0ZWAsIHdoaWNoIGlzIHdoeSB0aGlzXG4gKiBpcyBhIGRlY2lzaW9uIHJhdGhlciB0aGFuIGEgc3RyYWlnaHQgd3JpdGUtYmFjay5cbiAqXG4gKiBQdXJlIGFuZCB1bml0LXRlc3RlZDsgdGhlIGNhbGxzIHRoYXQgY2FycnkgaXQgb3V0IGxpdmUgaW4gYGRldmljZS1zZXR0aW5nc2AuXG4gKi9cblxuLyoqXG4gKiBIb3cgYSBzZXR0aW5nIGlzIHJlc3RvcmVkLlxuICovXG5leHBvcnQgZW51bSBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmcgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbiwgc28gcmVzdG9yaW5nIGl0IG1lYW5zIHJlbW92aW5nIGl0IGFnYWluLlxuICAgKi9cbiAgRGVsZXRlID0gJ2RlbGV0ZScsXG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5nIGhlbGQgYSB2YWx1ZSwgd2hpY2ggaXMgd3JpdHRlbiBiYWNrIHZlcmJhdGltLlxuICAgKi9cbiAgV3JpdGUgPSAnd3JpdGUnXG59XG5cbi8qKlxuICogV2hhdCByZXN0b3JpbmcgYSBzZXR0aW5nIHJlcXVpcmVzOiBwdXR0aW5nIGEgdmFsdWUgYmFjaywgb3IgcmVtb3ZpbmcgaXQgYWdhaW4uXG4gKi9cbmV4cG9ydCB0eXBlIERldmljZVNldHRpbmdSZXN0b3JlID0gRGV2aWNlU2V0dGluZ1Jlc3RvcmVEZWxldGUgfCBEZXZpY2VTZXR0aW5nUmVzdG9yZVdyaXRlO1xuXG4vKipcbiAqIFJlc3RvcmluZyBhIHNldHRpbmcgYnkgcmVtb3ZpbmcgaXQsIGJlY2F1c2UgaXQgaGFkIG5ldmVyIGJlZW4gd3JpdHRlbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VTZXR0aW5nUmVzdG9yZURlbGV0ZSB7XG4gIC8qKlxuICAgKiBEaXNjcmltaW5hdGVzIHRoZSB1bmlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERldmljZVNldHRpbmdSZXN0b3JlS2luZC5EZWxldGU7XG59XG5cbi8qKlxuICogUmVzdG9yaW5nIGEgc2V0dGluZyBieSB3cml0aW5nIGl0cyBwcmV2aW91cyB2YWx1ZSBiYWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERldmljZVNldHRpbmdSZXN0b3JlV3JpdGUge1xuICAvKipcbiAgICogRGlzY3JpbWluYXRlcyB0aGUgdW5pb24uXG4gICAqL1xuICByZWFkb25seSBraW5kOiBEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQuV3JpdGU7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0byB3cml0ZSBiYWNrLCBleGFjdGx5IGFzIGl0IHdhcyByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IGBzZXR0aW5ncyBnZXRgIHByaW50cyBmb3IgYSBzZXR0aW5nIHRoYXQgaGFzIG5ldmVyIGJlZW4gd3JpdHRlbi5cbiAqL1xuY29uc3QgVU5TRVRfU0VUVElOR19WQUxVRSA9ICdudWxsJztcblxuLyoqXG4gKiBEZWNpZGVzIGhvdyBhIHNldHRpbmcgcmVhZCBiZWZvcmUgYSBjaGFuZ2UgaXMgcHV0IGJhY2sgYWZ0ZXJ3YXJkcy5cbiAqXG4gKiBAcGFyYW0gcHJldmlvdXNWYWx1ZSAtIEV4YWN0bHkgd2hhdCBgcmVhZERldmljZVNldHRpbmdgIHJldHVybmVkIGJlZm9yZSB0aGUgY2hhbmdlLlxuICogQHJldHVybnMgV2hldGhlciB0byB3cml0ZSB0aGUgdmFsdWUgYmFjayBvciB0byByZW1vdmUgdGhlIHNldHRpbmcgYWdhaW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGV2aWNlU2V0dGluZ1Jlc3RvcmUocHJldmlvdXNWYWx1ZTogc3RyaW5nKTogRGV2aWNlU2V0dGluZ1Jlc3RvcmUge1xuICBpZiAocHJldmlvdXNWYWx1ZSA9PT0gVU5TRVRfU0VUVElOR19WQUxVRSkge1xuICAgIHJldHVybiB7IGtpbmQ6IERldmljZVNldHRpbmdSZXN0b3JlS2luZC5EZWxldGUgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAga2luZDogRGV2aWNlU2V0dGluZ1Jlc3RvcmVLaW5kLldyaXRlLFxuICAgIHZhbHVlOiBwcmV2aW91c1ZhbHVlXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrQk8sSUFBSywyQkFBTCxrQkFBS0EsOEJBQUw7QUFJTCxFQUFBQSwwQkFBQSxZQUFTO0FBS1QsRUFBQUEsMEJBQUEsV0FBUTtBQVRFLFNBQUFBO0FBQUEsR0FBQTtBQTZDWixNQUFNLHNCQUFzQjtBQVFyQixTQUFTLDRCQUE0QixlQUE2QztBQUN2RixNQUFJLGtCQUFrQixxQkFBcUI7QUFDekMsV0FBTyxFQUFFLE1BQU0sc0JBQWdDO0FBQUEsRUFDakQ7QUFFQSxTQUFPO0FBQUEsSUFDTCxNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogWyJEZXZpY2VTZXR0aW5nUmVzdG9yZUtpbmQiXQp9Cg==