obsidian-integration-testing 12.0.0 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +29 -32
- package/dist/lib/cjs/appium-server-marker.d.cts +22 -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/community-plugin-registry.cjs +1 -1
- package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
- 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/demo-vault-bootstrap.cjs +1 -1
- package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
- package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
- 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/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 +12 -1
- package/dist/lib/cjs/index.d.cts +6 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +14 -2
- package/dist/lib/cjs/mobile-input.d.cts +5 -9
- package/dist/lib/cjs/namespace-bootstrap.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/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/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 +102 -17
- package/dist/lib/cjs/transport-appium.d.cts +53 -3
- package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
- package/dist/lib/cjs/transport-factory.cjs +951 -133
- 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/webview-cdp.cjs +6 -7
- package/dist/lib/cjs/webview-cdp.d.cts +5 -1
- 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 +22 -0
- package/dist/lib/esm/appium-server-marker.mjs +28 -22
- 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/community-plugin-registry.d.mts +1 -1
- package/dist/lib/esm/community-plugin-registry.mjs +1 -1
- 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/demo-vault-bootstrap.d.mts +3 -2
- package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
- package/dist/lib/esm/demo-vault-populate.mjs +3 -2
- 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/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 +6 -1
- package/dist/lib/esm/index.mjs +11 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +5 -9
- package/dist/lib/esm/mobile-input.mjs +14 -2
- package/dist/lib/esm/namespace-bootstrap.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/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/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 +53 -3
- package/dist/lib/esm/transport-appium.mjs +108 -17
- package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
- package/dist/lib/esm/transport-factory.mjs +995 -138
- 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/webview-cdp.d.mts +5 -1
- package/dist/lib/esm/webview-cdp.mjs +6 -7
- package/package.json +24 -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
|
@@ -5,9 +5,10 @@ import {
|
|
|
5
5
|
} from "node:fs";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import { REQUIRED_PLUGIN_ASSET_NAMES } from "./community-plugin-registry.mjs";
|
|
8
|
+
import { DEFAULT_CONFIG_DIRECTORY } from "./config-directory.mjs";
|
|
8
9
|
import { readDemoVaultTree } from "./demo-vault-tree.mjs";
|
|
9
10
|
import { ensureNonNullable } from "./type-guards.mjs";
|
|
10
|
-
const OBSIDIAN_CONFIG_DIR =
|
|
11
|
+
const OBSIDIAN_CONFIG_DIR = DEFAULT_CONFIG_DIRECTORY;
|
|
11
12
|
const PLUGINS_DIR = "plugins";
|
|
12
13
|
const DATA_JSON = "data.json";
|
|
13
14
|
const DATA_JSON_INDENT = 2;
|
|
@@ -79,4 +80,4 @@ export {
|
|
|
79
80
|
resolveInjectedPluginSourceDirectory,
|
|
80
81
|
resolveMissingInjectedPlugins
|
|
81
82
|
};
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHsgcmVhZERlbW9WYXVsdFRyZWUgfSBmcm9tICcuL2RlbW8tdmF1bHQtdHJlZS5tanMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLm1qcyc7XG5cbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBSXJCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMseUJBQXlCO0FBRWxDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLFlBQVk7QUFDbEIsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxnQ0FBZ0MsQ0FBQyxZQUFZLG1CQUFtQixtQkFBbUI7QUFvSGxGLFNBQVMsdUJBQXVCLFFBQTJEO0FBQ2hHLFFBQU0sRUFBRSxlQUFlLGVBQWUsZ0JBQWdCLENBQUMsR0FBRyxzQkFBc0IsOEJBQThCLElBQUk7QUFFbEgsUUFBTSxNQUFNLGtCQUFrQixrQkFBa0IsU0FBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLGVBQWUsY0FBYyxDQUFDO0FBRWhILGFBQVcsY0FBYyxxQkFBcUI7QUFDNUMsVUFBTSxhQUFhLEtBQUssZUFBZSxxQkFBcUIsVUFBVTtBQUN0RSxRQUFJLFdBQVcsVUFBVSxHQUFHO0FBQzFCLFVBQUksR0FBRyxtQkFBbUIsSUFBSSxVQUFVLEVBQUUsSUFBSSxhQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLHFDQUFxQyxRQUE0RDtBQUMvRyxRQUFNLEVBQUUsZUFBZSxPQUFPLElBQUk7QUFDbEMsU0FBTyxPQUFPLG1CQUFtQixLQUFLLGVBQWUscUJBQXFCLGFBQWEsT0FBTyxRQUFRO0FBQ3hHO0FBY08sU0FBUyw4QkFBOEIsUUFBbUU7QUFDL0csUUFBTSxFQUFFLGNBQWMsSUFBSTtBQUMxQixTQUFPLE9BQU8sY0FBYyxPQUFPLENBQUMsV0FBVztBQUM3QyxRQUFJLE9BQU8sb0JBQW9CLFFBQVc7QUFDeEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFlBQVksb0JBQW9CLHFDQUFxQyxFQUFFLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFDckcsV0FBTyw0QkFBNEIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDdkYsQ0FBQztBQUNIO0FBWUEsU0FBUyx5QkFBeUIsZUFBdUIsUUFBb0M7QUFDM0YsTUFBSSxPQUFPLG9CQUFvQixRQUFXO0FBQ3hDLFdBQU87QUFBQSxFQUVUO0FBRUEsU0FBTyxvR0FBb0csYUFBYTtBQUcxSDtBQVFBLFNBQVMsb0JBQW9CLGlCQUFtQztBQUM5RCxTQUFPLFdBQVcsZUFBZSxJQUM3QixZQUFZLGlCQUFpQixFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksSUFDakgsQ0FBQztBQUNQO0FBVUEsU0FBUyxXQUFXLGVBQXVCLFFBQTRCLEtBQWdDO0FBQ3JHLFFBQU0sRUFBRSxNQUFNLFNBQVMsSUFBSTtBQUMzQixRQUFNLGtCQUFrQixxQ0FBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQztBQUN0RixRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLFlBQVksb0JBQW9CLGVBQWU7QUFFckQsYUFBVyxnQkFBZ0IsNkJBQTZCO0FBQ3RELFFBQUksQ0FBQyxVQUFVLFNBQVMsWUFBWSxHQUFHO0FBQ3JDLFlBQU0sU0FBUyx5QkFBeUIsZUFBZSxNQUFNO0FBQzdELFlBQU0sSUFBSTtBQUFBLFFBQ1IscUJBQXFCLFFBQVEseUNBQXlDLEtBQUssaUJBQWlCLFlBQVksQ0FBQyxjQUFjLE1BQU07QUFBQSxNQUMvSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLElBQUksYUFBYSxLQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sV0FBbUIsa0JBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtcG9wdWxhdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB7QGxpbmsgUG9wdWxhdGVGaWxlc1BhcmFtc30gbWFwIGZvciBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgcmVhZHkgdG8gc2VlZCBpbnRvXG4gKiB0aGUgdGVtcCB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQuIENvbXBvc2VzIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gKHRoZSBub3RlIHRyZWUpIHdpdGggdGhlIHR3b1xuICogcGllY2VzIGl0IGRlbGliZXJhdGVseSBvbWl0czogc2VsZWN0ZWQgYC5vYnNpZGlhbi8qYCBjb25maWcgZmlsZXMsIGFuZCB0aGUgYnVpbHQgYmluYXJpZXMgKCsgYGRhdGEuanNvbmApXG4gKiBvZiBhbnkgZXh0cmEgY29tbXVuaXR5IHBsdWdpbnMgdGhlIGRlbW8gdmF1bHQgZGVwZW5kcyBvbiAoZS5nLiBDb2RlU2NyaXB0IFRvb2xraXQsIGBkZW1vLXZhdWx0LWhlbHBlcmApLlxuICpcbiAqIFBhaXJzIHdpdGggdGhlIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYCBvcHRpb24gb2YgdGhlIGdsb2JhbC1zZXR1cCBgY3JlYXRlU2V0dXBgOiB0aGlzIHNlZWRzIHRoZSBiaW5hcmllcyxcbiAqIHRoYXQgdHVybnMgdGhlbSBvbi4gSXQgaW50ZW50aW9uYWxseSBkb2VzIE5PVCB3cml0ZSBgY29tbXVuaXR5LXBsdWdpbnMuanNvbmAgXHUyMDE0IHRoZSBoYXJuZXNzIG93bnMgdGhhdCBmaWxlXG4gKiAoaXQgbGlzdHMgdGhlIHBsdWdpbi11bmRlci10ZXN0KSwgYW5kIGVuYWJsaW5nIHRoZSBleHRyYXMgcGVyc2lzdHMgdGhlbS5cbiAqXG4gKiBTdGF5cyAqKnN5bmNocm9ub3VzKiosIHNvIGFuIGluamVjdGVkIHBsdWdpbiB3aG9zZSBiaW5hcmllcyBhcmUgYWJzZW50IGlzIGEgdGhyb3cgcmF0aGVyIHRoYW4gYSBkb3dubG9hZC5cbiAqIGBkZW1vLXZhdWx0LWJvb3RzdHJhcC50c2Agb3ducyB0aGUgaGVhZGxlc3MgaW5zdGFsbCB0aGUgdGhyb3cncyBtZXNzYWdlIHBvaW50cyBhdCBcdTIwMTQgaW5jbHVkaW5nXG4gKiBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jYCwgdGhlIHNlbGYtaGVhbGluZyBzaWJsaW5nIG9mIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS4gVGhlXG4gKiBtaXNzaW5nLXBsdWdpbiBkZXRlY3Rpb24gKHtAbGluayByZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc30pIGxpdmVzIGhlcmUgYW5kIGlzIHNoYXJlZCB3aXRoIGl0LCBzbyB0aGVcbiAqIHR3byBwYXRocyBjYW5ub3QgZGlzYWdyZWUgYWJvdXQgd2hhdCBcIm5vdCBpbnN0YWxsZWRcIiBtZWFucy5cbiAqL1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5cbmltcG9ydCB7IFJFUVVJUkVEX1BMVUdJTl9BU1NFVF9OQU1FUyB9IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5Lm1qcyc7XG5pbXBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJy4vdHlwZS1ndWFyZHMubWpzJztcblxuLypcbiAqIEJvdGggdGhlIGZvbGRlciB0aGUgZGVtbyB2YXVsdCdzIG93biBjb21taXR0ZWQgY29uZmlnIHNpdHMgaW4gb24gZGlzaywgYW5kIHRoZSBkZXN0aW5hdGlvbiB0aGUgbWFwXG4gKiBuYW1lcyBmb3IgaXQuIFRoZSB0d28gY29pbmNpZGUgYnkgY29uc3RydWN0aW9uOiB0aGUgc291cmNlIGlzIGEgcmVwbyBmb2xkZXIgT2JzaWRpYW4gY3JlYXRlZCB1bmRlciBpdHNcbiAqIGRlZmF1bHQsIGFuZCBhIGBjb25maWdEaXJlY3RvcnlgIG92ZXJyaWRlIG9uIHRoZSBydW4gaXMgYXBwbGllZCB0byB0aGUgZGVzdGluYXRpb24ga2V5cyBsYXRlciwgYnlcbiAqIGByZW1hcENvbmZpZ0RpcmVjdG9yeUtleXNgIGluIGBnbG9iYWwtc2V0dXAtY29yZWAsIHdoaWNoIGlzIHdoZXJlIHRoZSBvdmVycmlkZSBpcyBhY3R1YWxseSBrbm93bi5cbiAqL1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9IERFRkFVTFRfQ09ORklHX0RJUkVDVE9SWTtcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgREFUQV9KU09OID0gJ2RhdGEuanNvbic7XG5jb25zdCBEQVRBX0pTT05fSU5ERU5UID0gMjtcblxuY29uc3QgREVGQVVMVF9PQlNJRElBTl9DT05GSUdfRklMRVMgPSBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE5hbWVzIChvZiBmaWxlcyBvciBkaXJlY3RvcmllcywgbWF0Y2hlZCBhdCBhbnkgZGVwdGgpIHRvIHNraXAgd2hpbGUgcmVhZGluZyB0aGUgbm90ZSB0cmVlIFx1MjAxNCBmb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIHJlYWREZW1vVmF1bHRUcmVlfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnLmdpdCcsICcub2JzaWRpYW4nXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkTmFtZXM/OiBJdGVyYWJsZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBDb21tdW5pdHkgcGx1Z2lucyB0byBzZWVkIGludG8gYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYCAoYmluYXJpZXMgKyBvcHRpb25hbCBgZGF0YS5qc29uYCkuIFR1cm5cbiAgICogdGhlbSBvbiB3aXRoIHRoZSBnbG9iYWwtc2V0dXAgYGNyZWF0ZVNldHVwKHsgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyB9KWAgb3B0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5qZWN0UGx1Z2lucz86IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xuXG4gIC8qKlxuICAgKiBgLm9ic2lkaWFuLypgIGNvbmZpZyBmaWxlcyB0byBjYXJyeSBvdmVyIGZyb20gdGhlIGRlbW8gdmF1bHQuIHtAbGluayByZWFkRGVtb1ZhdWx0VHJlZX0gZXhjbHVkZXMgdGhlIHdob2xlXG4gICAqIGAub2JzaWRpYW5gIGRpcmVjdG9yeSwgc28gY29uZmlnIHRoZSB2YXVsdCByZWxpZXMgb24gKHByZXZpZXctbW9kZSBkZWZhdWx0LCBjb3JlIHBsdWdpbnMsIGFwcGVhcmFuY2UpIG11c3RcbiAgICogYmUgcmUtYWRkZWQgZXhwbGljaXRseS4gRmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ2FwcC5qc29uJywgJ2FwcGVhcmFuY2UuanNvbicsICdjb3JlLXBsdWdpbnMuanNvbiddYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5Db25maWdGaWxlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgY29tbXVuaXR5IHBsdWdpbiB0byBzZWVkIGludG8gdGhlIGRlbW8gdmF1bHQgYWxvbmdzaWRlIHRoZSBub3RlIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0UGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIE92ZXJsYXkgd3JpdHRlbiBhcyBgLm9ic2lkaWFuL3BsdWdpbnMvPHBsdWdpbklkPi9kYXRhLmpzb25gIChKU09OLCAyLXNwYWNlIGluZGVudCkuIE9taXQgdG8ga2VlcCB3aGF0ZXZlclxuICAgKiBgZGF0YS5qc29uYCAoaWYgYW55KSBhbHJlYWR5IGxpdmVzIGluIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tbXVuaXR5IHBsdWdpbidzIGlkIChpdHMgYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD5gIGZvbGRlciBuYW1lKS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBHaXRIdWIgcmVwb3NpdG9yeSAoYG93bmVyL25hbWVgKSBwdWJsaXNoaW5nIHRoaXMgcGx1Z2luLCBjb25zdWx0ZWQgKipvbmx5KiogYnkgdGhlIGhlYWRsZXNzXG4gICAqIGJvb3RzdHJhcCAoYGJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNgIC8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AgLyB0aGVcbiAgICogYGJvb3RzdHJhcC1kZW1vLXZhdWx0YCBDTEkpIHdoZW4gdGhlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQuIFN1cHBseWluZyBpdCBza2lwc1xuICAgKiB0aGUgbG9va3VwIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeSwgd2hpY2ggaXMgYWxzbyB0aGUgd2F5IHRvIGJvb3RzdHJhcCBhIHBsdWdpblxuICAgKiB0aGF0IGlzIG5vdCBsaXN0ZWQgdGhlcmUgYXQgYWxsLiBOZXZlciB1c2VkIHdoZW4gdGhlIGZpbGVzIGFyZSBhbHJlYWR5IG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSByZXBvPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcnkgdG8gcmVhZCB0aGUgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgZnJvbS4gRXZlcnkgZmlsZSBkaXJlY3RseSBpbnNpZGUgaXQgaXMgY29waWVkIGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zLzxwbHVnaW5JZD4vYDsgYG1haW4uanNgIGFuZCBgbWFuaWZlc3QuanNvbmAgYXJlIHJlcXVpcmVkLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoaXMgYWxzbyBvcHRzIHRoZSBwbHVnaW4gKipvdXQqKiBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwOiBhbiBleHBsaWNpdCBzb3VyY2UgZGlyZWN0b3J5XG4gICAqIG5hbWVzIGEgbG9jYWwgYnVpbGQgb3V0cHV0LCBub3Qgc29tZXdoZXJlIHRvIGRvd25sb2FkIGEgcHVibGlzaGVkIHJlbGVhc2UgaW50by5cbiAgICpcbiAgICogQGRlZmF1bHQgYDxkZW1vVmF1bHRQYXRoPi8ub2JzaWRpYW4vcGx1Z2lucy88cGx1Z2luSWQ+YFxuICAgKi9cblxuICByZWFkb25seSBzb3VyY2VEaXJlY3Rvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxlYXNlIHRhZyB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIGRvd25sb2FkcyBmcm9tLCBwaW5uaW5nIHRoZSBpbnN0YWxsZWQgdmVyc2lvbi4gT21pdCBmb3IgdGhlXG4gICAqIHJlcG9zaXRvcnkncyBsYXRlc3QgcmVsZWFzZSBcdTIwMTQgd2hhdCB0aGUgaW4tYXBwIGNvbW11bml0eSBicm93c2VyIGluc3RhbGxzLiBMaWtlXG4gICAqIHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMucmVwb30sIGNvbnN1bHRlZCBvbmx5IHdoaWxlIGJvb3RzdHJhcHBpbmcgbWlzc2luZyBiaW5hcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIHBsdWdpbiByZXBvJ3MgYGRlbW8tdmF1bHQvYCBkaXJlY3RvcnkuXG4gICAqL1xuICByZWFkb25seSBkZW1vVmF1bHRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBpbmplY3RlZCBwbHVnaW4gd2hvc2Ugc291cmNlIGRpcmVjdG9yeSB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyB7XG4gIC8qKlxuICBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwbHVnaW4gcmVwbydzIGBkZW1vLXZhdWx0L2AgZGlyZWN0b3J5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVtb1ZhdWx0UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgaW5qZWN0ZWQgcGx1Z2lucyB0byBjaGVjay5cbiAgICovXG4gIHJlYWRvbmx5IGluamVjdFBsdWdpbnM6IHJlYWRvbmx5IEluamVjdFBsdWdpblBhcmFtc1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVsbCBwb3B1bGF0ZSBtYXAgZm9yIGEgcGx1Z2luJ3MgYGRlbW8tdmF1bHQvYDogdGhlIG5vdGUgdHJlZSwgdGhlIHNlbGVjdGVkIGAub2JzaWRpYW4vKmAgY29uZmlnXG4gKiBmaWxlcywgYW5kIGV2ZXJ5IGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzICgrIG9wdGlvbmFsIGBkYXRhLmpzb25gKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwb3B1bGF0ZSBtYXAsIHJlYWR5IHRvIGhhbmQgdG8gYSBnbG9iYWwgc2V0dXAncyBgcG9wdWxhdGVgIG9yIHtAbGluayBUZW1wb3JhcnlWYXVsdC5wb3B1bGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZERlbW9WYXVsdFBvcHVsYXRlKHBhcmFtczogQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyk6IFBvcHVsYXRlRmlsZXNQYXJhbXMge1xuICBjb25zdCB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMsIGluamVjdFBsdWdpbnMgPSBbXSwgb2JzaWRpYW5Db25maWdGaWxlcyA9IERFRkFVTFRfT0JTSURJQU5fQ09ORklHX0ZJTEVTIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgbWFwID0gcmVhZERlbW9WYXVsdFRyZWUoZXhjbHVkZWROYW1lcyA9PT0gdW5kZWZpbmVkID8geyBkZW1vVmF1bHRQYXRoIH0gOiB7IGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTmFtZXMgfSk7XG5cbiAgZm9yIChjb25zdCBjb25maWdGaWxlIG9mIG9ic2lkaWFuQ29uZmlnRmlsZXMpIHtcbiAgICBjb25zdCBjb25maWdQYXRoID0gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBjb25maWdGaWxlKTtcbiAgICBpZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgbWFwW2Ake09CU0lESUFOX0NPTkZJR19ESVJ9LyR7Y29uZmlnRmlsZX1gXSA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBpbmplY3RQbHVnaW5zKSB7XG4gICAgc2VlZFBsdWdpbihkZW1vVmF1bHRQYXRoLCBwbHVnaW4sIG1hcCk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXJlY3RvcnkgYW4gaW5qZWN0ZWQgcGx1Z2luJ3MgYnVpbHQgZmlsZXMgYXJlIHJlYWQgZnJvbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGV4cGxpY2l0IHtAbGluayBJbmplY3RQbHVnaW5QYXJhbXMuc291cmNlRGlyZWN0b3J5fSB3aGVuIHNldCwgb3RoZXJ3aXNlIHRoZSBwbHVnaW4ncyBmb2xkZXJcbiAqICAgaW5zaWRlIHRoZSBkZW1vIHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5KHBhcmFtczogUmVzb2x2ZUluamVjdGVkUGx1Z2luU291cmNlRGlyZWN0b3J5UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBsdWdpbi5zb3VyY2VEaXJlY3RvcnkgPz8gam9pbihkZW1vVmF1bHRQYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luLnBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBpbmplY3RlZCBwbHVnaW5zIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nIGZyb20gdGhlIGRlbW8gdmF1bHQgYW5kIGNhbiB0aGVyZWZvcmUgYmVcbiAqIGluc3RhbGxlZCBoZWFkbGVzc2x5IFx1MjAxNCB0aGUgZXhhY3Qgc2V0IHtAbGluayBidWlsZERlbW9WYXVsdFBvcHVsYXRlfSB3b3VsZCBvdGhlcndpc2UgdGhyb3cgb24uXG4gKlxuICogUGx1Z2lucyBjYXJyeWluZyBhbiBleHBsaWNpdCB7QGxpbmsgSW5qZWN0UGx1Z2luUGFyYW1zLnNvdXJjZURpcmVjdG9yeX0gYXJlIGV4Y2x1ZGVkOiB0aGF0IG5hbWVzIGEgbG9jYWxcbiAqIGJ1aWxkIG91dHB1dCwgbm90IHNvbWV3aGVyZSB0byBkb3dubG9hZCBhIHB1Ymxpc2hlZCByZWxlYXNlIGludG8uXG4gKlxuICogU2hhcmVkIHdpdGggdGhlIGJvb3RzdHJhcCBzbyBcIm1pc3NpbmdcIiBoYXMgb25lIGRlZmluaXRpb24gcmF0aGVyIHRoYW4gdHdvIHRoYXQgY2FuIGRyaWZ0IGFwYXJ0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBwbHVnaW5zIHRvIGJvb3RzdHJhcCwgaW4gdGhlIG9yZGVyIGdpdmVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnMocGFyYW1zOiBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtcyk6IEluamVjdFBsdWdpblBhcmFtc1tdIHtcbiAgY29uc3QgeyBkZW1vVmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIHJldHVybiBwYXJhbXMuaW5qZWN0UGx1Z2lucy5maWx0ZXIoKHBsdWdpbikgPT4ge1xuICAgIGlmIChwbHVnaW4uc291cmNlRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZmlsZU5hbWVzID0gcmVhZFBsdWdpbkZpbGVOYW1lcyhyZXNvbHZlSW5qZWN0ZWRQbHVnaW5Tb3VyY2VEaXJlY3RvcnkoeyBkZW1vVmF1bHRQYXRoLCBwbHVnaW4gfSkpO1xuICAgIHJldHVybiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMuc29tZSgoYXNzZXROYW1lKSA9PiAhZmlsZU5hbWVzLmluY2x1ZGVzKGFzc2V0TmFtZSkpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIFwiaG93IHRvIGZpeCB0aGlzXCIgaGFsZiBvZiB0aGUgbWlzc2luZy1iaW5hcmllcyBlcnJvci5cbiAqXG4gKiBUaGUgcmVtZWR5IGRpZmZlcnMgYnkgb3B0LW91dDogYSBwbHVnaW4gcmVhZCBmcm9tIHRoZSBkZW1vIHZhdWx0IGNhbiBiZSBpbnN0YWxsZWQgaGVhZGxlc3NseSwgd2hpbGUgb25lXG4gKiByZWFkIGZyb20gYW4gZXhwbGljaXQgYHNvdXJjZURpcmVjdG9yeWAgbmFtZXMgYSBsb2NhbCBidWlsZCBvdXRwdXQgdGhlIGJvb3RzdHJhcCBtdXN0IG5ldmVyIG92ZXJ3cml0ZS5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIG5hbWVkIGluIHRoZSBDTEkgaGludCBzbyB0aGUgY29tbWFuZCBpcyBjb3B5LXBhc3RlYWJsZS5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHdob3NlIGJpbmFyaWVzIGFyZSBtaXNzaW5nLlxuICogQHJldHVybnMgVGhlIHJlbWVkeSBzZW50ZW5jZShzKS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNaXNzaW5nUGx1Z2luUmVtZWR5KGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMpOiBzdHJpbmcge1xuICBpZiAocGx1Z2luLnNvdXJjZURpcmVjdG9yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdJdCB3YXMgcmVhZCBmcm9tIGFuIGV4cGxpY2l0IGBzb3VyY2VEaXJlY3RvcnlgLCB3aGljaCBvcHRzIGl0IG91dCBvZiB0aGUgaGVhZGxlc3MgYm9vdHN0cmFwIFx1MjAxNCAnXG4gICAgICArICdidWlsZCBpdCBpbnRvIHRoYXQgZGlyZWN0b3J5LCBvciBkcm9wIGBzb3VyY2VEaXJlY3RvcnlgIHRvIGluc3RhbGwgaXQgZnJvbSBpdHMgcHVibGlzaGVkIHJlbGVhc2UuJztcbiAgfVxuXG4gIHJldHVybiBgSW5zdGFsbCBpdCBoZWFkbGVzc2x5IHdpdGggXFxgbnB4IG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgYm9vdHN0cmFwLWRlbW8tdmF1bHQgLS1kZW1vLXZhdWx0IFwiJHtkZW1vVmF1bHRQYXRofVwiXFxgLCBgXG4gICAgKyAnb3Igc3dpdGNoIHRoaXMgc2V0dXAgdG8gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVBc3luY2AsIHdoaWNoIGluc3RhbGxzIG1pc3NpbmcgcGx1Z2lucyBpdHNlbGYuICdcbiAgICArICdPcGVuaW5nIGRlbW8tdmF1bHQvIGluIE9ic2lkaWFuIG9uY2Ugc28gZGVtby12YXVsdC1oZWxwZXIgaW5zdGFsbHMgaXQgYWxzbyB3b3Jrcy4nO1xufVxuXG4vKipcbiAqIExpc3RzIHRoZSBmaWxlIG5hbWVzIGRpcmVjdGx5IGluc2lkZSBhIHBsdWdpbidzIHNvdXJjZSBkaXJlY3RvcnkuXG4gKlxuICogQHBhcmFtIHNvdXJjZURpcmVjdG9yeSAtIFRoZSBkaXJlY3RvcnkgdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIG5hbWVzLCBvciBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmZ1bmN0aW9uIHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBleGlzdHNTeW5jKHNvdXJjZURpcmVjdG9yeSlcbiAgICA/IHJlYWRkaXJTeW5jKHNvdXJjZURpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKS5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKVxuICAgIDogW107XG59XG5cbi8qKlxuICogU2VlZHMgb25lIGluamVjdGVkIHBsdWdpbidzIGJpbmFyaWVzIChhbmQgb3B0aW9uYWwgYGRhdGEuanNvbmApIGludG8gdGhlIHBvcHVsYXRlIG1hcC5cbiAqXG4gKiBAcGFyYW0gZGVtb1ZhdWx0UGF0aCAtIFRoZSBkZW1vIHZhdWx0IHJvb3QsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVmYXVsdCBzb3VyY2UgZGlyZWN0b3J5LlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gc2VlZC5cbiAqIEBwYXJhbSBtYXAgLSBUaGUgcG9wdWxhdGUgbWFwIHRvIHdyaXRlIGludG8uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgLyBgbWFuaWZlc3QuanNvbmAgYXJlIG5vdCBvbiBkaXNrLCBuYW1pbmcgdGhlIGhlYWRsZXNzIHJlbWVkaWVzLlxuICovXG5mdW5jdGlvbiBzZWVkUGx1Z2luKGRlbW9WYXVsdFBhdGg6IHN0cmluZywgcGx1Z2luOiBJbmplY3RQbHVnaW5QYXJhbXMsIG1hcDogUG9wdWxhdGVGaWxlc1BhcmFtcyk6IHZvaWQge1xuICBjb25zdCB7IGRhdGEsIHBsdWdpbklkIH0gPSBwbHVnaW47XG4gIGNvbnN0IHNvdXJjZURpcmVjdG9yeSA9IHJlc29sdmVJbmplY3RlZFBsdWdpblNvdXJjZURpcmVjdG9yeSh7IGRlbW9WYXVsdFBhdGgsIHBsdWdpbiB9KTtcbiAgY29uc3QgcGx1Z2luUHJlZml4ID0gYCR7T0JTSURJQU5fQ09ORklHX0RJUn0vJHtQTFVHSU5TX0RJUn0vJHtwbHVnaW5JZH1gO1xuXG4gIGNvbnN0IGZpbGVOYW1lcyA9IHJlYWRQbHVnaW5GaWxlTmFtZXMoc291cmNlRGlyZWN0b3J5KTtcblxuICBmb3IgKGNvbnN0IHJlcXVpcmVkRmlsZSBvZiBSRVFVSVJFRF9QTFVHSU5fQVNTRVRfTkFNRVMpIHtcbiAgICBpZiAoIWZpbGVOYW1lcy5pbmNsdWRlcyhyZXF1aXJlZEZpbGUpKSB7XG4gICAgICBjb25zdCByZW1lZHkgPSBidWlsZE1pc3NpbmdQbHVnaW5SZW1lZHkoZGVtb1ZhdWx0UGF0aCwgcGx1Z2luKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvbW11bml0eSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhlIGRlbW8gdmF1bHQgKCR7am9pbihzb3VyY2VEaXJlY3RvcnksIHJlcXVpcmVkRmlsZSl9IG1pc3NpbmcpLiAke3JlbWVkeX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzKSB7XG4gICAgLy8gYGRhdGEuanNvbmAgaXMgcmVnZW5lcmF0ZWQgZnJvbSBgZGF0YWAgYmVsb3cgKHdoZW4gcHJvdmlkZWQpOyBza2lwIHRoZSBvbi1kaXNrIGNvcHkgdG8gYXZvaWQgc2VlZGluZyBpdCB0d2ljZS5cbiAgICBpZiAoZmlsZU5hbWUgPT09IERBVEFfSlNPTiAmJiBkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtYXBbYCR7cGx1Z2luUHJlZml4fS8ke2ZpbGVOYW1lfWBdID0gcmVhZEZpbGVTeW5jKGpvaW4oc291cmNlRGlyZWN0b3J5LCBmaWxlTmFtZSkpO1xuICB9XG5cbiAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGRhdGFKc29uOiBzdHJpbmcgPSBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCBEQVRBX0pTT05fSU5ERU5UKSk7XG4gICAgbWFwW2Ake3BsdWdpblByZWZpeH0vJHtEQVRBX0pTT059YF0gPSBgJHtkYXRhSnNvbn1cXG5gO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBSXJCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMseUJBQXlCO0FBUWxDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sY0FBYztBQUNwQixNQUFNLFlBQVk7QUFDbEIsTUFBTSxtQkFBbUI7QUFFekIsTUFBTSxnQ0FBZ0MsQ0FBQyxZQUFZLG1CQUFtQixtQkFBbUI7QUFvSGxGLFNBQVMsdUJBQXVCLFFBQTJEO0FBQ2hHLFFBQU0sRUFBRSxlQUFlLGVBQWUsZ0JBQWdCLENBQUMsR0FBRyxzQkFBc0IsOEJBQThCLElBQUk7QUFFbEgsUUFBTSxNQUFNLGtCQUFrQixrQkFBa0IsU0FBWSxFQUFFLGNBQWMsSUFBSSxFQUFFLGVBQWUsY0FBYyxDQUFDO0FBRWhILGFBQVcsY0FBYyxxQkFBcUI7QUFDNUMsVUFBTSxhQUFhLEtBQUssZUFBZSxxQkFBcUIsVUFBVTtBQUN0RSxRQUFJLFdBQVcsVUFBVSxHQUFHO0FBQzFCLFVBQUksR0FBRyxtQkFBbUIsSUFBSSxVQUFVLEVBQUUsSUFBSSxhQUFhLFVBQVU7QUFBQSxJQUN2RTtBQUFBLEVBQ0Y7QUFFQSxhQUFXLFVBQVUsZUFBZTtBQUNsQyxlQUFXLGVBQWUsUUFBUSxHQUFHO0FBQUEsRUFDdkM7QUFFQSxTQUFPO0FBQ1Q7QUFTTyxTQUFTLHFDQUFxQyxRQUE0RDtBQUMvRyxRQUFNLEVBQUUsZUFBZSxPQUFPLElBQUk7QUFDbEMsU0FBTyxPQUFPLG1CQUFtQixLQUFLLGVBQWUscUJBQXFCLGFBQWEsT0FBTyxRQUFRO0FBQ3hHO0FBY08sU0FBUyw4QkFBOEIsUUFBbUU7QUFDL0csUUFBTSxFQUFFLGNBQWMsSUFBSTtBQUMxQixTQUFPLE9BQU8sY0FBYyxPQUFPLENBQUMsV0FBVztBQUM3QyxRQUFJLE9BQU8sb0JBQW9CLFFBQVc7QUFDeEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFlBQVksb0JBQW9CLHFDQUFxQyxFQUFFLGVBQWUsT0FBTyxDQUFDLENBQUM7QUFDckcsV0FBTyw0QkFBNEIsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLFNBQVMsU0FBUyxDQUFDO0FBQUEsRUFDdkYsQ0FBQztBQUNIO0FBWUEsU0FBUyx5QkFBeUIsZUFBdUIsUUFBb0M7QUFDM0YsTUFBSSxPQUFPLG9CQUFvQixRQUFXO0FBQ3hDLFdBQU87QUFBQSxFQUVUO0FBRUEsU0FBTyxvR0FBb0csYUFBYTtBQUcxSDtBQVFBLFNBQVMsb0JBQW9CLGlCQUFtQztBQUM5RCxTQUFPLFdBQVcsZUFBZSxJQUM3QixZQUFZLGlCQUFpQixFQUFFLGVBQWUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFVBQVUsTUFBTSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxNQUFNLElBQUksSUFDakgsQ0FBQztBQUNQO0FBVUEsU0FBUyxXQUFXLGVBQXVCLFFBQTRCLEtBQWdDO0FBQ3JHLFFBQU0sRUFBRSxNQUFNLFNBQVMsSUFBSTtBQUMzQixRQUFNLGtCQUFrQixxQ0FBcUMsRUFBRSxlQUFlLE9BQU8sQ0FBQztBQUN0RixRQUFNLGVBQWUsR0FBRyxtQkFBbUIsSUFBSSxXQUFXLElBQUksUUFBUTtBQUV0RSxRQUFNLFlBQVksb0JBQW9CLGVBQWU7QUFFckQsYUFBVyxnQkFBZ0IsNkJBQTZCO0FBQ3RELFFBQUksQ0FBQyxVQUFVLFNBQVMsWUFBWSxHQUFHO0FBQ3JDLFlBQU0sU0FBUyx5QkFBeUIsZUFBZSxNQUFNO0FBQzdELFlBQU0sSUFBSTtBQUFBLFFBQ1IscUJBQXFCLFFBQVEseUNBQXlDLEtBQUssaUJBQWlCLFlBQVksQ0FBQyxjQUFjLE1BQU07QUFBQSxNQUMvSDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsYUFBVyxZQUFZLFdBQVc7QUFFaEMsUUFBSSxhQUFhLGFBQWEsU0FBUyxRQUFXO0FBQ2hEO0FBQUEsSUFDRjtBQUNBLFFBQUksR0FBRyxZQUFZLElBQUksUUFBUSxFQUFFLElBQUksYUFBYSxLQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUNuRjtBQUVBLE1BQUksU0FBUyxRQUFXO0FBQ3RCLFVBQU0sV0FBbUIsa0JBQWtCLEtBQUssVUFBVSxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkYsUUFBSSxHQUFHLFlBQVksSUFBSSxTQUFTLEVBQUUsSUFBSSxHQUFHLFFBQVE7QUFBQTtBQUFBLEVBQ25EO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -1,24 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file
|
|
3
3
|
*
|
|
4
|
-
* Pure helpers for deciding when a freshly-booted Android emulator is
|
|
5
|
-
* enough to establish an Appium session, plus resolving the
|
|
6
|
-
* from the transport options. Kept separate from the integration-only
|
|
4
|
+
* Pure helpers for deciding when a freshly-booted Android emulator is ready
|
|
5
|
+
* enough to establish an Appium session, plus resolving the two readiness-wait
|
|
6
|
+
* timeouts from the transport options. Kept separate from the integration-only
|
|
7
7
|
* `transport-factory` so the parsing and default resolution stay unit-testable
|
|
8
8
|
* (the factory itself needs a real emulator and is excluded from unit tests).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
10
|
+
* Readiness is two independent questions, waited on in two phases:
|
|
11
|
+
*
|
|
12
|
+
* 1. **Is the guest idle?** `sys.boot_completed` fires *before* it is: package
|
|
13
|
+
* optimization (`dex2oat`) and system services keep churning after it, so a
|
|
14
|
+
* session established the instant it fires makes every one of UiAutomator2's
|
|
15
|
+
* serialized `adb` round-trips contend with that work and inflate ~3x. Gating
|
|
16
|
+
* the session on a later, quieter signal (the boot animation has stopped and
|
|
17
|
+
* the package manager is serving) lets it run against an idle guest instead.
|
|
18
|
+
* 2. **Does the guest have a network?** Both idle signals are true well *before*
|
|
19
|
+
* the default network is created and validated — that lands ~80s into guest
|
|
20
|
+
* uptime, tens of seconds after the idle gate clears — and neither says
|
|
21
|
+
* anything about connectivity, so an idle-only gate hands the suite a device
|
|
22
|
+
* with no route. See {@link checkNetworkValidated} for the measurement and
|
|
23
|
+
* for why the three obvious connectivity probes are all wrong here.
|
|
16
24
|
*/
|
|
17
25
|
import type { ObsidianAndroidAppiumTransportOptions } from './transport-options.mjs';
|
|
18
26
|
/**
|
|
19
27
|
* Default for {@link ObsidianAndroidAppiumTransportOptions.deviceIdleTimeoutInMilliseconds}.
|
|
20
28
|
*/
|
|
21
29
|
export declare const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 60000;
|
|
30
|
+
/**
|
|
31
|
+
* Default for {@link ObsidianAndroidAppiumTransportOptions.networkReadyTimeoutInMilliseconds}.
|
|
32
|
+
*
|
|
33
|
+
* The budget starts *after* `sys.boot_completed`, where the measured wait on a
|
|
34
|
+
* cold WHPX emulator is ~30s (validation at ~80s from boot, against a boot flag
|
|
35
|
+
* at ~56s). The default is headroom for the starved/CI regime the other Android
|
|
36
|
+
* budgets are already sized for, not the expected cost.
|
|
37
|
+
*/
|
|
38
|
+
export declare const DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS = 120000;
|
|
22
39
|
/**
|
|
23
40
|
* Parameters for {@link checkDeviceIdle}.
|
|
24
41
|
*/
|
|
@@ -32,6 +49,15 @@ export interface CheckDeviceIdleParams {
|
|
|
32
49
|
*/
|
|
33
50
|
readonly packageListOutput: string;
|
|
34
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Parameters for {@link checkNetworkValidated}.
|
|
54
|
+
*/
|
|
55
|
+
export interface CheckNetworkValidatedParams {
|
|
56
|
+
/**
|
|
57
|
+
Raw stdout of `adb shell dumpsys connectivity`.
|
|
58
|
+
*/
|
|
59
|
+
readonly connectivityOutput: string;
|
|
60
|
+
}
|
|
35
61
|
/**
|
|
36
62
|
* Decides whether a booted emulator is idle enough to start an Appium session,
|
|
37
63
|
* from the raw output of the two probe commands.
|
|
@@ -45,6 +71,42 @@ export interface CheckDeviceIdleParams {
|
|
|
45
71
|
* @returns `true` when the guest is idle enough to proceed.
|
|
46
72
|
*/
|
|
47
73
|
export declare function checkDeviceIdle(params: CheckDeviceIdleParams): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Decides whether a booted emulator has a working network, from the raw output
|
|
76
|
+
* of `adb shell dumpsys connectivity`.
|
|
77
|
+
*
|
|
78
|
+
* Ready means the dump names an **active default network** *and* that network's
|
|
79
|
+
* own agent info reports validation — either an `IS_VALIDATED` score policy or a
|
|
80
|
+
* non-zero `firstValidated` timestamp. Both are required: a default network
|
|
81
|
+
* exists for seconds before it validates, and during that window it carries no
|
|
82
|
+
* usable route.
|
|
83
|
+
*
|
|
84
|
+
* Why this matters at all: the two {@link checkDeviceIdle} signals are satisfied
|
|
85
|
+
* well before this one. Validation lands ~70-80s into guest uptime — measured on
|
|
86
|
+
* `obsidian_test`, `created 70635 firstValidated 72681`, and on a cold boot of
|
|
87
|
+
* `obsidian_screenshots`, `created 66870 firstValidated 79870`, which at 85s
|
|
88
|
+
* uptime still scored `EVER_EVALUATED&IS_UNMETERED` with no `IS_VALIDATED` and
|
|
89
|
+
* no `firstValidated` field at all. Against a boot flag at ~56s that leaves a
|
|
90
|
+
* gap of tens of seconds on a fast host, and more on a slow one. A suite started
|
|
91
|
+
* in that gap does not merely run slowly: a test that reaches the network runs
|
|
92
|
+
* to completion against a silently empty result, which no assertion inside the
|
|
93
|
+
* suite can tell apart from a genuinely empty feed.
|
|
94
|
+
*
|
|
95
|
+
* `dumpsys connectivity` is the honest source, and the three probes that look
|
|
96
|
+
* like better ones are all wrong — each of them misled a full day of
|
|
97
|
+
* investigation before this was understood:
|
|
98
|
+
*
|
|
99
|
+
* - `ip route` shows **no** default route on a healthy device: Android uses
|
|
100
|
+
* per-network policy routing, and the route lives in table 1015, not `main`.
|
|
101
|
+
* - `ping` fails on a healthy device: QEMU user-mode NAT does not forward ICMP
|
|
102
|
+
* on Windows hosts.
|
|
103
|
+
* - `getprop net.dns1` is empty on every modern Android: DNS went per-network
|
|
104
|
+
* in 8/9.
|
|
105
|
+
*
|
|
106
|
+
* @param params - The sampled probe output.
|
|
107
|
+
* @returns `true` when the guest has a validated default network.
|
|
108
|
+
*/
|
|
109
|
+
export declare function checkNetworkValidated(params: CheckNetworkValidatedParams): boolean;
|
|
48
110
|
/**
|
|
49
111
|
* Resolves the post-boot device-idle wait timeout, applying the default when
|
|
50
112
|
* the option is omitted.
|
|
@@ -57,3 +119,15 @@ export declare function checkDeviceIdle(params: CheckDeviceIdleParams): boolean;
|
|
|
57
119
|
* @returns The timeout in milliseconds.
|
|
58
120
|
*/
|
|
59
121
|
export declare function resolveDeviceIdleTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
|
|
122
|
+
/**
|
|
123
|
+
* Resolves the network-ready wait timeout, applying the default when the option
|
|
124
|
+
* is omitted.
|
|
125
|
+
*
|
|
126
|
+
* This bounds how long the factory waits, after the idle gate, for the guest to
|
|
127
|
+
* report a validated default network (see {@link checkNetworkValidated}) before
|
|
128
|
+
* establishing the session. A value of `0` skips the wait entirely.
|
|
129
|
+
*
|
|
130
|
+
* @param options - The Android Appium transport options.
|
|
131
|
+
* @returns The timeout in milliseconds.
|
|
132
|
+
*/
|
|
133
|
+
export declare function resolveNetworkReadyTimeoutInMilliseconds(options: ObsidianAndroidAppiumTransportOptions): number;
|
|
@@ -1,17 +1,49 @@
|
|
|
1
|
+
const ACTIVE_DEFAULT_NETWORK_PATTERN = /^\s*Active default network:\s*(?<networkId>\S+)/m;
|
|
1
2
|
const BOOT_ANIMATION_STOPPED_STATE = "stopped";
|
|
3
|
+
const FIRST_VALIDATED_PATTERN = /\bfirstValidated\s+(?<timestamp>\d+)/;
|
|
4
|
+
const NETWORK_AGENT_INFO_MARKER = "NetworkAgentInfo{";
|
|
5
|
+
const NETWORK_ID_PATTERN = /^\d+$/;
|
|
2
6
|
const PACKAGE_LINE_PREFIX = "package:";
|
|
7
|
+
const VALIDATED_SCORE_POLICY = "IS_VALIDATED";
|
|
3
8
|
const DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS = 6e4;
|
|
9
|
+
const DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS = 12e4;
|
|
4
10
|
function checkDeviceIdle(params) {
|
|
5
11
|
const isBootAnimationStopped = params.bootAnimationProperty.trim() === BOOT_ANIMATION_STOPPED_STATE;
|
|
6
12
|
const isPackageManagerReady = params.packageListOutput.split("\n").some((line) => line.trimStart().startsWith(PACKAGE_LINE_PREFIX));
|
|
7
13
|
return isBootAnimationStopped && isPackageManagerReady;
|
|
8
14
|
}
|
|
15
|
+
function checkNetworkValidated(params) {
|
|
16
|
+
const activeNetworkId = ACTIVE_DEFAULT_NETWORK_PATTERN.exec(params.connectivityOutput)?.groups?.["networkId"] ?? "";
|
|
17
|
+
if (!NETWORK_ID_PATTERN.test(activeNetworkId)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const agentInfo = extractNetworkAgentInfo(params.connectivityOutput, activeNetworkId);
|
|
21
|
+
if (agentInfo.includes(VALIDATED_SCORE_POLICY)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
const firstValidatedTimestamp = Number(FIRST_VALIDATED_PATTERN.exec(agentInfo)?.groups?.["timestamp"] ?? "0");
|
|
25
|
+
return firstValidatedTimestamp > 0;
|
|
26
|
+
}
|
|
9
27
|
function resolveDeviceIdleTimeoutInMilliseconds(options) {
|
|
10
28
|
return options.deviceIdleTimeoutInMilliseconds ?? DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS;
|
|
11
29
|
}
|
|
30
|
+
function resolveNetworkReadyTimeoutInMilliseconds(options) {
|
|
31
|
+
return options.networkReadyTimeoutInMilliseconds ?? DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS;
|
|
32
|
+
}
|
|
33
|
+
function extractNetworkAgentInfo(connectivityOutput, networkId) {
|
|
34
|
+
const startIndex = connectivityOutput.indexOf(`${NETWORK_AGENT_INFO_MARKER}network{${networkId}}`);
|
|
35
|
+
if (startIndex === -1) {
|
|
36
|
+
return "";
|
|
37
|
+
}
|
|
38
|
+
const lineEndIndex = connectivityOutput.indexOf("\n", startIndex);
|
|
39
|
+
return lineEndIndex === -1 ? connectivityOutput.slice(startIndex) : connectivityOutput.slice(startIndex, lineEndIndex);
|
|
40
|
+
}
|
|
12
41
|
export {
|
|
13
42
|
DEFAULT_DEVICE_IDLE_TIMEOUT_IN_MILLISECONDS,
|
|
43
|
+
DEFAULT_NETWORK_READY_TIMEOUT_IN_MILLISECONDS,
|
|
14
44
|
checkDeviceIdle,
|
|
15
|
-
|
|
45
|
+
checkNetworkValidated,
|
|
46
|
+
resolveDeviceIdleTimeoutInMilliseconds,
|
|
47
|
+
resolveNetworkReadyTimeoutInMilliseconds
|
|
16
48
|
};
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1yZWFkaW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZW4gYSBmcmVzaGx5LWJvb3RlZCBBbmRyb2lkIGVtdWxhdG9yIGlzIGlkbGVcbiAqIGVub3VnaCB0byBlc3RhYmxpc2ggYW4gQXBwaXVtIHNlc3Npb24sIHBsdXMgcmVzb2x2aW5nIHRoZSBpZGxlLXdhaXQgdGltZW91dFxuICogZnJvbSB0aGUgdHJhbnNwb3J0IG9wdGlvbnMuIEtlcHQgc2VwYXJhdGUgZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seVxuICogYHRyYW5zcG9ydC1mYWN0b3J5YCBzbyB0aGUgcGFyc2luZyBhbmQgZGVmYXVsdCByZXNvbHV0aW9uIHN0YXkgdW5pdC10ZXN0YWJsZVxuICogKHRoZSBmYWN0b3J5IGl0c2VsZiBuZWVkcyBhIHJlYWwgZW11bGF0b3IgYW5kIGlzIGV4Y2x1ZGVkIGZyb20gdW5pdCB0ZXN0cykuXG4gKlxuICogYHN5cy5ib290X2NvbXBsZXRlZGAgZmlyZXMgKmJlZm9yZSogdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGU6IHBhY2thZ2VcbiAqIG9wdGltaXphdGlvbiAoYGRleDJvYXRgKSBhbmQgc3lzdGVtIHNlcnZpY2VzIGtlZXAgY2h1cm5pbmcgYWZ0ZXIgaXQsIHNvIGFcbiAqIHNlc3Npb24gZXN0YWJsaXNoZWQgdGhlIGluc3RhbnQgaXQgZmlyZXMgbWFrZXMgZXZlcnkgb25lIG9mIFVpQXV0b21hdG9yMidzXG4gKiBzZXJpYWxpemVkIGBhZGJgIHJvdW5kLXRyaXBzIGNvbnRlbmQgd2l0aCB0aGF0IHdvcmsgYW5kIGluZmxhdGUgfjN4LiBHYXRpbmdcbiAqIHRoZSBzZXNzaW9uIG9uIGEgbGF0ZXIsIHF1aWV0ZXIgc2lnbmFsICh0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgYW5kXG4gKiB0aGUgcGFja2FnZSBtYW5hZ2VyIGlzIHNlcnZpbmcpIGxldHMgaXQgcnVuIGFnYWluc3QgYW4gaWRsZSBndWVzdCBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuY29uc3QgQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURSA9ICdzdG9wcGVkJztcbmNvbnN0IFBBQ0tBR0VfTElORV9QUkVGSVggPSAncGFja2FnZTonO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tEZXZpY2VJZGxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0RldmljZUlkbGVQYXJhbXMge1xuICAvKipcbiAgUmF3IHN0ZG91dCBvZiBgYWRiIHNoZWxsIGdldHByb3AgaW5pdC5zdmMuYm9vdGFuaW1gLlxuICAgKi9cbiAgcmVhZG9ubHkgYm9vdEFuaW1hdGlvblByb3BlcnR5OiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBjbWQgcGFja2FnZSBsaXN0IHBhY2thZ2VzYC5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VMaXN0T3V0cHV0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGlzIGlkbGUgZW5vdWdoIHRvIHN0YXJ0IGFuIEFwcGl1bSBzZXNzaW9uLFxuICogZnJvbSB0aGUgcmF3IG91dHB1dCBvZiB0aGUgdHdvIHByb2JlIGNvbW1hbmRzLlxuICpcbiAqIFRoZSBndWVzdCBpcyBjb25zaWRlcmVkIGlkbGUgb25jZSB0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgKiphbmQqKiB0aGVcbiAqIHBhY2thZ2UgbWFuYWdlciBpcyBzZXJ2aW5nIChpdCBsaXN0cyBhdCBsZWFzdCBvbmUgcGFja2FnZSkuIEJvdGggYXJlIGJpbmFyeSxcbiAqIGxhdGVyLXRoYW4tYHN5cy5ib290X2NvbXBsZXRlZGAgc2lnbmFscywgc28gdGhpcyByZXR1cm5zIGB0cnVlYCB3ZWxsIGFmdGVyIHRoZVxuICogcHJlbWF0dXJlIGJvb3QtY29tcGxldGVkIGZsYWcgYnV0IHdpdGhvdXQgYW55IGxhdGVuY3kgdGhyZXNob2xkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbXBsZWQgcHJvYmUgb3V0cHV0cy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBndWVzdCBpcyBpZGxlIGVub3VnaCB0byBwcm9jZWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEZXZpY2VJZGxlKHBhcmFtczogQ2hlY2tEZXZpY2VJZGxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzQm9vdEFuaW1hdGlvblN0b3BwZWQgPSBwYXJhbXMuYm9vdEFuaW1hdGlvblByb3BlcnR5LnRyaW0oKSA9PT0gQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURTtcbiAgY29uc3QgaXNQYWNrYWdlTWFuYWdlclJlYWR5ID0gcGFyYW1zLnBhY2thZ2VMaXN0T3V0cHV0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoUEFDS0FHRV9MSU5FX1BSRUZJWCkpO1xuICByZXR1cm4gaXNCb290QW5pbWF0aW9uU3RvcHBlZCAmJiBpc1BhY2thZ2VNYW5hZ2VyUmVhZHk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHBvc3QtYm9vdCBkZXZpY2UtaWRsZSB3YWl0IHRpbWVvdXQsIGFwcGx5aW5nIHRoZSBkZWZhdWx0IHdoZW5cbiAqIHRoZSBvcHRpb24gaXMgb21pdHRlZC5cbiAqXG4gKiBUaGlzIGJvdW5kcyBob3cgbG9uZyB0aGUgZmFjdG9yeSB3YWl0cyBmb3IgYSBmcmVzaGx5LXN0YXJ0ZWQgZW11bGF0b3IgdG9cbiAqIGJlY29tZSBpZGxlIChzZWUge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGJlZm9yZSBlc3RhYmxpc2hpbmcgdGhlIHNlc3Npb24uIEFcbiAqIHZhbHVlIG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKFxuICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4pOiBudW1iZXIge1xuICByZXR1cm4gb3B0aW9ucy5kZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVWSUNFX0lETEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkEsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxzQkFBc0I7QUFLckIsTUFBTSw4Q0FBOEM7QUE2QnBELFNBQVMsZ0JBQWdCLFFBQXdDO0FBQ3RFLFFBQU0seUJBQXlCLE9BQU8sc0JBQXNCLEtBQUssTUFBTTtBQUN2RSxRQUFNLHdCQUF3QixPQUFPLGtCQUNsQyxNQUFNLElBQUksRUFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxXQUFXLG1CQUFtQixDQUFDO0FBQ2xFLFNBQU8sMEJBQTBCO0FBQ25DO0FBYU8sU0FBUyx1Q0FDZCxTQUNRO0FBQ1IsU0FBTyxRQUFRLG1DQUFtQztBQUNwRDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RldmljZS1yZWFkaW5lc3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGRlY2lkaW5nIHdoZW4gYSBmcmVzaGx5LWJvb3RlZCBBbmRyb2lkIGVtdWxhdG9yIGlzIHJlYWR5XG4gKiBlbm91Z2ggdG8gZXN0YWJsaXNoIGFuIEFwcGl1bSBzZXNzaW9uLCBwbHVzIHJlc29sdmluZyB0aGUgdHdvIHJlYWRpbmVzcy13YWl0XG4gKiB0aW1lb3V0cyBmcm9tIHRoZSB0cmFuc3BvcnQgb3B0aW9ucy4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBpbnRlZ3JhdGlvbi1vbmx5XG4gKiBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCBkZWZhdWx0IHJlc29sdXRpb24gc3RheSB1bml0LXRlc3RhYmxlXG4gKiAodGhlIGZhY3RvcnkgaXRzZWxmIG5lZWRzIGEgcmVhbCBlbXVsYXRvciBhbmQgaXMgZXhjbHVkZWQgZnJvbSB1bml0IHRlc3RzKS5cbiAqXG4gKiBSZWFkaW5lc3MgaXMgdHdvIGluZGVwZW5kZW50IHF1ZXN0aW9ucywgd2FpdGVkIG9uIGluIHR3byBwaGFzZXM6XG4gKlxuICogMS4gKipJcyB0aGUgZ3Vlc3QgaWRsZT8qKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyAqYmVmb3JlKiBpdCBpczogcGFja2FnZVxuICogICAgb3B0aW1pemF0aW9uIChgZGV4Mm9hdGApIGFuZCBzeXN0ZW0gc2VydmljZXMga2VlcCBjaHVybmluZyBhZnRlciBpdCwgc28gYVxuICogICAgc2Vzc2lvbiBlc3RhYmxpc2hlZCB0aGUgaW5zdGFudCBpdCBmaXJlcyBtYWtlcyBldmVyeSBvbmUgb2YgVWlBdXRvbWF0b3IyJ3NcbiAqICAgIHNlcmlhbGl6ZWQgYGFkYmAgcm91bmQtdHJpcHMgY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZSB+M3guIEdhdGluZ1xuICogICAgdGhlIHNlc3Npb24gb24gYSBsYXRlciwgcXVpZXRlciBzaWduYWwgKHRoZSBib290IGFuaW1hdGlvbiBoYXMgc3RvcHBlZCBhbmRcbiAqICAgIHRoZSBwYWNrYWdlIG1hbmFnZXIgaXMgc2VydmluZykgbGV0cyBpdCBydW4gYWdhaW5zdCBhbiBpZGxlIGd1ZXN0IGluc3RlYWQuXG4gKiAyLiAqKkRvZXMgdGhlIGd1ZXN0IGhhdmUgYSBuZXR3b3JrPyoqIEJvdGggaWRsZSBzaWduYWxzIGFyZSB0cnVlIHdlbGwgKmJlZm9yZSpcbiAqICAgIHRoZSBkZWZhdWx0IG5ldHdvcmsgaXMgY3JlYXRlZCBhbmQgdmFsaWRhdGVkIFx1MjAxNCB0aGF0IGxhbmRzIH44MHMgaW50byBndWVzdFxuICogICAgdXB0aW1lLCB0ZW5zIG9mIHNlY29uZHMgYWZ0ZXIgdGhlIGlkbGUgZ2F0ZSBjbGVhcnMgXHUyMDE0IGFuZCBuZWl0aGVyIHNheXNcbiAqICAgIGFueXRoaW5nIGFib3V0IGNvbm5lY3Rpdml0eSwgc28gYW4gaWRsZS1vbmx5IGdhdGUgaGFuZHMgdGhlIHN1aXRlIGEgZGV2aWNlXG4gKiAgICB3aXRoIG5vIHJvdXRlLiBTZWUge0BsaW5rIGNoZWNrTmV0d29ya1ZhbGlkYXRlZH0gZm9yIHRoZSBtZWFzdXJlbWVudCBhbmRcbiAqICAgIGZvciB3aHkgdGhlIHRocmVlIG9idmlvdXMgY29ubmVjdGl2aXR5IHByb2JlcyBhcmUgYWxsIHdyb25nIGhlcmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuXG5jb25zdCBBQ1RJVkVfREVGQVVMVF9ORVRXT1JLX1BBVFRFUk4gPSAvXlxccypBY3RpdmUgZGVmYXVsdCBuZXR3b3JrOlxccyooPzxuZXR3b3JrSWQ+XFxTKykvbTtcbmNvbnN0IEJPT1RfQU5JTUFUSU9OX1NUT1BQRURfU1RBVEUgPSAnc3RvcHBlZCc7XG5jb25zdCBGSVJTVF9WQUxJREFURURfUEFUVEVSTiA9IC9cXGJmaXJzdFZhbGlkYXRlZFxccysoPzx0aW1lc3RhbXA+XFxkKykvO1xuY29uc3QgTkVUV09SS19BR0VOVF9JTkZPX01BUktFUiA9ICdOZXR3b3JrQWdlbnRJbmZveyc7XG5jb25zdCBORVRXT1JLX0lEX1BBVFRFUk4gPSAvXlxcZCskLztcbmNvbnN0IFBBQ0tBR0VfTElORV9QUkVGSVggPSAncGFja2FnZTonO1xuY29uc3QgVkFMSURBVEVEX1NDT1JFX1BPTElDWSA9ICdJU19WQUxJREFURUQnO1xuXG4vKipcbiAqIERlZmF1bHQgZm9yIHtAbGluayBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLmRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ERVZJQ0VfSURMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IGZvciB7QGxpbmsgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5uZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9LlxuICpcbiAqIFRoZSBidWRnZXQgc3RhcnRzICphZnRlciogYHN5cy5ib290X2NvbXBsZXRlZGAsIHdoZXJlIHRoZSBtZWFzdXJlZCB3YWl0IG9uIGFcbiAqIGNvbGQgV0hQWCBlbXVsYXRvciBpcyB+MzBzICh2YWxpZGF0aW9uIGF0IH44MHMgZnJvbSBib290LCBhZ2FpbnN0IGEgYm9vdCBmbGFnXG4gKiBhdCB+NTZzKS4gVGhlIGRlZmF1bHQgaXMgaGVhZHJvb20gZm9yIHRoZSBzdGFydmVkL0NJIHJlZ2ltZSB0aGUgb3RoZXIgQW5kcm9pZFxuICogYnVkZ2V0cyBhcmUgYWxyZWFkeSBzaXplZCBmb3IsIG5vdCB0aGUgZXhwZWN0ZWQgY29zdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTkVUV09SS19SRUFEWV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tEZXZpY2VJZGxlUGFyYW1zIHtcbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgYGFkYiBzaGVsbCBnZXRwcm9wIGluaXQuc3ZjLmJvb3RhbmltYC5cbiAgICovXG4gIHJlYWRvbmx5IGJvb3RBbmltYXRpb25Qcm9wZXJ0eTogc3RyaW5nO1xuXG4gIC8qKlxuICBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgY21kIHBhY2thZ2UgbGlzdCBwYWNrYWdlc2AuXG4gICAqL1xuICByZWFkb25seSBwYWNrYWdlTGlzdE91dHB1dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja05ldHdvcmtWYWxpZGF0ZWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrTmV0d29ya1ZhbGlkYXRlZFBhcmFtcyB7XG4gIC8qKlxuICBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBjb25uZWN0aXZpdHlgLlxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGl2aXR5T3V0cHV0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGlzIGlkbGUgZW5vdWdoIHRvIHN0YXJ0IGFuIEFwcGl1bSBzZXNzaW9uLFxuICogZnJvbSB0aGUgcmF3IG91dHB1dCBvZiB0aGUgdHdvIHByb2JlIGNvbW1hbmRzLlxuICpcbiAqIFRoZSBndWVzdCBpcyBjb25zaWRlcmVkIGlkbGUgb25jZSB0aGUgYm9vdCBhbmltYXRpb24gaGFzIHN0b3BwZWQgKiphbmQqKiB0aGVcbiAqIHBhY2thZ2UgbWFuYWdlciBpcyBzZXJ2aW5nIChpdCBsaXN0cyBhdCBsZWFzdCBvbmUgcGFja2FnZSkuIEJvdGggYXJlIGJpbmFyeSxcbiAqIGxhdGVyLXRoYW4tYHN5cy5ib290X2NvbXBsZXRlZGAgc2lnbmFscywgc28gdGhpcyByZXR1cm5zIGB0cnVlYCB3ZWxsIGFmdGVyIHRoZVxuICogcHJlbWF0dXJlIGJvb3QtY29tcGxldGVkIGZsYWcgYnV0IHdpdGhvdXQgYW55IGxhdGVuY3kgdGhyZXNob2xkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNhbXBsZWQgcHJvYmUgb3V0cHV0cy5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBndWVzdCBpcyBpZGxlIGVub3VnaCB0byBwcm9jZWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tEZXZpY2VJZGxlKHBhcmFtczogQ2hlY2tEZXZpY2VJZGxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzQm9vdEFuaW1hdGlvblN0b3BwZWQgPSBwYXJhbXMuYm9vdEFuaW1hdGlvblByb3BlcnR5LnRyaW0oKSA9PT0gQk9PVF9BTklNQVRJT05fU1RPUFBFRF9TVEFURTtcbiAgY29uc3QgaXNQYWNrYWdlTWFuYWdlclJlYWR5ID0gcGFyYW1zLnBhY2thZ2VMaXN0T3V0cHV0XG4gICAgLnNwbGl0KCdcXG4nKVxuICAgIC5zb21lKChsaW5lKSA9PiBsaW5lLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoUEFDS0FHRV9MSU5FX1BSRUZJWCkpO1xuICByZXR1cm4gaXNCb290QW5pbWF0aW9uU3RvcHBlZCAmJiBpc1BhY2thZ2VNYW5hZ2VyUmVhZHk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgYm9vdGVkIGVtdWxhdG9yIGhhcyBhIHdvcmtpbmcgbmV0d29yaywgZnJvbSB0aGUgcmF3IG91dHB1dFxuICogb2YgYGFkYiBzaGVsbCBkdW1wc3lzIGNvbm5lY3Rpdml0eWAuXG4gKlxuICogUmVhZHkgbWVhbnMgdGhlIGR1bXAgbmFtZXMgYW4gKiphY3RpdmUgZGVmYXVsdCBuZXR3b3JrKiogKmFuZCogdGhhdCBuZXR3b3JrJ3NcbiAqIG93biBhZ2VudCBpbmZvIHJlcG9ydHMgdmFsaWRhdGlvbiBcdTIwMTQgZWl0aGVyIGFuIGBJU19WQUxJREFURURgIHNjb3JlIHBvbGljeSBvciBhXG4gKiBub24temVybyBgZmlyc3RWYWxpZGF0ZWRgIHRpbWVzdGFtcC4gQm90aCBhcmUgcmVxdWlyZWQ6IGEgZGVmYXVsdCBuZXR3b3JrXG4gKiBleGlzdHMgZm9yIHNlY29uZHMgYmVmb3JlIGl0IHZhbGlkYXRlcywgYW5kIGR1cmluZyB0aGF0IHdpbmRvdyBpdCBjYXJyaWVzIG5vXG4gKiB1c2FibGUgcm91dGUuXG4gKlxuICogV2h5IHRoaXMgbWF0dGVycyBhdCBhbGw6IHRoZSB0d28ge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0gc2lnbmFscyBhcmUgc2F0aXNmaWVkXG4gKiB3ZWxsIGJlZm9yZSB0aGlzIG9uZS4gVmFsaWRhdGlvbiBsYW5kcyB+NzAtODBzIGludG8gZ3Vlc3QgdXB0aW1lIFx1MjAxNCBtZWFzdXJlZCBvblxuICogYG9ic2lkaWFuX3Rlc3RgLCBgY3JlYXRlZCA3MDYzNSBmaXJzdFZhbGlkYXRlZCA3MjY4MWAsIGFuZCBvbiBhIGNvbGQgYm9vdCBvZlxuICogYG9ic2lkaWFuX3NjcmVlbnNob3RzYCwgYGNyZWF0ZWQgNjY4NzAgZmlyc3RWYWxpZGF0ZWQgNzk4NzBgLCB3aGljaCBhdCA4NXNcbiAqIHVwdGltZSBzdGlsbCBzY29yZWQgYEVWRVJfRVZBTFVBVEVEJklTX1VOTUVURVJFRGAgd2l0aCBubyBgSVNfVkFMSURBVEVEYCBhbmRcbiAqIG5vIGBmaXJzdFZhbGlkYXRlZGAgZmllbGQgYXQgYWxsLiBBZ2FpbnN0IGEgYm9vdCBmbGFnIGF0IH41NnMgdGhhdCBsZWF2ZXMgYVxuICogZ2FwIG9mIHRlbnMgb2Ygc2Vjb25kcyBvbiBhIGZhc3QgaG9zdCwgYW5kIG1vcmUgb24gYSBzbG93IG9uZS4gQSBzdWl0ZSBzdGFydGVkXG4gKiBpbiB0aGF0IGdhcCBkb2VzIG5vdCBtZXJlbHkgcnVuIHNsb3dseTogYSB0ZXN0IHRoYXQgcmVhY2hlcyB0aGUgbmV0d29yayBydW5zXG4gKiB0byBjb21wbGV0aW9uIGFnYWluc3QgYSBzaWxlbnRseSBlbXB0eSByZXN1bHQsIHdoaWNoIG5vIGFzc2VydGlvbiBpbnNpZGUgdGhlXG4gKiBzdWl0ZSBjYW4gdGVsbCBhcGFydCBmcm9tIGEgZ2VudWluZWx5IGVtcHR5IGZlZWQuXG4gKlxuICogYGR1bXBzeXMgY29ubmVjdGl2aXR5YCBpcyB0aGUgaG9uZXN0IHNvdXJjZSwgYW5kIHRoZSB0aHJlZSBwcm9iZXMgdGhhdCBsb29rXG4gKiBsaWtlIGJldHRlciBvbmVzIGFyZSBhbGwgd3JvbmcgXHUyMDE0IGVhY2ggb2YgdGhlbSBtaXNsZWQgYSBmdWxsIGRheSBvZlxuICogaW52ZXN0aWdhdGlvbiBiZWZvcmUgdGhpcyB3YXMgdW5kZXJzdG9vZDpcbiAqXG4gKiAtIGBpcCByb3V0ZWAgc2hvd3MgKipubyoqIGRlZmF1bHQgcm91dGUgb24gYSBoZWFsdGh5IGRldmljZTogQW5kcm9pZCB1c2VzXG4gKiAgIHBlci1uZXR3b3JrIHBvbGljeSByb3V0aW5nLCBhbmQgdGhlIHJvdXRlIGxpdmVzIGluIHRhYmxlIDEwMTUsIG5vdCBgbWFpbmAuXG4gKiAtIGBwaW5nYCBmYWlscyBvbiBhIGhlYWx0aHkgZGV2aWNlOiBRRU1VIHVzZXItbW9kZSBOQVQgZG9lcyBub3QgZm9yd2FyZCBJQ01QXG4gKiAgIG9uIFdpbmRvd3MgaG9zdHMuXG4gKiAtIGBnZXRwcm9wIG5ldC5kbnMxYCBpcyBlbXB0eSBvbiBldmVyeSBtb2Rlcm4gQW5kcm9pZDogRE5TIHdlbnQgcGVyLW5ldHdvcmtcbiAqICAgaW4gOC85LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2FtcGxlZCBwcm9iZSBvdXRwdXQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZ3Vlc3QgaGFzIGEgdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTmV0d29ya1ZhbGlkYXRlZChwYXJhbXM6IENoZWNrTmV0d29ya1ZhbGlkYXRlZFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCBhY3RpdmVOZXR3b3JrSWQgPSBBQ1RJVkVfREVGQVVMVF9ORVRXT1JLX1BBVFRFUk4uZXhlYyhwYXJhbXMuY29ubmVjdGl2aXR5T3V0cHV0KT8uZ3JvdXBzPy5bJ25ldHdvcmtJZCddID8/ICcnO1xuICBpZiAoIU5FVFdPUktfSURfUEFUVEVSTi50ZXN0KGFjdGl2ZU5ldHdvcmtJZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBhZ2VudEluZm8gPSBleHRyYWN0TmV0d29ya0FnZW50SW5mbyhwYXJhbXMuY29ubmVjdGl2aXR5T3V0cHV0LCBhY3RpdmVOZXR3b3JrSWQpO1xuICBpZiAoYWdlbnRJbmZvLmluY2x1ZGVzKFZBTElEQVRFRF9TQ09SRV9QT0xJQ1kpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBmaXJzdFZhbGlkYXRlZFRpbWVzdGFtcCA9IE51bWJlcihGSVJTVF9WQUxJREFURURfUEFUVEVSTi5leGVjKGFnZW50SW5mbyk/Lmdyb3Vwcz8uWyd0aW1lc3RhbXAnXSA/PyAnMCcpO1xuICByZXR1cm4gZmlyc3RWYWxpZGF0ZWRUaW1lc3RhbXAgPiAwO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwb3N0LWJvb3QgZGV2aWNlLWlkbGUgd2FpdCB0aW1lb3V0LCBhcHBseWluZyB0aGUgZGVmYXVsdCB3aGVuXG4gKiB0aGUgb3B0aW9uIGlzIG9taXR0ZWQuXG4gKlxuICogVGhpcyBib3VuZHMgaG93IGxvbmcgdGhlIGZhY3Rvcnkgd2FpdHMgZm9yIGEgZnJlc2hseS1zdGFydGVkIGVtdWxhdG9yIHRvXG4gKiBiZWNvbWUgaWRsZSAoc2VlIHtAbGluayBjaGVja0RldmljZUlkbGV9KSBiZWZvcmUgZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uLiBBXG4gKiB2YWx1ZSBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgQW5kcm9pZCBBcHBpdW0gdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyhcbiAgb3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9uc1xuKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnMuZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0RFVklDRV9JRExFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBuZXR3b3JrLXJlYWR5IHdhaXQgdGltZW91dCwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uXG4gKiBpcyBvbWl0dGVkLlxuICpcbiAqIFRoaXMgYm91bmRzIGhvdyBsb25nIHRoZSBmYWN0b3J5IHdhaXRzLCBhZnRlciB0aGUgaWRsZSBnYXRlLCBmb3IgdGhlIGd1ZXN0IHRvXG4gKiByZXBvcnQgYSB2YWxpZGF0ZWQgZGVmYXVsdCBuZXR3b3JrIChzZWUge0BsaW5rIGNoZWNrTmV0d29ya1ZhbGlkYXRlZH0pIGJlZm9yZVxuICogZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uLiBBIHZhbHVlIG9mIGAwYCBza2lwcyB0aGUgd2FpdCBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBBbmRyb2lkIEFwcGl1bSB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVOZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMoXG4gIG9wdGlvbnM6IE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnNcbik6IG51bWJlciB7XG4gIHJldHVybiBvcHRpb25zLm5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX05FVFdPUktfUkVBRFlfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBOZXR3b3JrQWdlbnRJbmZve1x1MjAyNn1gIGVudHJ5IGZvciBvbmUgbmV0d29yayBpZCBmcm9tIGFcbiAqIGNvbm5lY3Rpdml0eSBkdW1wLlxuICpcbiAqICoqQm91bmRlZCB0byB0aGUgZW50cnkncyBvd24gbGluZSwgYW5kIHRoYXQgYm91bmQgaXMgbG9hZC1iZWFyaW5nLioqIEEgcmVhbFxuICogZHVtcCBsaXN0cyB0aGUgYWN0aXZlIG5ldHdvcmsncyBhZ2VudCB1bmRlciBgQ3VycmVudCBOZXR3b3JrczpgIGFuZCB0aGVuLCBtdWNoXG4gKiBmdXJ0aGVyIGRvd24sIGEgYE5ldHdvcmtPZmZlcmAgcGVyIHByb3ZpZGVyIFx1MjAxNCBhbmQgdGhvc2Ugb2ZmZXJzIGNhcnJ5XG4gKiBgSVNfVkFMSURBVEVEYCBpbiB0aGVpciBzY29yZSBwb2xpY2llcyB3aGF0ZXZlciB0aGUgbGl2ZSBuZXR3b3JrIGlzIGRvaW5nLiBBXG4gKiBkdW1wIHNhbXBsZWQgaGVyZSB3aXRoIGFuIHVudmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayBoZWxkIHNldmVuIHN1Y2ggb2ZmZXJzLFxuICogc28gcmVhZGluZyBwYXN0IHRoZSBhZ2VudCdzIG93biBsaW5lIHJlcG9ydHMgKmV2ZXJ5KiBkdW1wIGFzIHZhbGlkYXRlZC4gT25lXG4gKiBlbnRyeSBpcyBvbmUgbGluZSBpbiB0aGUgb2JzZXJ2ZWQgb3V0cHV0OyBhbiBlbnRyeSB0aGF0IGV2ZXIgd3JhcHMgcmVhZHMgYXNcbiAqIG5vdC1yZWFkeSwgd2hpY2ggaXMgdGhlIHNhZmUgZGlyZWN0aW9uIHRvIGJlIHdyb25nIGluLlxuICpcbiAqIEBwYXJhbSBjb25uZWN0aXZpdHlPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBjb25uZWN0aXZpdHlgLlxuICogQHBhcmFtIG5ldHdvcmtJZCAtIFRoZSBuZXR3b3JrIGlkIHdob3NlIGVudHJ5IHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgZW50cnkncyBsaW5lLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgZHVtcCBoYXMgbm8gc3VjaCBlbnRyeS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE5ldHdvcmtBZ2VudEluZm8oY29ubmVjdGl2aXR5T3V0cHV0OiBzdHJpbmcsIG5ldHdvcmtJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RhcnRJbmRleCA9IGNvbm5lY3Rpdml0eU91dHB1dC5pbmRleE9mKGAke05FVFdPUktfQUdFTlRfSU5GT19NQVJLRVJ9bmV0d29ya3ske25ldHdvcmtJZH19YCk7XG4gIGlmIChzdGFydEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IGxpbmVFbmRJbmRleCA9IGNvbm5lY3Rpdml0eU91dHB1dC5pbmRleE9mKCdcXG4nLCBzdGFydEluZGV4KTtcbiAgcmV0dXJuIGxpbmVFbmRJbmRleCA9PT0gLTFcbiAgICA/IGNvbm5lY3Rpdml0eU91dHB1dC5zbGljZShzdGFydEluZGV4KVxuICAgIDogY29ubmVjdGl2aXR5T3V0cHV0LnNsaWNlKHN0YXJ0SW5kZXgsIGxpbmVFbmRJbmRleCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkEsTUFBTSxpQ0FBaUM7QUFDdkMsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSwwQkFBMEI7QUFDaEMsTUFBTSw0QkFBNEI7QUFDbEMsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSx5QkFBeUI7QUFLeEIsTUFBTSw4Q0FBOEM7QUFVcEQsTUFBTSxnREFBZ0Q7QUF1Q3RELFNBQVMsZ0JBQWdCLFFBQXdDO0FBQ3RFLFFBQU0seUJBQXlCLE9BQU8sc0JBQXNCLEtBQUssTUFBTTtBQUN2RSxRQUFNLHdCQUF3QixPQUFPLGtCQUNsQyxNQUFNLElBQUksRUFDVixLQUFLLENBQUMsU0FBUyxLQUFLLFVBQVUsRUFBRSxXQUFXLG1CQUFtQixDQUFDO0FBQ2xFLFNBQU8sMEJBQTBCO0FBQ25DO0FBcUNPLFNBQVMsc0JBQXNCLFFBQThDO0FBQ2xGLFFBQU0sa0JBQWtCLCtCQUErQixLQUFLLE9BQU8sa0JBQWtCLEdBQUcsU0FBUyxXQUFXLEtBQUs7QUFDakgsTUFBSSxDQUFDLG1CQUFtQixLQUFLLGVBQWUsR0FBRztBQUM3QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sWUFBWSx3QkFBd0IsT0FBTyxvQkFBb0IsZUFBZTtBQUNwRixNQUFJLFVBQVUsU0FBUyxzQkFBc0IsR0FBRztBQUM5QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sMEJBQTBCLE9BQU8sd0JBQXdCLEtBQUssU0FBUyxHQUFHLFNBQVMsV0FBVyxLQUFLLEdBQUc7QUFDNUcsU0FBTywwQkFBMEI7QUFDbkM7QUFhTyxTQUFTLHVDQUNkLFNBQ1E7QUFDUixTQUFPLFFBQVEsbUNBQW1DO0FBQ3BEO0FBYU8sU0FBUyx5Q0FDZCxTQUNRO0FBQ1IsU0FBTyxRQUFRLHFDQUFxQztBQUN0RDtBQW1CQSxTQUFTLHdCQUF3QixvQkFBNEIsV0FBMkI7QUFDdEYsUUFBTSxhQUFhLG1CQUFtQixRQUFRLEdBQUcseUJBQXlCLFdBQVcsU0FBUyxHQUFHO0FBQ2pHLE1BQUksZUFBZSxJQUFJO0FBQ3JCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxlQUFlLG1CQUFtQixRQUFRLE1BQU0sVUFBVTtBQUNoRSxTQUFPLGlCQUFpQixLQUNwQixtQkFBbUIsTUFBTSxVQUFVLElBQ25DLG1CQUFtQixNQUFNLFlBQVksWUFBWTtBQUN2RDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
* @file
|
|
3
3
|
*
|
|
4
4
|
* Builds the argument list for spawning the Android emulator.
|
|
5
|
+
*
|
|
6
|
+
* **The harness owns the snapshot it loads, or it loads none.** This file used
|
|
7
|
+
* to pass `-no-snapshot-save` alone — the one combination that is never
|
|
8
|
+
* correct. It never *writes* `default_boot`, yet every run *resumed* it, so the
|
|
9
|
+
* guest each run started from was state nothing had validated since whenever a
|
|
10
|
+
* human last saved it. Measured 2026-09-03, same AVD back to back:
|
|
11
|
+
*
|
|
12
|
+
* | Launch | Result |
|
|
13
|
+
* | --- | --- |
|
|
14
|
+
* | snapshot resumed (`-no-snapshot-save` alone) | guest dies ~90s in, every time |
|
|
15
|
+
* | `-no-snapshot-load` (cold) | booted in 50s, alive at 60/120/180/240s |
|
|
16
|
+
*
|
|
17
|
+
* A resumed snapshot rots silently, and the failure it eventually produces —
|
|
18
|
+
* a device that serves adb, accepts a session and then drops `offline` a
|
|
19
|
+
* half-minute later — is indistinguishable from a code regression. So the
|
|
20
|
+
* default is a full cold boot, and snapshot reuse is an explicit opt-in that
|
|
21
|
+
* takes **both** halves: load and save together, so the snapshot the next run
|
|
22
|
+
* resumes is one this run wrote.
|
|
5
23
|
*/
|
|
6
24
|
/**
|
|
7
25
|
* Parameters for {@link buildEmulatorArguments}.
|
|
@@ -16,6 +34,14 @@ export interface BuildEmulatorArgumentsParams {
|
|
|
16
34
|
* focus. Resolved from the `isEmulatorVisible` transport option.
|
|
17
35
|
*/
|
|
18
36
|
readonly isHidden: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Whether the emulator may resume — and refresh — the AVD's saved boot
|
|
39
|
+
* snapshot. Resolved from the `shouldReuseEmulatorSnapshot` transport option.
|
|
40
|
+
*
|
|
41
|
+
* `false` (the default) cold-boots hermetically. `true` buys back the ~112s
|
|
42
|
+
* boot on a persistent runner, at the cost of test isolation.
|
|
43
|
+
*/
|
|
44
|
+
readonly shouldReuseSnapshot: boolean;
|
|
19
45
|
}
|
|
20
46
|
/**
|
|
21
47
|
* Builds the argument list for spawning the Android emulator.
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
const DNS_SERVER = "8.8.8.8";
|
|
2
2
|
function buildEmulatorArguments(params) {
|
|
3
|
-
const emulatorArguments = ["-avd", params.avdName
|
|
3
|
+
const emulatorArguments = ["-avd", params.avdName];
|
|
4
|
+
if (!params.shouldReuseSnapshot) {
|
|
5
|
+
emulatorArguments.push("-no-snapshot-load", "-no-snapshot-save");
|
|
6
|
+
}
|
|
7
|
+
emulatorArguments.push("-dns-server", DNS_SERVER);
|
|
4
8
|
if (params.isHidden) {
|
|
5
9
|
emulatorArguments.push("-no-window");
|
|
6
10
|
}
|
|
@@ -9,4 +13,4 @@ function buildEmulatorArguments(params) {
|
|
|
9
13
|
export {
|
|
10
14
|
buildEmulatorArguments
|
|
11
15
|
};
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWFyZ3VtZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyB0aGUgYXJndW1lbnQgbGlzdCBmb3Igc3Bhd25pbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IuXG4gKlxuICogKipUaGUgaGFybmVzcyBvd25zIHRoZSBzbmFwc2hvdCBpdCBsb2Fkcywgb3IgaXQgbG9hZHMgbm9uZS4qKiBUaGlzIGZpbGUgdXNlZFxuICogdG8gcGFzcyBgLW5vLXNuYXBzaG90LXNhdmVgIGFsb25lIFx1MjAxNCB0aGUgb25lIGNvbWJpbmF0aW9uIHRoYXQgaXMgbmV2ZXJcbiAqIGNvcnJlY3QuIEl0IG5ldmVyICp3cml0ZXMqIGBkZWZhdWx0X2Jvb3RgLCB5ZXQgZXZlcnkgcnVuICpyZXN1bWVkKiBpdCwgc28gdGhlXG4gKiBndWVzdCBlYWNoIHJ1biBzdGFydGVkIGZyb20gd2FzIHN0YXRlIG5vdGhpbmcgaGFkIHZhbGlkYXRlZCBzaW5jZSB3aGVuZXZlciBhXG4gKiBodW1hbiBsYXN0IHNhdmVkIGl0LiBNZWFzdXJlZCAyMDI2LTA5LTAzLCBzYW1lIEFWRCBiYWNrIHRvIGJhY2s6XG4gKlxuICogfCBMYXVuY2ggfCBSZXN1bHQgfFxuICogfCAtLS0gfCAtLS0gfFxuICogfCBzbmFwc2hvdCByZXN1bWVkIChgLW5vLXNuYXBzaG90LXNhdmVgIGFsb25lKSB8IGd1ZXN0IGRpZXMgfjkwcyBpbiwgZXZlcnkgdGltZSB8XG4gKiB8IGAtbm8tc25hcHNob3QtbG9hZGAgKGNvbGQpIHwgYm9vdGVkIGluIDUwcywgYWxpdmUgYXQgNjAvMTIwLzE4MC8yNDBzIHxcbiAqXG4gKiBBIHJlc3VtZWQgc25hcHNob3Qgcm90cyBzaWxlbnRseSwgYW5kIHRoZSBmYWlsdXJlIGl0IGV2ZW50dWFsbHkgcHJvZHVjZXMgXHUyMDE0XG4gKiBhIGRldmljZSB0aGF0IHNlcnZlcyBhZGIsIGFjY2VwdHMgYSBzZXNzaW9uIGFuZCB0aGVuIGRyb3BzIGBvZmZsaW5lYCBhXG4gKiBoYWxmLW1pbnV0ZSBsYXRlciBcdTIwMTQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGNvZGUgcmVncmVzc2lvbi4gU28gdGhlXG4gKiBkZWZhdWx0IGlzIGEgZnVsbCBjb2xkIGJvb3QsIGFuZCBzbmFwc2hvdCByZXVzZSBpcyBhbiBleHBsaWNpdCBvcHQtaW4gdGhhdFxuICogdGFrZXMgKipib3RoKiogaGFsdmVzOiBsb2FkIGFuZCBzYXZlIHRvZ2V0aGVyLCBzbyB0aGUgc25hcHNob3QgdGhlIG5leHQgcnVuXG4gKiByZXN1bWVzIGlzIG9uZSB0aGlzIHJ1biB3cm90ZS5cbiAqL1xuXG5jb25zdCBETlNfU0VSVkVSID0gJzguOC44LjgnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBidWlsZEVtdWxhdG9yQXJndW1lbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEVtdWxhdG9yQXJndW1lbnRzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBbmRyb2lkIFZpcnR1YWwgRGV2aWNlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBlbXVsYXRvciBoZWFkbGVzcyAoYC1uby13aW5kb3dgKSwgc28gaXQgbmV2ZXIgc3RlYWxzXG4gICAqIGZvY3VzLiBSZXNvbHZlZCBmcm9tIHRoZSBgaXNFbXVsYXRvclZpc2libGVgIHRyYW5zcG9ydCBvcHRpb24uXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZW11bGF0b3IgbWF5IHJlc3VtZSBcdTIwMTQgYW5kIHJlZnJlc2ggXHUyMDE0IHRoZSBBVkQncyBzYXZlZCBib290XG4gICAqIHNuYXBzaG90LiBSZXNvbHZlZCBmcm9tIHRoZSBgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90YCB0cmFuc3BvcnQgb3B0aW9uLlxuICAgKlxuICAgKiBgZmFsc2VgICh0aGUgZGVmYXVsdCkgY29sZC1ib290cyBoZXJtZXRpY2FsbHkuIGB0cnVlYCBidXlzIGJhY2sgdGhlIH4xMTJzXG4gICAqIGJvb3Qgb24gYSBwZXJzaXN0ZW50IHJ1bm5lciwgYXQgdGhlIGNvc3Qgb2YgdGVzdCBpc29sYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZVNuYXBzaG90OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYXJndW1lbnQgbGlzdCBmb3Igc3Bhd25pbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbXVsYXRvciBhcmd1bWVudCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIGFyZ3VtZW50IGFycmF5IHRvIHBhc3MgdG8gdGhlIGVtdWxhdG9yIGJpbmFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JBcmd1bWVudHMocGFyYW1zOiBCdWlsZEVtdWxhdG9yQXJndW1lbnRzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBlbXVsYXRvckFyZ3VtZW50cyA9IFsnLWF2ZCcsIHBhcmFtcy5hdmROYW1lXTtcbiAgLypcbiAgICogQm90aCBmbGFncyBvciBuZWl0aGVyOiBsb2FkaW5nIHdpdGhvdXQgc2F2aW5nIGlzIHRoZSByZXN1bWUtd2hhdC13ZS1uZXZlci1cbiAgICogd3JvdGUgY29tYmluYXRpb24gdGhpcyBmaWxlJ3MgaGVhZGVyIGV4aXN0cyB0byBydWxlIG91dC5cbiAgICovXG4gIGlmICghcGFyYW1zLnNob3VsZFJldXNlU25hcHNob3QpIHtcbiAgICBlbXVsYXRvckFyZ3VtZW50cy5wdXNoKCctbm8tc25hcHNob3QtbG9hZCcsICctbm8tc25hcHNob3Qtc2F2ZScpO1xuICB9XG4gIGVtdWxhdG9yQXJndW1lbnRzLnB1c2goJy1kbnMtc2VydmVyJywgRE5TX1NFUlZFUik7XG4gIGlmIChwYXJhbXMuaXNIaWRkZW4pIHtcbiAgICBlbXVsYXRvckFyZ3VtZW50cy5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIGVtdWxhdG9yQXJndW1lbnRzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBd0JBLE1BQU0sYUFBYTtBQWlDWixTQUFTLHVCQUF1QixRQUFnRDtBQUNyRixRQUFNLG9CQUFvQixDQUFDLFFBQVEsT0FBTyxPQUFPO0FBS2pELE1BQUksQ0FBQyxPQUFPLHFCQUFxQjtBQUMvQixzQkFBa0IsS0FBSyxxQkFBcUIsbUJBQW1CO0FBQUEsRUFDakU7QUFDQSxvQkFBa0IsS0FBSyxlQUFlLFVBQVU7QUFDaEQsTUFBSSxPQUFPLFVBQVU7QUFDbkIsc0JBQWtCLEtBQUssWUFBWTtBQUFBLEVBQ3JDO0FBQ0EsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Pure helpers for finding the Android emulator process that **outlives the pid
|
|
5
|
+
* the harness killed**.
|
|
6
|
+
*
|
|
7
|
+
* Under `-no-window` the emulator's backend process is
|
|
8
|
+
* `qemu-system-x86_64-headless` (`qemu-system-x86_64` when windowed), not the
|
|
9
|
+
* `emulator` launcher the harness spawned and holds a `ChildProcess` for. The
|
|
10
|
+
* launcher exits or is killed, and the backend is what actually holds the AVD's
|
|
11
|
+
* `multiinstance.lock` and the console/adb ports — so `taskkill /F /T` against
|
|
12
|
+
* the launcher's pid reports success while the emulator keeps running. Every
|
|
13
|
+
* later run against that AVD then dies with `Running multiple emulators with the
|
|
14
|
+
* same AVD is an experimental feature`, which never reaches the user because the
|
|
15
|
+
* emulator writes it to its own stdout.
|
|
16
|
+
*
|
|
17
|
+
* Note that the obvious filter — `-Name qemu-system-x86_64` / matching that
|
|
18
|
+
* exact image name — does **not** match the `-headless` build, which is how the
|
|
19
|
+
* leftover stays invisible through several rounds of "no emulator is running".
|
|
20
|
+
*
|
|
21
|
+
* Ownership is decided by a **pre-launch snapshot**: a backend already running
|
|
22
|
+
* before this run started its own belongs to somebody else (another AVD, or one
|
|
23
|
+
* the user booted by hand) and is never touched. Kept separate from the
|
|
24
|
+
* integration-only `transport-factory` so the parsing and the selection stay
|
|
25
|
+
* unit-testable.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* One process from a host process listing.
|
|
29
|
+
*/
|
|
30
|
+
export interface ProcessListEntry {
|
|
31
|
+
/**
|
|
32
|
+
The process/image name, as the platform's listing reports it.
|
|
33
|
+
*/
|
|
34
|
+
readonly name: string;
|
|
35
|
+
/**
|
|
36
|
+
The process ID.
|
|
37
|
+
*/
|
|
38
|
+
readonly pid: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Parameters for {@link selectEmulatorBackendPids}.
|
|
42
|
+
*/
|
|
43
|
+
export interface SelectEmulatorBackendPidsParams {
|
|
44
|
+
/**
|
|
45
|
+
Emulator backend PIDs seen **before** this run launched its emulator, which it therefore does not own.
|
|
46
|
+
*/
|
|
47
|
+
readonly knownPids: readonly number[];
|
|
48
|
+
/**
|
|
49
|
+
The host's current process listing.
|
|
50
|
+
*/
|
|
51
|
+
readonly processes: readonly ProcessListEntry[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parses `ps -eo pid=,comm=` output.
|
|
55
|
+
*
|
|
56
|
+
* @param processListOutput - Raw stdout of the `ps` listing.
|
|
57
|
+
* @returns One entry per parsable row, in listed order.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parsePosixProcessList(processListOutput: string): ProcessListEntry[];
|
|
60
|
+
/**
|
|
61
|
+
* Parses `tasklist /FO CSV /NH` output.
|
|
62
|
+
*
|
|
63
|
+
* Only the first two fields are read — the image name and the PID — so the
|
|
64
|
+
* memory column's own commas cannot confuse the split.
|
|
65
|
+
*
|
|
66
|
+
* @param taskListOutput - Raw stdout of the `tasklist` listing.
|
|
67
|
+
* @returns One entry per parsable row, in listed order.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseWindowsTaskList(taskListOutput: string): ProcessListEntry[];
|
|
70
|
+
/**
|
|
71
|
+
* Selects the emulator processes this run is responsible for killing.
|
|
72
|
+
*
|
|
73
|
+
* @param params - The current listing plus the PIDs that predate this run's emulator.
|
|
74
|
+
* @returns The PIDs of emulator processes this run owns, in listed order.
|
|
75
|
+
*/
|
|
76
|
+
export declare function selectEmulatorBackendPids(params: SelectEmulatorBackendPidsParams): number[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const EMULATOR_BACKEND_NAME_PATTERN = /^(?:emulator|emulator64-[\w.-]+|qemu-system-[\w.-]+)$/;
|
|
2
|
+
const EXECUTABLE_SUFFIX_PATTERN = /\.exe$/;
|
|
3
|
+
const RADIX_DECIMAL = 10;
|
|
4
|
+
const TASK_LIST_FIELDS_READ = 2;
|
|
5
|
+
function parsePosixProcessList(processListOutput) {
|
|
6
|
+
const entries = [];
|
|
7
|
+
for (const rawLine of processListOutput.split("\n")) {
|
|
8
|
+
const line = rawLine.trim();
|
|
9
|
+
const separatorIndex = line.indexOf(" ");
|
|
10
|
+
if (separatorIndex === -1) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const pid = Number.parseInt(line.slice(0, separatorIndex), RADIX_DECIMAL);
|
|
14
|
+
if (Number.isNaN(pid)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
entries.push({ name: line.slice(separatorIndex + 1).trim(), pid });
|
|
18
|
+
}
|
|
19
|
+
return entries;
|
|
20
|
+
}
|
|
21
|
+
function parseWindowsTaskList(taskListOutput) {
|
|
22
|
+
const entries = [];
|
|
23
|
+
for (const rawLine of taskListOutput.split("\n")) {
|
|
24
|
+
const [rawName = "", rawPid = ""] = rawLine.trim().replaceAll('"', "").split(",", TASK_LIST_FIELDS_READ);
|
|
25
|
+
const pid = Number.parseInt(rawPid, RADIX_DECIMAL);
|
|
26
|
+
if (rawName.length === 0 || Number.isNaN(pid)) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
entries.push({ name: rawName, pid });
|
|
30
|
+
}
|
|
31
|
+
return entries;
|
|
32
|
+
}
|
|
33
|
+
function selectEmulatorBackendPids(params) {
|
|
34
|
+
return params.processes.filter((entry) => checkIsEmulatorBackendName(entry.name) && !params.knownPids.includes(entry.pid)).map((entry) => entry.pid);
|
|
35
|
+
}
|
|
36
|
+
function checkIsEmulatorBackendName(name) {
|
|
37
|
+
const baseName = name.slice(Math.max(name.lastIndexOf("/"), name.lastIndexOf("\\")) + 1);
|
|
38
|
+
return EMULATOR_BACKEND_NAME_PATTERN.test(baseName.toLowerCase().replace(EXECUTABLE_SUFFIX_PATTERN, ""));
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
parsePosixProcessList,
|
|
42
|
+
parseWindowsTaskList,
|
|
43
|
+
selectEmulatorBackendPids
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLWJhY2tlbmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQdXJlIGhlbHBlcnMgZm9yIGZpbmRpbmcgdGhlIEFuZHJvaWQgZW11bGF0b3IgcHJvY2VzcyB0aGF0ICoqb3V0bGl2ZXMgdGhlIHBpZFxuICogdGhlIGhhcm5lc3Mga2lsbGVkKiouXG4gKlxuICogVW5kZXIgYC1uby13aW5kb3dgIHRoZSBlbXVsYXRvcidzIGJhY2tlbmQgcHJvY2VzcyBpc1xuICogYHFlbXUtc3lzdGVtLXg4Nl82NC1oZWFkbGVzc2AgKGBxZW11LXN5c3RlbS14ODZfNjRgIHdoZW4gd2luZG93ZWQpLCBub3QgdGhlXG4gKiBgZW11bGF0b3JgIGxhdW5jaGVyIHRoZSBoYXJuZXNzIHNwYXduZWQgYW5kIGhvbGRzIGEgYENoaWxkUHJvY2Vzc2AgZm9yLiBUaGVcbiAqIGxhdW5jaGVyIGV4aXRzIG9yIGlzIGtpbGxlZCwgYW5kIHRoZSBiYWNrZW5kIGlzIHdoYXQgYWN0dWFsbHkgaG9sZHMgdGhlIEFWRCdzXG4gKiBgbXVsdGlpbnN0YW5jZS5sb2NrYCBhbmQgdGhlIGNvbnNvbGUvYWRiIHBvcnRzIFx1MjAxNCBzbyBgdGFza2tpbGwgL0YgL1RgIGFnYWluc3RcbiAqIHRoZSBsYXVuY2hlcidzIHBpZCByZXBvcnRzIHN1Y2Nlc3Mgd2hpbGUgdGhlIGVtdWxhdG9yIGtlZXBzIHJ1bm5pbmcuIEV2ZXJ5XG4gKiBsYXRlciBydW4gYWdhaW5zdCB0aGF0IEFWRCB0aGVuIGRpZXMgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGVcbiAqIHNhbWUgQVZEIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlYCwgd2hpY2ggbmV2ZXIgcmVhY2hlcyB0aGUgdXNlciBiZWNhdXNlIHRoZVxuICogZW11bGF0b3Igd3JpdGVzIGl0IHRvIGl0cyBvd24gc3Rkb3V0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgb2J2aW91cyBmaWx0ZXIgXHUyMDE0IGAtTmFtZSBxZW11LXN5c3RlbS14ODZfNjRgIC8gbWF0Y2hpbmcgdGhhdFxuICogZXhhY3QgaW1hZ2UgbmFtZSBcdTIwMTQgZG9lcyAqKm5vdCoqIG1hdGNoIHRoZSBgLWhlYWRsZXNzYCBidWlsZCwgd2hpY2ggaXMgaG93IHRoZVxuICogbGVmdG92ZXIgc3RheXMgaW52aXNpYmxlIHRocm91Z2ggc2V2ZXJhbCByb3VuZHMgb2YgXCJubyBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gKlxuICogT3duZXJzaGlwIGlzIGRlY2lkZWQgYnkgYSAqKnByZS1sYXVuY2ggc25hcHNob3QqKjogYSBiYWNrZW5kIGFscmVhZHkgcnVubmluZ1xuICogYmVmb3JlIHRoaXMgcnVuIHN0YXJ0ZWQgaXRzIG93biBiZWxvbmdzIHRvIHNvbWVib2R5IGVsc2UgKGFub3RoZXIgQVZELCBvciBvbmVcbiAqIHRoZSB1c2VyIGJvb3RlZCBieSBoYW5kKSBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gS2VwdCBzZXBhcmF0ZSBmcm9tIHRoZVxuICogaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgIHNvIHRoZSBwYXJzaW5nIGFuZCB0aGUgc2VsZWN0aW9uIHN0YXlcbiAqIHVuaXQtdGVzdGFibGUuXG4gKi9cblxuLyoqXG4gKiBPbmUgcHJvY2VzcyBmcm9tIGEgaG9zdCBwcm9jZXNzIGxpc3RpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc0xpc3RFbnRyeSB7XG4gIC8qKlxuICBUaGUgcHJvY2Vzcy9pbWFnZSBuYW1lLCBhcyB0aGUgcGxhdGZvcm0ncyBsaXN0aW5nIHJlcG9ydHMgaXQuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBwcm9jZXNzIElELlxuICAgKi9cbiAgcmVhZG9ubHkgcGlkOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMge1xuICAvKipcbiAgRW11bGF0b3IgYmFja2VuZCBQSURzIHNlZW4gKipiZWZvcmUqKiB0aGlzIHJ1biBsYXVuY2hlZCBpdHMgZW11bGF0b3IsIHdoaWNoIGl0IHRoZXJlZm9yZSBkb2VzIG5vdCBvd24uXG4gICAqL1xuICByZWFkb25seSBrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgaG9zdCdzIGN1cnJlbnQgcHJvY2VzcyBsaXN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiByZWFkb25seSBQcm9jZXNzTGlzdEVudHJ5W107XG59XG5cbi8qKlxuICogTWF0Y2hlcyB0aGUgZW11bGF0b3IgbGF1bmNoZXIgYW5kIGJvdGggUUVNVSBiYWNrZW5kIGJ1aWxkcyBcdTIwMTQgY3J1Y2lhbGx5XG4gKiBpbmNsdWRpbmcgdGhlIGAtaGVhZGxlc3NgIHN1ZmZpeCBgLW5vLXdpbmRvd2AgcnVucyBwcm9kdWNlLlxuICovXG5jb25zdCBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTiA9IC9eKD86ZW11bGF0b3J8ZW11bGF0b3I2NC1bXFx3Li1dK3xxZW11LXN5c3RlbS1bXFx3Li1dKykkLztcbmNvbnN0IEVYRUNVVEFCTEVfU1VGRklYX1BBVFRFUk4gPSAvXFwuZXhlJC87XG5jb25zdCBSQURJWF9ERUNJTUFMID0gMTA7XG4vKipcbiAqIE9ubHkgdGhlIGltYWdlIG5hbWUgYW5kIHRoZSBQSUQgYXJlIHJlYWQsIHNvIHRoZSBzcGxpdCBzdG9wcyBhZnRlciB0aGVtLlxuICovXG5jb25zdCBUQVNLX0xJU1RfRklFTERTX1JFQUQgPSAyO1xuXG4vKipcbiAqIFBhcnNlcyBgcHMgLWVvIHBpZD0sY29tbT1gIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0gcHJvY2Vzc0xpc3RPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIHRoZSBgcHNgIGxpc3RpbmcuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIHBhcnNhYmxlIHJvdywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQb3NpeFByb2Nlc3NMaXN0KHByb2Nlc3NMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgcHJvY2Vzc0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgbGluZSA9IHJhd0xpbmUudHJpbSgpO1xuICAgIGNvbnN0IHNlcGFyYXRvckluZGV4ID0gbGluZS5pbmRleE9mKCcgJyk7XG4gICAgaWYgKHNlcGFyYXRvckluZGV4ID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGlkID0gTnVtYmVyLnBhcnNlSW50KGxpbmUuc2xpY2UoMCwgc2VwYXJhdG9ySW5kZXgpLCBSQURJWF9ERUNJTUFMKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKHBpZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGVudHJpZXMucHVzaCh7IG5hbWU6IGxpbmUuc2xpY2Uoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCksIHBpZCB9KTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKipcbiAqIFBhcnNlcyBgdGFza2xpc3QgL0ZPIENTViAvTkhgIG91dHB1dC5cbiAqXG4gKiBPbmx5IHRoZSBmaXJzdCB0d28gZmllbGRzIGFyZSByZWFkIFx1MjAxNCB0aGUgaW1hZ2UgbmFtZSBhbmQgdGhlIFBJRCBcdTIwMTQgc28gdGhlXG4gKiBtZW1vcnkgY29sdW1uJ3Mgb3duIGNvbW1hcyBjYW5ub3QgY29uZnVzZSB0aGUgc3BsaXQuXG4gKlxuICogQHBhcmFtIHRhc2tMaXN0T3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB0aGUgYHRhc2tsaXN0YCBsaXN0aW5nLlxuICogQHJldHVybnMgT25lIGVudHJ5IHBlciBwYXJzYWJsZSByb3csIGluIGxpc3RlZCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2luZG93c1Rhc2tMaXN0KHRhc2tMaXN0T3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBQcm9jZXNzTGlzdEVudHJ5W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhd0xpbmUgb2YgdGFza0xpc3RPdXRwdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgY29uc3QgW3Jhd05hbWUgPSAnJywgcmF3UGlkID0gJyddID0gcmF3TGluZS50cmltKCkucmVwbGFjZUFsbCgnXCInLCAnJykuc3BsaXQoJywnLCBUQVNLX0xJU1RfRklFTERTX1JFQUQpO1xuICAgIGNvbnN0IHBpZCA9IE51bWJlci5wYXJzZUludChyYXdQaWQsIFJBRElYX0RFQ0lNQUwpO1xuICAgIGlmIChyYXdOYW1lLmxlbmd0aCA9PT0gMCB8fCBOdW1iZXIuaXNOYU4ocGlkKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZW50cmllcy5wdXNoKHsgbmFtZTogcmF3TmFtZSwgcGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qKlxuICogU2VsZWN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoaXMgcnVuIGlzIHJlc3BvbnNpYmxlIGZvciBraWxsaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY3VycmVudCBsaXN0aW5nIHBsdXMgdGhlIFBJRHMgdGhhdCBwcmVkYXRlIHRoaXMgcnVuJ3MgZW11bGF0b3IuXG4gKiBAcmV0dXJucyBUaGUgUElEcyBvZiBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gb3ducywgaW4gbGlzdGVkIG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXM6IFNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNQYXJhbXMpOiBudW1iZXJbXSB7XG4gIHJldHVybiBwYXJhbXMucHJvY2Vzc2VzXG4gICAgLmZpbHRlcigoZW50cnkpID0+IGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKGVudHJ5Lm5hbWUpICYmICFwYXJhbXMua25vd25QaWRzLmluY2x1ZGVzKGVudHJ5LnBpZCkpXG4gICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnBpZCk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrSXNFbXVsYXRvckJhY2tlbmROYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlTmFtZSA9IG5hbWUuc2xpY2UoTWF0aC5tYXgobmFtZS5sYXN0SW5kZXhPZignLycpLCBuYW1lLmxhc3RJbmRleE9mKCdcXFxcJykpICsgMSk7XG4gIHJldHVybiBFTVVMQVRPUl9CQUNLRU5EX05BTUVfUEFUVEVSTi50ZXN0KGJhc2VOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZShFWEVDVVRBQkxFX1NVRkZJWF9QQVRURVJOLCAnJykpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBNkRBLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sNEJBQTRCO0FBQ2xDLE1BQU0sZ0JBQWdCO0FBSXRCLE1BQU0sd0JBQXdCO0FBUXZCLFNBQVMsc0JBQXNCLG1CQUErQztBQUNuRixRQUFNLFVBQThCLENBQUM7QUFFckMsYUFBVyxXQUFXLGtCQUFrQixNQUFNLElBQUksR0FBRztBQUNuRCxVQUFNLE9BQU8sUUFBUSxLQUFLO0FBQzFCLFVBQU0saUJBQWlCLEtBQUssUUFBUSxHQUFHO0FBQ3ZDLFFBQUksbUJBQW1CLElBQUk7QUFDekI7QUFBQSxJQUNGO0FBRUEsVUFBTSxNQUFNLE9BQU8sU0FBUyxLQUFLLE1BQU0sR0FBRyxjQUFjLEdBQUcsYUFBYTtBQUN4RSxRQUFJLE9BQU8sTUFBTSxHQUFHLEdBQUc7QUFDckI7QUFBQSxJQUNGO0FBRUEsWUFBUSxLQUFLLEVBQUUsTUFBTSxLQUFLLE1BQU0saUJBQWlCLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQUEsRUFDbkU7QUFFQSxTQUFPO0FBQ1Q7QUFXTyxTQUFTLHFCQUFxQixnQkFBNEM7QUFDL0UsUUFBTSxVQUE4QixDQUFDO0FBRXJDLGFBQVcsV0FBVyxlQUFlLE1BQU0sSUFBSSxHQUFHO0FBQ2hELFVBQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLElBQUksUUFBUSxLQUFLLEVBQUUsV0FBVyxLQUFLLEVBQUUsRUFBRSxNQUFNLEtBQUsscUJBQXFCO0FBQ3ZHLFVBQU0sTUFBTSxPQUFPLFNBQVMsUUFBUSxhQUFhO0FBQ2pELFFBQUksUUFBUSxXQUFXLEtBQUssT0FBTyxNQUFNLEdBQUcsR0FBRztBQUM3QztBQUFBLElBQ0Y7QUFFQSxZQUFRLEtBQUssRUFBRSxNQUFNLFNBQVMsSUFBSSxDQUFDO0FBQUEsRUFDckM7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDBCQUEwQixRQUFtRDtBQUMzRixTQUFPLE9BQU8sVUFDWCxPQUFPLENBQUMsVUFBVSwyQkFBMkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLFVBQVUsU0FBUyxNQUFNLEdBQUcsQ0FBQyxFQUNqRyxJQUFJLENBQUMsVUFBVSxNQUFNLEdBQUc7QUFDN0I7QUFFQSxTQUFTLDJCQUEyQixNQUF1QjtBQUN6RCxRQUFNLFdBQVcsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLFlBQVksR0FBRyxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3ZGLFNBQU8sOEJBQThCLEtBQUssU0FBUyxZQUFZLEVBQUUsUUFBUSwyQkFBMkIsRUFBRSxDQUFDO0FBQ3pHOyIsCiAgIm5hbWVzIjogW10KfQo=
|