obsidian-integration-testing 11.0.0 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/adb-device-list.cjs +54 -0
- package/dist/lib/cjs/adb-device-list.d.cts +72 -0
- package/dist/lib/cjs/android-sdk.cjs +52 -0
- package/dist/lib/cjs/android-sdk.d.cts +29 -0
- package/dist/lib/cjs/app-startup-progress.cjs +87 -0
- package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
- package/dist/lib/cjs/appium-server-marker.cjs +112 -0
- package/dist/lib/cjs/appium-server-marker.d.cts +103 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
- package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
- package/dist/lib/cjs/cli.cjs +104 -19
- package/dist/lib/cjs/cli.d.cts +16 -8
- package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
- package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
- package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
- package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
- package/dist/lib/cjs/config-directory.cjs +46 -0
- package/dist/lib/cjs/config-directory.d.cts +45 -0
- package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
- package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
- package/dist/lib/cjs/context-provider.cjs +12 -1
- package/dist/lib/cjs/context-provider.d.cts +26 -3
- package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +114 -0
- package/dist/lib/cjs/demo-vault-populate.cjs +38 -10
- package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
- package/dist/lib/cjs/device-readiness.cjs +38 -3
- package/dist/lib/cjs/device-readiness.d.cts +83 -9
- package/dist/lib/cjs/emulator-arguments.cjs +6 -2
- package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
- package/dist/lib/cjs/emulator-backend.cjs +71 -0
- package/dist/lib/cjs/emulator-backend.d.cts +76 -0
- package/dist/lib/cjs/emulator-liveness.cjs +72 -0
- package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
- package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
- package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
- package/dist/lib/cjs/global-setup-core.cjs +30 -30
- package/dist/lib/cjs/global-setup-core.d.cts +27 -2
- package/dist/lib/cjs/headless-vault-config.cjs +51 -0
- package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
- package/dist/lib/cjs/index.cjs +24 -1
- package/dist/lib/cjs/index.d.cts +14 -5
- package/dist/lib/cjs/installer-asset.cjs +1 -1
- package/dist/lib/cjs/installer-asset.d.cts +1 -1
- package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
- package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
- package/dist/lib/cjs/jest/global-setup.cjs +2 -2
- package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/kill-process-tree.cjs +18 -7
- package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +173 -0
- package/dist/lib/cjs/mobile-input.d.cts +156 -0
- package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
- package/dist/lib/cjs/obsidian-installer.cjs +1 -1
- package/dist/lib/cjs/obsidian-instance.cjs +52 -3
- package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
- package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
- package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
- package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
- package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
- package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
- package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
- package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
- package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
- package/dist/lib/cjs/parent-liveness.cjs +42 -5
- package/dist/lib/cjs/parent-liveness.d.cts +37 -5
- package/dist/lib/cjs/port-owner.cjs +61 -0
- package/dist/lib/cjs/port-owner.d.cts +47 -0
- package/dist/lib/cjs/process-capture.cjs +62 -0
- package/dist/lib/cjs/process-capture.d.cts +83 -0
- package/dist/lib/cjs/process-exit-message.cjs +14 -8
- package/dist/lib/cjs/process-exit-message.d.cts +37 -3
- package/dist/lib/cjs/process-liveness.cjs +51 -0
- package/dist/lib/cjs/process-liveness.d.cts +18 -0
- package/dist/lib/cjs/release-catalog.cjs +73 -0
- package/dist/lib/cjs/release-catalog.d.cts +125 -0
- package/dist/lib/cjs/run-version-matrix.cjs +1 -1
- package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
- package/dist/lib/cjs/teardown-verdict.cjs +53 -0
- package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
- package/dist/lib/cjs/temporary-vault.cjs +43 -8
- package/dist/lib/cjs/temporary-vault.d.cts +47 -5
- package/dist/lib/cjs/transport-appium.cjs +223 -17
- package/dist/lib/cjs/transport-appium.d.cts +104 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +201 -6
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +100 -0
- package/dist/lib/cjs/transport-factory.cjs +1165 -142
- package/dist/lib/cjs/transport-factory.d.cts +10 -1
- package/dist/lib/cjs/transport-options.cjs +11 -3
- package/dist/lib/cjs/transport-options.d.cts +131 -12
- package/dist/lib/cjs/transport.cjs +1 -1
- package/dist/lib/cjs/transport.d.cts +7 -1
- package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
- package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
- package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
- package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +1 -1
- package/dist/lib/cjs/version-matrix.d.cts +2 -2
- package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
- package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
- package/dist/lib/cjs/vitest/setup.cjs +2 -1
- package/dist/lib/cjs/vitest/setup.d.cts +5 -0
- package/dist/lib/cjs/vitest/typings.d.cts +6 -4
- package/dist/lib/cjs/webview-cdp.cjs +263 -0
- package/dist/lib/cjs/webview-cdp.d.cts +156 -0
- package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
- package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
- package/dist/lib/esm/adb-device-list.d.mts +72 -0
- package/dist/lib/esm/adb-device-list.mjs +28 -0
- package/dist/lib/esm/android-sdk.d.mts +29 -0
- package/dist/lib/esm/android-sdk.mjs +18 -0
- package/dist/lib/esm/app-startup-progress.d.mts +128 -0
- package/dist/lib/esm/app-startup-progress.mjs +59 -0
- package/dist/lib/esm/appium-server-marker.d.mts +103 -0
- package/dist/lib/esm/appium-server-marker.mjs +89 -0
- package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
- package/dist/lib/esm/cli.d.mts +16 -8
- package/dist/lib/esm/cli.mjs +110 -19
- package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
- package/dist/lib/esm/community-plugin-registry.mjs +23 -0
- package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
- package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
- package/dist/lib/esm/config-directory.d.mts +45 -0
- package/dist/lib/esm/config-directory.mjs +21 -0
- package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
- package/dist/lib/esm/connect-to-cdp.mjs +13 -7
- package/dist/lib/esm/context-provider.d.mts +26 -3
- package/dist/lib/esm/context-provider.mjs +10 -1
- package/dist/lib/esm/demo-vault-bootstrap.d.mts +114 -0
- package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
- package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
- package/dist/lib/esm/demo-vault-populate.mjs +35 -9
- package/dist/lib/esm/device-readiness.d.mts +83 -9
- package/dist/lib/esm/device-readiness.mjs +34 -2
- package/dist/lib/esm/emulator-arguments.d.mts +26 -0
- package/dist/lib/esm/emulator-arguments.mjs +6 -2
- package/dist/lib/esm/emulator-backend.d.mts +76 -0
- package/dist/lib/esm/emulator-backend.mjs +45 -0
- package/dist/lib/esm/emulator-liveness.d.mts +158 -0
- package/dist/lib/esm/emulator-liveness.mjs +47 -0
- package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
- package/dist/lib/esm/emulator-snapshot.mjs +32 -0
- package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/global-setup-core.d.mts +27 -2
- package/dist/lib/esm/global-setup-core.mjs +34 -35
- package/dist/lib/esm/headless-vault-config.d.mts +67 -0
- package/dist/lib/esm/headless-vault-config.mjs +31 -0
- package/dist/lib/esm/index.d.mts +14 -5
- package/dist/lib/esm/index.mjs +26 -2
- package/dist/lib/esm/installer-asset.d.mts +1 -1
- package/dist/lib/esm/installer-asset.mjs +1 -1
- package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
- package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
- package/dist/lib/esm/jest/global-setup.d.mts +5 -1
- package/dist/lib/esm/jest/global-setup.mjs +2 -2
- package/dist/lib/esm/kill-process-tree.d.mts +10 -2
- package/dist/lib/esm/kill-process-tree.mjs +16 -6
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +156 -0
- package/dist/lib/esm/mobile-input.mjs +144 -0
- package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
- package/dist/lib/esm/obsidian-installer.mjs +1 -1
- package/dist/lib/esm/obsidian-instance.d.mts +12 -0
- package/dist/lib/esm/obsidian-instance.mjs +55 -3
- package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
- package/dist/lib/esm/obsidian-metadata.mjs +123 -17
- package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
- package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
- package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
- package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
- package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
- package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
- package/dist/lib/esm/owned-vault-seed.mjs +9 -5
- package/dist/lib/esm/parent-liveness.d.mts +37 -5
- package/dist/lib/esm/parent-liveness.mjs +42 -5
- package/dist/lib/esm/port-owner.d.mts +47 -0
- package/dist/lib/esm/port-owner.mjs +36 -0
- package/dist/lib/esm/process-capture.d.mts +83 -0
- package/dist/lib/esm/process-capture.mjs +38 -0
- package/dist/lib/esm/process-exit-message.d.mts +37 -3
- package/dist/lib/esm/process-exit-message.mjs +13 -8
- package/dist/lib/esm/process-liveness.d.mts +18 -0
- package/dist/lib/esm/process-liveness.mjs +17 -0
- package/dist/lib/esm/release-catalog.d.mts +125 -0
- package/dist/lib/esm/release-catalog.mjs +46 -0
- package/dist/lib/esm/run-version-matrix.d.mts +1 -1
- package/dist/lib/esm/run-version-matrix.mjs +1 -1
- package/dist/lib/esm/teardown-verdict.d.mts +69 -0
- package/dist/lib/esm/teardown-verdict.mjs +28 -0
- package/dist/lib/esm/temporary-vault.d.mts +47 -5
- package/dist/lib/esm/temporary-vault.mjs +43 -8
- package/dist/lib/esm/transport-appium.d.mts +104 -3
- package/dist/lib/esm/transport-appium.mjs +233 -17
- package/dist/lib/esm/transport-desktop-cdp.d.mts +100 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +208 -7
- package/dist/lib/esm/transport-factory.d.mts +10 -1
- package/dist/lib/esm/transport-factory.mjs +1220 -149
- package/dist/lib/esm/transport-options.d.mts +131 -12
- package/dist/lib/esm/transport-options.mjs +9 -2
- package/dist/lib/esm/transport.d.mts +7 -1
- package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
- package/dist/lib/esm/vault-plugin-install.mjs +20 -0
- package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
- package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
- package/dist/lib/esm/version-matrix.d.mts +2 -2
- package/dist/lib/esm/version-matrix.mjs +1 -1
- package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
- package/dist/lib/esm/vitest/global-setup.mjs +14 -7
- package/dist/lib/esm/vitest/setup.d.mts +5 -0
- package/dist/lib/esm/vitest/setup.mjs +3 -1
- package/dist/lib/esm/vitest/typings.d.mts +6 -4
- package/dist/lib/esm/webview-cdp.d.mts +156 -0
- package/dist/lib/esm/webview-cdp.mjs +235 -0
- package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
- package/dist/lib/esm/wedged-appium-server.mjs +86 -0
- package/package.json +25 -23
- package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
- package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
- package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
- package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
- package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
- package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
- package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
- package/dist/lib/esm/obsidian-namespace.mjs +0 -1
|
@@ -17,9 +17,9 @@ import {
|
|
|
17
17
|
parseVersionSpec,
|
|
18
18
|
resolveVersionFromManifest
|
|
19
19
|
} from "./obsidian-version.mjs";
|
|
20
|
+
import { buildCatalystAsarUrl } from "./release-catalog.mjs";
|
|
20
21
|
const DOWNLOAD_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36";
|
|
21
22
|
const PUBLIC_ASAR_RELEASE_BASE_URL = "https://github.com/obsidianmd/obsidian-releases/releases/download";
|
|
22
|
-
const CATALYST_ASAR_RELEASE_BASE_URL = "https://releases.obsidian.md/release";
|
|
23
23
|
const CACHE_ROOT = join(tmpdir(), "obsidian-integration-testing");
|
|
24
24
|
const ASAR_CACHE_DIR = join(CACHE_ROOT, "asar-cache");
|
|
25
25
|
const ASAR_FILE_PATTERN = /^obsidian-(?<version>\d+\.\d+\.\d+)\.asar$/;
|
|
@@ -103,7 +103,7 @@ function getAsarDownloadUrls(version) {
|
|
|
103
103
|
const asarGzFileName = `${getVersionAsarFileName(version)}.gz`;
|
|
104
104
|
const fallbackUrls = [
|
|
105
105
|
`${PUBLIC_ASAR_RELEASE_BASE_URL}/v${version}/${asarGzFileName}`,
|
|
106
|
-
|
|
106
|
+
buildCatalystAsarUrl(version)
|
|
107
107
|
];
|
|
108
108
|
const bakedUrl = getVersionMetadata(version)?.downloads?.asar;
|
|
109
109
|
return bakedUrl ? [bakedUrl, ...fallbackUrls] : fallbackUrls;
|
|
@@ -116,4 +116,4 @@ export {
|
|
|
116
116
|
getCachedAsarPath,
|
|
117
117
|
resolveConcreteVersion
|
|
118
118
|
};
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gTWF0Y2hlcyB0aGUgVUEgZG9jdW1lbnRlZCBpbiB0aGUgb2JzaWRpYW4tdmVyc2lvbnMgcmVwby5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipjYXRhbHlzdCoqIChlYXJseSBhY2Nlc3MgLyBpbnNpZGVyKSByZWxlYXNlIGFzYXJzLCBzZXJ2ZWQgZnJvbVxuICogdGhlIE9ic2lkaWFuIENETiBhcyBgLi4uL3JlbGVhc2Uvb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLiBQdWJsaWMgdmVyc2lvbnNcbiAqIGFyZSBOT1QgaG9zdGVkIGhlcmUgKHRoZSBDRE4gcmV0dXJucyBhbiBlbXB0eSBib2R5IGZvciB0aGVtKS5cbiAqL1xuY29uc3QgQ0FUQUxZU1RfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vcmVsZWFzZXMub2JzaWRpYW4ubWQvcmVsZWFzZSc7XG5cbmNvbnN0IENBQ0hFX1JPT1QgPSBqb2luKHRtcGRpcigpLCAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycpO1xuY29uc3QgQVNBUl9DQUNIRV9ESVIgPSBqb2luKENBQ0hFX1JPT1QsICdhc2FyLWNhY2hlJyk7XG5jb25zdCBBU0FSX0ZJTEVfUEFUVEVSTiA9IC9eb2JzaWRpYW4tKD88dmVyc2lvbj5cXGQrXFwuXFxkK1xcLlxcZCspXFwuYXNhciQvO1xuXG4vKipcbiAqIEEgZGlzY292ZXJlZCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEFzYXIge1xuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgYXNhciBmaWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgYHgueS56YCB2ZXJzaW9uIHBhcnNlZCBmcm9tIHRoZSBmaWxlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29waWVzIGFuIGFzYXIgZmlsZSBpbnRvIGEgdXNlci1kYXRhIGRpcmVjdG9yeSB1bmRlciBpdHMgY2Fub25pY2FsXG4gKiBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIG5hbWUuXG4gKlxuICogQHBhcmFtIGFzYXJQYXRoIC0gU291cmNlIGFzYXIgcGF0aC5cbiAqIEBwYXJhbSB2ZXJzaW9uIC0gVGhlIGFzYXIncyB2ZXJzaW9uICh1c2VkIGZvciB0aGUgZGVzdGluYXRpb24gZmlsZSBuYW1lKS5cbiAqIEBwYXJhbSB1c2VyRGF0YURpcmVjdG9yeSAtIERlc3RpbmF0aW9uIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5QXNhckludG9Vc2VyRGF0YShhc2FyUGF0aDogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHVzZXJEYXRhRGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgbWtkaXJTeW5jKHVzZXJEYXRhRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBqb2luKHVzZXJEYXRhRGlyZWN0b3J5LCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbiAgY29weUZpbGVTeW5jKGFzYXJQYXRoLCBkZXN0aW5hdGlvbik7XG4gIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBQcm92aXNpb25lZCAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9IGludG8gJHt1c2VyRGF0YURpcmVjdG9yeX0uYCk7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYXNhciBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uIGlzIHByZXNlbnQgaW4gdGhlIGxvY2FsIGNhY2hlLFxuICogZG93bmxvYWRpbmcgYW5kIGRlY29tcHJlc3NpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uIC0gQSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2FjaGVkIGFzYXIuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkb3dubG9hZCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZUFzYXJDYWNoZWQodmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbWtkaXJTeW5jKEFTQVJfQ0FDSEVfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVkUGF0aCA9IGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb24pO1xuICBpZiAoZXhpc3RzU3luYyhjYWNoZWRQYXRoKSkge1xuICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBVc2luZyBjYWNoZWQgYXNhciBmb3IgJHt2ZXJzaW9ufS5gKTtcbiAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgfVxuXG4gIC8vIEEgdmVyc2lvbidzIGFzYXIuZ3ogbGl2ZXMgb24gZXhhY3RseSBvbmUgaG9zdCBkZXBlbmRpbmcgb24gaXRzIGNoYW5uZWxcbiAgLy8gKHB1YmxpYyBcdTIxOTIgR2l0SHViIHJlbGVhc2UgYXNzZXRzLCBjYXRhbHlzdCBcdTIxOTIgdGhlIE9ic2lkaWFuIENETikuIFRoZSBjb25jcmV0ZVxuICAvLyBWZXJzaW9uIGFsb25lIGRvZXMgbm90IHRlbGwgdXMgd2hpY2gsIHNvIHRyeSBib3RoIGFuZCB1c2UgdGhlIGZpcnN0IHRoYXRcbiAgLy8gUmV0dXJucyBhIHZhbGlkIGFyY2hpdmUuXG4gIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCB1cmwgb2YgZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhc2FyID0gYXdhaXQgZG93bmxvYWRBbmREZWNvbXByZXNzQXNhcih1cmwpO1xuICAgICAgd3JpdGVGaWxlU3luYyhjYWNoZWRQYXRoLCBhc2FyKTtcbiAgICAgIGxvZyhgW3ZlcnNpb24tc3dpdGNoXSBDYWNoZWQgYXNhciAke3ZlcnNpb259ICgke1N0cmluZyhhc2FyLmxlbmd0aCl9IGJ5dGVzKSAtPiAke2NhY2hlZFBhdGh9YCk7XG4gICAgICByZXR1cm4gY2FjaGVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JzLnB1c2goYCR7dXJsfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZG93bmxvYWQgT2JzaWRpYW4gYXNhciAke3ZlcnNpb259LiBBdHRlbXB0czogJHtlcnJvcnMuam9pbignOyAnKX1gKTtcbn1cblxuLyoqXG4gKiBGZXRjaGVzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgbWFuaWZlc3QuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgZmV0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoRGVza3RvcFJlbGVhc2VzTWFuaWZlc3QoKTogUHJvbWlzZTxEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3Q6IEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIERlc2t0b3BSZWxlYXNlc01hbmlmZXN0O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBuZXdlc3QgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBpbiBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gZGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBzY2FuIChlLmcuIHRoZSB1c2VyJ3MgT2JzaWRpYW4gY29uZmlnIGRpcmVjdG9yeSkuXG4gKiBAcmV0dXJucyBUaGUgbmV3ZXN0IGRpc2NvdmVyZWQgYXNhciwgb3IgYHVuZGVmaW5lZGAgaWYgbm9uZSAvIHRoZSBkaXJlY3RvcnkgaXMgdW5yZWFkYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmROZXdlc3RBc2FyKGRpcmVjdG9yeTogc3RyaW5nKTogRGlzY292ZXJlZEFzYXIgfCB1bmRlZmluZWQge1xuICBsZXQgZW50cmllczogc3RyaW5nW107XG4gIHRyeSB7XG4gICAgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpcmVjdG9yeSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgbmV3ZXN0OiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBBU0FSX0ZJTEVfUEFUVEVSTi5leGVjKGVudHJ5KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmVyc2lvbiA9IG1hdGNoLmdyb3Vwcz8uWyd2ZXJzaW9uJ10gPz8gJyc7XG4gICAgaWYgKCFuZXdlc3QgfHwgY29tcGFyZVZlcnNpb25zKHZlcnNpb24sIG5ld2VzdC52ZXJzaW9uKSA+IDApIHtcbiAgICAgIG5ld2VzdCA9IHsgcGF0aDogam9pbihkaXJlY3RvcnksIGVudHJ5KSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3ZXN0O1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxvY2FsIGNhY2hlIHBhdGggZm9yIGEgY29uY3JldGUgdmVyc2lvbidzIGFzYXIgKHRoZSBmaWxlIG1heSBub3RcbiAqIHlldCBleGlzdCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRoZSBhc2FyIGlzIGNhY2hlZCBhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlZEFzYXJQYXRoKHZlcnNpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKEFTQVJfQ0FDSEVfRElSLCBnZXRWZXJzaW9uQXNhckZpbGVOYW1lKHZlcnNpb24pKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIHZlcnNpb24gc3BlY2lmaWVyIChleHBsaWNpdCBvciBjaGFubmVsIGFsaWFzKSB0byBhIGNvbmNyZXRlXG4gKiBgeC55LnpgIHZlcnNpb24sIGZldGNoaW5nIHRoZSBtYW5pZmVzdCBvbmx5IHdoZW4gYSBjaGFubmVsIGFsaWFzIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIHNwZWMgLSBUaGUgdmVyc2lvbiBzcGVjaWZpZXIuXG4gKiBAcmV0dXJucyBUaGUgY29uY3JldGUgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb25jcmV0ZVZlcnNpb24oc3BlYzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpO1xuICByZXR1cm4gcmVzb2x2ZVZlcnNpb25Gcm9tTWFuaWZlc3QobWFuaWZlc3QsIHBhcnNlZC5jaGFubmVsKTtcbn1cblxuLyoqXG4gKiBEb3dubG9hZHMgYSBnemlwLWNvbXByZXNzZWQgYXNhciBmcm9tIGEgVVJMIGFuZCBkZWNvbXByZXNzZXMgaXQuXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBgLmFzYXIuZ3pgIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvbXByZXNzZWQgYXNhciBieXRlcy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHJlcXVlc3QgZmFpbHMsIHRoZSBib2R5IGlzIGVtcHR5LCBvciBkZWNvbXByZXNzaW9uIGZhaWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIERvd25sb2FkaW5nIGFzYXIgZnJvbSAke3VybH0gLi4uYCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiBET1dOTE9BRF9VU0VSX0FHRU5UIH0gfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKX1gKTtcbiAgfVxuXG4gIGNvbnN0IGd6ID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChnei5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IHJlc3BvbnNlIGJvZHknKTtcbiAgfVxuICByZXR1cm4gZ3VuemlwU3luYyhneik7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY2FuZGlkYXRlIGAuYXNhci5nemAgZG93bmxvYWQgVVJMcyBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uLlxuICpcbiAqIFRoZSB2ZXJzaW9uJ3MgZXhhY3QgVVJMIGJha2VkIGludG8gdGhlIGBtZXRhZGF0YS5qc29uYCBjYXRhbG9nIChmcm9tIHVwc3RyZWFtXG4gKiBgb2JzaWRpYW4tdmVyc2lvbnMuanNvbmApIGlzIHRyaWVkIGZpcnN0IHdoZW4gcHJlc2VudDsgdGhlIGhhbmQtcm9sbGVkIHB1YmxpY1xuICogKEdpdEh1YikgYW5kIGNhdGFseXN0IChDRE4pIGd1ZXNzZXMgZm9sbG93IGFzIGEgZmFsbGJhY2sgZm9yIHZlcnNpb25zIGFic2VudFxuICogZnJvbSB0aGUgY2F0YWxvZyAob3IgYSBzdGFsZSBjYXRhbG9nKS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIFVSTHMgdG8gdHJ5LCBpbiBvcmRlci5cbiAqL1xuZnVuY3Rpb24gZ2V0QXNhckRvd25sb2FkVXJscyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzYXJHekZpbGVOYW1lID0gYCR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0uZ3pgO1xuICBjb25zdCBmYWxsYmFja1VybHMgPSBbXG4gICAgYCR7UFVCTElDX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vdiR7dmVyc2lvbn0vJHthc2FyR3pGaWxlTmFtZX1gLFxuICAgIGAke0NBVEFMWVNUX0FTQVJfUkVMRUFTRV9CQVNFX1VSTH0vJHthc2FyR3pGaWxlTmFtZX1gXG4gIF07XG5cbiAgY29uc3QgYmFrZWRVcmwgPSBnZXRWZXJzaW9uTWV0YWRhdGEodmVyc2lvbik/LmRvd25sb2Fkcz8uYXNhcjtcbiAgcmV0dXJuIGJha2VkVXJsID8gW2Jha2VkVXJsLCAuLi5mYWxsYmFja1VybHNdIDogZmFsbGJhY2tVcmxzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixTQUFTLGtCQUFrQjtBQUkzQixTQUFTLFdBQVc7QUFDcEIsU0FBUywwQkFBMEI7QUFDbkM7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
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogSW50ZWdyYXRpb24tdGltZSBoZWxwZXJzIGZvciBwcm92aXNpb25pbmcgYSBzcGVjaWZpYyBPYnNpZGlhbiAqKmFzYXIqKiAodGhlXG4gKiBhcHAgY29kZSkgaW50byBhbiBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIE9ic2lkaWFuJ3MgYm9vdHN0cmFwIGxvYWRzIHRoZSBoaWdoZXN0IG9mIChpdHMgc2hlbGwncyBidW5kbGVkXG4gKiBgcmVzb3VyY2VzL29ic2lkaWFuLmFzYXJgLCB0aGUgYG9ic2lkaWFuLTx2ZXJzaW9uPi5hc2FyYCBmaWxlcyBpbiB0aGVcbiAqIHVzZXItZGF0YSBkaXJlY3RvcnkpLiBTbyBwbGFjaW5nIGFuIGFzYXIgaGVyZSBvbmx5IHRha2VzIGVmZmVjdCB3aGVuIGl0cyB2ZXJzaW9uIGlzXG4gKiAqKj49IHRoZSBzaGVsbCdzIGJ1bmRsZWQgdmVyc2lvbioqICh1cGdyYWRlLW9ubHkgXHUyMDE0IGNvbmZpcm1lZCBieSB0aGUgUGhhc2UgMFxuICogc3Bpa2UpLiBSdW5uaW5nIGFuIG9sZGVyIHZlcnNpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgaW5zdGFsbGVyL3NoZWxsIGluc3RlYWRcbiAqIChzZWUgYG9ic2lkaWFuLWluc3RhbGxlci50c2ApLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGRvd25sb2FkL2ZpbGVzeXN0ZW0gZ2x1ZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgY29weUZpbGVTeW5jLFxuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGd1bnppcFN5bmMgfSBmcm9tICdub2RlOnpsaWInO1xuXG5pbXBvcnQgdHlwZSB7IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIERFU0tUT1BfUkVMRUFTRVNfTUFOSUZFU1RfVVJMLFxuICBnZXRWZXJzaW9uQXNhckZpbGVOYW1lLFxuICBwYXJzZVZlcnNpb25TcGVjLFxuICByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdFxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IGJ1aWxkQ2F0YWx5c3RBc2FyVXJsIH0gZnJvbSAnLi9yZWxlYXNlLWNhdGFsb2cubWpzJztcblxuLyoqXG4gKiBCcm93c2VyIFVzZXItQWdlbnQgcmVxdWlyZWQgdG8gZmV0Y2ggYXNhciBwYWNrYWdlcyBmcm9tXG4gKiBgcmVsZWFzZXMub2JzaWRpYW4ubWRgICh0aGUgZW5kcG9pbnQgaXMgQ2xvdWRmbGFyZS1nYXRlZCBhZ2FpbnN0IG5vbi1icm93c2VyXG4gKiBjbGllbnRzKS4gVGhlIHNhbWUgVUEgdGhlIGNhdGFsb2cgcmVmcmVzaCBzZW5kcyB3aGVuIHByb2JpbmcgdGhlIENETi5cbiAqL1xuY29uc3QgRE9XTkxPQURfVVNFUl9BR0VOVCA9ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODYuMC40MjQwLjE4MyBTYWZhcmkvNTM3LjM2JztcblxuLyoqXG4gKiBCYXNlIFVSTCBmb3IgKipwdWJsaWMqKiAoc3RhYmxlKSByZWxlYXNlIGFzYXJzLCBwdWJsaXNoZWQgYXMgR2l0SHViIHJlbGVhc2VcbiAqIGFzc2V0cyB1bmRlciBgLi4uL2Rvd25sb2FkL3Y8dmVyc2lvbj4vb2JzaWRpYW4tPHZlcnNpb24+LmFzYXIuZ3pgLlxuICovXG5jb25zdCBQVUJMSUNfQVNBUl9SRUxFQVNFX0JBU0VfVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2Rvd25sb2FkJztcblxuY29uc3QgQ0FDSEVfUk9PVCA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG5jb25zdCBBU0FSX0NBQ0hFX0RJUiA9IGpvaW4oQ0FDSEVfUk9PVCwgJ2FzYXItY2FjaGUnKTtcbmNvbnN0IEFTQVJfRklMRV9QQVRURVJOID0gL15vYnNpZGlhbi0oPzx2ZXJzaW9uPlxcZCtcXC5cXGQrXFwuXFxkKylcXC5hc2FyJC87XG5cbi8qKlxuICogQSBkaXNjb3ZlcmVkIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkQXNhciB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBhc2FyIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBgeC55LnpgIHZlcnNpb24gcGFyc2VkIGZyb20gdGhlIGZpbGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb3BpZXMgYW4gYXNhciBmaWxlIGludG8gYSB1c2VyLWRhdGEgZGlyZWN0b3J5IHVuZGVyIGl0cyBjYW5vbmljYWxcbiAqIGBvYnNpZGlhbi08dmVyc2lvbj4uYXNhcmAgbmFtZS5cbiAqXG4gKiBAcGFyYW0gYXNhclBhdGggLSBTb3VyY2UgYXNhciBwYXRoLlxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgYXNhcidzIHZlcnNpb24gKHVzZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUpLlxuICogQHBhcmFtIHVzZXJEYXRhRGlyZWN0b3J5IC0gRGVzdGluYXRpb24gdXNlci1kYXRhIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlBc2FySW50b1VzZXJEYXRhKGFzYXJQYXRoOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgdXNlckRhdGFEaXJlY3Rvcnk6IHN0cmluZyk6IHZvaWQge1xuICBta2RpclN5bmModXNlckRhdGFEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IGpvaW4odXNlckRhdGFEaXJlY3RvcnksIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xuICBjb3B5RmlsZVN5bmMoYXNhclBhdGgsIGRlc3RpbmF0aW9uKTtcbiAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFByb3Zpc2lvbmVkICR7Z2V0VmVyc2lvbkFzYXJGaWxlTmFtZSh2ZXJzaW9uKX0gaW50byAke3VzZXJEYXRhRGlyZWN0b3J5fS5gKTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBhc2FyIGZvciBhIGNvbmNyZXRlIHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgbG9jYWwgY2FjaGUsXG4gKiBkb3dubG9hZGluZyBhbmQgZGVjb21wcmVzc2luZyBpdCBpZiBuZWNlc3NhcnkuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjYWNoZWQgYXNhci5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGRvd25sb2FkIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQXNhckNhY2hlZCh2ZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBta2RpclN5bmMoQVNBUl9DQUNIRV9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBjYWNoZWRQYXRoID0gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbik7XG4gIGlmIChleGlzdHNTeW5jKGNhY2hlZFBhdGgpKSB7XG4gICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIFVzaW5nIGNhY2hlZCBhc2FyIGZvciAke3ZlcnNpb259LmApO1xuICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICB9XG5cbiAgLy8gQSB2ZXJzaW9uJ3MgYXNhci5neiBsaXZlcyBvbiBleGFjdGx5IG9uZSBob3N0IGRlcGVuZGluZyBvbiBpdHMgY2hhbm5lbFxuICAvLyAocHVibGljIFx1MjE5MiBHaXRIdWIgcmVsZWFzZSBhc3NldHMsIGNhdGFseXN0IFx1MjE5MiB0aGUgT2JzaWRpYW4gQ0ROKS4gVGhlIGNvbmNyZXRlXG4gIC8vIFZlcnNpb24gYWxvbmUgZG9lcyBub3QgdGVsbCB1cyB3aGljaCwgc28gdHJ5IGJvdGggYW5kIHVzZSB0aGUgZmlyc3QgdGhhdFxuICAvLyBSZXR1cm5zIGEgdmFsaWQgYXJjaGl2ZS5cbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHVybCBvZiBnZXRBc2FyRG93bmxvYWRVcmxzKHZlcnNpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFzYXIgPSBhd2FpdCBkb3dubG9hZEFuZERlY29tcHJlc3NBc2FyKHVybCk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNhY2hlZFBhdGgsIGFzYXIpO1xuICAgICAgbG9nKGBbdmVyc2lvbi1zd2l0Y2hdIENhY2hlZCBhc2FyICR7dmVyc2lvbn0gKCR7U3RyaW5nKGFzYXIubGVuZ3RoKX0gYnl0ZXMpIC0+ICR7Y2FjaGVkUGF0aH1gKTtcbiAgICAgIHJldHVybiBjYWNoZWRQYXRoO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChgJHt1cmx9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkb3dubG9hZCBPYnNpZGlhbiBhc2FyICR7dmVyc2lvbn0uIEF0dGVtcHRzOiAke2Vycm9ycy5qb2luKCc7ICcpfWApO1xufVxuXG4vKipcbiAqIEZldGNoZXMgYW5kIHBhcnNlcyBPYnNpZGlhbidzIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBtYW5pZmVzdC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCgpOiBQcm9taXNlPERlc2t0b3BSZWxlYXNlc01hbmlmZXN0PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goREVTS1RPUF9SRUxFQVNFU19NQU5JRkVTVF9VUkwpO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGVza3RvcCByZWxlYXNlcyBtYW5pZmVzdDogSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgRGVza3RvcFJlbGVhc2VzTWFuaWZlc3Q7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG5ld2VzdCBgb2JzaWRpYW4tPHZlcnNpb24+LmFzYXJgIGluIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSBkaXJlY3RvcnkgLSBUaGUgZGlyZWN0b3J5IHRvIHNjYW4gKGUuZy4gdGhlIHVzZXIncyBPYnNpZGlhbiBjb25maWcgZGlyZWN0b3J5KS5cbiAqIEByZXR1cm5zIFRoZSBuZXdlc3QgZGlzY292ZXJlZCBhc2FyLCBvciBgdW5kZWZpbmVkYCBpZiBub25lIC8gdGhlIGRpcmVjdG9yeSBpcyB1bnJlYWRhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE5ld2VzdEFzYXIoZGlyZWN0b3J5OiBzdHJpbmcpOiBEaXNjb3ZlcmVkQXNhciB8IHVuZGVmaW5lZCB7XG4gIGxldCBlbnRyaWVzOiBzdHJpbmdbXTtcbiAgdHJ5IHtcbiAgICBlbnRyaWVzID0gcmVhZGRpclN5bmMoZGlyZWN0b3J5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGxldCBuZXdlc3Q6IERpc2NvdmVyZWRBc2FyIHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBtYXRjaCA9IEFTQVJfRklMRV9QQVRURVJOLmV4ZWMoZW50cnkpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gbWF0Y2guZ3JvdXBzPy5bJ3ZlcnNpb24nXSA/PyAnJztcbiAgICBpZiAoIW5ld2VzdCB8fCBjb21wYXJlVmVyc2lvbnModmVyc2lvbiwgbmV3ZXN0LnZlcnNpb24pID4gMCkge1xuICAgICAgbmV3ZXN0ID0geyBwYXRoOiBqb2luKGRpcmVjdG9yeSwgZW50cnkpLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBuZXdlc3Q7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbG9jYWwgY2FjaGUgcGF0aCBmb3IgYSBjb25jcmV0ZSB2ZXJzaW9uJ3MgYXNhciAodGhlIGZpbGUgbWF5IG5vdFxuICogeWV0IGV4aXN0KS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEEgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdGhlIGFzYXIgaXMgY2FjaGVkIGF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkQXNhclBhdGgodmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oQVNBUl9DQUNIRV9ESVIsIGdldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbikpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGEgdmVyc2lvbiBzcGVjaWZpZXIgKGV4cGxpY2l0IG9yIGNoYW5uZWwgYWxpYXMpIHRvIGEgY29uY3JldGVcbiAqIGB4LnkuemAgdmVyc2lvbiwgZmV0Y2hpbmcgdGhlIG1hbmlmZXN0IG9ubHkgd2hlbiBhIGNoYW5uZWwgYWxpYXMgaXMgdXNlZC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSB2ZXJzaW9uIHNwZWNpZmllci5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihzcGVjOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZVZlcnNpb25TcGVjKHNwZWMpO1xuICBpZiAocGFyc2VkLmtpbmQgPT09ICdleHBsaWNpdCcpIHtcbiAgICByZXR1cm4gcGFyc2VkLnZlcnNpb247XG4gIH1cbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBmZXRjaERlc2t0b3BSZWxlYXNlc01hbmlmZXN0KCk7XG4gIHJldHVybiByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdChtYW5pZmVzdCwgcGFyc2VkLmNoYW5uZWwpO1xufVxuXG4vKipcbiAqIERvd25sb2FkcyBhIGd6aXAtY29tcHJlc3NlZCBhc2FyIGZyb20gYSBVUkwgYW5kIGRlY29tcHJlc3NlcyBpdC5cbiAqXG4gKiBAcGFyYW0gdXJsIC0gVGhlIGAuYXNhci5nemAgVVJMLlxuICogQHJldHVybnMgVGhlIGRlY29tcHJlc3NlZCBhc2FyIGJ5dGVzLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcmVxdWVzdCBmYWlscywgdGhlIGJvZHkgaXMgZW1wdHksIG9yIGRlY29tcHJlc3Npb24gZmFpbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkQW5kRGVjb21wcmVzc0FzYXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICBsb2coYFt2ZXJzaW9uLXN3aXRjaF0gRG93bmxvYWRpbmcgYXNhciBmcm9tICR7dXJsfSAuLi5gKTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6IERPV05MT0FEX1VTRVJfQUdFTlQgfSB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCAke1N0cmluZyhyZXNwb25zZS5zdGF0dXMpfWApO1xuICB9XG5cbiAgY29uc3QgZ3ogPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGd6Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZW1wdHkgcmVzcG9uc2UgYm9keScpO1xuICB9XG4gIHJldHVybiBndW56aXBTeW5jKGd6KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYW5kaWRhdGUgYC5hc2FyLmd6YCBkb3dubG9hZCBVUkxzIGZvciBhIGNvbmNyZXRlIHZlcnNpb24uXG4gKlxuICogVGhlIHZlcnNpb24ncyBleGFjdCBVUkwgYmFrZWQgaW50byB0aGUgYG1ldGFkYXRhLmpzb25gIGNhdGFsb2cgKGZyb20gdGhlXG4gKiBgb2JzaWRpYW5tZC9vYnNpZGlhbi1yZWxlYXNlc2AgYXNzZXRzKSBpcyB0cmllZCBmaXJzdCB3aGVuIHByZXNlbnQ7IHRoZSBoYW5kLXJvbGxlZCBwdWJsaWNcbiAqIChHaXRIdWIpIGFuZCBjYXRhbHlzdCAoQ0ROKSBndWVzc2VzIGZvbGxvdyBhcyBhIGZhbGxiYWNrIGZvciB2ZXJzaW9ucyBhYnNlbnRcbiAqIGZyb20gdGhlIGNhdGFsb2cgKG9yIGEgc3RhbGUgY2F0YWxvZykuXG4gKlxuICogQHBhcmFtIHZlcnNpb24gLSBBIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBVUkxzIHRvIHRyeSwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIGdldEFzYXJEb3dubG9hZFVybHModmVyc2lvbjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBhc2FyR3pGaWxlTmFtZSA9IGAke2dldFZlcnNpb25Bc2FyRmlsZU5hbWUodmVyc2lvbil9Lmd6YDtcbiAgY29uc3QgZmFsbGJhY2tVcmxzID0gW1xuICAgIGAke1BVQkxJQ19BU0FSX1JFTEVBU0VfQkFTRV9VUkx9L3Yke3ZlcnNpb259LyR7YXNhckd6RmlsZU5hbWV9YCxcbiAgICBidWlsZENhdGFseXN0QXNhclVybCh2ZXJzaW9uKVxuICBdO1xuXG4gIGNvbnN0IGJha2VkVXJsID0gZ2V0VmVyc2lvbk1ldGFkYXRhKHZlcnNpb24pPy5kb3dubG9hZHM/LmFzYXI7XG4gIHJldHVybiBiYWtlZFVybCA/IFtiYWtlZFVybCwgLi4uZmFsbGJhY2tVcmxzXSA6IGZhbGxiYWNrVXJscztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFJM0IsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsMEJBQTBCO0FBQ25DO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyw0QkFBNEI7QUFPckMsTUFBTSxzQkFBc0I7QUFNNUIsTUFBTSwrQkFBK0I7QUFFckMsTUFBTSxhQUFhLEtBQUssT0FBTyxHQUFHLDhCQUE4QjtBQUNoRSxNQUFNLGlCQUFpQixLQUFLLFlBQVksWUFBWTtBQUNwRCxNQUFNLG9CQUFvQjtBQXlCbkIsU0FBUyxxQkFBcUIsVUFBa0IsU0FBaUIsbUJBQWlDO0FBQ3ZHLFlBQVUsbUJBQW1CLEVBQUUsV0FBVyxLQUFL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
|
|
@@ -33,8 +33,9 @@ export interface OpenObsidianSettingsTabOptions extends OpenSettingsTabParams {
|
|
|
33
33
|
* actually rendered, resolving the transport and vault from the current test
|
|
34
34
|
* context.
|
|
35
35
|
*
|
|
36
|
-
* See {@link Lib.openSettingsTab} for why
|
|
37
|
-
*
|
|
36
|
+
* See {@link Lib.openSettingsTab} for why `app.setting.open()` can put the modal
|
|
37
|
+
* in a second Electron window, and why the container is attached **before** it on
|
|
38
|
+
* a vault that lacks the harness's `settingsPopoutWindow: false` default.
|
|
38
39
|
*
|
|
39
40
|
* Close it again from a callback with `app.setting.close()`; re-opening works,
|
|
40
41
|
* because the attach is idempotent.
|
|
@@ -24,4 +24,4 @@ async function openObsidianSettingsTab(options) {
|
|
|
24
24
|
export {
|
|
25
25
|
openObsidianSettingsTab
|
|
26
26
|
};
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgT2JzaWRpYW4ncyBzZXR0aW5ncyBtb2RhbCBvbiBhIGdpdmVuIHRhYiBpbiB0aGUgaW5zdGFuY2UgdGhlIGN1cnJlbnRcbiAqIHRlc3QgY29udGV4dCBpcyBhbHJlYWR5IGRyaXZpbmcuXG4gKlxuICogVGhlIHJlbmRlcmVyLXNpZGUgd29yayBsaXZlcyBpbiB0aGUgaW5qZWN0ZWQgYGxpYmAgYmFnXG4gKiAoYGxpYi5vcGVuU2V0dGluZ3NUYWJgKSwgd2hlcmUgYSBjYWxsYmFjayB0aGF0IGFsc28gcHJvYmVzIHRoZSByZW5kZXJlZCBET01cbiAqIGNhbiByZWFjaCBpdC4gVGhpcyBpcyB0aGUgY29udGV4dC1yZXNvbHZpbmcgZW50cnkgcG9pbnQgZm9yIHRoZSBmYXIgbW9yZVxuICogY29tbW9uIGNhc2UgXHUyMDE0IGEgc2NyZWVuc2hvdCBzdWl0ZSB0aGF0IG9ubHkgd2FudHMgdGhlIHRhYiBvbiBzY3JlZW4gYmVmb3JlIGl0XG4gKiBjYWxscyBgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdGAsIGFuZCB3b3VsZCBvdGhlcndpc2Ugd3JpdGUgdGhlIHNhbWVcbiAqIGBldmFsSW5PYnNpZGlhbmAgd3JhcHBlciBpbiBldmVyeSBwbHVnaW4uXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbikgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIE9wZW5TZXR0aW5nc1RhYlBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi9ub3JtYWxpemUtb3B0aW9uYWwtcHJvcGVydGllcy5tanMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3Blbk9ic2lkaWFuU2V0dGluZ3NUYWJPcHRpb25zIGV4dGVuZHMgT3BlblNldHRpbmdzVGFiUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSB0cmFuc3BvcnQuIFdoZW4gb21pdHRlZCwgdGhlIHRyYW5zcG9ydCB0aGUgY3VycmVudCB0ZXN0XG4gICAqIGNvbnRleHQgaXMgZHJpdmluZyBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0PzogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB3aG9zZSBPYnNpZGlhbiB3aW5kb3cgdG8gb3BlbiB0aGUgc2V0dGluZ3MgaW4uIFdoZW4gb21pdHRlZCwgdGhlXG4gICAqIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VyaWFsaXplZCBwYXlsb2FkIGhhbmRlZCB0byB0aGUgY2FsbGJhY2sgXHUyMDE0IHRoZSB3aG9sZVxuICoge0BsaW5rIE9wZW5TZXR0aW5nc1RhYlBhcmFtc30gYmFnIGluIG9uZSBKU09OLXNhZmUgZmllbGQuXG4gKi9cbnR5cGUgT3BlblNldHRpbmdzVGFiSW5wdXQgPSBSZWNvcmQ8J29wZW5QYXJhbXMnLCBPcGVuU2V0dGluZ3NUYWJQYXJhbXM+O1xuXG4vKipcbiAqIE9wZW5zIE9ic2lkaWFuJ3Mgc2V0dGluZ3MgbW9kYWwgb24gYSBnaXZlbiB0YWIgYW5kIHdhaXRzIHVudGlsIHRoYXQgdGFiIGhhc1xuICogYWN0dWFsbHkgcmVuZGVyZWQsIHJlc29sdmluZyB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBmcm9tIHRoZSBjdXJyZW50IHRlc3RcbiAqIGNvbnRleHQuXG4gKlxuICogU2VlIHtAbGluayBMaWIub3BlblNldHRpbmdzVGFifSBmb3Igd2h5IGBhcHAuc2V0dGluZy5vcGVuKClgIGNhbiBwdXQgdGhlIG1vZGFsXG4gKiBpbiBhIHNlY29uZCBFbGVjdHJvbiB3aW5kb3csIGFuZCB3aHkgdGhlIGNvbnRhaW5lciBpcyBhdHRhY2hlZCAqKmJlZm9yZSoqIGl0IG9uXG4gKiBhIHZhdWx0IHRoYXQgbGFja3MgdGhlIGhhcm5lc3MncyBgc2V0dGluZ3NQb3BvdXRXaW5kb3c6IGZhbHNlYCBkZWZhdWx0LlxuICpcbiAqIENsb3NlIGl0IGFnYWluIGZyb20gYSBjYWxsYmFjayB3aXRoIGBhcHAuc2V0dGluZy5jbG9zZSgpYDsgcmUtb3BlbmluZyB3b3JrcyxcbiAqIGJlY2F1c2UgdGhlIGF0dGFjaCBpcyBpZGVtcG90ZW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRhYiB0byBvcGVuLCBob3cgbG9uZyB0byB3YWl0LCBhbmQgdHJhbnNwb3J0IC8gdmF1bHRcbiAqICAgb3ZlcnJpZGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBuYW1lcyBvZiB0aGUgc2V0dGluZyByb3dzIHRoZSB0YWJcbiAqICAgcmVuZGVyZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIHRhYiBjYXJyaWVzIHtAbGluayBPcGVuU2V0dGluZ3NUYWJQYXJhbXMudGFiSWR9LCBvciBpZiB0aGVcbiAqICAgdGFiIGRvZXMgbm90IHJlbmRlciB3aXRoaW4gdGhlIHRpbWVvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYihvcHRpb25zOiBPcGVuT2JzaWRpYW5TZXR0aW5nc1RhYk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHtcbiAgICB0YWJJZCxcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4obm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEV2YWxJbk9ic2lkaWFuUGFyYW1zPE9wZW5TZXR0aW5nc1RhYklucHV0LCBzdHJpbmdbXT4+KHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGxpYiwgb3BlblBhcmFtcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IGxpYi5vcGVuU2V0dGluZ3NUYWIob3BlblBhcmFtcyk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgb3BlblBhcmFtczogbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPE9wZW5TZXR0aW5nc1RhYlBhcmFtcz4oe1xuICAgICAgICB0YWJJZCxcbiAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICB9KVxuICAgIH0sXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aFxuICB9KSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFzQkEsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxtQ0FBbUM7QUE0QzVDLGVBQXNCLHdCQUF3QixTQUE0RDtBQUN4RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFNBQU8sTUFBTSxlQUFlLDRCQUFrRjtBQUFBLElBQzVHLE1BQU0sU0FBUyxFQUFFLEtBQUssV0FBVyxHQUFzQjtBQUNyRCxhQUFPLE1BQU0sSUFBSSxnQkFBZ0IsVUFBVTtBQUFBLElBQzdDO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxZQUFZLDRCQUFtRDtBQUFBLFFBQzdEO0FBQUEsUUFDQTtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsQ0FBQyxDQUFDO0FBQ0o7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Records that the harness-owned Obsidian instance on a CDP port died, so a
|
|
5
|
+
* process that did not spawn it can still say **why** it is unreachable.
|
|
6
|
+
*
|
|
7
|
+
* Only the process that launched the instance holds the child handle and sees
|
|
8
|
+
* `exit`; the test workers get nothing but the port (see the repo's L9). So the
|
|
9
|
+
* one fact worth having — the exit code — has to cross a process boundary, and
|
|
10
|
+
* this is the channel: a small JSON sentinel next to the setup lock
|
|
11
|
+
* (`setup-lock.ts`) and the Appium server marker (`appium-server-marker.ts`),
|
|
12
|
+
* keyed by port.
|
|
13
|
+
*
|
|
14
|
+
* Written **only for a death the harness did not order.** A deliberate kill
|
|
15
|
+
* (teardown, or the relaunch loop killing an instance before starting the next)
|
|
16
|
+
* clears the marker instead, because a marker left behind by a clean run would
|
|
17
|
+
* convict the next run's healthy instance of an exit that never happened.
|
|
18
|
+
*
|
|
19
|
+
* Reads are deliberately tolerant, exactly as the Appium marker's are: missing,
|
|
20
|
+
* unreadable, or describing another port all read as "no marker", and the
|
|
21
|
+
* caller falls back to saying only that the instance is gone.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Records the death of the owned instance that was serving CDP on a port.
|
|
25
|
+
*/
|
|
26
|
+
export interface OwnedInstanceExitMarker {
|
|
27
|
+
/**
|
|
28
|
+
Exit code, or `null` when terminated by a signal or when it failed to spawn.
|
|
29
|
+
*/
|
|
30
|
+
readonly code: null | number;
|
|
31
|
+
/**
|
|
32
|
+
When the instance exited (`Date.now()` epoch milliseconds).
|
|
33
|
+
*/
|
|
34
|
+
readonly exitedAtInMilliseconds: number;
|
|
35
|
+
/**
|
|
36
|
+
The tail of everything the instance wrote to stdout/stderr (empty when it wrote nothing).
|
|
37
|
+
*/
|
|
38
|
+
readonly outputTail: string;
|
|
39
|
+
/**
|
|
40
|
+
PID of the instance's process, or `undefined` when it never got one.
|
|
41
|
+
*/
|
|
42
|
+
readonly pid: number | undefined;
|
|
43
|
+
/**
|
|
44
|
+
The CDP port the dead instance was serving.
|
|
45
|
+
*/
|
|
46
|
+
readonly port: number;
|
|
47
|
+
/**
|
|
48
|
+
Terminating signal, or `null` when it exited normally or failed to spawn.
|
|
49
|
+
*/
|
|
50
|
+
readonly signal: NodeJS.Signals | null;
|
|
51
|
+
/**
|
|
52
|
+
The spawn-failure message when the instance never started (e.g. `ENOENT`), otherwise absent.
|
|
53
|
+
*/
|
|
54
|
+
readonly spawnError?: string | undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parameters for {@link writeOwnedInstanceExitMarker}.
|
|
58
|
+
*/
|
|
59
|
+
export interface WriteOwnedInstanceExitMarkerParams {
|
|
60
|
+
/**
|
|
61
|
+
Exit code, or `null` when terminated by a signal or when it failed to spawn.
|
|
62
|
+
*/
|
|
63
|
+
readonly code: null | number;
|
|
64
|
+
/**
|
|
65
|
+
The tail of everything the instance wrote to stdout/stderr.
|
|
66
|
+
*/
|
|
67
|
+
readonly outputTail: string;
|
|
68
|
+
/**
|
|
69
|
+
PID of the instance's process, or `undefined` when it never got one.
|
|
70
|
+
*/
|
|
71
|
+
readonly pid: number | undefined;
|
|
72
|
+
/**
|
|
73
|
+
The CDP port the dead instance was serving.
|
|
74
|
+
*/
|
|
75
|
+
readonly port: number;
|
|
76
|
+
/**
|
|
77
|
+
Terminating signal, or `null` when it exited normally or failed to spawn.
|
|
78
|
+
*/
|
|
79
|
+
readonly signal: NodeJS.Signals | null;
|
|
80
|
+
/**
|
|
81
|
+
The spawn-failure message when the instance never started, otherwise absent.
|
|
82
|
+
*/
|
|
83
|
+
readonly spawnError?: string | undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Removes the marker for a port. Called when an instance is launched on it (a
|
|
87
|
+
* recycled port must not inherit an older instance's death) and whenever the
|
|
88
|
+
* harness kills an instance on purpose.
|
|
89
|
+
*
|
|
90
|
+
* @param port - The CDP port.
|
|
91
|
+
*/
|
|
92
|
+
export declare function clearOwnedInstanceExitMarker(port: number): void;
|
|
93
|
+
/**
|
|
94
|
+
* Reads the marker for a port.
|
|
95
|
+
*
|
|
96
|
+
* @param port - The CDP port.
|
|
97
|
+
* @returns The marker, or `undefined` when there is none, it is unreadable, or it does not describe this port.
|
|
98
|
+
*/
|
|
99
|
+
export declare function readOwnedInstanceExitMarker(port: number): OwnedInstanceExitMarker | undefined;
|
|
100
|
+
/**
|
|
101
|
+
* Records that the instance serving a port has died, stamping it with the
|
|
102
|
+
* current time so a reader can report how long ago it happened.
|
|
103
|
+
*
|
|
104
|
+
* @param params - The dead instance's port, exit details, and output tail.
|
|
105
|
+
*/
|
|
106
|
+
export declare function writeOwnedInstanceExitMarker(params: WriteOwnedInstanceExitMarkerParams): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import {
|
|
2
|
+
mkdirSync,
|
|
3
|
+
readFileSync,
|
|
4
|
+
rmSync,
|
|
5
|
+
writeFileSync
|
|
6
|
+
} from "node:fs";
|
|
7
|
+
import { tmpdir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { log } from "./log.mjs";
|
|
10
|
+
const MARKER_DIR_NAME = "obsidian-integration-testing";
|
|
11
|
+
const MARKER_FILE_SUFFIX = ".owned-instance-exit.json";
|
|
12
|
+
function clearOwnedInstanceExitMarker(port) {
|
|
13
|
+
try {
|
|
14
|
+
rmSync(getMarkerFilePath(port), { force: true });
|
|
15
|
+
} catch (error) {
|
|
16
|
+
log(`[owned-instance-exit-marker] Could not remove the marker for port ${String(port)}: ${getErrorMessage(error)}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function readOwnedInstanceExitMarker(port) {
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(readFileSync(getMarkerFilePath(port), "utf-8"));
|
|
23
|
+
} catch {
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
return parseMarker(parsed, port);
|
|
27
|
+
}
|
|
28
|
+
function writeOwnedInstanceExitMarker(params) {
|
|
29
|
+
const marker = {
|
|
30
|
+
code: params.code,
|
|
31
|
+
exitedAtInMilliseconds: Date.now(),
|
|
32
|
+
outputTail: params.outputTail,
|
|
33
|
+
pid: params.pid,
|
|
34
|
+
port: params.port,
|
|
35
|
+
signal: params.signal,
|
|
36
|
+
...params.spawnError !== void 0 && { spawnError: params.spawnError }
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
mkdirSync(getMarkerDirectory(), { recursive: true });
|
|
40
|
+
writeFileSync(getMarkerFilePath(marker.port), JSON.stringify(marker));
|
|
41
|
+
} catch (error) {
|
|
42
|
+
log(`[owned-instance-exit-marker] Could not record the exit on port ${String(marker.port)}: ${getErrorMessage(error)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function getErrorMessage(error) {
|
|
46
|
+
return error instanceof Error ? error.message : String(error);
|
|
47
|
+
}
|
|
48
|
+
function getMarkerDirectory() {
|
|
49
|
+
return join(tmpdir(), MARKER_DIR_NAME);
|
|
50
|
+
}
|
|
51
|
+
function getMarkerFilePath(port) {
|
|
52
|
+
return join(getMarkerDirectory(), `${String(port)}${MARKER_FILE_SUFFIX}`);
|
|
53
|
+
}
|
|
54
|
+
function parseMarker(parsed, port) {
|
|
55
|
+
if (typeof parsed !== "object" || parsed === null) {
|
|
56
|
+
return void 0;
|
|
57
|
+
}
|
|
58
|
+
const record = parsed;
|
|
59
|
+
const { code, exitedAtInMilliseconds, outputTail, pid, port: markedPort, signal, spawnError } = record;
|
|
60
|
+
if (typeof exitedAtInMilliseconds !== "number" || markedPort !== port) {
|
|
61
|
+
return void 0;
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
code: typeof code === "number" ? code : null,
|
|
65
|
+
exitedAtInMilliseconds,
|
|
66
|
+
outputTail: typeof outputTail === "string" ? outputTail : "",
|
|
67
|
+
pid: typeof pid === "number" ? pid : void 0,
|
|
68
|
+
port,
|
|
69
|
+
signal: typeof signal === "string" ? signal : null,
|
|
70
|
+
...typeof spawnError === "string" && { spawnError }
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
clearOwnedInstanceExitMarker,
|
|
75
|
+
readOwnedInstanceExitMarker,
|
|
76
|
+
writeOwnedInstanceExitMarker
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXQtbWFya2VyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUmVjb3JkcyB0aGF0IHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIG9uIGEgQ0RQIHBvcnQgZGllZCwgc28gYVxuICogcHJvY2VzcyB0aGF0IGRpZCBub3Qgc3Bhd24gaXQgY2FuIHN0aWxsIHNheSAqKndoeSoqIGl0IGlzIHVucmVhY2hhYmxlLlxuICpcbiAqIE9ubHkgdGhlIHByb2Nlc3MgdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UgaG9sZHMgdGhlIGNoaWxkIGhhbmRsZSBhbmQgc2Vlc1xuICogYGV4aXRgOyB0aGUgdGVzdCB3b3JrZXJzIGdldCBub3RoaW5nIGJ1dCB0aGUgcG9ydCAoc2VlIHRoZSByZXBvJ3MgTDkpLiBTbyB0aGVcbiAqIG9uZSBmYWN0IHdvcnRoIGhhdmluZyBcdTIwMTQgdGhlIGV4aXQgY29kZSBcdTIwMTQgaGFzIHRvIGNyb3NzIGEgcHJvY2VzcyBib3VuZGFyeSwgYW5kXG4gKiB0aGlzIGlzIHRoZSBjaGFubmVsOiBhIHNtYWxsIEpTT04gc2VudGluZWwgbmV4dCB0byB0aGUgc2V0dXAgbG9ja1xuICogKGBzZXR1cC1sb2NrLnRzYCkgYW5kIHRoZSBBcHBpdW0gc2VydmVyIG1hcmtlciAoYGFwcGl1bS1zZXJ2ZXItbWFya2VyLnRzYCksXG4gKiBrZXllZCBieSBwb3J0LlxuICpcbiAqIFdyaXR0ZW4gKipvbmx5IGZvciBhIGRlYXRoIHRoZSBoYXJuZXNzIGRpZCBub3Qgb3JkZXIuKiogQSBkZWxpYmVyYXRlIGtpbGxcbiAqICh0ZWFyZG93biwgb3IgdGhlIHJlbGF1bmNoIGxvb3Aga2lsbGluZyBhbiBpbnN0YW5jZSBiZWZvcmUgc3RhcnRpbmcgdGhlIG5leHQpXG4gKiBjbGVhcnMgdGhlIG1hcmtlciBpbnN0ZWFkLCBiZWNhdXNlIGEgbWFya2VyIGxlZnQgYmVoaW5kIGJ5IGEgY2xlYW4gcnVuIHdvdWxkXG4gKiBjb252aWN0IHRoZSBuZXh0IHJ1bidzIGhlYWx0aHkgaW5zdGFuY2Ugb2YgYW4gZXhpdCB0aGF0IG5ldmVyIGhhcHBlbmVkLlxuICpcbiAqIFJlYWRzIGFyZSBkZWxpYmVyYXRlbHkgdG9sZXJhbnQsIGV4YWN0bHkgYXMgdGhlIEFwcGl1bSBtYXJrZXIncyBhcmU6IG1pc3NpbmcsXG4gKiB1bnJlYWRhYmxlLCBvciBkZXNjcmliaW5nIGFub3RoZXIgcG9ydCBhbGwgcmVhZCBhcyBcIm5vIG1hcmtlclwiLCBhbmQgdGhlXG4gKiBjYWxsZXIgZmFsbHMgYmFjayB0byBzYXlpbmcgb25seSB0aGF0IHRoZSBpbnN0YW5jZSBpcyBnb25lLlxuICovXG5cbmltcG9ydCB7XG4gIG1rZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuXG5jb25zdCBNQVJLRVJfRElSX05BTUUgPSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5jb25zdCBNQVJLRVJfRklMRV9TVUZGSVggPSAnLm93bmVkLWluc3RhbmNlLWV4aXQuanNvbic7XG5cbi8qKlxuICogUmVjb3JkcyB0aGUgZGVhdGggb2YgdGhlIG93bmVkIGluc3RhbmNlIHRoYXQgd2FzIHNlcnZpbmcgQ0RQIG9uIGEgcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB7XG4gIC8qKlxuICBFeGl0IGNvZGUsIG9yIGBudWxsYCB3aGVuIHRlcm1pbmF0ZWQgYnkgYSBzaWduYWwgb3Igd2hlbiBpdCBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlOiBudWxsIHwgbnVtYmVyO1xuXG4gIC8qKlxuICBXaGVuIHRoZSBpbnN0YW5jZSBleGl0ZWQgKGBEYXRlLm5vdygpYCBlcG9jaCBtaWxsaXNlY29uZHMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgdGFpbCBvZiBldmVyeXRoaW5nIHRoZSBpbnN0YW5jZSB3cm90ZSB0byBzdGRvdXQvc3RkZXJyIChlbXB0eSB3aGVuIGl0IHdyb3RlIG5vdGhpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0VGFpbDogc3RyaW5nO1xuXG4gIC8qKlxuICBQSUQgb2YgdGhlIGluc3RhbmNlJ3MgcHJvY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZXZlciBnb3Qgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBDRFAgcG9ydCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IHBvcnQ6IG51bWJlcjtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCBvciBgbnVsbGAgd2hlbiBpdCBleGl0ZWQgbm9ybWFsbHkgb3IgZmFpbGVkIHRvIHNwYXduLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsOiBOb2RlSlMuU2lnbmFscyB8IG51bGw7XG5cbiAgLyoqXG4gIFRoZSBzcGF3bi1mYWlsdXJlIG1lc3NhZ2Ugd2hlbiB0aGUgaW5zdGFuY2UgbmV2ZXIgc3RhcnRlZCAoZS5nLiBgRU5PRU5UYCksIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3cml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXcml0ZU93bmVkSW5zdGFuY2VFeGl0TWFya2VyUGFyYW1zIHtcbiAgLyoqXG4gIEV4aXQgY29kZSwgb3IgYG51bGxgIHdoZW4gdGVybWluYXRlZCBieSBhIHNpZ25hbCBvciB3aGVuIGl0IGZhaWxlZCB0byBzcGF3bi5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGU6IG51bGwgfCBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIGV2ZXJ5dGhpbmcgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRUYWlsOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgaW5zdGFuY2UncyBwcm9jZXNzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IG5ldmVyIGdvdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBwaWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIENEUCBwb3J0IHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBUZXJtaW5hdGluZyBzaWduYWwsIG9yIGBudWxsYCB3aGVuIGl0IGV4aXRlZCBub3JtYWxseSBvciBmYWlsZWQgdG8gc3Bhd24uXG4gICAqL1xuICByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbDtcblxuICAvKipcbiAgVGhlIHNwYXduLWZhaWx1cmUgbWVzc2FnZSB3aGVuIHRoZSBpbnN0YW5jZSBuZXZlciBzdGFydGVkLCBvdGhlcndpc2UgYWJzZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc3Bhd25FcnJvcj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBtYXJrZXIgZm9yIGEgcG9ydC4gQ2FsbGVkIHdoZW4gYW4gaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gaXQgKGFcbiAqIHJlY3ljbGVkIHBvcnQgbXVzdCBub3QgaW5oZXJpdCBhbiBvbGRlciBpbnN0YW5jZSdzIGRlYXRoKSBhbmQgd2hlbmV2ZXIgdGhlXG4gKiBoYXJuZXNzIGtpbGxzIGFuIGluc3RhbmNlIG9uIHB1cnBvc2UuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgQ0RQIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICB0cnkge1xuICAgIHJtU3luYyhnZXRNYXJrZXJGaWxlUGF0aChwb3J0KSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtvd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlcl0gQ291bGQgbm90IHJlbW92ZSB0aGUgbWFya2VyIGZvciBwb3J0ICR7U3RyaW5nKHBvcnQpfTogJHtnZXRFcnJvck1lc3NhZ2UoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIG1hcmtlciBmb3IgYSBwb3J0LlxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0LlxuICogQHJldHVybnMgVGhlIG1hcmtlciwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBub25lLCBpdCBpcyB1bnJlYWRhYmxlLCBvciBpdCBkb2VzIG5vdCBkZXNjcmliZSB0aGlzIHBvcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIocG9ydDogbnVtYmVyKTogT3duZWRJbnN0YW5jZUV4aXRNYXJrZXIgfCB1bmRlZmluZWQge1xuICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKHBvcnQpLCAndXRmLTgnKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gcGFyc2VNYXJrZXIocGFyc2VkLCBwb3J0KTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoYXQgdGhlIGluc3RhbmNlIHNlcnZpbmcgYSBwb3J0IGhhcyBkaWVkLCBzdGFtcGluZyBpdCB3aXRoIHRoZVxuICogY3VycmVudCB0aW1lIHNvIGEgcmVhZGVyIGNhbiByZXBvcnQgaG93IGxvbmcgYWdvIGl0IGhhcHBlbmVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGVhZCBpbnN0YW5jZSdzIHBvcnQsIGV4aXQgZGV0YWlscywgYW5kIG91dHB1dCB0YWlsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVPd25lZEluc3RhbmNlRXhpdE1hcmtlcihwYXJhbXM6IFdyaXRlT3duZWRJbnN0YW5jZUV4aXRNYXJrZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciA9IHtcbiAgICBjb2RlOiBwYXJhbXMuY29kZSxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpLFxuICAgIG91dHB1dFRhaWw6IHBhcmFtcy5vdXRwdXRUYWlsLFxuICAgIHBpZDogcGFyYW1zLnBpZCxcbiAgICBwb3J0OiBwYXJhbXMucG9ydCxcbiAgICBzaWduYWw6IHBhcmFtcy5zaWduYWwsXG4gICAgLi4uKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQgJiYgeyBzcGF3bkVycm9yOiBwYXJhbXMuc3Bhd25FcnJvciB9KVxuICB9O1xuXG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGdldE1hcmtlckRpcmVjdG9yeSgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGdldE1hcmtlckZpbGVQYXRoKG1hcmtlci5wb3J0KSwgSlNPTi5zdHJpbmdpZnkobWFya2VyKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXJdIENvdWxkIG5vdCByZWNvcmQgdGhlIGV4aXQgb24gcG9ydCAke1N0cmluZyhtYXJrZXIucG9ydCl9OiAke2dldEVycm9yTWVzc2FnZShlcnJvcil9YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFya2VyRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHRtcGRpcigpLCBNQVJLRVJfRElSX05BTUUpO1xufVxuXG5mdW5jdGlvbiBnZXRNYXJrZXJGaWxlUGF0aChwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihnZXRNYXJrZXJEaXJlY3RvcnkoKSwgYCR7U3RyaW5nKHBvcnQpfSR7TUFSS0VSX0ZJTEVfU1VGRklYfWApO1xufVxuXG5mdW5jdGlvbiBwYXJzZU1hcmtlcihwYXJzZWQ6IHVua25vd24sIHBvcnQ6IG51bWJlcik6IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmQgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHsgY29kZSwgZXhpdGVkQXRJbk1pbGxpc2Vjb25kcywgb3V0cHV0VGFpbCwgcGlkLCBwb3J0OiBtYXJrZWRQb3J0LCBzaWduYWwsIHNwYXduRXJyb3IgfSA9IHJlY29yZDtcblxuICBpZiAodHlwZW9mIGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgIT09ICdudW1iZXInIHx8IG1hcmtlZFBvcnQgIT09IHBvcnQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiB0eXBlb2YgY29kZSA9PT0gJ251bWJlcicgPyBjb2RlIDogbnVsbCxcbiAgICBleGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IHR5cGVvZiBvdXRwdXRUYWlsID09PSAnc3RyaW5nJyA/IG91dHB1dFRhaWwgOiAnJyxcbiAgICBwaWQ6IHR5cGVvZiBwaWQgPT09ICdudW1iZXInID8gcGlkIDogdW5kZWZpbmVkLFxuICAgIHBvcnQsXG4gICAgc2lnbmFsOiB0eXBlb2Ygc2lnbmFsID09PSAnc3RyaW5nJyA/IHNpZ25hbCBhcyBOb2RlSlMuU2lnbmFscyA6IG51bGwsXG4gICAgLi4uKHR5cGVvZiBzcGF3bkVycm9yID09PSAnc3RyaW5nJyAmJiB7IHNwYXduRXJyb3IgfSlcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQXVCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUVyQixTQUFTLFdBQVc7QUFFcEIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxxQkFBcUI7QUFvRnBCLFNBQVMsNkJBQTZCLE1BQW9CO0FBQy9ELE1BQUk7QUFDRixXQUFPLGtCQUFrQixJQUFJLEdBQUcsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUFBLEVBQ2pELFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSxxRUFBcUUsT0FBTyxJQUFJLENBQUMsS0FBSyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNwSDtBQUNGO0FBUU8sU0FBUyw0QkFBNEIsTUFBbUQ7QUFDN0YsTUFBSTtBQUNKLE1BQUk7QUFDRixhQUFTLEtBQUssTUFBTSxhQUFhLGtCQUFrQixJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQUEsRUFDcEUsUUFBUTtBQUNOLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxZQUFZLFFBQVEsSUFBSTtBQUNqQztBQVFPLFNBQVMsNkJBQTZCLFFBQWtEO0FBQzdGLFFBQU0sU0FBa0M7QUFBQSxJQUN0QyxNQUFNLE9BQU87QUFBQSxJQUNiLHdCQUF3QixLQUFLLElBQUk7QUFBQSxJQUNqQyxZQUFZLE9BQU87QUFBQSxJQUNuQixLQUFLLE9BQU87QUFBQSxJQUNaLE1BQU0sT0FBTztBQUFBLElBQ2IsUUFBUSxPQUFPO0FBQUEsSUFDZixHQUFJLE9BQU8sZUFBZSxVQUFhLEVBQUUsWUFBWSxPQUFPLFdBQVc7QUFBQSxFQUN6RTtBQUVBLE1BQUk7QUFDRixjQUFVLG1CQUFtQixHQUFHLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDbkQsa0JBQWMsa0JBQWtCLE9BQU8sSUFBSSxHQUFHLEtBQUssVUFBVSxNQUFNLENBQUM7QUFBQSxFQUN0RSxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksa0VBQWtFLE9BQU8sT0FBTyxJQUFJLENBQUMsS0FBSyxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUN4SDtBQUNGO0FBRUEsU0FBUyxnQkFBZ0IsT0FBd0I7QUFDL0MsU0FBTyxpQkFBaUIsUUFBUSxNQUFNLFVBQVUsT0FBTyxLQUFLO0FBQzlEO0FBRUEsU0FBUyxxQkFBNkI7QUFDcEMsU0FBTyxLQUFLLE9BQU8sR0FBRyxlQUFlO0FBQ3ZDO0FBRUEsU0FBUyxrQkFBa0IsTUFBc0I7QUFDL0MsU0FBTyxLQUFLLG1CQUFtQixHQUFHLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxrQkFBa0IsRUFBRTtBQUMxRTtBQUVBLFNBQVMsWUFBWSxRQUFpQixNQUFtRDtBQUN2RixNQUFJLE9BQU8sV0FBVyxZQUFZLFdBQVcsTUFBTTtBQUNqRCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FBUztBQUNmLFFBQU0sRUFBRSxNQUFNLHdCQUF3QixZQUFZLEtBQUssTUFBTSxZQUFZLFFBQVEsV0FBVyxJQUFJO0FBRWhHLE1BQUksT0FBTywyQkFBMkIsWUFBWSxlQUFlLE1BQU07QUFDckUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQUEsSUFDTCxNQUFNLE9BQU8sU0FBUyxXQUFXLE9BQU87QUFBQSxJQUN4QztBQUFBLElBQ0EsWUFBWSxPQUFPLGVBQWUsV0FBVyxhQUFhO0FBQUEsSUFDMUQsS0FBSyxPQUFPLFFBQVEsV0FBVyxNQUFNO0FBQUEsSUFDckM7QUFBQSxJQUNBLFFBQVEsT0FBTyxXQUFXLFdBQVcsU0FBMkI7QUFBQSxJQUNoRSxHQUFJLE9BQU8sZUFBZSxZQUFZLEVBQUUsV0FBVztBQUFBLEVBQ3JEO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* The distinct error thrown when the harness-owned Obsidian instance is gone —
|
|
5
|
+
* it exited, and the CDP endpoint it was serving answers nothing.
|
|
6
|
+
*
|
|
7
|
+
* It exists to replace an anonymous cascade with one named cause. Before it,
|
|
8
|
+
* every test file scheduled after a mid-run death failed in ~60–90 ms with
|
|
9
|
+
* `TypeError: fetch failed` wrapping `connect ECONNREFUSED 127.0.0.1:<port>` —
|
|
10
|
+
* measured at **156 such failures across 21 files** in `obsidian-patterns` on
|
|
11
|
+
* 2026-09-05, not one of them a test result. The absence of an app is not a test
|
|
12
|
+
* outcome, and this error says so in the words a reader needs: the instance
|
|
13
|
+
* died, here is its exit code, and these failures are not about your code.
|
|
14
|
+
*
|
|
15
|
+
* Exported so callers can `instanceof`-match it, like `SilentAsarFallbackError`
|
|
16
|
+
* and `RendererFailedToInitializeError`.
|
|
17
|
+
*/
|
|
18
|
+
import type { OwnedInstanceExitMarker } from './owned-instance-exit-marker.mjs';
|
|
19
|
+
/**
|
|
20
|
+
* Parameters for the {@link OwnedInstanceExitedError} constructor.
|
|
21
|
+
*
|
|
22
|
+
* Everything but the URL is optional: the exit details come from the process
|
|
23
|
+
* that launched the instance, and a caller in another process has them only
|
|
24
|
+
* when the exit marker survived (see `owned-instance-exit-marker.ts`).
|
|
25
|
+
*/
|
|
26
|
+
export interface OwnedInstanceExitedErrorConstructorParams {
|
|
27
|
+
/**
|
|
28
|
+
The CDP URL the dead instance was serving.
|
|
29
|
+
*/
|
|
30
|
+
readonly cdpUrl: string;
|
|
31
|
+
/**
|
|
32
|
+
Exit code, when known.
|
|
33
|
+
*/
|
|
34
|
+
readonly code?: null | number | undefined;
|
|
35
|
+
/**
|
|
36
|
+
When the instance exited (`Date.now()` epoch milliseconds), when known.
|
|
37
|
+
*/
|
|
38
|
+
readonly exitedAtInMilliseconds?: number | undefined;
|
|
39
|
+
/**
|
|
40
|
+
The tail of what the instance wrote to stdout/stderr, when any was captured.
|
|
41
|
+
*/
|
|
42
|
+
readonly outputTail?: string | undefined;
|
|
43
|
+
/**
|
|
44
|
+
PID of the dead instance, when known.
|
|
45
|
+
*/
|
|
46
|
+
readonly pid?: number | undefined;
|
|
47
|
+
/**
|
|
48
|
+
Terminating signal, when known.
|
|
49
|
+
*/
|
|
50
|
+
readonly signal?: NodeJS.Signals | null | undefined;
|
|
51
|
+
/**
|
|
52
|
+
The spawn-failure message when the instance never started, otherwise absent.
|
|
53
|
+
*/
|
|
54
|
+
readonly spawnError?: string | undefined;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Thrown when the harness-owned Obsidian instance has exited and its CDP
|
|
58
|
+
* endpoint is therefore unreachable. Carries whatever is known about the death
|
|
59
|
+
* — exit code, signal, when it happened, and the output tail — so the failure
|
|
60
|
+
* names its own cause instead of a refused connection.
|
|
61
|
+
*/
|
|
62
|
+
export declare class OwnedInstanceExitedError extends Error {
|
|
63
|
+
/**
|
|
64
|
+
The CDP URL the dead instance was serving.
|
|
65
|
+
*/
|
|
66
|
+
readonly cdpUrl: string;
|
|
67
|
+
/**
|
|
68
|
+
Exit code, when known.
|
|
69
|
+
*/
|
|
70
|
+
readonly code: null | number | undefined;
|
|
71
|
+
/**
|
|
72
|
+
When the instance exited (`Date.now()` epoch milliseconds), when known.
|
|
73
|
+
*/
|
|
74
|
+
readonly exitedAtInMilliseconds: number | undefined;
|
|
75
|
+
/**
|
|
76
|
+
Terminating signal, when known.
|
|
77
|
+
*/
|
|
78
|
+
readonly signal: NodeJS.Signals | null | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Creates the error from whatever is known about the instance's death.
|
|
81
|
+
*
|
|
82
|
+
* @param params - The CDP URL, and the exit details when they are available.
|
|
83
|
+
*/
|
|
84
|
+
constructor(params: OwnedInstanceExitedErrorConstructorParams);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Builds the error from an exit marker, for a process that did not launch the
|
|
88
|
+
* instance and so has nothing else to go on.
|
|
89
|
+
*
|
|
90
|
+
* A missing marker is expected rather than exceptional — it is cleared on every
|
|
91
|
+
* deliberate kill, and a hard enough kill records nothing — so the error is
|
|
92
|
+
* still built, naming the instance without claiming to know how it died.
|
|
93
|
+
*
|
|
94
|
+
* @param cdpUrl - The CDP URL the dead instance was serving.
|
|
95
|
+
* @param marker - The exit marker read for its port, or `undefined` when there is none.
|
|
96
|
+
* @returns The error to throw in place of a refused connection.
|
|
97
|
+
*/
|
|
98
|
+
export declare function buildOwnedInstanceExitedErrorFromMarker(cdpUrl: string, marker: OwnedInstanceExitMarker | undefined): OwnedInstanceExitedError;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { appendProcessOutputTail } from "./process-exit-message.mjs";
|
|
2
|
+
const MILLISECONDS_PER_SECOND = 1e3;
|
|
3
|
+
class OwnedInstanceExitedError extends Error {
|
|
4
|
+
/**
|
|
5
|
+
The CDP URL the dead instance was serving.
|
|
6
|
+
*/
|
|
7
|
+
cdpUrl;
|
|
8
|
+
/**
|
|
9
|
+
Exit code, when known.
|
|
10
|
+
*/
|
|
11
|
+
code;
|
|
12
|
+
/**
|
|
13
|
+
When the instance exited (`Date.now()` epoch milliseconds), when known.
|
|
14
|
+
*/
|
|
15
|
+
exitedAtInMilliseconds;
|
|
16
|
+
/**
|
|
17
|
+
Terminating signal, when known.
|
|
18
|
+
*/
|
|
19
|
+
signal;
|
|
20
|
+
/**
|
|
21
|
+
* Creates the error from whatever is known about the instance's death.
|
|
22
|
+
*
|
|
23
|
+
* @param params - The CDP URL, and the exit details when they are available.
|
|
24
|
+
*/
|
|
25
|
+
constructor(params) {
|
|
26
|
+
super(buildMessage(params));
|
|
27
|
+
this.name = "OwnedInstanceExitedError";
|
|
28
|
+
this.cdpUrl = params.cdpUrl;
|
|
29
|
+
this.code = params.code;
|
|
30
|
+
this.exitedAtInMilliseconds = params.exitedAtInMilliseconds;
|
|
31
|
+
this.signal = params.signal;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function buildOwnedInstanceExitedErrorFromMarker(cdpUrl, marker) {
|
|
35
|
+
if (!marker) {
|
|
36
|
+
return new OwnedInstanceExitedError({ cdpUrl });
|
|
37
|
+
}
|
|
38
|
+
return new OwnedInstanceExitedError({
|
|
39
|
+
cdpUrl,
|
|
40
|
+
code: marker.code,
|
|
41
|
+
exitedAtInMilliseconds: marker.exitedAtInMilliseconds,
|
|
42
|
+
outputTail: marker.outputTail,
|
|
43
|
+
pid: marker.pid,
|
|
44
|
+
signal: marker.signal,
|
|
45
|
+
spawnError: marker.spawnError
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function buildMessage(params) {
|
|
49
|
+
const message = `The harness-owned Obsidian instance at ${params.cdpUrl} is gone: ${describeExit(params)}. Whatever ran after it had no app to talk to, so these failures are not test results \u2014 look for the \`!!! OWNED OBSIDIAN EXITED\` line in the run log for the moment it happened.`;
|
|
50
|
+
return appendProcessOutputTail(message, { output: params.outputTail ?? "", outputLabel: "Obsidian output" });
|
|
51
|
+
}
|
|
52
|
+
function describeExit(params) {
|
|
53
|
+
if (params.spawnError !== void 0) {
|
|
54
|
+
return `it failed to start (${params.spawnError})`;
|
|
55
|
+
}
|
|
56
|
+
if (params.code === void 0 && params.signal === void 0) {
|
|
57
|
+
return "it exited at some point during this run, and the harness recorded nothing about how (the run that owns it logs the exit code; a worker sees only what the exit marker preserved)";
|
|
58
|
+
}
|
|
59
|
+
return `${describeProcess(params)} ${describeReason(params)}${describeWhen(params.exitedAtInMilliseconds)}`;
|
|
60
|
+
}
|
|
61
|
+
function describeProcess(params) {
|
|
62
|
+
return params.pid === void 0 ? "it" : `its process (pid ${String(params.pid)})`;
|
|
63
|
+
}
|
|
64
|
+
function describeReason(params) {
|
|
65
|
+
if (params.signal !== void 0 && params.signal !== null) {
|
|
66
|
+
return `was terminated by signal ${params.signal}`;
|
|
67
|
+
}
|
|
68
|
+
return params.code === void 0 || params.code === null ? "exited with no exit code" : `exited with code ${String(params.code)}`;
|
|
69
|
+
}
|
|
70
|
+
function describeWhen(exitedAtInMilliseconds) {
|
|
71
|
+
if (exitedAtInMilliseconds === void 0) {
|
|
72
|
+
return "";
|
|
73
|
+
}
|
|
74
|
+
const elapsedInSeconds = Math.max(0, Math.round((Date.now() - exitedAtInMilliseconds) / MILLISECONDS_PER_SECOND));
|
|
75
|
+
return ` ${String(elapsedInSeconds)}s ago, at ${new Date(exitedAtInMilliseconds).toISOString()}`;
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
OwnedInstanceExitedError,
|
|
79
|
+
buildOwnedInstanceExitedErrorFromMarker
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiB0aGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBpcyBnb25lIFx1MjAxNFxuICogaXQgZXhpdGVkLCBhbmQgdGhlIENEUCBlbmRwb2ludCBpdCB3YXMgc2VydmluZyBhbnN3ZXJzIG5vdGhpbmcuXG4gKlxuICogSXQgZXhpc3RzIHRvIHJlcGxhY2UgYW4gYW5vbnltb3VzIGNhc2NhZGUgd2l0aCBvbmUgbmFtZWQgY2F1c2UuIEJlZm9yZSBpdCxcbiAqIGV2ZXJ5IHRlc3QgZmlsZSBzY2hlZHVsZWQgYWZ0ZXIgYSBtaWQtcnVuIGRlYXRoIGZhaWxlZCBpbiB+NjBcdTIwMTM5MCBtcyB3aXRoXG4gKiBgVHlwZUVycm9yOiBmZXRjaCBmYWlsZWRgIHdyYXBwaW5nIGBjb25uZWN0IEVDT05OUkVGVVNFRCAxMjcuMC4wLjE6PHBvcnQ+YCBcdTIwMTRcbiAqIG1lYXN1cmVkIGF0ICoqMTU2IHN1Y2ggZmFpbHVyZXMgYWNyb3NzIDIxIGZpbGVzKiogaW4gYG9ic2lkaWFuLXBhdHRlcm5zYCBvblxuICogMjAyNi0wOS0wNSwgbm90IG9uZSBvZiB0aGVtIGEgdGVzdCByZXN1bHQuIFRoZSBhYnNlbmNlIG9mIGFuIGFwcCBpcyBub3QgYSB0ZXN0XG4gKiBvdXRjb21lLCBhbmQgdGhpcyBlcnJvciBzYXlzIHNvIGluIHRoZSB3b3JkcyBhIHJlYWRlciBuZWVkczogdGhlIGluc3RhbmNlXG4gKiBkaWVkLCBoZXJlIGlzIGl0cyBleGl0IGNvZGUsIGFuZCB0aGVzZSBmYWlsdXJlcyBhcmUgbm90IGFib3V0IHlvdXIgY29kZS5cbiAqXG4gKiBFeHBvcnRlZCBzbyBjYWxsZXJzIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggaXQsIGxpa2UgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYFxuICogYW5kIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE93bmVkSW5zdGFuY2VFeGl0TWFya2VyIH0gZnJvbSAnLi9vd25lZC1pbnN0YW5jZS1leGl0LW1hcmtlci5tanMnO1xuXG5pbXBvcnQgeyBhcHBlbmRQcm9jZXNzT3V0cHV0VGFpbCB9IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcblxuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBFdmVyeXRoaW5nIGJ1dCB0aGUgVVJMIGlzIG9wdGlvbmFsOiB0aGUgZXhpdCBkZXRhaWxzIGNvbWUgZnJvbSB0aGUgcHJvY2Vzc1xuICogdGhhdCBsYXVuY2hlZCB0aGUgaW5zdGFuY2UsIGFuZCBhIGNhbGxlciBpbiBhbm90aGVyIHByb2Nlc3MgaGFzIHRoZW0gb25seVxuICogd2hlbiB0aGUgZXhpdCBtYXJrZXIgc3Vydml2ZWQgKHNlZSBgb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIudHNgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICByZWFkb25seSBjb2RlPzogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IGV4aXRlZEF0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSB0YWlsIG9mIHdoYXQgdGhlIGluc3RhbmNlIHdyb3RlIHRvIHN0ZG91dC9zdGRlcnIsIHdoZW4gYW55IHdhcyBjYXB0dXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dFRhaWw/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFBJRCBvZiB0aGUgZGVhZCBpbnN0YW5jZSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHJlYWRvbmx5IHBpZD86IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGVybWluYXRpbmcgc2lnbmFsLCB3aGVuIGtub3duLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogTm9kZUpTLlNpZ25hbHMgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgc3Bhd24tZmFpbHVyZSBtZXNzYWdlIHdoZW4gdGhlIGluc3RhbmNlIG5ldmVyIHN0YXJ0ZWQsIG90aGVyd2lzZSBhYnNlbnQuXG4gICAqL1xuICByZWFkb25seSBzcGF3bkVycm9yPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBoYXJuZXNzLW93bmVkIE9ic2lkaWFuIGluc3RhbmNlIGhhcyBleGl0ZWQgYW5kIGl0cyBDRFBcbiAqIGVuZHBvaW50IGlzIHRoZXJlZm9yZSB1bnJlYWNoYWJsZS4gQ2FycmllcyB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgZGVhdGhcbiAqIFx1MjAxNCBleGl0IGNvZGUsIHNpZ25hbCwgd2hlbiBpdCBoYXBwZW5lZCwgYW5kIHRoZSBvdXRwdXQgdGFpbCBcdTIwMTQgc28gdGhlIGZhaWx1cmVcbiAqIG5hbWVzIGl0cyBvd24gY2F1c2UgaW5zdGVhZCBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gIFRoZSBDRFAgVVJMIHRoZSBkZWFkIGluc3RhbmNlIHdhcyBzZXJ2aW5nLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNkcFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICBFeGl0IGNvZGUsIHdoZW4ga25vd24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZTogbnVsbCB8IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hlbiB0aGUgaW5zdGFuY2UgZXhpdGVkIChgRGF0ZS5ub3coKWAgZXBvY2ggbWlsbGlzZWNvbmRzKSwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBleGl0ZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRlcm1pbmF0aW5nIHNpZ25hbCwgd2hlbiBrbm93bi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzaWduYWw6IE5vZGVKUy5TaWduYWxzIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB3aGF0ZXZlciBpcyBrbm93biBhYm91dCB0aGUgaW5zdGFuY2UncyBkZWF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBDRFAgVVJMLCBhbmQgdGhlIGV4aXQgZGV0YWlscyB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoYnVpbGRNZXNzYWdlKHBhcmFtcykpO1xuICAgIHRoaXMubmFtZSA9ICdPd25lZEluc3RhbmNlRXhpdGVkRXJyb3InO1xuICAgIHRoaXMuY2RwVXJsID0gcGFyYW1zLmNkcFVybDtcbiAgICB0aGlzLmNvZGUgPSBwYXJhbXMuY29kZTtcbiAgICB0aGlzLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMuZXhpdGVkQXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLnNpZ25hbCA9IHBhcmFtcy5zaWduYWw7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGVycm9yIGZyb20gYW4gZXhpdCBtYXJrZXIsIGZvciBhIHByb2Nlc3MgdGhhdCBkaWQgbm90IGxhdW5jaCB0aGVcbiAqIGluc3RhbmNlIGFuZCBzbyBoYXMgbm90aGluZyBlbHNlIHRvIGdvIG9uLlxuICpcbiAqIEEgbWlzc2luZyBtYXJrZXIgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gZXhjZXB0aW9uYWwgXHUyMDE0IGl0IGlzIGNsZWFyZWQgb24gZXZlcnlcbiAqIGRlbGliZXJhdGUga2lsbCwgYW5kIGEgaGFyZCBlbm91Z2gga2lsbCByZWNvcmRzIG5vdGhpbmcgXHUyMDE0IHNvIHRoZSBlcnJvciBpc1xuICogc3RpbGwgYnVpbHQsIG5hbWluZyB0aGUgaW5zdGFuY2Ugd2l0aG91dCBjbGFpbWluZyB0byBrbm93IGhvdyBpdCBkaWVkLlxuICpcbiAqIEBwYXJhbSBjZHBVcmwgLSBUaGUgQ0RQIFVSTCB0aGUgZGVhZCBpbnN0YW5jZSB3YXMgc2VydmluZy5cbiAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgZXhpdCBtYXJrZXIgcmVhZCBmb3IgaXRzIHBvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEByZXR1cm5zIFRoZSBlcnJvciB0byB0aHJvdyBpbiBwbGFjZSBvZiBhIHJlZnVzZWQgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcihjZHBVcmw6IHN0cmluZywgbWFya2VyOiBPd25lZEluc3RhbmNlRXhpdE1hcmtlciB8IHVuZGVmaW5lZCk6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvciB7XG4gIGlmICghbWFya2VyKSB7XG4gICAgcmV0dXJuIG5ldyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IoeyBjZHBVcmwgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcih7XG4gICAgY2RwVXJsLFxuICAgIGNvZGU6IG1hcmtlci5jb2RlLFxuICAgIGV4aXRlZEF0SW5NaWxsaXNlY29uZHM6IG1hcmtlci5leGl0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIG91dHB1dFRhaWw6IG1hcmtlci5vdXRwdXRUYWlsLFxuICAgIHBpZDogbWFya2VyLnBpZCxcbiAgICBzaWduYWw6IG1hcmtlci5zaWduYWwsXG4gICAgc3Bhd25FcnJvcjogbWFya2VyLnNwYXduRXJyb3JcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTWVzc2FnZShwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgbWVzc2FnZSA9IGBUaGUgaGFybmVzcy1vd25lZCBPYnNpZGlhbiBpbnN0YW5jZSBhdCAke3BhcmFtcy5jZHBVcmx9IGlzIGdvbmU6ICR7ZGVzY3JpYmVFeGl0KHBhcmFtcyl9LiBgXG4gICAgKyAnV2hhdGV2ZXIgcmFuIGFmdGVyIGl0IGhhZCBubyBhcHAgdG8gdGFsayB0bywgc28gdGhlc2UgZmFpbHVyZXMgYXJlIG5vdCB0ZXN0IHJlc3VsdHMgXHUyMDE0ICdcbiAgICArICdsb29rIGZvciB0aGUgYCEhISBPV05FRCBPQlNJRElBTiBFWElURURgIGxpbmUgaW4gdGhlIHJ1biBsb2cgZm9yIHRoZSBtb21lbnQgaXQgaGFwcGVuZWQuJztcblxuICByZXR1cm4gYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwobWVzc2FnZSwgeyBvdXRwdXQ6IHBhcmFtcy5vdXRwdXRUYWlsID8/ICcnLCBvdXRwdXRMYWJlbDogJ09ic2lkaWFuIG91dHB1dCcgfSk7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdChwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgaWYgKHBhcmFtcy5zcGF3bkVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYGl0IGZhaWxlZCB0byBzdGFydCAoJHtwYXJhbXMuc3Bhd25FcnJvcn0pYDtcbiAgfVxuXG4gIGlmIChwYXJhbXMuY29kZSA9PT0gdW5kZWZpbmVkICYmIHBhcmFtcy5zaWduYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnaXQgZXhpdGVkIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoaXMgcnVuLCBhbmQgdGhlIGhhcm5lc3MgcmVjb3JkZWQgbm90aGluZyBhYm91dCBob3cgJ1xuICAgICAgKyAnKHRoZSBydW4gdGhhdCBvd25zIGl0IGxvZ3MgdGhlIGV4aXQgY29kZTsgYSB3b3JrZXIgc2VlcyBvbmx5IHdoYXQgdGhlIGV4aXQgbWFya2VyIHByZXNlcnZlZCknO1xuICB9XG5cbiAgcmV0dXJuIGAke2Rlc2NyaWJlUHJvY2VzcyhwYXJhbXMpfSAke2Rlc2NyaWJlUmVhc29uKHBhcmFtcyl9JHtkZXNjcmliZVdoZW4ocGFyYW1zLmV4aXRlZEF0SW5NaWxsaXNlY29uZHMpfWA7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUHJvY2VzcyhwYXJhbXM6IE93bmVkSW5zdGFuY2VFeGl0ZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhcmFtcy5waWQgPT09IHVuZGVmaW5lZCA/ICdpdCcgOiBgaXRzIHByb2Nlc3MgKHBpZCAke1N0cmluZyhwYXJhbXMucGlkKX0pYDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24ocGFyYW1zOiBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyk6IHN0cmluZyB7XG4gIGlmIChwYXJhbXMuc2lnbmFsICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLnNpZ25hbCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICR7cGFyYW1zLnNpZ25hbH1gO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtcy5jb2RlID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvZGUgPT09IG51bGwgPyAnZXhpdGVkIHdpdGggbm8gZXhpdCBjb2RlJyA6IGBleGl0ZWQgd2l0aCBjb2RlICR7U3RyaW5nKHBhcmFtcy5jb2RlKX1gO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdoZW4oZXhpdGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGV4aXRlZEF0SW5NaWxsaXNlY29uZHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGVsYXBzZWRJblNlY29uZHMgPSBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gZXhpdGVkQXRJbk1pbGxpc2Vjb25kcykgLyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCkpO1xuICByZXR1cm4gYCAke1N0cmluZyhlbGFwc2VkSW5TZWNvbmRzKX1zIGFnbywgYXQgJHtuZXcgRGF0ZShleGl0ZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfWA7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFvQkEsU0FBUywrQkFBK0I7QUFFeEMsTUFBTSwwQkFBMEI7QUFvRHpCLE1BQU0saUNBQWlDLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9ULFlBQVksUUFBbUQ7QUFDcEUsVUFBTSxhQUFhLE1BQU0sQ0FBQztBQUMxQixTQUFLLE9BQU87QUFDWixTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLE9BQU8sT0FBTztBQUNuQixTQUFLLHlCQUF5QixPQUFPO0FBQ3JDLFNBQUssU0FBUyxPQUFPO0FBQUEsRUFDdkI7QUFDRjtBQWNPLFNBQVMsd0NBQXdDLFFBQWdCLFFBQXVFO0FBQzdJLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTyxJQUFJLHlCQUF5QixFQUFFLE9BQU8sQ0FBQztBQUFBLEVBQ2hEO0FBRUEsU0FBTyxJQUFJLHlCQUF5QjtBQUFBLElBQ2xDO0FBQUEsSUFDQSxNQUFNLE9BQU87QUFBQSxJQUNiLHdCQUF3QixPQUFPO0FBQUEsSUFDL0IsWUFBWSxPQUFPO0FBQUEsSUFDbkIsS0FBSyxPQUFPO0FBQUEsSUFDWixRQUFRLE9BQU87QUFBQSxJQUNmLFlBQVksT0FBTztBQUFBLEVBQ3JCLENBQUM7QUFDSDtBQUVBLFNBQVMsYUFBYSxRQUEyRDtBQUMvRSxRQUFNLFVBQVUsMENBQTBDLE9BQU8sTUFBTSxhQUFhLGFBQWEsTUFBTSxDQUFDO0FBSXhHLFNBQU8sd0JBQXdCLFNBQVMsRUFBRSxRQUFRLE9BQU8sY0FBYyxJQUFJLGFBQWEsa0JBQWtCLENBQUM7QUFDN0c7QUFFQSxTQUFTLGFBQWEsUUFBMkQ7QUFDL0UsTUFBSSxPQUFPLGVBQWUsUUFBVztBQUNuQyxXQUFPLHVCQUF1QixPQUFPLFVBQVU7QUFBQSxFQUNqRDtBQUVBLE1BQUksT0FBTyxTQUFTLFVBQWEsT0FBTyxXQUFXLFFBQVc7QUFDNUQsV0FBTztBQUFBLEVBRVQ7QUFFQSxTQUFPLEdBQUcsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLGVBQWUsTUFBTSxDQUFDLEdBQUcsYUFBYSxPQUFPLHNCQUFzQixDQUFDO0FBQzNHO0FBRUEsU0FBUyxnQkFBZ0IsUUFBMkQ7QUFDbEYsU0FBTyxPQUFPLFFBQVEsU0FBWSxPQUFPLG9CQUFvQixPQUFPLE9BQU8sR0FBRyxDQUFDO0FBQ2pGO0FBRUEsU0FBUyxlQUFlLFFBQTJEO0FBQ2pGLE1BQUksT0FBTyxXQUFXLFVBQWEsT0FBTyxXQUFXLE1BQU07QUFDekQsV0FBTyw0QkFBNEIsT0FBTyxNQUFNO0FBQUEsRUFDbEQ7QUFFQSxTQUFPLE9BQU8sU0FBUyxVQUFhLE9BQU8sU0FBUyxPQUFPLDZCQUE2QixvQkFBb0IsT0FBTyxPQUFPLElBQUksQ0FBQztBQUNqSTtBQUVBLFNBQVMsYUFBYSx3QkFBb0Q7QUFDeEUsTUFBSSwyQkFBMkIsUUFBVztBQUN4QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sbUJBQW1CLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTyxLQUFLLElBQUksSUFBSSwwQkFBMEIsdUJBQXVCLENBQUM7QUFDaEgsU0FBTyxJQUFJLE9BQU8sZ0JBQWdCLENBQUMsYUFBYSxJQUFJLEtBQUssc0JBQXNCLEVBQUUsWUFBWSxDQUFDO0FBQ2hHOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -19,11 +19,30 @@
|
|
|
19
19
|
* Seeding both was verified to open the vault directly (no selector) on 0.6.4,
|
|
20
20
|
* 0.9.20, 0.12.19, 0.13.19, 0.14.5 and 1.12.7. `updateDisabled` suppresses the
|
|
21
21
|
* throwaway instance's self-update.
|
|
22
|
+
*
|
|
23
|
+
* Both markers can also be **withheld** — see
|
|
24
|
+
* {@link BuildOwnedObsidianJsonParams.shouldAutoOpenVault}. The one caller that
|
|
25
|
+
* does so wants the starter screen on purpose: a `configDirectory` override is a
|
|
26
|
+
* `localStorage` entry, and `localStorage` only exists once a renderer does, so
|
|
27
|
+
* the override has to be written in the starter screen's renderer before the
|
|
28
|
+
* vault's own window is created. The vault stays registered under the harness's
|
|
29
|
+
* id either way, and the later `vault-open` IPC reuses that id (verified on
|
|
30
|
+
* 1.13.7) rather than minting a second entry — which is what makes the
|
|
31
|
+
* `<vaultId>-config` key name knowable before launch.
|
|
22
32
|
*/
|
|
23
33
|
/**
|
|
24
34
|
* Parameters for {@link buildOwnedObsidianJson}.
|
|
25
35
|
*/
|
|
26
36
|
export interface BuildOwnedObsidianJsonParams {
|
|
37
|
+
/**
|
|
38
|
+
* Whether to include the auto-open markers, so Obsidian opens the vault
|
|
39
|
+
* directly instead of showing the starter screen. Pass `false` to keep the
|
|
40
|
+
* vault registered but closed — the caller then opens it itself, over the
|
|
41
|
+
* `vault-open` IPC, once it has prepared the starter screen's renderer.
|
|
42
|
+
*
|
|
43
|
+
* @default `true`
|
|
44
|
+
*/
|
|
45
|
+
readonly shouldAutoOpenVault?: boolean;
|
|
27
46
|
/**
|
|
28
47
|
Last-access timestamp to stamp on the vault entry.
|
|
29
48
|
*/
|
|
@@ -44,8 +63,9 @@ export interface OwnedObsidianJson {
|
|
|
44
63
|
/**
|
|
45
64
|
* Top-level auto-open marker (vault id) honored by old Obsidian versions;
|
|
46
65
|
* ignored as an unknown key by newer versions that use the per-entry `open`.
|
|
66
|
+
* Omitted when the caller withheld the auto-open markers.
|
|
47
67
|
*/
|
|
48
|
-
readonly last_open
|
|
68
|
+
readonly last_open?: string;
|
|
49
69
|
/**
|
|
50
70
|
Disables the throwaway instance's self-update.
|
|
51
71
|
*/
|
|
@@ -60,9 +80,10 @@ export interface OwnedObsidianJson {
|
|
|
60
80
|
*/
|
|
61
81
|
export interface OwnedObsidianVaultEntry {
|
|
62
82
|
/**
|
|
63
|
-
|
|
83
|
+
* Per-entry auto-open flag honored by newer Obsidian versions. Omitted when
|
|
84
|
+
* the caller withheld the auto-open markers.
|
|
64
85
|
*/
|
|
65
|
-
readonly open
|
|
86
|
+
readonly open?: true;
|
|
66
87
|
/**
|
|
67
88
|
Absolute path to the harness vault folder.
|
|
68
89
|
*/
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
function buildOwnedObsidianJson(params) {
|
|
2
|
+
const shouldAutoOpenVault = params.shouldAutoOpenVault ?? true;
|
|
3
|
+
const entry = shouldAutoOpenVault ? { open: true, path: params.vaultPath, ts: params.ts } : { path: params.vaultPath, ts: params.ts };
|
|
2
4
|
return {
|
|
5
|
+
// Spread rather than `last_open: undefined`, so the key is genuinely absent from
|
|
6
|
+
// The written JSON: this seed is read by Obsidian versions spanning a decade, and
|
|
7
|
+
// A present-but-undefined auto-open marker is not a shape any of them was tested
|
|
8
|
+
// Against.
|
|
3
9
|
// eslint-disable-next-line camelcase -- Obsidian's own obsidian.json field name (old versions' auto-open marker).
|
|
4
|
-
last_open: params.vaultId,
|
|
10
|
+
...shouldAutoOpenVault && { last_open: params.vaultId },
|
|
5
11
|
updateDisabled: true,
|
|
6
|
-
vaults: {
|
|
7
|
-
[params.vaultId]: { open: true, path: params.vaultPath, ts: params.ts }
|
|
8
|
-
}
|
|
12
|
+
vaults: { [params.vaultId]: entry }
|
|
9
13
|
};
|
|
10
14
|
}
|
|
11
15
|
export {
|
|
12
16
|
buildOwnedObsidianJson
|
|
13
17
|
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL293bmVkLXZhdWx0LXNlZWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgdGhlIGlzb2xhdGVkIGBvYnNpZGlhbi5qc29uYCB0aGUgaGFybmVzcyBwcmUtc2VlZHMgaW50byBhbiBvd25lZFxuICogaW5zdGFuY2UncyB0ZW1wIGAtLXVzZXItZGF0YS1kaXJgIHNvIE9ic2lkaWFuIG9wZW5zIHRoZSBoYXJuZXNzIHZhdWx0IGRpcmVjdGx5XG4gKiBpbnN0ZWFkIG9mIHNob3dpbmcgdGhlIGZpcnN0LXJ1biB2YXVsdC1zZWxlY3RvciAodGhlIGBzdGFydGVyLXNjcmVlbmApLlxuICpcbiAqIFRoZSBhdXRvLW9wZW4gbWFya2VyIGNoYW5nZWQgYWNyb3NzIE9ic2lkaWFuJ3MgaGlzdG9yeSwgc28gdGhlIHNlZWQgY2Fycmllc1xuICogQk9USCBmb3JtcyBhbmQgZWFjaCB2ZXJzaW9uIHJlYWRzIHRoZSBvbmUgaXQgdW5kZXJzdGFuZHMgKGlnbm9yaW5nIHRoZSBvdGhlclxuICogdW5rbm93biBrZXkpIFx1MjAxNCBubyBwZXItdmVyc2lvbiBicmFuY2hpbmc6XG4gKlxuICogLSAqKk9sZCB2ZXJzaW9ucyoqIChjb25maXJtZWQgMC42LjQpIGF1dG8tb3BlbiBmcm9tIGEgKip0b3AtbGV2ZWwgYGxhc3Rfb3BlbmAqKlxuICogICBob2xkaW5nIHRoZSB2YXVsdCBpZCAoYG1haW4uanNgOiBgaWYgKGlkICYmIHZhdWx0cy5oYXNPd25Qcm9wZXJ0eShpZCkpXG4gKiAgIGNyZWF0ZVdpbmRvdyhpZCk7IGVsc2Ugb3BlblN0YXJ0ZXIoKTtgKSwgYW5kIHN0b3JlIGVhY2ggdmF1bHQgZW50cnkgYXMganVzdFxuICogICBgeyBwYXRoLCB0cyB9YC4gV2l0aG91dCBgbGFzdF9vcGVuYCB0aGV5IGZhbGwgdGhyb3VnaCB0byB0aGUgdmF1bHQtc2VsZWN0b3IuXG4gKiAtICoqTmV3ZXIgdmVyc2lvbnMqKiAoY29uZmlybWVkIDAuMTQuNSspIGRyb3BwZWQgYGxhc3Rfb3BlbmAgYW5kIGF1dG8tb3BlbiBmcm9tXG4gKiAgIHRoZSBwZXItZW50cnkgKipgb3BlbjogdHJ1ZWAqKiBmbGFnLlxuICpcbiAqIFNlZWRpbmcgYm90aCB3YXMgdmVyaWZpZWQgdG8gb3BlbiB0aGUgdmF1bHQgZGlyZWN0bHkgKG5vIHNlbGVjdG9yKSBvbiAwLjYuNCxcbiAqIDAuOS4yMCwgMC4xMi4xOSwgMC4xMy4xOSwgMC4xNC41IGFuZCAxLjEyLjcuIGB1cGRhdGVEaXNhYmxlZGAgc3VwcHJlc3NlcyB0aGVcbiAqIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICpcbiAqIEJvdGggbWFya2VycyBjYW4gYWxzbyBiZSAqKndpdGhoZWxkKiogXHUyMDE0IHNlZVxuICoge0BsaW5rIEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMuc2hvdWxkQXV0b09wZW5WYXVsdH0uIFRoZSBvbmUgY2FsbGVyIHRoYXRcbiAqIGRvZXMgc28gd2FudHMgdGhlIHN0YXJ0ZXIgc2NyZWVuIG9uIHB1cnBvc2U6IGEgYGNvbmZpZ0RpcmVjdG9yeWAgb3ZlcnJpZGUgaXMgYVxuICogYGxvY2FsU3RvcmFnZWAgZW50cnksIGFuZCBgbG9jYWxTdG9yYWdlYCBvbmx5IGV4aXN0cyBvbmNlIGEgcmVuZGVyZXIgZG9lcywgc29cbiAqIHRoZSBvdmVycmlkZSBoYXMgdG8gYmUgd3JpdHRlbiBpbiB0aGUgc3RhcnRlciBzY3JlZW4ncyByZW5kZXJlciBiZWZvcmUgdGhlXG4gKiB2YXVsdCdzIG93biB3aW5kb3cgaXMgY3JlYXRlZC4gVGhlIHZhdWx0IHN0YXlzIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGhhcm5lc3Mnc1xuICogaWQgZWl0aGVyIHdheSwgYW5kIHRoZSBsYXRlciBgdmF1bHQtb3BlbmAgSVBDIHJldXNlcyB0aGF0IGlkICh2ZXJpZmllZCBvblxuICogMS4xMy43KSByYXRoZXIgdGhhbiBtaW50aW5nIGEgc2Vjb25kIGVudHJ5IFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZVxuICogYDx2YXVsdElkPi1jb25maWdgIGtleSBuYW1lIGtub3dhYmxlIGJlZm9yZSBsYXVuY2guXG4gKi9cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRPd25lZE9ic2lkaWFuSnNvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRPd25lZE9ic2lkaWFuSnNvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF1dG8tb3BlbiBtYXJrZXJzLCBzbyBPYnNpZGlhbiBvcGVucyB0aGUgdmF1bHRcbiAgICogZGlyZWN0bHkgaW5zdGVhZCBvZiBzaG93aW5nIHRoZSBzdGFydGVyIHNjcmVlbi4gUGFzcyBgZmFsc2VgIHRvIGtlZXAgdGhlXG4gICAqIHZhdWx0IHJlZ2lzdGVyZWQgYnV0IGNsb3NlZCBcdTIwMTQgdGhlIGNhbGxlciB0aGVuIG9wZW5zIGl0IGl0c2VsZiwgb3ZlciB0aGVcbiAgICogYHZhdWx0LW9wZW5gIElQQywgb25jZSBpdCBoYXMgcHJlcGFyZWQgdGhlIHN0YXJ0ZXIgc2NyZWVuJ3MgcmVuZGVyZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b09wZW5WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gIExhc3QtYWNjZXNzIHRpbWVzdGFtcCB0byBzdGFtcCBvbiB0aGUgdmF1bHQgZW50cnkuXG4gICAqL1xuICByZWFkb25seSB0czogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgcmFuZG9tbHktZ2VuZXJhdGVkIHZhdWx0IGlkIHVzZWQgYXMgdGhlIHJlZ2lzdHJ5IGtleSBhbmQgYGxhc3Rfb3BlbmAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGhhcm5lc3MgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGBvYnNpZGlhbi5qc29uYCBzdHJ1Y3R1cmUgdGhlIGhhcm5lc3Mgc2VlZHMgZm9yIGFuIG93bmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5Kc29uIHtcbiAgLyoqXG4gICAqIFRvcC1sZXZlbCBhdXRvLW9wZW4gbWFya2VyICh2YXVsdCBpZCkgaG9ub3JlZCBieSBvbGQgT2JzaWRpYW4gdmVyc2lvbnM7XG4gICAqIGlnbm9yZWQgYXMgYW4gdW5rbm93biBrZXkgYnkgbmV3ZXIgdmVyc2lvbnMgdGhhdCB1c2UgdGhlIHBlci1lbnRyeSBgb3BlbmAuXG4gICAqIE9taXR0ZWQgd2hlbiB0aGUgY2FsbGVyIHdpdGhoZWxkIHRoZSBhdXRvLW9wZW4gbWFya2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IGxhc3Rfb3Blbj86IHN0cmluZztcblxuICAvKipcbiAgRGlzYWJsZXMgdGhlIHRocm93YXdheSBpbnN0YW5jZSdzIHNlbGYtdXBkYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlRGlzYWJsZWQ6IHRydWU7XG5cbiAgLyoqXG4gIFZhdWx0IHJlZ2lzdHJ5IGtleWVkIGJ5IHZhdWx0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBPd25lZE9ic2lkaWFuVmF1bHRFbnRyeT4+O1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIHZhdWx0IGVudHJ5IGluIHRoZSBzZWVkZWQgYG9ic2lkaWFuLmpzb25gLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVkT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqXG4gICAqIFBlci1lbnRyeSBhdXRvLW9wZW4gZmxhZyBob25vcmVkIGJ5IG5ld2VyIE9ic2lkaWFuIHZlcnNpb25zLiBPbWl0dGVkIHdoZW5cbiAgICogdGhlIGNhbGxlciB3aXRoaGVsZCB0aGUgYXV0by1vcGVuIG1hcmtlcnMuXG4gICAqL1xuICByZWFkb25seSBvcGVuPzogdHJ1ZTtcblxuICAvKipcbiAgQWJzb2x1dGUgcGF0aCB0byB0aGUgaGFybmVzcyB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIExhc3QtYWNjZXNzIHRpbWVzdGFtcC5cbiAgICovXG4gIHJlYWRvbmx5IHRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBpc29sYXRlZCBgb2JzaWRpYW4uanNvbmAgdGhhdCBmb3JjZS1vcGVucyB0aGUgb3duZWQgdmF1bHQgYWNyb3NzIGFsbFxuICogc3VwcG9ydGVkIE9ic2lkaWFuIHZlcnNpb25zIChzZWUgdGhlIGZpbGUgb3ZlcnZpZXcgZm9yIHRoZSBkdWFsLW1hcmtlclxuICogcmF0aW9uYWxlKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZhdWx0IGlkLCBwYXRoLCBhbmQgdGltZXN0YW1wIHRvIHNlZWQuXG4gKiBAcmV0dXJucyBUaGUgYG9ic2lkaWFuLmpzb25gIG9iamVjdCB0byB3cml0ZSBpbnRvIHRoZSBvd25lZCB1c2VyLWRhdGEgZGlyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPd25lZE9ic2lkaWFuSnNvbihwYXJhbXM6IEJ1aWxkT3duZWRPYnNpZGlhbkpzb25QYXJhbXMpOiBPd25lZE9ic2lkaWFuSnNvbiB7XG4gIGNvbnN0IHNob3VsZEF1dG9PcGVuVmF1bHQgPSBwYXJhbXMuc2hvdWxkQXV0b09wZW5WYXVsdCA/PyB0cnVlO1xuICBjb25zdCBlbnRyeTogT3duZWRPYnNpZGlhblZhdWx0RW50cnkgPSBzaG91bGRBdXRvT3BlblZhdWx0XG4gICAgPyB7IG9wZW46IHRydWUsIHBhdGg6IHBhcmFtcy52YXVsdFBhdGgsIHRzOiBwYXJhbXMudHMgfVxuICAgIDogeyBwYXRoOiBwYXJhbXMudmF1bHRQYXRoLCB0czogcGFyYW1zLnRzIH07XG5cbiAgcmV0dXJuIHtcbiAgICAvLyBTcHJlYWQgcmF0aGVyIHRoYW4gYGxhc3Rfb3BlbjogdW5kZWZpbmVkYCwgc28gdGhlIGtleSBpcyBnZW51aW5lbHkgYWJzZW50IGZyb21cbiAgICAvLyBUaGUgd3JpdHRlbiBKU09OOiB0aGlzIHNlZWQgaXMgcmVhZCBieSBPYnNpZGlhbiB2ZXJzaW9ucyBzcGFubmluZyBhIGRlY2FkZSwgYW5kXG4gICAgLy8gQSBwcmVzZW50LWJ1dC11bmRlZmluZWQgYXV0by1vcGVuIG1hcmtlciBpcyBub3QgYSBzaGFwZSBhbnkgb2YgdGhlbSB3YXMgdGVzdGVkXG4gICAgLy8gQWdhaW5zdC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlIC0tIE9ic2lkaWFuJ3Mgb3duIG9ic2lkaWFuLmpzb24gZmllbGQgbmFtZSAob2xkIHZlcnNpb25zJyBhdXRvLW9wZW4gbWFya2VyKS5cbiAgICAuLi5zaG91bGRBdXRvT3BlblZhdWx0ICYmIHsgbGFzdF9vcGVuOiBwYXJhbXMudmF1bHRJZCB9LFxuICAgIHVwZGF0ZURpc2FibGVkOiB0cnVlLFxuICAgIHZhdWx0czogeyBbcGFyYW1zLnZhdWx0SWRdOiBlbnRyeSB9XG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFrSE8sU0FBUyx1QkFBdUIsUUFBeUQ7QUFDOUYsUUFBTSxzQkFBc0IsT0FBTyx1QkFBdUI7QUFDMUQsUUFBTSxRQUFpQyxzQkFDbkMsRUFBRSxNQUFNLE1BQU0sTUFBTSxPQUFPLFdBQVcsSUFBSSxPQUFPLEdBQUcsSUFDcEQsRUFBRSxNQUFNLE9BQU8sV0FBVyxJQUFJLE9BQU8sR0FBRztBQUU1QyxTQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTUwsR0FBRyx1QkFBdUIsRUFBRSxXQUFXLE9BQU8sUUFBUTtBQUFBLElBQ3RELGdCQUFnQjtBQUFBLElBQ2hCLFFBQVEsRUFBRSxDQUFDLE9BQU8sT0FBTyxHQUFHLE1BQU07QUFBQSxFQUNwQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|