obsidian-integration-testing 12.2.0 → 12.3.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/README.md +1 -5
- package/dist/lib/cjs/appium-session-config.cjs +3 -5
- package/dist/lib/cjs/appium-session-config.d.cts +6 -9
- package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
- package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
- package/dist/lib/cjs/emulator-device-id.cjs +1 -1
- package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
- package/dist/lib/cjs/eval-cap.cjs +29 -0
- package/dist/lib/cjs/eval-cap.d.cts +43 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
- package/dist/lib/cjs/soft-keyboard.cjs +7 -4
- package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
- package/dist/lib/cjs/transport-appium.cjs +5 -5
- package/dist/lib/cjs/transport-desktop-cdp.cjs +77 -13
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +11 -1
- package/dist/lib/cjs/webview-cdp.cjs +45 -14
- package/dist/lib/cjs/webview-cdp.d.cts +17 -0
- package/dist/lib/esm/appium-session-config.d.mts +6 -9
- package/dist/lib/esm/appium-session-config.mjs +3 -4
- package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
- package/dist/lib/esm/connect-to-cdp.mjs +1 -1
- package/dist/lib/esm/emulator-device-id.d.mts +7 -6
- package/dist/lib/esm/emulator-device-id.mjs +1 -1
- package/dist/lib/esm/eval-cap.d.mts +43 -0
- package/dist/lib/esm/eval-cap.mjs +5 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
- package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
- package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
- package/dist/lib/esm/soft-keyboard.d.mts +16 -2
- package/dist/lib/esm/soft-keyboard.mjs +7 -4
- package/dist/lib/esm/transport-appium.mjs +5 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +77 -13
- package/dist/lib/esm/transport-options.d.mts +11 -1
- package/dist/lib/esm/transport-options.mjs +1 -1
- package/dist/lib/esm/webview-cdp.d.mts +17 -0
- package/dist/lib/esm/webview-cdp.mjs +45 -14
- package/package.json +1 -1
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
classifyAppStartupProbe,
|
|
13
13
|
compareAppStartupMilestones
|
|
14
14
|
} from "./app-startup-progress.mjs";
|
|
15
|
-
import { DEFAULT_SCRIPT_TIMEOUT_IN_MILLISECONDS } from "./appium-session-config.mjs";
|
|
16
15
|
import {
|
|
17
16
|
decodeBase64Png,
|
|
18
17
|
isPng
|
|
@@ -22,6 +21,7 @@ import {
|
|
|
22
21
|
EvalCapExceededError,
|
|
23
22
|
isScriptTimeoutError
|
|
24
23
|
} from "./eval-cap-exceeded-error.mjs";
|
|
24
|
+
import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "./eval-cap.mjs";
|
|
25
25
|
import { exec } from "./exec.mjs";
|
|
26
26
|
import { TEMP_VAULT_DIR_PREFIX } from "./leftover-cleanup.mjs";
|
|
27
27
|
import { log } from "./log.mjs";
|
|
@@ -44,8 +44,8 @@ const DEFAULT_APP_START_POLL_TIMEOUT_IN_MILLISECONDS = 18e4;
|
|
|
44
44
|
const APP_RESTART_DELAY_IN_MILLISECONDS = 2e3;
|
|
45
45
|
const DEFAULT_APP_ID = "md.obsidian";
|
|
46
46
|
const ADB_VAULT_REMOVE_TIMEOUT_IN_MILLISECONDS = 3e4;
|
|
47
|
-
const CAP_RECOVERY_GRACE_IN_MILLISECONDS =
|
|
48
|
-
const CONSOLE_CAPTURE_MARKER_TAG = "
|
|
47
|
+
const CAP_RECOVERY_GRACE_IN_MILLISECONDS = DEFAULT_EVAL_CAP_IN_MILLISECONDS;
|
|
48
|
+
const CONSOLE_CAPTURE_MARKER_TAG = "OBSIDIAN_INTEGRATION_TESTING_CAPTURE";
|
|
49
49
|
const CONSOLE_CAPTURE_TAIL_MAX_LENGTH = 8e3;
|
|
50
50
|
const ADB_LOG_MARKER_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
51
51
|
const LOGCAT_DUMP_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
@@ -117,7 +117,7 @@ class AppiumTransport {
|
|
|
117
117
|
this.platform = config.platform;
|
|
118
118
|
this.appId = config.appId ?? DEFAULT_APP_ID;
|
|
119
119
|
this.appStartTimeoutInMilliseconds = config.appStartTimeoutInMilliseconds ?? DEFAULT_APP_START_POLL_TIMEOUT_IN_MILLISECONDS;
|
|
120
|
-
this.scriptTimeoutInMilliseconds = config.scriptTimeoutInMilliseconds ??
|
|
120
|
+
this.scriptTimeoutInMilliseconds = config.scriptTimeoutInMilliseconds ?? DEFAULT_EVAL_CAP_IN_MILLISECONDS;
|
|
121
121
|
this.shouldSweepLeftovers = config.shouldSweepLeftovers ?? true;
|
|
122
122
|
this.vaultBasePath = config.vaultBasePath ?? DEFAULT_VAULT_BASE_PATH[this.platform] ?? DEFAULT_ANDROID_VAULT_BASE_PATH;
|
|
123
123
|
this.webviewTimeoutInMilliseconds = config.webviewTimeoutInMilliseconds ?? DEFAULT_WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS;
|
|
@@ -765,4 +765,4 @@ export {
|
|
|
765
765
|
AppiumTransport,
|
|
766
766
|
DEFAULT_ANDROID_VAULT_BASE_PATH
|
|
767
767
|
};
|
|
768
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5tanMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MubWpzJztcbmltcG9ydCB7IERFRkFVTFRfU0NSSVBUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9hcHBpdW0tc2Vzc2lvbi1jb25maWcubWpzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5tanMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICcuL2V4ZWMubWpzJztcbmltcG9ydCB7IFRFTVBfVkFVTFRfRElSX1BSRUZJWCB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkQ2xhaW1JbnB1dEV4cHJlc3Npb24sXG4gIGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbixcbiAgY2hlY2tJbnB1dENsYWltR3JhbnRlZCxcbiAgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSxcbiAgdG9DZHBJbnB1dENvbW1hbmRzXG59IGZyb20gJy4vbW9iaWxlLWlucHV0Lm1qcyc7XG5pbXBvcnQgeyBjb25uZWN0VG9XZWJWaWV3Q2RwIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5tanMnO1xuXG4vKipcbiAqIFNlc3Npb24gY29ubmVjdGlvbiBpbmZvIHJldHVybmVkIGJ5IHtAbGluayBBcHBpdW1UcmFuc3BvcnQuZ2V0U2Vzc2lvbkluZm99LFxuICogdXNlZCB0byByZWF0dGFjaCBmcm9tIGFub3RoZXIgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBpdW1TZXNzaW9uSW5mbyB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIFVESUQgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIEFwcGl1bS9XZWJEcml2ZXIgc2Vzc2lvbiBJRC5cbiAgICovXG4gIHNlc3Npb25JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVRyYW5zcG9ydENvbmZpZyB7XG4gIC8qKlxuICAgKiBBcHAgcGFja2FnZSAoQW5kcm9pZCkgb3IgYnVuZGxlIElEIChpT1MpLlxuICAgKiBEZWZhdWx0cyB0byBgJ21kLm9ic2lkaWFuJ2AuXG4gICAqL1xuICBhcHBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIE9ic2lkaWFuIE1vYmlsZSB0byBnZXQgYXMgZmFyIGFzIGBnbG9iYWxUaGlzLmFwcGBcbiAgICogZXhpc3RpbmcgYWZ0ZXIgdGhlIHZhdWx0IGlzIChyZSlvcGVuZWQsIGJlZm9yZSB0aGUgdGlnaHRlclxuICAgKiB7QGxpbmsgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGNsb2NrIHN0YXJ0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDE4MDAwMGBcbiAgICovXG4gIGFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgQXBwaXVtIGJyb3dzZXIvZHJpdmVyIGluc3RhbmNlLlxuICAgKiBDcmVhdGVkIGJ5IHRoZSBjb25zdW1lciB2aWEgZS5nLiBXZWJEcml2ZXJJTydzIGByZW1vdGUoKWAuXG4gICAqL1xuICBicm93c2VyOiBCcm93c2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIFVESUQgKGUuZy4gYCdlbXVsYXRvci01NTU0J2ApLlxuICAgKiBVc2VkIGZvciBgYWRiYCBjb21tYW5kcyB3aGVuIHB1c2hpbmcgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAgICovXG4gIGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgb3ducyB0aGUgQXBwaXVtIHNlc3Npb24gYW5kIHNob3VsZCBkZWxldGUgaXQgb25cbiAgICoge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfS5cbiAgICpcbiAgICogYHRydWVgIGZvciBzZXNzaW9ucyBjcmVhdGVkIHZpYSBgcmVtb3RlKClgIChnbG9iYWwgc2V0dXApLlxuICAgKiBgZmFsc2VgIGZvciBzZXNzaW9ucyByZWF0dGFjaGVkIHZpYSBgYXR0YWNoKClgICh0ZXN0IHdvcmtlcnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIGlzU2Vzc2lvbk93bmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YCwgY291bnRlZFxuICAgKiBmcm9tIHRoZSBtb21lbnQge0BsaW5rIGFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzfSBpcyBzYXRpc2ZpZWQgXHUyMDE0IG5vdCBmcm9tXG4gICAqIHRoZSByZWxvYWQsIHNvIGEgY29sZCBhcHAgc3RhcnQgaXMgbm90IGNoYXJnZWQgYWdhaW5zdCBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDkwMDAwYFxuICAgKi9cbiAgbGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRhcmdldCBwbGF0Zm9ybS4gRGV0ZXJtaW5lcyBXZWJWaWV3IGNvbnRleHQgbmFtaW5nIGFuZCBkZXZpY2UgZmlsZSBwYXRocy5cbiAgICovXG4gIHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcblxuICAvKipcbiAgICogVGhlIHBlci1zY3JpcHQgY2FwLCBpbiBtaWxsaXNlY29uZHMsIHRoaXMgc2Vzc2lvbiB3YXMgZ2l2ZW4gYXMgaXRzIFczQ1xuICAgKiBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5LlxuICAgKlxuICAgKiBDYXJyaWVkIG9ubHkgc28gYSBzY3JpcHQgdGltZW91dCBjYW4gYmUgcmVwb3J0ZWQgd2l0aCB0aGUgbnVtYmVyIHRoYXRcbiAgICogcHJvZHVjZWQgaXQ7IHRoZSBjYXBhYmlsaXR5IGl0c2VsZiBpcyBzZXQgd2hlbiB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMzAwMDBgXG4gICAqL1xuICBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVnaXN0ZXJpbmcgYSB2YXVsdCBhbHNvIHBydW5lcyB0aGUgKipvdGhlcioqIGB0ZW1wLXZhdWx0LSpgXG4gICAqIHJlZ2lzdHJhdGlvbnMgZWFybGllciBydW5zIGxlZnQgaW4gT2JzaWRpYW4gTW9iaWxlJ3MgYGxvY2FsU3RvcmFnZWAuXG4gICAqXG4gICAqIFRoZSBkZXZpY2Utc2lkZSBkaXJlY3RvcmllcyBhcmUgc3dlcHQgYmVmb3JlIHRoZSBhcHAgbGF1bmNoZXMgKHNlZSB0aGVcbiAgICogZmFjdG9yeSk7IHRoaXMgcmVtb3ZlcyB0aGVpciBub3ctZGFuZ2xpbmcgcmVnaXN0cnkgZW50cmllcywgd2hpY2ggYXJlIHdoYXRcbiAgICogT2JzaWRpYW4gYWN0dWFsbHkgZW51bWVyYXRlcyBhdCBzdGFydHVwLiBVbnJlZ2lzdGVyaW5nIHRoaXMgcnVuJ3Mgb3duIHZhdWx0XG4gICAqIGlzIHVuYWZmZWN0ZWQgXHUyMDE0IHRoYXQgYWx3YXlzIGhhcHBlbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCYXNlIHBhdGggb24gdGhlIGRldmljZSB3aGVyZSBPYnNpZGlhbiBzdG9yZXMgdmF1bHRzLlxuICAgKlxuICAgKiBEZWZhdWx0czpcbiAgICogLSBBbmRyb2lkOiBgL3NkY2FyZC9Eb2N1bWVudHMvYFxuICAgKiAtIGlPUzogYEBtZC5vYnNpZGlhbjpkb2N1bWVudHMvYFxuICAgKi9cbiAgdmF1bHRCYXNlUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHdhaXRpbmcgZm9yIHRoZSBXZWJWaWV3IGNvbnRleHQgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYDYwMDAwYFxuICAgKi9cbiAgd2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuY29uc3QgTk9fT1VUUFVUID0gJyhubyBvdXRwdXQpJztcbmNvbnN0IEFQUF9TVEFURV9GT1JFR1JPVU5EID0gNDtcbmNvbnN0IFdFQlZJRVdfQ09OVEVYVF9QUkVGSVggPSAnV0VCVklFV19tZC5vYnNpZGlhbic7XG5jb25zdCBXRUJWSUVXX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgREVGQVVMVF9XRUJWSUVXX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MF8wMDA7XG5jb25zdCBMQVlPVVRfUkVBRFlfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX0xBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gOTBfMDAwO1xuY29uc3QgREVGQVVMVF9BUFBfU1RBUlRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDE4MF8wMDA7XG5jb25zdCBBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgREVGQVVMVF9BUFBfSUQgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQURCX1ZBVUxUX1JFTU9WRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbi8qXG4gKiBFeHRyYSBidWRnZXQgZ3JhbnRlZCB0byB0aGUgT05FIGV2YWwgdGhhdCBmb2xsb3dzIGEgY2FwIG92ZXJydW4sIG9uIHRvcCBvZiB0aGUgY2FwIGl0c2VsZi4gVGhlXG4gKiBhYmFuZG9uZWQgY2xvc3VyZSBrZWVwcyBydW5uaW5nIGluIHRoZSBndWVzdCwgYW5kIEFwcGl1bSBzZXJpYWxpemVzIGNvbW1hbmRzIHBlciBzZXNzaW9uLCBzbyB0aGUgbmV4dFxuICogY29tbWFuZCB3YWl0cyBvdXQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBpdC4gU2l6ZWQgYXQgdGhlIGNhcCBhZ2Fpbiwgd2hpY2ggaXMgYSBwcmFnbWF0aWMgY2VpbGluZyByYXRoZXJcbiAqIHRoYW4gYSBwcm9vZjogYSBjbG9zdXJlIGNhbiBvdXRydW4gYW55IG51bWJlciBwaWNrZWQgaGVyZS4gSXQgZG9lcyBub3QgbmVlZCB0byBiZSBhIHByb29mLCBiZWNhdXNlIGFcbiAqIGd1ZXN0IHRoYXQgaXMgc3RpbGwgYnVzeSBhZnRlciBpdCBzaW1wbHkgcHJvZHVjZXMgYW5vdGhlciBvdmVycnVuIG9uIHRoZSBuZXh0IGV2YWwsIHdoaWNoIGlzIGdyYW50ZWQgdGhlXG4gKiBncmFjZSBpbiB0dXJuIFx1MjAxNCBzbyB0aGUgc2Vzc2lvbiByZWNvdmVycyBvdmVyIHN1Y2Nlc3NpdmUgZXZhbHMgaW5zdGVhZCBvZiBjb21wb3VuZGluZywgYW5kIGV2ZXJ5IG9uZSBvZlxuICogdGhvc2UgZXZhbHMgcmVwb3J0cyB0aGUgc2FtZSBob25lc3QgZGlhZ25vc2lzLlxuICovXG5jb25zdCBDQVBfUkVDT1ZFUllfR1JBQ0VfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuXG4vLyAtLS0gQ29uc29sZSBjYXB0dXJlIChMYXllciAyIG9mIHRoZSBwbHVnaW4tbG9hZCBlcnJvciBzdXJmYWNpbmcpIC0tLVxuY29uc3QgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcgPSAnT0lUX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgV2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTYXRpc2ZpZWQ6IChtaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBwaGFzZSBiZWluZyB3YWl0ZWQgb3V0LCBuYW1lZCBpbiB0aGUgbG9nIGFuZCBpbiB0aGUgdGltZW91dCBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEFwcFN0YXJ0dXBQaGFzZTtcblxuICAvKipcbiAgVGhpcyBwaGFzZSdzIGJ1ZGdldC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgdGVhcnMgdGhlIGNoYW5uZWwgZG93biB3aGVuIG5vdGhpbmcgZWxzZSB3aWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGhhbGYgb2YgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbDogYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgV2ViVmlldywgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAqIEFwcGl1bSBzZXNzaW9uLCBvcGVuZWQgbGF6aWx5IG9uIGZpcnN0IGV2YWx1YXRlIGFuZCByZXVzZWQgKHNlZSAqKkwzOSoqKS5cbiAgICovXG4gIHByaXZhdGUgaW5wdXRDaGFubmVsOiBudWxsIHwgV2ViVmlld0NkcENvbm5lY3Rpb24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb25jZSB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlzIGtub3duIG5vdCB0byBiZSBvcGVuYWJsZSBoZXJlIChpT1MsIGEgcmVtb3RlIGh1Yiwgbm8gbG9jYWxcbiAgICogYGFkYmApLCBzbyB0aGUgYXR0ZW1wdCBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnkgZXZhbHVhdGUuXG4gICAqL1xuICBwcml2YXRlIGlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRyYWNrcyB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHN3aXRjaGVkIHRvIHRoZSBXZWJWaWV3IGNvbnRleHQuXG4gICAqXG4gICAqIFNldCB0byBgdHJ1ZWAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBzd2l0Y2hDb250ZXh0KFdFQlZJRVdfbWQub2JzaWRpYW4pYC5cbiAgICogUmVzZXQgdG8gYGZhbHNlYCB3aGVuIHRoZSBjb250ZXh0IGlzIGtub3duIHRvIGJlIGludmFsaWRhdGVkXG4gICAqIChlLmcuIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAgaW4ge0BsaW5rIHJlZ2lzdGVyVmF1bHR9KS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gc2tpcHMgdGhlIGV4cGVuc2l2ZVxuICAgKiBgZ2V0Q29udGV4dHMoKWAgY2FsbCAod2hpY2ggcnVucyBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kXG4gICAqIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycykuXG4gICAqL1xuICBwcml2YXRlIGlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBldmFsIGVuZGVkIGluIGEgY2FwIG92ZXJydW4sIHNvIHRoZSBuZXh0IG9uZSBpcyBvd2VkIHRoZSByZWNvdmVyeSBncmFjZS5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCBjbG9zdXJlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvXG4gICAqIHRoZSBuZXh0IGNvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTZWUge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZVdpdGhpbkNhcH0uXG4gICAqL1xuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc1Nlc3Npb25Pd25lcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTd2VlcExlZnRvdmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1Nlc3Npb25Pd25lciA9IGNvbmZpZy5pc1Nlc3Npb25Pd25lciA/PyB0cnVlO1xuICAgIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnBsYXRmb3JtID0gY29uZmlnLnBsYXRmb3JtO1xuICAgIHRoaXMuYXBwSWQgPSBjb25maWcuYXBwSWQgPz8gREVGQVVMVF9BUFBfSUQ7XG4gICAgdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1NDUklQVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID0gY29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG4gICAgdGhpcy52YXVsdEJhc2VQYXRoID0gY29uZmlnLnZhdWx0QmFzZVBhdGggPz8gREVGQVVMVF9WQVVMVF9CQVNFX1BBVEhbdGhpcy5wbGF0Zm9ybV0gPz8gREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSDtcbiAgICB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgYSBjb25zb2xlIGNhcHR1cmUgYnkgc3RhbXBpbmcgdGhlIGRldmljZSBsb2cgd2l0aCBhIHVuaXF1ZSBtYXJrZXIuXG4gICAqXG4gICAqIFVzZXMgYGFkYiBzaGVsbCBsb2dgIHRvIHdyaXRlIGEgbWFya2VyIGludG8gYGxvZ2NhdGAgYXQgY2FwdHVyZSBzdGFydCBzbyBhXG4gICAqIGxhdGVyIHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiBzbGljZSBvdXRcbiAgICogZXZlcnl0aGluZyB0aGUgV2ViVmlldyBsb2dnZWQgYWZ0ZXJ3YXJkcyBcdTIwMTQgd2l0aG91dCB0aGUgaW52YXNpdmUgYGxvZ2NhdCAtY2BcbiAgICogYnVmZmVyIGNsZWFyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSBjYXJyeWluZyB0aGUgdW5pcXVlIG1hcmtlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkNvbnNvbGVDYXB0dXJlKCk6IFByb21pc2U8Q29uc29sZUNhcHR1cmVIYW5kbGU+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBgJHtDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBR31fJHtyYW5kb21VVUlEKCl9YDtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbG9nJywgJy10JywgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcsIG1hcmtlcl0sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuICAgIHJldHVybiB7IG1hcmtlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIGRldmljZSdzIHNjcmVlbi5cbiAgICpcbiAgICogVGhlIGltYWdlIGlzIGFsd2F5cyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGZyYW1lYnVmZmVyIFx1MjAxNCB0aGVyZSBpcyBubyBtb2JpbGVcbiAgICogZXF1aXZhbGVudCBvZiB0aGUgZGVza3RvcCB2aWV3cG9ydCBvdmVycmlkZSwgc29cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLndpZHRoSW5QaXhlbHN9IC9cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLmhlaWdodEluUGl4ZWxzfSBhcmUgaWdub3JlZC4gU2l6ZSBhIG1vYmlsZVxuICAgKiBjYXB0dXJlIGJ5IGNob29zaW5nIGFuIEFWRCB3aG9zZSBzY3JlZW4gZ2VvbWV0cnkgYWxyZWFkeSBtYXRjaGVzIHdoYXQgdGhlXG4gICAqIGltYWdlIGhhcyB0byBiZS5cbiAgICpcbiAgICogQHBhcmFtIF9wYXJhbXMgLSBDYXB0dXJlIHBhcmFtZXRlcnMuIElnbm9yZWQgb24gbW9iaWxlOiBgY3dkYCBkb2VzIG5vdCBzZWxlY3QgYSB3aW5kb3cgKHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKSwgYW5kIHRoZSBzaXplIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZHJpdmVyIHJldHVybnMgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChfcGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpKTtcbiAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBpdW0gc2NyZWVuc2hvdCBlcnJvcjogdGFrZVNjcmVlbnNob3QgcmV0dXJuZWQgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk93bmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMuXG4gICAqXG4gICAqIE9ubHkgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCBuZWVkcyBpdDogdGhlIEFwcGl1bSBzZXNzaW9uIGlzIHRoZSBvd25pbmcgcHJvY2VzcydzIHRvIGVuZCwgYW5kIGFuXG4gICAqIGFicnVwdCBleGl0IGlzIGV4YWN0bHkgd2hlbiB0aGUgYXN5bmMge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfSBuZXZlciBydW5zIFx1MjAxNCB3aGljaCB3b3VsZCBzdHJhbmRcbiAgICogdGhlIGFkYiBwb3J0IGZvcndhcmQgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgY2hhbm5lbD8uZGlzcG9zZVN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgX29wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbnB1dENoYW5uZWwoKTtcblxuICAgIHRyeSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGNhcCBpcyBlbmZvcmNlZCBIRVJFLCBvbiB0aGUgTm9kZSBzaWRlLCBhbmQgbm90IGJ5IHRoZSBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5IHRoZVxuICAgICAgICogU2Vzc2lvbiBhbHNvIGRlY2xhcmVzLiBNZWFzdXJlZCBvbiBhIGxpdmUgZW11bGF0b3I6IHRoZSBjYXBhYmlsaXR5IGlzIGFjY2VwdGVkIGFuZCByZWFkc1xuICAgICAgICogQmFjayBhcyAzMDAwMCBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBhbmQgbm90aGluZyBldmVyIGVuZm9yY2VzIGl0IFx1MjAxNCBvdmVyLWNhcCBjbG9zdXJlcyBpbiBib3RoIHRoZVxuICAgICAgICogU2xlZXBpbmcgYW5kIHRoZSBzcGlubmluZyBzaGFwZSwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdCBgc2V0VGltZW91dHNgLCByYW4gcGFzdCBhIDYwcyBjZWlsaW5nXG4gICAgICAgKiBXaXRob3V0IFdlYkRyaXZlciByYWlzaW5nIGBzY3JpcHQgdGltZW91dGAgZXZlbiBvbmNlLiBXaGF0IGFjdHVhbGx5IGhhcHBlbnMgcGFzdCByb3VnaGx5IGhhbGYgYVxuICAgICAgICogTWludXRlIGlzIHdvcnNlIHRoYW4gYSBsYXRlIGFuc3dlcjogdGhlIGNsb3N1cmUgQ09NUExFVEVTIGluIHRoZSBndWVzdCBvbiBzY2hlZHVsZSAodGltZXJzIGFybWVkIGF0XG4gICAgICAgKiAzMHMgYW5kIDQwcyBmaXJlZCB3aXRoaW4gfjEzbXMgb2Ygbm9taW5hbCwgb24gYSB2aXNpYmxlIGFuZCBmb2N1c2VkIHBhZ2UpIGFuZCBpdHMgRXhlY3V0ZSBTY3JpcHRcbiAgICAgICAqIFJlc3BvbnNlIG5ldmVyIHJlYWNoZXMgdGhpcyBjbGllbnQgXHUyMDE0IHNvIHRoZSBwcm9taXNlIGJlbG93IHNpbXBseSBuZXZlciBzZXR0bGVzLlxuICAgICAgICpcbiAgICAgICAqIEEgaGFuZyBpcyB0aGUgb25lIGZhaWx1cmUgbW9kZSBhIHRlc3QgYXV0aG9yIGNhbm5vdCBhY3Qgb24sIHNvIHRoZSB3YWl0IGlzIGJvdW5kZWQgaGVyZS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVdpdGhpbkNhcChgcmV0dXJuICgke2V4cHJlc3Npb259KWApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBIGNhcCBvdmVycnVuIGlzIHRoZSBvbmUgZmFpbHVyZSBoZXJlIHRoYXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBjb250ZXh0OiB0aGUgY2xvc3VyZSBvdXRzdGF5ZWRcbiAgICAgICAqIEl0cyBidWRnZXQsIHRoZSBXZWJWaWV3IGlzIHN0aWxsIHRoZSBXZWJWaWV3LiBSZXNldHRpbmcgdGhlIGZsYWcgd291bGQgY2hhcmdlIHRoZSBORVhUIGV2YWwgYVxuICAgICAgICogfjE3cyBgc3dpdGNoQ29udGV4dGAgKCoqTDE5KiopIHRvIHJlY292ZXIgZnJvbSBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXIgbG9zdC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXZhbENhcEV4Y2VlZGVkRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRleHQgbWF5IGhhdmUgYmVlbiBsb3N0IG1pZC1leGVjdXRpb24gKGUuZy4gcGFnZSByZWxvYWQpLlxuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgICAgLypcbiAgICAgICAqIEtlcHQgYXMgYSBmYXN0IHBhdGggZXZlbiB0aG91Z2ggdGhpcyBkcml2ZXIgd2FzIG1lYXN1cmVkIG5ldmVyIHJhaXNpbmcgaXQ6IGl0IGNvc3RzIG5vdGhpbmcsXG4gICAgICAgKiBJdCBpcyB0aGUgY29ycmVjdCB0cmFuc2xhdGlvbiBpZiBhIGZ1dHVyZSBkcml2ZXIgZG9lcyBlbmZvcmNlIHRoZSBjYXBhYmlsaXR5LCBhbmQgaXQga2VlcHMgdGhlIHR3b1xuICAgICAgICogVHJhbnNwb3J0cyByZXBvcnRpbmcgb25lIGVycm9yIGZvciBvbmUgY29uZGl0aW9uLlxuICAgICAgICovXG4gICAgICBpZiAoaXNTY3JpcHRUaW1lb3V0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBvcHRpb25OYW1lOiAnc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGNvbm5lY3Rpb24gaW5mbyBuZWVkZWQgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAqIGZyb20gYW5vdGhlciBwcm9jZXNzIChlLmcuIGEgdGVzdCB3b3JrZXIpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBJRCBhbmQgZGV2aWNlIElELlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JbmZvKCk6IEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuYnJvd3Nlci5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuYWN0aXZhdGVBcHAodGhpcy5hcHBJZCk7XG4gICAgICBhd2FpdCBkZWxheShBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIHZpYSBjb21wcmVzc2VkIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0YXIuZ3ogYXJjaGl2ZSBvZiB0aGUgbG9jYWwgdmF1bHQgZGlyZWN0b3J5LCBwdXNoZXMgaXQgdG8gdGhlXG4gICAqIGRldmljZSBhcyBhIHNpbmdsZSBmaWxlLCBhbmQgZXh0cmFjdHMgaXQgaW4tcGxhY2UuIFRoaXMgYXZvaWRzIHRoZVxuICAgKiB3ZWJkcml2ZXIgYFJhbmdlRXJyb3JgIG9uIGxhcmdlIGJhc2U2NCBwYXlsb2FkcyBhbmQgaXMgc2lnbmlmaWNhbnRseVxuICAgKiBmYXN0ZXIgdGhhbiBwZXItZmlsZSBgYnJvd3Nlci5wdXNoRmlsZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGFzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBvbiBkZXZpY2UpLlxuICAgKiBAcGFyYW0gX2ZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzICh1bnVzZWQgXHUyMDE0IGFkYiBwdXNoZXMgdGhlIGRpcmVjdG9yeSBkaXJlY3RseSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVzaEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBfZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcbiAgICBjb25zdCBhcmNoaXZlTmFtZSA9IGB2YXVsdC0ke3JhbmRvbVVVSUQoKX0udGFyLmd6YDtcbiAgICBjb25zdCBsb2NhbEFyY2hpdmUgPSBqb2luKHRtcGRpcigpLCBhcmNoaXZlTmFtZSk7XG4gICAgY29uc3QgcmVtb3RlQXJjaGl2ZSA9IGAvZGF0YS9sb2NhbC90bXAvJHthcmNoaXZlTmFtZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIENyZWF0aW5nIGFyY2hpdmU6ICR7bG9jYWxBcmNoaXZlfWApO1xuICAgICAgYXdhaXQgZXhlYyhbJ3RhcicsICdjemYnLCBhcmNoaXZlTmFtZSwgJy1DJywgdmF1bHRQYXRoLCAnLiddLCB7IGN3ZDogdG1wZGlyKCksIGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFB1c2hpbmcgYXJjaGl2ZSB0byBkZXZpY2UgJHt0aGlzLmRldmljZUlkfS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxBcmNoaXZlLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBFeHRyYWN0aW5nIGFyY2hpdmUgb24gZGV2aWNlIGF0ICR7ZGV2aWNlVmF1bHRQYXRofS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAndGFyJywgJ3h6ZicsIHJlbW90ZUFyY2hpdmUsICctQycsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gRmx1c2hpbmcgZmlsZXN5c3RlbSBidWZmZXJzLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3N5bmMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBDbGVhbmluZyB1cCByZW1vdGUgYXJjaGl2ZS4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsQXJjaGl2ZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHVtcHMgYGFkYiBsb2djYXRgIGFuZCByZXR1cm5zIHRoZSBXZWJWaWV3IGNvbnNvbGUvZXJyb3Igb3V0cHV0IGxvZ2dlZFxuICAgKiBzaW5jZSB0aGUgbWFya2VyIGZyb20ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlfS5cbiAgICpcbiAgICogRmlsdGVycyB0byB0aGUgQ2hyb21pdW0vV2ViVmlldyB0YWdzIHRoYXQgY2FycnkgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZFxuICAgKiB1bmNhdWdodCBlcnJvcnMsIGFuZCBjYXBzIHRoZSByZXN1bHQgbGVuZ3RoLiBCb3VuZGVkLCBwb3N0LWhvYyxcbiAgICogZmFpbHVyZS1wYXRoLW9ubHkgXHUyMDE0IG5ldmVyIGEgbGl2ZSBtb25pdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gVGhlIGNhcHR1cmUgaGFuZGxlIChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgbmV2ZXIgc3RhcnRlZCkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXB0dXJlZCBjb25zb2xlL2Vycm9yIHRleHQsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgcmVsZXZhbnQgd2FzIGxvZ2dlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkQ29uc29sZUNhcHR1cmVTaW5jZShoYW5kbGU6IENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1wID0gYXdhaXQgZXhlYyhcbiAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2xvZ2NhdCcsICctZCcsICctdicsICd0aW1lJ10sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuXG4gICAgY29uc3QgbWFya2VySW5kZXggPSBkdW1wLmxhc3RJbmRleE9mKGhhbmRsZS5tYXJrZXIpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG1hcmtlckluZGV4ID09PSAtMSA/IGR1bXAgOiBkdW1wLnNsaWNlKG1hcmtlckluZGV4ICsgaGFuZGxlLm1hcmtlci5sZW5ndGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gcmVnaW9uXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBDT05TT0xFX0NBUFRVUkVfVEFHX1JFLnRlc3QobGluZSkpXG4gICAgICAuam9pbignXFxuJylcbiAgICAgIC50cmltKCk7XG5cbiAgICBpZiAoIXJlbGV2YW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiByZWxldmFudC5zbGljZSgtQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHB1c2hpbmcgZmlsZXMgYW5kIGNvbmZpZ3VyaW5nIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogVGhlIHJlZ2lzdHJhdGlvbiBmbG93OlxuICAgKiAxLiBQdXNoIGEgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB0byB0aGUgZGV2aWNlIHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgdGhlIHZhdWx0XG4gICAqIDIuIFN3aXRjaCB0byB0aGUgV2ViVmlldyBjb250ZXh0XG4gICAqIDMuIEFkZCB0aGUgdmF1bHQgdG8gbG9jYWxTdG9yYWdlIChgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AsIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgLFxuICAgKiAgICBgZW5hYmxlLXBsdWdpbi08cGF0aD5gKVxuICAgKiA0LiBUcmlnZ2VyIGBsb2NhdGlvbi5yZWxvYWQoKWAgc28gT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAgICogNS4gV2FpdCBmb3IgYGdsb2JhbFRoaXMuYXBwYCB0byBleGlzdCAodGhlIGFwcCdzIGNvbGQgc3RhcnQpLCB0aGVuIFx1MjAxNCBvbiBhXG4gICAqICAgIHNlcGFyYXRlLCB0aWdodGVyIGJ1ZGdldCBcdTIwMTQgZm9yIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YFxuICAgKlxuICAgKiBFeGlzdGluZyB2YXVsdCByZWdpc3RyYXRpb25zIGluIGxvY2FsU3RvcmFnZSBhcmUgcHJlc2VydmVkIChhcHBlbmQsIG5vdFxuICAgKiBvdmVyd3JpdGUpIFx1MjAxNCBleGNlcHQgdGhlICoqaGFybmVzcydzIG93bioqIGB0ZW1wLXZhdWx0LSpgIHJlZ2lzdHJhdGlvbnMgZnJvbVxuICAgKiBlYXJsaWVyIHJ1bnMsIHdoaWNoIGFyZSBwcnVuZWQgd2hlbiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0Q29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiBpcyBvbi4gVGhlaXIgZGlyZWN0b3JpZXMgYXJlIGFscmVhZHkgZ29uZSAodGhlIGZhY3Rvcnkgc3dlZXBzIHRoZW0gYmVmb3JlXG4gICAqIHRoZSBhcHAgbGF1bmNoZXMpLCBhbmQgaXQgaXMgdGhpcyByZWdpc3RyeSBcdTIwMTQgbm90IHRoZSBmaWxlc3lzdGVtIFx1MjAxNCB0aGF0XG4gICAqIE9ic2lkaWFuIGVudW1lcmF0ZXMgYXQgc3RhcnR1cCwgc28gbGVhdmluZyB0aGVtIGlzIHdoYXQgbWFrZXMgZWFjaCBmYWlsZWRcbiAgICogcnVuIHNsb3cgdGhlIG5leHQgb25lIGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICAvLyBQdXNoIGEgbWluaW1hbCAub2JzaWRpYW4gZGlyZWN0b3J5IHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgaXQgYXMgYSB2YXVsdC5cbiAgICBhd2FpdCB0aGlzLnB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGgpO1xuXG4gICAgLy8gU3dpdGNoIHRvIFdlYlZpZXcgYW5kIGNvbmZpZ3VyZSBsb2NhbFN0b3JhZ2UuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgLy8gSW52YWxpZGF0ZSBiZWZvcmUgcmVsb2FkIFx1MjAxNCB0aGUgcGFnZSB3aWxsIG5hdmlnYXRlIGFuZCB0aGUgV2ViVmlld1xuICAgIC8vIENvbnRleHQgbWF5IGJlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIGR1cmluZyByZWxvYWQuXG4gICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YWxlUHJlZml4ID0gdGhpcy5zaG91bGRTd2VlcExlZnRvdmVycyA/IGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke1RFTVBfVkFVTFRfRElSX1BSRUZJWH1gIDogJyc7XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZShcbiAgICAgIChwYXRoOiBzdHJpbmcsIHBydW5lUHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIGlmIChwcnVuZVByZWZpeCkge1xuICAgICAgICAgIGNvbnN0IHN0YWxlID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiByZWdpc3RlcmVkICE9PSBwYXRoICYmIHJlZ2lzdGVyZWQuc3RhcnRzV2l0aChwcnVuZVByZWZpeCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZCBvZiBzdGFsZSkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtyZWdpc3RlcmVkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGlzdGluZyA9IGV4aXN0aW5nLmZpbHRlcigocmVnaXN0ZXJlZCkgPT4gIXN0YWxlLmluY2x1ZGVzKHJlZ2lzdGVyZWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXhpc3RpbmcuaW5jbHVkZXMocGF0aCkpIHtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCwgJ3RydWUnKTtcbiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgZGV2aWNlVmF1bHRQYXRoLFxuICAgICAgc3RhbGVQcmVmaXhcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgcmVsb2FkICsgdmF1bHQgaW5pdGlhbGl6YXRpb24sIGFzIHR3byBzZXBhcmF0ZWx5IGJ1ZGdldGVkIHBoYXNlczpcbiAgICAvLyBUaGUgYXBwJ3MgY29sZCBzdGFydCBmaXJzdCwgdGhlbiBPYnNpZGlhbidzIG93biB3b3JrLiBTZWUgYHdhaXRGb3JBcHBTdGFydGVkYC5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JBcHBTdGFydGVkKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IG9uIG1vYmlsZSBieSByZW1vdmluZyBpdCBmcm9tIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogUHJlc2VydmVzIG90aGVyIHZhdWx0IHJlZ2lzdHJhdGlvbnMuIElmIHRoZSB1bnJlZ2lzdGVyZWQgdmF1bHQgd2FzIHNlbGVjdGVkLFxuICAgKiBzd2l0Y2hlcyB0byB0aGUgZmlyc3QgcmVtYWluaW5nIHZhdWx0IChvciBjbGVhcnMgdGhlIHNlbGVjdGlvbikuXG4gICAqXG4gICAqIFRoZSB2YXVsdCdzICoqZmlsZXMgYXJlIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgd2hldGhlciBvclxuICAgKiBub3QgdGhlIGBsb2NhbFN0b3JhZ2VgIHN0ZXAgc3VjY2VlZGVkKiogXHUyMDE0IGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGVcbiAgICogYGxvY2FsU3RvcmFnZWAgc3RlcCBnb2VzIHRocm91Z2ggdGhlIFdlYlZpZXcgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIGV4YWN0bHlcbiAgICogd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlLiBSb3V0aW5nIHRoZSByZW1vdmFsIHRocm91Z2ggdGhlIGFwcCB3YXMgd2hhdFxuICAgKiBtYWRlIGV2ZXJ5IGZhaWxlZCBydW4gbGVhayBpdHMgdmF1bHQgKGBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiBub1xuICAgKiBzdWNoIHdpbmRvd2ApLCBzbyB0aGUgZmlsZXN5c3RlbS1sZXZlbCByZW1vdmFsIG11c3Qgbm90IGRlcGVuZCBvbiBpdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGV4aXN0aW5nLmZpbHRlcigodikgPT4gdiAhPT0gcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWQpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtwYXRofWApO1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpID09PSBwYXRoKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnLCBmaWx0ZXJlZFswXSA/PyAnJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBDb3VsZCBub3QgZGVyZWdpc3RlciAke2RldmljZVZhdWx0UGF0aH0gZnJvbSBsb2NhbFN0b3JhZ2UgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhlcnJvcil9KTsgcmVtb3ZpbmcgaXRzIGZpbGVzIGFueXdheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCwgaWYgb25lIGlzIG9wZW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3Bvc2VJbnB1dENoYW5uZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuaW5wdXRDaGFubmVsO1xuICAgIHRoaXMuaW5wdXRDaGFubmVsID0gbnVsbDtcbiAgICB0aGlzLnVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpO1xuICAgIGF3YWl0IGNoYW5uZWw/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW4sIGFuZCByZS1vcGVucyBpdCBpZiB0aGUgV2ViVmlldyB3ZW50IGF3YXkuXG4gICAqXG4gICAqIEluc3RhbGxzIGEgYFJ1bnRpbWUuYWRkQmluZGluZ2AgZnVuY3Rpb24gb24gdGhlIHBhZ2UgYW5kIHNlcnZpY2VzIGV2ZXJ5IGNhbGwgdG8gaXQgZm9yIHRoZSBsaWZlIG9mIHRoZVxuICAgKiBjb25uZWN0aW9uLiBUaGUgYmluZGluZyBpcyBleHBvc2VkIG9uICpldmVyeSogZXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIHBhZ2UsIHNvIGl0IHN1cnZpdmVzIHRoZVxuICAgKiBgbG9jYXRpb24ucmVsb2FkKClgIHRoYXQge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWdpc3RlclZhdWx0fSBwZXJmb3Jtczsgb25seSBhIGZ1bGwgYXBwIHJlc3RhcnQsIHdoaWNoXG4gICAqIGRlc3Ryb3lzIHRoZSBXZWJWaWV3IHRhcmdldCwgbmVlZHMgdGhlIHJlY29ubmVjdCBiZWxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5wdXRDaGFubmVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlucHV0Q2hhbm5lbD8uaXNPcGVuIHx8IHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBjaGFubmVsIGlzIHJlYWNoYWJsZSBvbmx5IG92ZXIgbG9jYWwgYGFkYmAsIHNvIGl0IGRvZXMgbm90IGV4aXN0IG9uIGlPUyBvciBhZ2FpbnN0IGEgcmVtb3RlIGh1YlxuICAgIC8vIChCcm93c2VyU3RhY2spLiBUaG9zZSBhcmUgc3VwcG9ydGVkIHRyYW5zcG9ydHMsIHNvIHRoaXMgc3RheXMgKipiZXN0LWVmZm9ydCoqOiBhIHJ1biB0aGF0IG5ldmVyXG4gICAgLy8gRHJpdmVzIGlucHV0IG11c3Qgbm90IGZhaWwgYmVjYXVzZSB0aGUgY2hhbm5lbCBjb3VsZCBub3QgYmUgb3BlbmVkLiBBIHJ1biB0aGF0ICpkb2VzKiBkcml2ZSBpbnB1dFxuICAgIC8vIEdldHMgYSBsZWdpYmxlIGVycm9yIGZyb20gdGhlIHJlbmRlcmVyJ3Mgb3duIGd1YXJkLCB3aGljaCBuYW1lcyB0aGUgbWlzc2luZyBjaGFubmVsLlxuICAgIGlmICh0aGlzLnBsYXRmb3JtICE9PSAnYW5kcm9pZCcpIHtcbiAgICAgIHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3RUb1dlYlZpZXdDZHAoeyBhcHBJZDogdGhpcy5hcHBJZCwgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQgfSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZW5hYmxlJyk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHsgbmFtZTogTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSB9KTtcbiAgICAgIGNvbm5lY3Rpb24ub24oJ1J1bnRpbWUuYmluZGluZ0NhbGxlZCcsIChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGlmIChwYXJhbXNbJ25hbWUnXSAhPT0gTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXJhbXNbJ3BheWxvYWQnXTtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBhd2FpdGVkOiB0aGlzIHJ1bnMgd2hpbGUgdGhlIHJlbmRlcmVyJ3MgYEV4ZWN1dGUgU2NyaXB0YCBpcyBzdGlsbCBwZW5kaW5nLCBhbmRcbiAgICAgICAgLy8gVGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgXHUyMDE0IHRoZSByZXF1ZXN0IGlzIHNlcnZpY2VkIGNvbmN1cnJlbnRseSBhbmQgYW5zd2VyZWQgYnkgcmVzb2x2aW5nIHRoZVxuICAgICAgICAvLyBSZW5kZXJlcidzIHByb21pc2Ugb3ZlciB0aGlzIHNhbWUgc29ja2V0LiBJdCBoYW5kbGVzIGl0cyBvd24gZmFpbHVyZXMsIHNvIG5vdGhpbmcgcmVhY2hlcyBoZXJlLlxuICAgICAgICB0aGlzLmhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uLCB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycgPyBwYXlsb2FkIDogJycpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogYGhhbmRsZUlucHV0UmVxdWVzdGAgbmV2ZXIgcmVqZWN0cy5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbnB1dENoYW5uZWwgPSBjb25uZWN0aW9uO1xuXG4gICAgICAvLyBTZWxmLWNsZWFuaW5nLCBkZWxpYmVyYXRlbHk6IHRoaXMgdHJhbnNwb3J0IGNhbiBiZSBjcmVhdGVkIHN0cmFpZ2h0IGZyb20gYSB0ZXN0IHdvcmtlciwgd2l0aCBub1xuICAgICAgLy8gYGNvcmVTZXR1cGAgb3duaW5nIGl0cyBsaWZlY3ljbGUgYW5kIHRoZXJlZm9yZSBub3RoaW5nIHRoYXQgZXZlciBjYWxscyBgZGlzcG9zZWAvYGRpc3Bvc2VTeW5jYCBcdTIwMTRcbiAgICAgIC8vIFdoaWNoIGlzIGhvdyBhIHJ1biBsZWF2ZXMgaXRzIGFkYiBwb3J0IGZvcndhcmQgc3RyYW5kZWQgb24gdGhlIGRldmljZSAob2JzZXJ2ZWQgMjAyNi0wOC0zMCkuIFRoZVxuICAgICAgLy8gSGFuZGxlciBpcyByZW1vdmVkIGFnYWluIG9uIGRpc3Bvc2FsIHNvIHJlY29ubmVjdHMgZG8gbm90IHN0YWNrIGxpc3RlbmVycy5cbiAgICAgIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29ubmVjdGlvbi5kaXNwb3NlU3luYygpO1xuICAgICAgfTtcbiAgICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQtaW5wdXQgY2hhbm5lbCBvcGVuLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBHaXZlIHVwIGZvciB0aGUgbGlmZSBvZiB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIHBheWluZyBhbiBgYWRiYCByb3VuZC10cmlwIG9uIGV2ZXJ5IGV2YWwuXG4gICAgICAvLyBBIHNvY2tldCB0aGF0IG1lcmVseSAqY2xvc2VkKiBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCBpcyBhIGRpZmZlcmVudCBjYXNlIFx1MjAxNCBgaXNPcGVuYCBpcyBmYWxzZVxuICAgICAgLy8gVGhlcmUgd2hpbGUgdGhpcyBmbGFnIHN0YXlzIHVuc2V0LCBzbyB0aGUgcmVjb25uZWN0IGFib3ZlIHN0aWxsIHJ1bnMuXG4gICAgICB0aGlzLmlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZCBpbnB1dCBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIGRldmljZTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhlIGRyaXZlciB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQuXG4gICAqXG4gICAqIElmIHRoZSBjb250ZXh0IHdhcyBhbHJlYWR5IHZlcmlmaWVkIChjYWNoZWQgdmlhIHtAbGluayBpc0luV2ViVmlld0NvbnRleHR9KSxcbiAgICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IGNhbGxpbmcgYGdldENvbnRleHRzKClgIFx1MjAxNCB3aGljaCBydW5zXG4gICAqIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmQgY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzLlxuICAgKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgY29udGV4dCBiZWNvbWVzIGF2YWlsYWJsZSAodGhlIGFwcCBtYXkgc3RpbGwgYmUgbG9hZGluZykuXG4gICAqIFVzZXMgdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IHNwZWNpZmljYWxseSB0byBhdm9pZCBjb25uZWN0aW5nXG4gICAqIHRvIENocm9tZSBvciBvdGhlciBXZWJWaWV3cyBvbiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJWaWV3Q29udGV4dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luV2ViVmlld0NvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuYnJvd3Nlci5nZXRDb250ZXh0cygpO1xuICAgICAgY29uc3Qgb2JzaWRpYW5Db250ZXh0ID0gY29udGV4dHMuZmluZCgoY29udGV4dCk6IGNvbnRleHQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJyAmJiBjb250ZXh0LnN0YXJ0c1dpdGgoV0VCVklFV19DT05URVhUX1BSRUZJWCkpO1xuXG4gICAgICBpZiAob2JzaWRpYW5Db250ZXh0KSB7XG4gICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEZvdW5kIFdlYlZpZXcgY29udGV4dDogJHtvYnNpZGlhbkNvbnRleHR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQob2JzaWRpYW5Db250ZXh0KTtcbiAgICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXNldHRpbmcgdG8gTkFUSVZFX0FQUCBiZWZvcmUgcmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQoJ05BVElWRV9BUFAnKTtcbiAgICAgICAgICB9IGNhdGNoIChyZXNldEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBOQVRJVkVfQVBQIHJlc2V0IGFsc28gZmFpbGVkOiAke1N0cmluZyhyZXNldEVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2ViVmlldyBub3QgcmVhZHksIGF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeShjb250ZXh0cyl9LiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoV0VCVklFV19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgZm91bmQgd2l0aGluICR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuIElzIHRoZSBPYnNpZGlhbiBhcHAgZnVsbHkgbG9hZGVkP2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIEV4ZWN1dGUgU2NyaXB0IHVuZGVyIHRoZSBwZXItZXZhbCBjYXAsIHJhaXNpbmcge0BsaW5rIEV2YWxDYXBFeGNlZWRlZEVycm9yfSBpZiBpdCBvdXRsYXN0cyBpdC5cbiAgICpcbiAgICogVGhlIGNhcCBjb3ZlcnMgdGhlIHNjcmlwdCBBTE9ORSBcdTIwMTQgYGVuc3VyZVdlYlZpZXdDb250ZXh0YCBhbmQgYGVuc3VyZUlucHV0Q2hhbm5lbGAgcnVuIGJlZm9yZSBpdCxcbiAgICogYmVjYXVzZSBhIGBzd2l0Y2hDb250ZXh0YCBsZWdpdGltYXRlbHkgY29zdHMgfjE3cyAoKipMMTkqKikgYW5kIGNoYXJnaW5nIHRoYXQgdG8gYSB0ZXN0J3Mgb3duIGJ1ZGdldFxuICAgKiB3b3VsZCByZXBvcnQgdGhlIGhhcm5lc3MncyBzZXR1cCBhcyB0aGUgdGVzdCdzIG92ZXJydW4uXG4gICAqXG4gICAqIFRoZSBhYmFuZG9uZWQgcmVxdWVzdCBpcyBkZWxpYmVyYXRlbHkgbGVmdCBpbiBmbGlnaHQgcmF0aGVyIHRoYW4gY2FuY2VsbGVkLiBOb3RoaW5nIGNhbiBjYW5jZWwgaXQ6XG4gICAqIGBSdW50aW1lLnRlcm1pbmF0ZUV4ZWN1dGlvbmAgb3ZlciB0aGUgdHJhbnNwb3J0J3Mgb3duIENEUCBjaGFubmVsIHdhcyBtZWFzdXJlZCByZWxlYXNpbmcgbm90aGluZyxcbiAgICogYW5kIGEgZ3Vlc3Qtc2lkZSBhYm9ydCBob29rIGNvdWxkIG5vdCBldmVuIGJlIGluc3RhbGxlZCBpbiB0aW1lLiBXaGF0IHRoZSBzYW1lIHJ1bnMgZGlkIHNob3cgaXMgdGhhdFxuICAgKiB0aGUgc2Vzc2lvbiB1c3VhbGx5IGtlZXBzIHNlcnZpbmcgXHUyMDE0IGEgdmF1bHQgcmVhZC1iYWNrIHdhcyBhbnN3ZXJlZCA1MjhtcyBhZnRlciBvbmUgc3VjaCBhYmFuZG9ubWVudCxcbiAgICogd2l0aCB0aGUgc2Vzc2lvbiBmcmVlIFx1MjAxNCBzbyBib3VuZGluZyB0aGUgd2FpdCBjb3N0cyBhIHRlc3QgaXRzIGNsb3N1cmUsIG5vdCB0aGUgcmVzdCBvZiBpdHMgc3VpdGUuXG4gICAqXG4gICAqIEBwYXJhbSBzY3JpcHQgLSBUaGUgc2NyaXB0IHRvIHJ1biwgYWxyZWFkeSB3cmFwcGVkIGluIGl0cyBgcmV0dXJuICguLi4pYC5cbiAgICogQHJldHVybnMgVGhlIHNjcmlwdCdzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbHVhdGVXaXRoaW5DYXAoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvKlxuICAgICAqIFRoZSBldmFsIEFGVEVSIGFuIG92ZXJydW4gZ2V0cyBhIGdyYWNlIHBlcmlvZCBvbiB0b3Agb2YgdGhlIGNhcCwgYW5kIHRoaXMgaXMgbm90IGdlbmVyb3NpdHkuIEFwcGl1bVxuICAgICAqIFNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIGFuZCBhbiBhYmFuZG9uZWQgY2xvc3VyZSBrZWVwcyBydW5uaW5nIGluIHRoZSBndWVzdCBcdTIwMTQgc28gdGhlIG5leHRcbiAgICAgKiBDb21tYW5kIHF1ZXVlcyBiZWhpbmQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBpdCBhbmQsIG9uIHRoZSBiYXJlIGNhcCwgaXMgY2FwcGVkIGluIGl0cyB0dXJuLiBUaGF0IGlzXG4gICAgICogTWVhc3VyZWQ6IHdpdGggdGhlIGNhcCBmaXJpbmcgYXQgMzBzIGFnYWluc3QgYSA0MHMgY2xvc3VyZSwgdGhlIGZvbGxvd2luZyB2YXVsdCByZWFkLWJhY2sgZmFpbGVkIGF0XG4gICAgICogMzAgMjA2bXMsIHdoaWxlIHRoZSBzYW1lIHJlYWQtYmFjayBpc3N1ZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgaGFkIGZpbmlzaGVkIHdhcyBhbnN3ZXJlZCBpbiA1Mjhtcy5cbiAgICAgKlxuICAgICAqIFdhaXRpbmcgb24gdGhlIGFiYW5kb25lZCByZXF1ZXN0IGluc3RlYWQgd291bGQgbm90IHdvcms6IHRoYXQgcHJvbWlzZSBpcyB0aGUgb25lIHRoYXQgbmV2ZXIgc2V0dGxlcy5cbiAgICAgKiBXaGF0IGZyZWVzIHRoZSBzZXNzaW9uIGlzIHRoZSBHVUVTVCBmaW5pc2hpbmcsIG9uIGEgc2NoZWR1bGUgdGhpcyBzaWRlIGNhbm5vdCBrbm93IFx1MjAxNCBzbyB0aGUgZ3JhY2UgaXNcbiAgICAgKiBhIGNlaWxpbmcsIG5vdCBhIGRlbGF5LiBJdCBjb3N0cyBub3RoaW5nIHdoZW4gdGhlIHNlc3Npb24gY29tZXMgYmFjayBwcm9tcHRseSwgd2hpY2ggaXMgdGhlIG5vcm0uXG4gICAgICovXG4gICAgY29uc3QgYnVkZ2V0SW5NaWxsaXNlY29uZHMgPSB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuXG4gICAgICA/IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzICsgQ0FQX1JFQ09WRVJZX0dSQUNFX0lOX01JTExJU0VDT05EU1xuICAgICAgOiB0aGlzLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgICBsZXQgY2FwVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FwID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjYXBUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogYnVkZ2V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBjYXVzZTogbmV3IEVycm9yKGBUaGUgQXBwaXVtIEV4ZWN1dGUgU2NyaXB0IGNhcnJ5aW5nIHRoaXMgY2xvc3VyZSBkaWQgbm90IGFuc3dlciB3aXRoaW4gJHtTdHJpbmcoYnVkZ2V0SW5NaWxsaXNlY29uZHMpfW1zLmApLFxuICAgICAgICAgICAgb3B0aW9uTmFtZTogJ3NjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSwgYnVkZ2V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB0aGlzLmJyb3dzZXIuZXhlY3V0ZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBbXT4oc2NyaXB0KSxcbiAgICAgICAgY2FwXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNhcFRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNhcFRpbWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBob3N0LXNpZGUgdmF1bHQgcGF0aCB0byB0aGUgZGV2aWNlLXNpZGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICogQHJldHVybnMgVGhlIGRldmljZS1zaWRlIHZhdWx0IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke2V4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIG9uZSBpbnB1dCByZXF1ZXN0IGZyb20gdGhlIHJlbmRlcmVyOiBpbmplY3QsIHRoZW4gcmVzb2x2ZSB0aGUgcmVuZGVyZXIncyBwcm9taXNlLlxuICAgKlxuICAgKiBFdmVyeSBmYWlsdXJlIHBhdGggc3RpbGwgcmVzb2x2ZXMgdGhhdCBwcm9taXNlIFx1MjAxNCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgdGhlIHJlbmRlcmVyIHJlLXRocm93cyBcdTIwMTQgYmVjYXVzZVxuICAgKiBhIHJlcXVlc3QgdGhhdCBpcyBzaWxlbnRseSBkcm9wcGVkIHdvdWxkIGhhbmcgdGhlIGNsb3N1cmUgdW50aWwgdGhlIHdob2xlIHJ1biB0aW1lcyBvdXQsIGFuZCByZXBvcnRcbiAgICogbm90aGluZyBhYm91dCB3aHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIC0gVGhlIGNoYW5uZWwgdGhlIHJlcXVlc3QgYXJyaXZlZCBvbi5cbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcmF3IEpTT04gcGF5bG9hZCB0aGUgYmluZGluZyB3YXMgY2FsbGVkIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uOiBXZWJWaWV3Q2RwQ29ubmVjdGlvbiwgcGF5bG9hZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlcXVlc3RJZCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGlkLCByZXF1ZXN0IH0gPSBKU09OLnBhcnNlKHBheWxvYWQpIGFzIE1vYmlsZUlucHV0RW52ZWxvcGU7XG4gICAgICByZXF1ZXN0SWQgPSBpZDtcblxuICAgICAgLy8gRXhhY3RseS1vbmNlIGFjcm9zcyBldmVyeSBhdHRhY2hlZCBob3N0LiBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCBpcyBicm9hZGNhc3QgdG8gQUxMIGF0dGFjaGVkXG4gICAgICAvLyBDRFAgc2Vzc2lvbnMsIHNvIHdpdGhvdXQgdGhpcyBlYWNoIHByb2Nlc3MgaW5qZWN0cyB0aGUgZ2VzdHVyZSBhZ2FpbjogbWVhc3VyZWQgMjAyNi0wOS0xMCwgYVxuICAgICAgLy8gVml0ZXN0IG1haW4gcHJvY2VzcyBhbmQgaXRzIHdvcmtlciBzZXJ2aWNlZCByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCwgYW5kIG9uZVxuICAgICAgLy8gYGNsaWNrRWxlbWVudGAgcmVhY2hlZCB0aGUgcGFnZSBhcyB0d28gYHBvaW50ZXJkb3duYCAvIGB0b3VjaHN0YXJ0YCBwYWlycy5cbiAgICAgIC8vXG4gICAgICAvLyBBIExPU0VSIE1VU1QgUkVUVVJOIFNJTEVOVExZOiB0aGUgd2lubmVyIGlzIHRoZSBvbmUgdGhhdCBpbmplY3RzIGFuZCB0aGUgb25lIHRoYXQgcmVzb2x2ZXMgdGhlXG4gICAgICAvLyBSZW5kZXJlcidzIHByb21pc2UsIHNvIGFuc3dlcmluZyBoZXJlIGFzIHdlbGwgd291bGQgcmVzb2x2ZSBhIHJlcXVlc3Qgd2hvc2UgZ2VzdHVyZSB0aGlzXG4gICAgICAvLyBQcm9jZXNzIG5ldmVyIHNlbnQuXG4gICAgICBjb25zdCBjbGFpbSA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbihpZCksIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XG4gICAgICBpZiAoIWNoZWNrSW5wdXRDbGFpbUdyYW50ZWQoY2xhaW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kQWxsKHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0KSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZXZhbHVhdGUnLCB7IGV4cHJlc3Npb246IGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclRvU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQgaW5wdXQgZmFpbGVkOiAke21lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKHJlcXVlc3RJZCwgbWVzc2FnZSkgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHNvY2tldCBpcyBnb25lOyB0aGUgcmVuZGVyZXIncyBvd24gdGltZW91dCBpcyB0aGUgcmVtYWluaW5nIGJhY2tzdG9wLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgdGhlIFdlYlZpZXcgb25jZSBmb3IgaG93IGZhciBPYnNpZGlhbidzIHN0YXJ0dXAgaGFzIGdvdC5cbiAgICpcbiAgICogQSBwcm9iZSB0aGF0IHRocm93cyBpcyByZXBvcnRlZCBhcyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiBwcm9wYWdhdGVkOiB0aGVcbiAgICogcGFnZSBpcyBtaWQtYGxvY2F0aW9uLnJlbG9hZCgpYCBmb3IgbW9zdCBvZiB0aGUgYXBwLXN0YXJ0IHBoYXNlLCBhbmQgYVxuICAgKiBXZWJWaWV3IHRoYXQgY2Fubm90IGFuc3dlciB5ZXQgaXMgdGhlICpleHBlY3RlZCogcmVhZGluZyB0aGVyZSwgbm90IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGF0IHRoZSBwcm9iZSBzYXcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY291bGQgbm90IHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVTdGFydHVwKCk6IFByb21pc2U8U3RhcnR1cFByb2JlUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgoKTogU3RhcnR1cFByb2JlUmVzdWx0ID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIFdlIG5lZWQgZ2xvYmFsIGBhcHBgIHZhcmlhYmxlLlxuICAgICAgICBjb25zdCBhcHAgPSBnbG9iYWxUaGlzLmFwcCBhcyBMb2FkaW5nQXBwIHwgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0FwcDogISFhcHAsXG4gICAgICAgICAgaGFzV29ya3NwYWNlOiAhIWFwcD8ud29ya3NwYWNlLFxuICAgICAgICAgIGlzTGF5b3V0UmVhZHk6ICEhYXBwPy53b3Jrc3BhY2U/LmxheW91dFJlYWR5XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB0aGUgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB2YXVsdCBtYXJrZXIgdmlhIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIGBicm93c2VyLnB1c2hGaWxlYCAoV2ViRHJpdmVyIGJhc2U2NCkgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNsb3dlciBvbiBhXG4gICAqIGNvbGQgb3IgbG9hZGVkIGVtdWxhdG9yIFx1MjAxNCBtZWFzdXJlZCBhdCA5XHUyMDEzMjFzIHBlciBjYWxsIGZvciB0aGlzIDItYnl0ZSBtYXJrZXIsXG4gICAqIHZlcnN1cyBzdWItc2Vjb25kIG92ZXIgYGFkYmAuIFRoaXMgbWlycm9ycyB7QGxpbmsgcHVzaEZpbGVzfSwgd2hpY2ggc3dpdGNoZWRcbiAgICogdG8gYGFkYmAgZm9yIHRoZSBzYW1lIHJlYXNvbi4gYG1rZGlyIC1wYCBndWFyYW50ZWVzIHRoZSBwYXJlbnQgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlVmF1bHRQYXRoIC0gVGhlIGRldmljZS1zaWRlIHZhdWx0IGRpcmVjdG9yeSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXNoT2JzaWRpYW5NYXJrZXIoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NhbE1hcmtlciA9IGpvaW4odG1wZGlyKCksIGBvYnNpZGlhbi1tYXJrZXItJHtyYW5kb21VVUlEKCl9Lmpzb25gKTtcbiAgICBjb25zdCByZW1vdGVNYXJrZXIgPSBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbi9hcHAuanNvbmA7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGxvY2FsTWFya2VyLCAne30nLCAndXRmLTgnKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbWtkaXInLCAnLXAnLCBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbmBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbE1hcmtlciwgcmVtb3RlTWFya2VyXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBybShsb2NhbE1hcmtlciwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHZhdWx0IGRpcmVjdG9yeSBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgYW5kIENIRUNLUyB0aGF0IGl0IGlzXG4gICAqIGFjdHVhbGx5IGdvbmUuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzbyBhIHRlYXJkb3duIHByb2JsZW0gbmV2ZXJcbiAgICogbWFza3MgdGhlIHRlc3QgcmVzdWx0LiBUaGUgbmV4dCBydW4ncyBzdGFydC1vZi1ydW4gc3dlZXAgcGlja3MgdXAgd2hhdGV2ZXJcbiAgICogdGhpcyBjb3VsZCBub3QgcmVtb3ZlLlxuICAgKlxuICAgKiBUaGUgY2hlY2sgaXMgdGhlIHBvaW50LiBgcm0gLXJmYCBydW5zIHdpdGggYHNob3VsZElnbm9yZUV4aXRDb2RlYCwgc28gYW5cbiAgICogdW5yZW1vdmVkIGRpcmVjdG9yeSB1c2VkIHRvIGxlYXZlIG5vIHRyYWNlIGF0IGFsbCBcdTIwMTQgd2hpY2ggaXMgaG93IHJ1bnMgdGhhdFxuICAgKiBwYXNzZWQgZW5kIHRvIGVuZCB3ZXJlIHN0aWxsIGZvdW5kIHRvIGJlIGxlYWtpbmcgYSB2YXVsdCBhcGllY2UsIGludmlzaWJseSxcbiAgICogdW50aWwgc29tZW9uZSBjb3VudGVkIHRoZSBkaXJlY3RvcmllcyBvbiB0aGUgZGV2aWNlIGJ5IGhhbmQuIEEgbGVhayBpcyBub3dcbiAgICogbmFtZWQgaW4gdGhlIGxvZyBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbW92ZURldmljZVZhdWx0RGlyZWN0b3J5KGRldmljZVZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGRpcmVjdG9yeSBmcm9tIGRldmljZTogJHtkZXZpY2VWYXVsdFBhdGh9YCk7XG4gICAgICBhd2FpdCBleGVjKFxuICAgICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsICctcmYnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbGlzdGluZyA9IGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ2xzJywgJy1kJywgZGV2aWNlVmF1bHRQYXRoXSxcbiAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChsaXN0aW5nLmluY2x1ZGVzKGRldmljZVZhdWx0UGF0aCkpIHtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FybmluZzogJHtkZXZpY2VWYXVsdFBhdGh9IHN1cnZpdmVkIHJlbW92YWwgYW5kIGlzIG5vdyBsZWFrZWQgcmVzaWR1ZS4gYFxuICAgICAgICAgICAgKyAnVGhlIG5leHQgcnVuXFwncyBzdGFydC1vZi1ydW4gc3dlZXAgd2lsbCByZXRyeSBpdC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFZhdWx0IGRpcmVjdG9yeSByZW1vdmFsIGZhaWxlZCAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlciB0aGF0IHdvdWxkIG90aGVyd2lzZSBjbG9zZSBhbiBhbHJlYWR5LWNsb3NlZCBjaGFubmVsLCBhbmQgd291bGRcbiAgICogc3RhY2sgYSBsaXN0ZW5lciBwZXIgcmVjb25uZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVySW5wdXRDaGFubmVsRXhpdEhhbmRsZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLm9mZignZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG4gICAgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgZ2xvYmFsVGhpcy5hcHBgIGV4aXN0cyBpbiB0aGUgV2ViVmlldyBcdTIwMTQgdGhlIGFwcCBoYXMgZmluaXNoZWRcbiAgICogaXRzIGNvbGQgc3RhcnQgYW5kIE9ic2lkaWFuJ3Mgb3duIGJvb3QgaGFzIGJlZ3VuLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSAqKmZpcnN0Kiogb2YgdGhlIHR3byBidWRnZXRzIHNwZW50IGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAsXG4gICAqIGFuZCB0aGUgZ2VuZXJvdXMgb25lLiBFdmVyeXRoaW5nIGl0IHBheXMgZm9yIGlzIG91dHNpZGUgT2JzaWRpYW4ncyBjb250cm9sOlxuICAgKiB0aGUgV2ViVmlldyByZWxvYWRpbmcsIGFuZCBhIGd1ZXN0IHRoYXQgbWF5IHN0aWxsIGJlIG9wdGltaXppbmcgcGFja2FnZXMuXG4gICAqIEtlZXBpbmcgaXQgc2VwYXJhdGUgaXMgdGhlIHBvaW50IG9mIHRoZSBzcGxpdCBcdTIwMTQgdGhlIG9sZCBzaW5nbGUgd2FsbCBjbG9ja1xuICAgKiBzdGFydGVkIGhlcmUgYW5kIGxlZnQgdGhlIHRpZ2h0IGxheW91dCBidWRnZXQgcGF5aW5nIGZvciBhIGNvbGQgc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBTdGFydGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHRoZSBhcHAgdG8gc3RhcnQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZSh7XG4gICAgICBpc1NhdGlzZmllZDogY2hlY2tBcHBTdGFydGVkLFxuICAgICAgcGhhc2U6ICdhcHAtc3RhcnQnLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGlzIGB0cnVlYCBpbiB0aGUgV2ViVmlldy5cbiAgICpcbiAgICogVGhlICoqc2Vjb25kKiogYnVkZ2V0LCBhbmQgdGhlIHRpZ2h0IG9uZTogYnkgdGhlIHRpbWUgaXQgc3RhcnRzLCB0aGUgYXBwIGlzXG4gICAqIGFscmVhZHkgdXAsIHNvIGFsbCBpdCBjb3ZlcnMgaXMgT2JzaWRpYW4gb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmdcbiAgICogcGx1Z2lucyBcdTIwMTQgfjFzIGluIHByYWN0aWNlLCBcdTIyNjQ4LjRzIHVuZGVyIGhlYXZ5IGhvc3Qgc3RyZXNzICgqKkwxOSoqKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIGxheW91dCByZWFkeSAodGltZW91dD0ke1N0cmluZyh0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGFydHVwTWlsZXN0b25lKHtcbiAgICAgIGlzU2F0aXNmaWVkOiBjaGVja0xheW91dFJlYWR5LFxuICAgICAgcGhhc2U6ICdsYXlvdXQtcmVhZHknLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIFdlYlZpZXcgdW50aWwgYSBzdGFydHVwIHBoYXNlJ3MgbWlsZXN0b25lIGlzIHNhdGlzZmllZCwgdHJhY2tpbmdcbiAgICogdGhlIGV2aWRlbmNlIHRoYXQgdGVsbHMgYSBzbG93IE9ic2lkaWFuIGZyb20gYSBjb250ZW5kZWQgZ3Vlc3QuXG4gICAqXG4gICAqIEVhY2ggcG9sbCBjb3N0cyBleGFjdGx5IG9uZSBgYnJvd3Nlci5leGVjdXRlYCByb3VuZC10cmlwIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90XG4gICAqIGFuIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gY2FsbCwgd2hvc2UgYGdldENvbnRleHRzKClgIHJ1bnNcbiAgICogYGFkYiBzaGVsbCBjYXQgL3Byb2MvbmV0L3VuaXhgIGFuZCB3YXMgbWVhc3VyZWQgYXQgfjE3cyBwZXIgKipMMTkqKi4gVGhlXG4gICAqIHJvdW5kLXRyaXAgaXMgdGltZWQsIGFuZCB0aGUgc2xvd2VzdCBvbmUgaXMgcmVwb3J0ZWQgb24gdGltZW91dDogYSBwaGFzZVxuICAgKiB0aGF0IHJhbiBvdXQgYWZ0ZXIgYSBoYW5kZnVsIG9mIHByb2JlcyBlYWNoIHRha2luZyB0ZW5zIG9mIHNlY29uZHMgd2FzXG4gICAqIHN0YXJ2ZWQgYnkgdGhlIGd1ZXN0LCBub3QgYnkgT2JzaWRpYW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGhhc2UsIGl0cyBidWRnZXQsIGFuZCB0aGUgcHJlZGljYXRlIHRoYXQgZW5kcyBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUocGFyYW1zOiBXYWl0Rm9yU3RhcnR1cE1pbGVzdG9uZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaXNTYXRpc2ZpZWQsIHBoYXNlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIGxldCBmdXJ0aGVzdE1pbGVzdG9uZTogQXBwU3RhcnR1cE1pbGVzdG9uZSA9ICduby13ZWJ2aWV3JztcbiAgICBsZXQgcG9sbENvdW50ID0gMDtcbiAgICBsZXQgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gMDtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IHJvdW5kVHJpcFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG1pbGVzdG9uZSA9IGNsYXNzaWZ5QXBwU3RhcnR1cFByb2JlKGF3YWl0IHRoaXMucHJvYmVTdGFydHVwKCkpO1xuICAgICAgY29uc3Qgcm91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpIC0gcm91bmRUcmlwU3RhcnQ7XG5cbiAgICAgIHBvbGxDb3VudCsrO1xuICAgICAgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gTWF0aC5tYXgoc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzLCByb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyk7XG4gICAgICBpZiAoY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzKG1pbGVzdG9uZSwgZnVydGhlc3RNaWxlc3RvbmUpID4gMCkge1xuICAgICAgICBmdXJ0aGVzdE1pbGVzdG9uZSA9IG1pbGVzdG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU2F0aXNmaWVkKG1pbGVzdG9uZSkpIHtcbiAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIHNhdGlzZmllZCBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zICgke1N0cmluZyhwb2xsQ291bnQpfSBwcm9iZShzKSkuYCk7XG4gICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2coXG4gICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIG5vdCBzYXRpc2ZpZWQgeWV0OiAke21pbGVzdG9uZX0gYFxuICAgICAgICAgICsgYChlbGFwc2VkPSR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMsIHJvdW5kLXRyaXA9JHtTdHJpbmcocm91bmRUcmlwSW5NaWxsaXNlY29uZHMpfW1zKS4gUmV0cnlpbmcuLi5gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGVsYXkoTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRTdGFydHVwVGltZW91dE1lc3NhZ2Uoe1xuICAgICAgZWxhcHNlZEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICBtaWxlc3RvbmU6IGZ1cnRoZXN0TWlsZXN0b25lLFxuICAgICAgcGhhc2UsXG4gICAgICBwb2xsQ291bnQsXG4gICAgICBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmF1bHQgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBwYXRoIHNlZ21lbnQgKHZhdWx0IGRpcmVjdG9yeSBuYW1lKS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YXVsdFBhdGgucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICBjb25zdCBsYXN0U2VwYXJhdG9yID0gTWF0aC5tYXgobm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycpLCBub3JtYWxpemVkLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShsYXN0U2VwYXJhdG9yICsgMSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUE0Q0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGNBQWM7QUFDdkIsU0FBUyxZQUFZO0FBZ0JyQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsOENBQThDO0FBQ3ZEO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxxQkFBcUI7QUFDOUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyxXQUFXO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUywyQkFBMkI7QUFtSHBDLE1BQU0sWUFBWTtBQUNsQixNQUFNLHVCQUF1QjtBQUM3QixN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
|
|
768
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBhdmROYW1lOiAnb2JzaWRpYW5fdGVzdCcsXG4gKiAgIH0sXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBGb3IgQnJvd3NlclN0YWNrLCBzZXQgYGFwcGl1bVVybGAgdG8gdGhlIEJyb3dzZXJTdGFjayBodWIgVVJMXG4gKiBcdTIwMTQgdGhlIHRyYW5zcG9ydCBpdHNlbGYgaXMgaHViLWFnbm9zdGljLlxuICpcbiAqICMjIEhvdyB2YXVsdCByZWdpc3RyYXRpb24gd29ya3Mgb24gbW9iaWxlXG4gKlxuICogT2JzaWRpYW4gTW9iaWxlIHN0b3JlcyBpdHMgdmF1bHQgcmVnaXN0cnkgaW4gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYDpcbiAqXG4gKiAtIGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCBcdTIwMTQgSlNPTiBhcnJheSBvZiByZWdpc3RlcmVkIHZhdWx0IHBhdGhzXG4gKiAtIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgIFx1MjAxNCB0aGUgY3VycmVudGx5IGFjdGl2ZSB2YXVsdCBwYXRoXG4gKiAtIGBlbmFibGUtcGx1Z2luLTx2YXVsdFBhdGg+YCBcdTIwMTQgYFwidHJ1ZVwiYCB0byBlbmFibGUgdGhlIHBsdWdpbiBzeXN0ZW0gZm9yIHRoZSB2YXVsdFxuICpcbiAqIFRvIHJlZ2lzdGVyIGEgdmF1bHQgcHJvZ3JhbW1hdGljYWxseSAod2l0aG91dCBVSSBpbnRlcmFjdGlvbik6XG4gKlxuICogMS4gUHVzaCB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIChlLmcuIGAvc2RjYXJkL0RvY3VtZW50cy88TmFtZT4vLm9ic2lkaWFuL2FwcC5qc29uYClcbiAqIDIuIFN3aXRjaCB0byBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dFxuICogMy4gU2V0IHRoZSBsb2NhbFN0b3JhZ2UgZW50cmllc1xuICogNC4gQ2FsbCBgbG9jYXRpb24ucmVsb2FkKClgIFx1MjAxNCBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICpcbiAqIFRoaXMgYXZvaWRzIHRoZSBvbmJvYXJkaW5nIGZsb3cgZW50aXJlbHkuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBCcm93c2VyIH0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgcm0sXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwU3RhcnR1cE1pbGVzdG9uZSxcbiAgQXBwU3RhcnR1cFBoYXNlLFxuICBTdGFydHVwUHJvYmVSZXN1bHRcbn0gZnJvbSAnLi9hcHAtc3RhcnR1cC1wcm9ncmVzcy5tanMnO1xuaW1wb3J0IHR5cGUgeyBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyB9IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE1vYmlsZUlucHV0RW52ZWxvcGUgfSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb25zb2xlQ2FwdHVyZUhhbmRsZSxcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlZpZXdDZHBDb25uZWN0aW9uIH0gZnJvbSAnLi93ZWJ2aWV3LWNkcC5tanMnO1xuXG5pbXBvcnQge1xuICBidWlsZFN0YXJ0dXBUaW1lb3V0TWVzc2FnZSxcbiAgY2hlY2tBcHBTdGFydGVkLFxuICBjaGVja0xheW91dFJlYWR5LFxuICBjbGFzc2lmeUFwcFN0YXJ0dXBQcm9iZSxcbiAgY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzXG59IGZyb20gJy4vYXBwLXN0YXJ0dXAtcHJvZ3Jlc3MubWpzJztcbmltcG9ydCB7XG4gIGRlY29kZUJhc2U2NFBuZyxcbiAgaXNQbmdcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuL2Vycm9yLXRvLXN0cmluZy5tanMnO1xuaW1wb3J0IHtcbiAgRXZhbENhcEV4Y2VlZGVkRXJyb3IsXG4gIGlzU2NyaXB0VGltZW91dEVycm9yXG59IGZyb20gJy4vZXZhbC1jYXAtZXhjZWVkZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTIH0gZnJvbSAnLi9ldmFsLWNhcC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgVEVNUF9WQVVMVF9ESVJfUFJFRklYIH0gZnJvbSAnLi9sZWZ0b3Zlci1jbGVhbnVwLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbixcbiAgYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uLFxuICBjaGVja0lucHV0Q2xhaW1HcmFudGVkLFxuICBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICB0b0NkcElucHV0Q29tbWFuZHNcbn0gZnJvbSAnLi9tb2JpbGUtaW5wdXQubWpzJztcbmltcG9ydCB7IGNvbm5lY3RUb1dlYlZpZXdDZHAgfSBmcm9tICcuL3dlYnZpZXctY2RwLm1qcyc7XG5cbi8qKlxuICogU2Vzc2lvbiBjb25uZWN0aW9uIGluZm8gcmV0dXJuZWQgYnkge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mb30sXG4gKiB1c2VkIHRvIHJlYXR0YWNoIGZyb20gYW5vdGhlciBwcm9jZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtL1dlYkRyaXZlciBzZXNzaW9uIElELlxuICAgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIEFwcGl1bSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwaXVtVHJhbnNwb3J0Q29uZmlnIHtcbiAgLyoqXG4gICAqIEFwcCBwYWNrYWdlIChBbmRyb2lkKSBvciBidW5kbGUgSUQgKGlPUykuXG4gICAqIERlZmF1bHRzIHRvIGAnbWQub2JzaWRpYW4nYC5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgT2JzaWRpYW4gTW9iaWxlIHRvIGdldCBhcyBmYXIgYXMgYGdsb2JhbFRoaXMuYXBwYFxuICAgKiBleGlzdGluZyBhZnRlciB0aGUgdmF1bHQgaXMgKHJlKW9wZW5lZCwgYmVmb3JlIHRoZSB0aWdodGVyXG4gICAqIHtAbGluayBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc30gY2xvY2sgc3RhcnRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTgwMDAwYFxuICAgKi9cbiAgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBBcHBpdW0gYnJvd3Nlci9kcml2ZXIgaW5zdGFuY2UuXG4gICAqIENyZWF0ZWQgYnkgdGhlIGNvbnN1bWVyIHZpYSBlLmcuIFdlYkRyaXZlcklPJ3MgYHJlbW90ZSgpYC5cbiAgICovXG4gIGJyb3dzZXI6IEJyb3dzZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgVURJRCAoZS5nLiBgJ2VtdWxhdG9yLTU1NTQnYCkuXG4gICAqIFVzZWQgZm9yIGBhZGJgIGNvbW1hbmRzIHdoZW4gcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICAgKi9cbiAgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBvd25zIHRoZSBBcHBpdW0gc2Vzc2lvbiBhbmQgc2hvdWxkIGRlbGV0ZSBpdCBvblxuICAgKiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0LmRpc3Bvc2V9LlxuICAgKlxuICAgKiBgdHJ1ZWAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgdmlhIGByZW1vdGUoKWAgKGdsb2JhbCBzZXR1cCkuXG4gICAqIGBmYWxzZWAgZm9yIHNlc3Npb25zIHJlYXR0YWNoZWQgdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycykuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgaXNTZXNzaW9uT3duZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgLCBjb3VudGVkXG4gICAqIGZyb20gdGhlIG1vbWVudCB7QGxpbmsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHN9IGlzIHNhdGlzZmllZCBcdTIwMTQgbm90IGZyb21cbiAgICogdGhlIHJlbG9hZCwgc28gYSBjb2xkIGFwcCBzdGFydCBpcyBub3QgY2hhcmdlZCBhZ2FpbnN0IGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgOTAwMDBgXG4gICAqL1xuICBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGFyZ2V0IHBsYXRmb3JtLiBEZXRlcm1pbmVzIFdlYlZpZXcgY29udGV4dCBuYW1pbmcgYW5kIGRldmljZSBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuXG4gIC8qKlxuICAgKiBUaGUgcGVyLXNjcmlwdCBjYXAsIGluIG1pbGxpc2Vjb25kcywgdGhpcyBzZXNzaW9uIHdhcyBnaXZlbiBhcyBpdHMgVzNDXG4gICAqIGB0aW1lb3V0cy5zY3JpcHRgIGNhcGFiaWxpdHkuXG4gICAqXG4gICAqIENhcnJpZWQgb25seSBzbyBhIHNjcmlwdCB0aW1lb3V0IGNhbiBiZSByZXBvcnRlZCB3aXRoIHRoZSBudW1iZXIgdGhhdFxuICAgKiBwcm9kdWNlZCBpdDsgdGhlIGNhcGFiaWxpdHkgaXRzZWxmIGlzIHNldCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAzMDAwMGBcbiAgICovXG4gIHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciByZWdpc3RlcmluZyBhIHZhdWx0IGFsc28gcHJ1bmVzIHRoZSAqKm90aGVyKiogYHRlbXAtdmF1bHQtKmBcbiAgICogcmVnaXN0cmF0aW9ucyBlYXJsaWVyIHJ1bnMgbGVmdCBpbiBPYnNpZGlhbiBNb2JpbGUncyBgbG9jYWxTdG9yYWdlYC5cbiAgICpcbiAgICogVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyAoc2VlIHRoZVxuICAgKiBmYWN0b3J5KTsgdGhpcyByZW1vdmVzIHRoZWlyIG5vdy1kYW5nbGluZyByZWdpc3RyeSBlbnRyaWVzLCB3aGljaCBhcmUgd2hhdFxuICAgKiBPYnNpZGlhbiBhY3R1YWxseSBlbnVtZXJhdGVzIGF0IHN0YXJ0dXAuIFVucmVnaXN0ZXJpbmcgdGhpcyBydW4ncyBvd24gdmF1bHRcbiAgICogaXMgdW5hZmZlY3RlZCBcdTIwMTQgdGhhdCBhbHdheXMgaGFwcGVucy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICBzaG91bGRTd2VlcExlZnRvdmVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwXzAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IERFRkFVTFRfTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA5MF8wMDA7XG5jb25zdCBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTgwXzAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5jb25zdCBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLypcbiAqIEV4dHJhIGJ1ZGdldCBncmFudGVkIHRvIHRoZSBPTkUgZXZhbCB0aGF0IGZvbGxvd3MgYSBjYXAgb3ZlcnJ1biwgb24gdG9wIG9mIHRoZSBjYXAgaXRzZWxmLiBUaGVcbiAqIGFiYW5kb25lZCBjbG9zdXJlIGtlZXBzIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvIHRoZSBuZXh0XG4gKiBjb21tYW5kIHdhaXRzIG91dCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTaXplZCBhdCB0aGUgZGVmYXVsdCBjYXAgYWdhaW4gXHUyMDE0IGRlcml2ZWQgZnJvbSBpdCByYXRoZXIgdGhhblxuICogcmVzdGF0ZWQsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IFx1MjAxNCB3aGljaCBpcyBhIHByYWdtYXRpYyBjZWlsaW5nIHJhdGhlciB0aGFuIGEgcHJvb2Y6IGEgY2xvc3VyZSBjYW5cbiAqIG91dHJ1biBhbnkgbnVtYmVyIHBpY2tlZCBoZXJlLiBJdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGEgcHJvb2YsIGJlY2F1c2UgYSBndWVzdCB0aGF0IGlzIHN0aWxsIGJ1c3kgYWZ0ZXJcbiAqIGl0IHNpbXBseSBwcm9kdWNlcyBhbm90aGVyIG92ZXJydW4gb24gdGhlIG5leHQgZXZhbCwgd2hpY2ggaXMgZ3JhbnRlZCB0aGUgZ3JhY2UgaW4gdHVybiBcdTIwMTQgc28gdGhlIHNlc3Npb25cbiAqIHJlY292ZXJzIG92ZXIgc3VjY2Vzc2l2ZSBldmFscyBpbnN0ZWFkIG9mIGNvbXBvdW5kaW5nLCBhbmQgZXZlcnkgb25lIG9mIHRob3NlIGV2YWxzIHJlcG9ydHMgdGhlIHNhbWVcbiAqIGhvbmVzdCBkaWFnbm9zaXMuXG4gKi9cbmNvbnN0IENBUF9SRUNPVkVSWV9HUkFDRV9JTl9NSUxMSVNFQ09ORFMgPSBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcblxuLy8gLS0tIENvbnNvbGUgY2FwdHVyZSAoTGF5ZXIgMiBvZiB0aGUgcGx1Z2luLWxvYWQgZXJyb3Igc3VyZmFjaW5nKSAtLS1cbi8qKlxuICogVGhlIGBsb2djYXRgIHRhZyBzdGFtcGVkIGF0IGNhcHR1cmUgc3RhcnQsIGFuZCB0aGUgcHJlZml4IG9mIHRoZSB1bmlxdWUgbWFya2VyIHdyaXR0ZW4gdW5kZXIgaXQuXG4gKlxuICogUHJvY2Vzcy1sb2NhbCByYXRoZXIgdGhhbiBhIHByb3RvY29sOiBgYmVnaW5Db25zb2xlQ2FwdHVyZWAgd3JpdGVzIGl0IGFuZCBgcmVhZENvbnNvbGVDYXB0dXJlU2luY2VgIHNlYXJjaGVzIHRoZSBkdW1wIGZvclxuICogdGhlIHNhbWUgc3RyaW5nLCBib3RoIGZyb20gdGhpcyBjb25zdGFudCwgc28gdGhlIHZhbHVlIGlzIGZyZWUgdG8gY2hhbmdlLiBJdCBvbmx5IGhhcyB0byBiZSB1bmxpa2VseSB0byBvY2N1ciBpbiBhblxuICogdW5yZWxhdGVkIGxvZyBsaW5lLlxuICovXG5jb25zdCBDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBRyA9ICdPQlNJRElBTl9JTlRFR1JBVElPTl9URVNUSU5HX0NBUFRVUkUnO1xuY29uc3QgQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBREJfTE9HX01BUktFUl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBMT0dDQVRfRFVNUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbi8qKlxuICogYGFkYiBsb2djYXQgLXYgdGltZWAgbGluZXMgbG9vayBsaWtlIGBNTS1ERCBISDpNTTpTUy5tbW0gTEVWRUwvVEFHKCBQSUQpOiBtZXNzYWdlYC5cbiAqIEtlZXAgb25seSB0aGUgdGFncyBDaHJvbWl1bS9XZWJWaWV3IHJvdXRlcyBKUyBgY29uc29sZS4qYCBvdXRwdXQgYW5kIHVuY2F1Z2h0XG4gKiBlcnJvcnMgdG8gKGBjaHJvbWl1bWAsIHRoZSBDYXBhY2l0b3IgY29uc29sZSBicmlkZ2UsIGFuZCBuYXRpdmUgYEFuZHJvaWRSdW50aW1lYCkuXG4gKi9cbmNvbnN0IENPTlNPTEVfQ0FQVFVSRV9UQUdfUkUgPSAvXFwvKD86Y2hyb21pdW18QW5kcm9pZFJ1bnRpbWV8Q2FwYWNpdG9yXFwvQ29uc29sZSlcXCgvO1xuXG4vKipcbiAqIEJhc2UgcGF0aCBvbiBhbiBBbmRyb2lkIGRldmljZSB3aGVyZSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMuXG4gKlxuICogRXhwb3J0ZWQgYmVjYXVzZSB0aGUgdHJhbnNwb3J0IGZhY3Rvcnkgc3dlZXBzIGxlZnRvdmVyIHZhdWx0cyBmcm9tIGl0IGJlZm9yZVxuICogYSB0cmFuc3BvcnQgZXhpc3RzIChzZWUgdGhlIHJlcG8ncyBMMzEpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCA9ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSCxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnQud2FpdEZvclN0YXJ0dXBNaWxlc3RvbmV9LlxuICovXG5pbnRlcmZhY2UgV2FpdEZvclN0YXJ0dXBNaWxlc3RvbmVQYXJhbXMge1xuICAvKipcbiAgV2hldGhlciB0aGUgbWlsZXN0b25lIGp1c3Qgb2JzZXJ2ZWQgZW5kcyB0aGlzIHBoYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNTYXRpc2ZpZWQ6IChtaWxlc3RvbmU6IEFwcFN0YXJ0dXBNaWxlc3RvbmUpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBwaGFzZSBiZWluZyB3YWl0ZWQgb3V0LCBuYW1lZCBpbiB0aGUgbG9nIGFuZCBpbiB0aGUgdGltZW91dCBtZXNzYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGhhc2U6IEFwcFN0YXJ0dXBQaGFzZTtcblxuICAvKipcbiAgVGhpcyBwaGFzZSdzIGJ1ZGdldC5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCBoYW5kbGVyIHRoYXQgdGVhcnMgdGhlIGNoYW5uZWwgZG93biB3aGVuIG5vdGhpbmcgZWxzZSB3aWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0OiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBob3N0IGhhbGYgb2YgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbDogYSBDRFAgY29ubmVjdGlvbiB0byB0aGUgV2ViVmlldywgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAqIEFwcGl1bSBzZXNzaW9uLCBvcGVuZWQgbGF6aWx5IG9uIGZpcnN0IGV2YWx1YXRlIGFuZCByZXVzZWQgKHNlZSAqKkwzOSoqKS5cbiAgICovXG4gIHByaXZhdGUgaW5wdXRDaGFubmVsOiBudWxsIHwgV2ViVmlld0NkcENvbm5lY3Rpb24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXQgb25jZSB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlzIGtub3duIG5vdCB0byBiZSBvcGVuYWJsZSBoZXJlIChpT1MsIGEgcmVtb3RlIGh1Yiwgbm8gbG9jYWxcbiAgICogYGFkYmApLCBzbyB0aGUgYXR0ZW1wdCBpcyBub3QgcmVwZWF0ZWQgb24gZXZlcnkgZXZhbHVhdGUuXG4gICAqL1xuICBwcml2YXRlIGlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFRyYWNrcyB3aGV0aGVyIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHN3aXRjaGVkIHRvIHRoZSBXZWJWaWV3IGNvbnRleHQuXG4gICAqXG4gICAqIFNldCB0byBgdHJ1ZWAgYWZ0ZXIgYSBzdWNjZXNzZnVsIGBzd2l0Y2hDb250ZXh0KFdFQlZJRVdfbWQub2JzaWRpYW4pYC5cbiAgICogUmVzZXQgdG8gYGZhbHNlYCB3aGVuIHRoZSBjb250ZXh0IGlzIGtub3duIHRvIGJlIGludmFsaWRhdGVkXG4gICAqIChlLmcuIGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAgaW4ge0BsaW5rIHJlZ2lzdGVyVmF1bHR9KS5cbiAgICpcbiAgICogV2hlbiBgdHJ1ZWAsIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gc2tpcHMgdGhlIGV4cGVuc2l2ZVxuICAgKiBgZ2V0Q29udGV4dHMoKWAgY2FsbCAod2hpY2ggcnVucyBgYWRiIHNoZWxsIGNhdCAvcHJvYy9uZXQvdW5peGAgYW5kXG4gICAqIGNhbiB0aW1lIG91dCBvbiBzbG93IGVtdWxhdG9ycykuXG4gICAqL1xuICBwcml2YXRlIGlzSW5XZWJWaWV3Q29udGV4dCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwcmV2aW91cyBldmFsIGVuZGVkIGluIGEgY2FwIG92ZXJydW4sIHNvIHRoZSBuZXh0IG9uZSBpcyBvd2VkIHRoZSByZWNvdmVyeSBncmFjZS5cbiAgICpcbiAgICogVGhlIGFiYW5kb25lZCBjbG9zdXJlIGlzIHN0aWxsIHJ1bm5pbmcgaW4gdGhlIGd1ZXN0LCBhbmQgQXBwaXVtIHNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIHNvXG4gICAqIHRoZSBuZXh0IGNvbW1hbmQgcXVldWVzIGJlaGluZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIGl0LiBTZWUge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZVdpdGhpbkNhcH0uXG4gICAqL1xuICBwcml2YXRlIGlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc1Nlc3Npb25Pd25lcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRTd2VlcExlZnRvdmVyczogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5pc1Nlc3Npb25Pd25lciA9IGNvbmZpZy5pc1Nlc3Npb25Pd25lciA/PyB0cnVlO1xuICAgIHRoaXMubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcubGF5b3V0UmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnBsYXRmb3JtID0gY29uZmlnLnBsYXRmb3JtO1xuICAgIHRoaXMuYXBwSWQgPSBjb25maWcuYXBwSWQgPz8gREVGQVVMVF9BUFBfSUQ7XG4gICAgdGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FQUF9TVEFSVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzID0gY29uZmlnLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLnNob3VsZFN3ZWVwTGVmdG92ZXJzID0gY29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzID8/IHRydWU7XG4gICAgdGhpcy52YXVsdEJhc2VQYXRoID0gY29uZmlnLnZhdWx0QmFzZVBhdGggPz8gREVGQVVMVF9WQVVMVF9CQVNFX1BBVEhbdGhpcy5wbGF0Zm9ybV0gPz8gREVGQVVMVF9BTkRST0lEX1ZBVUxUX0JBU0VfUEFUSDtcbiAgICB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBjb25maWcud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbnMgYSBjb25zb2xlIGNhcHR1cmUgYnkgc3RhbXBpbmcgdGhlIGRldmljZSBsb2cgd2l0aCBhIHVuaXF1ZSBtYXJrZXIuXG4gICAqXG4gICAqIFVzZXMgYGFkYiBzaGVsbCBsb2dgIHRvIHdyaXRlIGEgbWFya2VyIGludG8gYGxvZ2NhdGAgYXQgY2FwdHVyZSBzdGFydCBzbyBhXG4gICAqIGxhdGVyIHtAbGluayBBcHBpdW1UcmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2V9IGNhbiBzbGljZSBvdXRcbiAgICogZXZlcnl0aGluZyB0aGUgV2ViVmlldyBsb2dnZWQgYWZ0ZXJ3YXJkcyBcdTIwMTQgd2l0aG91dCB0aGUgaW52YXNpdmUgYGxvZ2NhdCAtY2BcbiAgICogYnVmZmVyIGNsZWFyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGhhbmRsZSBjYXJyeWluZyB0aGUgdW5pcXVlIG1hcmtlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWdpbkNvbnNvbGVDYXB0dXJlKCk6IFByb21pc2U8Q29uc29sZUNhcHR1cmVIYW5kbGU+IHtcbiAgICBjb25zdCBtYXJrZXIgPSBgJHtDT05TT0xFX0NBUFRVUkVfTUFSS0VSX1RBR31fJHtyYW5kb21VVUlEKCl9YDtcbiAgICBhd2FpdCBleGVjKFxuICAgICAgWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbG9nJywgJy10JywgQ09OU09MRV9DQVBUVVJFX01BUktFUl9UQUcsIG1hcmtlcl0sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9MT0dfTUFSS0VSX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuICAgIHJldHVybiB7IG1hcmtlciB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmVzIGEgUE5HIHNjcmVlbnNob3Qgb2YgdGhlIGRldmljZSdzIHNjcmVlbi5cbiAgICpcbiAgICogVGhlIGltYWdlIGlzIGFsd2F5cyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGZyYW1lYnVmZmVyIFx1MjAxNCB0aGVyZSBpcyBubyBtb2JpbGVcbiAgICogZXF1aXZhbGVudCBvZiB0aGUgZGVza3RvcCB2aWV3cG9ydCBvdmVycmlkZSwgc29cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLndpZHRoSW5QaXhlbHN9IC9cbiAgICoge0BsaW5rIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLmhlaWdodEluUGl4ZWxzfSBhcmUgaWdub3JlZC4gU2l6ZSBhIG1vYmlsZVxuICAgKiBjYXB0dXJlIGJ5IGNob29zaW5nIGFuIEFWRCB3aG9zZSBzY3JlZW4gZ2VvbWV0cnkgYWxyZWFkeSBtYXRjaGVzIHdoYXQgdGhlXG4gICAqIGltYWdlIGhhcyB0byBiZS5cbiAgICpcbiAgICogQHBhcmFtIF9wYXJhbXMgLSBDYXB0dXJlIHBhcmFtZXRlcnMuIElnbm9yZWQgb24gbW9iaWxlOiBgY3dkYCBkb2VzIG5vdCBzZWxlY3QgYSB3aW5kb3cgKHZhdWx0IHRhcmdldGluZyBpcyB2aWEgbG9jYWxTdG9yYWdlKSwgYW5kIHRoZSBzaXplIGNhbm5vdCBiZSBvdmVycmlkZGVuLlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IFBORyBieXRlcy5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZHJpdmVyIHJldHVybnMgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjYXB0dXJlU2NyZWVuc2hvdChfcGFyYW1zOiBDYXB0dXJlU2NyZWVuc2hvdFBhcmFtcyk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0UG5nKGF3YWl0IHRoaXMuYnJvd3Nlci50YWtlU2NyZWVuc2hvdCgpKTtcbiAgICBpZiAoIWlzUG5nKGJ5dGVzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHBpdW0gc2NyZWVuc2hvdCBlcnJvcjogdGFrZVNjcmVlbnNob3QgcmV0dXJuZWQgZGF0YSB0aGF0IGlzIG5vdCBhIFBORy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogRW5kcyB0aGUgQXBwaXVtIHNlc3Npb24uXG4gICAqXG4gICAqIE9ubHkgZGVsZXRlcyB0aGUgc2Vzc2lvbiBpZiB0aGlzIHRyYW5zcG9ydCBvd25zIGl0LiBUcmFuc3BvcnRzIGNyZWF0ZWRcbiAgICogdmlhIGBhdHRhY2goKWAgKHRlc3Qgd29ya2VycyByZXVzaW5nIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uKSBza2lwXG4gICAqIGRlbGV0aW9uIHNvIHRoZSBzZXNzaW9uIHJlbWFpbnMgYXZhaWxhYmxlIGZvciB0aGUgb3duaW5nIHByb2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWwoKTtcblxuICAgIGlmICh0aGlzLmlzU2Vzc2lvbk93bmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZGVsZXRlU2Vzc2lvbigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlcnMuXG4gICAqXG4gICAqIE9ubHkgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCBuZWVkcyBpdDogdGhlIEFwcGl1bSBzZXNzaW9uIGlzIHRoZSBvd25pbmcgcHJvY2VzcydzIHRvIGVuZCwgYW5kIGFuXG4gICAqIGFicnVwdCBleGl0IGlzIGV4YWN0bHkgd2hlbiB0aGUgYXN5bmMge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlfSBuZXZlciBydW5zIFx1MjAxNCB3aGljaCB3b3VsZCBzdHJhbmRcbiAgICogdGhlIGFkYiBwb3J0IGZvcndhcmQgb24gdGhlIGRldmljZS5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlU3luYygpOiB2b2lkIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5pbnB1dENoYW5uZWw7XG4gICAgdGhpcy5pbnB1dENoYW5uZWwgPSBudWxsO1xuICAgIHRoaXMudW5yZWdpc3RlcklucHV0Q2hhbm5lbEV4aXRIYW5kbGVyKCk7XG4gICAgY2hhbm5lbD8uZGlzcG9zZVN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgX29wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbnB1dENoYW5uZWwoKTtcblxuICAgIHRyeSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGNhcCBpcyBlbmZvcmNlZCBIRVJFLCBvbiB0aGUgTm9kZSBzaWRlLCBhbmQgbm90IGJ5IHRoZSBgdGltZW91dHMuc2NyaXB0YCBjYXBhYmlsaXR5IHRoZVxuICAgICAgICogU2Vzc2lvbiBhbHNvIGRlY2xhcmVzLiBNZWFzdXJlZCBvbiBhIGxpdmUgZW11bGF0b3I6IHRoZSBjYXBhYmlsaXR5IGlzIGFjY2VwdGVkIGFuZCByZWFkc1xuICAgICAgICogQmFjayBhcyAzMDAwMCBpbiB0aGUgV2ViVmlldyBjb250ZXh0LCBhbmQgbm90aGluZyBldmVyIGVuZm9yY2VzIGl0IFx1MjAxNCBvdmVyLWNhcCBjbG9zdXJlcyBpbiBib3RoIHRoZVxuICAgICAgICogU2xlZXBpbmcgYW5kIHRoZSBzcGlubmluZyBzaGFwZSwgd2l0aCBhbmQgd2l0aG91dCBhbiBleHBsaWNpdCBgc2V0VGltZW91dHNgLCByYW4gcGFzdCBhIDYwcyBjZWlsaW5nXG4gICAgICAgKiBXaXRob3V0IFdlYkRyaXZlciByYWlzaW5nIGBzY3JpcHQgdGltZW91dGAgZXZlbiBvbmNlLiBXaGF0IGFjdHVhbGx5IGhhcHBlbnMgcGFzdCByb3VnaGx5IGhhbGYgYVxuICAgICAgICogTWludXRlIGlzIHdvcnNlIHRoYW4gYSBsYXRlIGFuc3dlcjogdGhlIGNsb3N1cmUgQ09NUExFVEVTIGluIHRoZSBndWVzdCBvbiBzY2hlZHVsZSAodGltZXJzIGFybWVkIGF0XG4gICAgICAgKiAzMHMgYW5kIDQwcyBmaXJlZCB3aXRoaW4gfjEzbXMgb2Ygbm9taW5hbCwgb24gYSB2aXNpYmxlIGFuZCBmb2N1c2VkIHBhZ2UpIGFuZCBpdHMgRXhlY3V0ZSBTY3JpcHRcbiAgICAgICAqIFJlc3BvbnNlIG5ldmVyIHJlYWNoZXMgdGhpcyBjbGllbnQgXHUyMDE0IHNvIHRoZSBwcm9taXNlIGJlbG93IHNpbXBseSBuZXZlciBzZXR0bGVzLlxuICAgICAgICpcbiAgICAgICAqIEEgaGFuZyBpcyB0aGUgb25lIGZhaWx1cmUgbW9kZSBhIHRlc3QgYXV0aG9yIGNhbm5vdCBhY3Qgb24sIHNvIHRoZSB3YWl0IGlzIGJvdW5kZWQgaGVyZS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ldmFsdWF0ZVdpdGhpbkNhcChgcmV0dXJuICgke2V4cHJlc3Npb259KWApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQgfHwgcmVzdWx0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBOT19PVVRQVVQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBIGNhcCBvdmVycnVuIGlzIHRoZSBvbmUgZmFpbHVyZSBoZXJlIHRoYXQgc2F5cyBub3RoaW5nIGFib3V0IHRoZSBjb250ZXh0OiB0aGUgY2xvc3VyZSBvdXRzdGF5ZWRcbiAgICAgICAqIEl0cyBidWRnZXQsIHRoZSBXZWJWaWV3IGlzIHN0aWxsIHRoZSBXZWJWaWV3LiBSZXNldHRpbmcgdGhlIGZsYWcgd291bGQgY2hhcmdlIHRoZSBORVhUIGV2YWwgYVxuICAgICAgICogfjE3cyBgc3dpdGNoQ29udGV4dGAgKCoqTDE5KiopIHRvIHJlY292ZXIgZnJvbSBzb21ldGhpbmcgdGhhdCB3YXMgbmV2ZXIgbG9zdC5cbiAgICAgICAqL1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXZhbENhcEV4Y2VlZGVkRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnRleHQgbWF5IGhhdmUgYmVlbiBsb3N0IG1pZC1leGVjdXRpb24gKGUuZy4gcGFnZSByZWxvYWQpLlxuICAgICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgICAgLypcbiAgICAgICAqIEtlcHQgYXMgYSBmYXN0IHBhdGggZXZlbiB0aG91Z2ggdGhpcyBkcml2ZXIgd2FzIG1lYXN1cmVkIG5ldmVyIHJhaXNpbmcgaXQ6IGl0IGNvc3RzIG5vdGhpbmcsXG4gICAgICAgKiBJdCBpcyB0aGUgY29ycmVjdCB0cmFuc2xhdGlvbiBpZiBhIGZ1dHVyZSBkcml2ZXIgZG9lcyBlbmZvcmNlIHRoZSBjYXBhYmlsaXR5LCBhbmQgaXQga2VlcHMgdGhlIHR3b1xuICAgICAgICogVHJhbnNwb3J0cyByZXBvcnRpbmcgb25lIGVycm9yIGZvciBvbmUgY29uZGl0aW9uLlxuICAgICAgICovXG4gICAgICBpZiAoaXNTY3JpcHRUaW1lb3V0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBvcHRpb25OYW1lOiAnc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uIGNvbm5lY3Rpb24gaW5mbyBuZWVkZWQgdG8gcmVhdHRhY2ggdG8gdGhpcyBzZXNzaW9uXG4gICAqIGZyb20gYW5vdGhlciBwcm9jZXNzIChlLmcuIGEgdGVzdCB3b3JrZXIpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBJRCBhbmQgZGV2aWNlIElELlxuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb25JbmZvKCk6IEFwcGl1bVNlc3Npb25JbmZvIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuYnJvd3Nlci5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuYWN0aXZhdGVBcHAodGhpcy5hcHBJZCk7XG4gICAgICBhd2FpdCBkZWxheShBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcbiAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB2YXVsdCBmaWxlcyB0byB0aGUgZGV2aWNlIHZpYSBjb21wcmVzc2VkIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIENyZWF0ZXMgYSB0YXIuZ3ogYXJjaGl2ZSBvZiB0aGUgbG9jYWwgdmF1bHQgZGlyZWN0b3J5LCBwdXNoZXMgaXQgdG8gdGhlXG4gICAqIGRldmljZSBhcyBhIHNpbmdsZSBmaWxlLCBhbmQgZXh0cmFjdHMgaXQgaW4tcGxhY2UuIFRoaXMgYXZvaWRzIHRoZVxuICAgKiB3ZWJkcml2ZXIgYFJhbmdlRXJyb3JgIG9uIGxhcmdlIGJhc2U2NCBwYXlsb2FkcyBhbmQgaXMgc2lnbmlmaWNhbnRseVxuICAgKiBmYXN0ZXIgdGhhbiBwZXItZmlsZSBgYnJvd3Nlci5wdXNoRmlsZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoICh1c2VkIGFzIHRoZSB2YXVsdCBkaXJlY3RvcnkgbmFtZSBvbiBkZXZpY2UpLlxuICAgKiBAcGFyYW0gX2ZpbGVzIC0gTWFwIG9mIHJlbGF0aXZlIGZpbGUgcGF0aHMgdG8gY29udGVudCBidWZmZXJzICh1bnVzZWQgXHUyMDE0IGFkYiBwdXNoZXMgdGhlIGRpcmVjdG9yeSBkaXJlY3RseSkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHVzaEZpbGVzKHZhdWx0UGF0aDogc3RyaW5nLCBfZmlsZXM6IFJlY29yZDxzdHJpbmcsIFVpbnQ4QXJyYXk+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcbiAgICBjb25zdCBhcmNoaXZlTmFtZSA9IGB2YXVsdC0ke3JhbmRvbVVVSUQoKX0udGFyLmd6YDtcbiAgICBjb25zdCBsb2NhbEFyY2hpdmUgPSBqb2luKHRtcGRpcigpLCBhcmNoaXZlTmFtZSk7XG4gICAgY29uc3QgcmVtb3RlQXJjaGl2ZSA9IGAvZGF0YS9sb2NhbC90bXAvJHthcmNoaXZlTmFtZX1gO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIENyZWF0aW5nIGFyY2hpdmU6ICR7bG9jYWxBcmNoaXZlfWApO1xuICAgICAgYXdhaXQgZXhlYyhbJ3RhcicsICdjemYnLCBhcmNoaXZlTmFtZSwgJy1DJywgdmF1bHRQYXRoLCAnLiddLCB7IGN3ZDogdG1wZGlyKCksIGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFB1c2hpbmcgYXJjaGl2ZSB0byBkZXZpY2UgJHt0aGlzLmRldmljZUlkfS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdwdXNoJywgbG9jYWxBcmNoaXZlLCByZW1vdGVBcmNoaXZlXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBFeHRyYWN0aW5nIGFyY2hpdmUgb24gZGV2aWNlIGF0ICR7ZGV2aWNlVmF1bHRQYXRofS4uLmApO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdta2RpcicsICctcCcsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAndGFyJywgJ3h6ZicsIHJlbW90ZUFyY2hpdmUsICctQycsIGRldmljZVZhdWx0UGF0aF0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKCdbYXBwaXVtLXRyYW5zcG9ydF0gRmx1c2hpbmcgZmlsZXN5c3RlbSBidWZmZXJzLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3N5bmMnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBDbGVhbmluZyB1cCByZW1vdGUgYXJjaGl2ZS4uLicpO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHJtKGxvY2FsQXJjaGl2ZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRHVtcHMgYGFkYiBsb2djYXRgIGFuZCByZXR1cm5zIHRoZSBXZWJWaWV3IGNvbnNvbGUvZXJyb3Igb3V0cHV0IGxvZ2dlZFxuICAgKiBzaW5jZSB0aGUgbWFya2VyIGZyb20ge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5iZWdpbkNvbnNvbGVDYXB0dXJlfS5cbiAgICpcbiAgICogRmlsdGVycyB0byB0aGUgQ2hyb21pdW0vV2ViVmlldyB0YWdzIHRoYXQgY2FycnkgSlMgYGNvbnNvbGUuKmAgb3V0cHV0IGFuZFxuICAgKiB1bmNhdWdodCBlcnJvcnMsIGFuZCBjYXBzIHRoZSByZXN1bHQgbGVuZ3RoLiBCb3VuZGVkLCBwb3N0LWhvYyxcbiAgICogZmFpbHVyZS1wYXRoLW9ubHkgXHUyMDE0IG5ldmVyIGEgbGl2ZSBtb25pdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlIC0gVGhlIGNhcHR1cmUgaGFuZGxlIChvciBgdW5kZWZpbmVkYCB3aGVuIGNhcHR1cmUgbmV2ZXIgc3RhcnRlZCkuXG4gICAqIEByZXR1cm5zIFRoZSBjYXB0dXJlZCBjb25zb2xlL2Vycm9yIHRleHQsIG9yIGB1bmRlZmluZWRgIGlmIG5vdGhpbmcgcmVsZXZhbnQgd2FzIGxvZ2dlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWFkQ29uc29sZUNhcHR1cmVTaW5jZShoYW5kbGU6IENvbnNvbGVDYXB0dXJlSGFuZGxlIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1wID0gYXdhaXQgZXhlYyhcbiAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ2xvZ2NhdCcsICctZCcsICctdicsICd0aW1lJ10sXG4gICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IExPR0NBVF9EVU1QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICApO1xuXG4gICAgY29uc3QgbWFya2VySW5kZXggPSBkdW1wLmxhc3RJbmRleE9mKGhhbmRsZS5tYXJrZXIpO1xuICAgIGNvbnN0IHJlZ2lvbiA9IG1hcmtlckluZGV4ID09PSAtMSA/IGR1bXAgOiBkdW1wLnNsaWNlKG1hcmtlckluZGV4ICsgaGFuZGxlLm1hcmtlci5sZW5ndGgpO1xuICAgIGNvbnN0IHJlbGV2YW50ID0gcmVnaW9uXG4gICAgICAuc3BsaXQoJ1xcbicpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBDT05TT0xFX0NBUFRVUkVfVEFHX1JFLnRlc3QobGluZSkpXG4gICAgICAuam9pbignXFxuJylcbiAgICAgIC50cmltKCk7XG5cbiAgICBpZiAoIXJlbGV2YW50KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiByZWxldmFudC5zbGljZSgtQ09OU09MRV9DQVBUVVJFX1RBSUxfTUFYX0xFTkdUSCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHB1c2hpbmcgZmlsZXMgYW5kIGNvbmZpZ3VyaW5nIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogVGhlIHJlZ2lzdHJhdGlvbiBmbG93OlxuICAgKiAxLiBQdXNoIGEgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB0byB0aGUgZGV2aWNlIHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgdGhlIHZhdWx0XG4gICAqIDIuIFN3aXRjaCB0byB0aGUgV2ViVmlldyBjb250ZXh0XG4gICAqIDMuIEFkZCB0aGUgdmF1bHQgdG8gbG9jYWxTdG9yYWdlIChgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AsIGBtb2JpbGUtc2VsZWN0ZWQtdmF1bHRgLFxuICAgKiAgICBgZW5hYmxlLXBsdWdpbi08cGF0aD5gKVxuICAgKiA0LiBUcmlnZ2VyIGBsb2NhdGlvbi5yZWxvYWQoKWAgc28gT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAgICogNS4gV2FpdCBmb3IgYGdsb2JhbFRoaXMuYXBwYCB0byBleGlzdCAodGhlIGFwcCdzIGNvbGQgc3RhcnQpLCB0aGVuIFx1MjAxNCBvbiBhXG4gICAqICAgIHNlcGFyYXRlLCB0aWdodGVyIGJ1ZGdldCBcdTIwMTQgZm9yIGBhcHAud29ya3NwYWNlLmxheW91dFJlYWR5YFxuICAgKlxuICAgKiBFeGlzdGluZyB2YXVsdCByZWdpc3RyYXRpb25zIGluIGxvY2FsU3RvcmFnZSBhcmUgcHJlc2VydmVkIChhcHBlbmQsIG5vdFxuICAgKiBvdmVyd3JpdGUpIFx1MjAxNCBleGNlcHQgdGhlICoqaGFybmVzcydzIG93bioqIGB0ZW1wLXZhdWx0LSpgIHJlZ2lzdHJhdGlvbnMgZnJvbVxuICAgKiBlYXJsaWVyIHJ1bnMsIHdoaWNoIGFyZSBwcnVuZWQgd2hlbiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0Q29uZmlnLnNob3VsZFN3ZWVwTGVmdG92ZXJzfVxuICAgKiBpcyBvbi4gVGhlaXIgZGlyZWN0b3JpZXMgYXJlIGFscmVhZHkgZ29uZSAodGhlIGZhY3Rvcnkgc3dlZXBzIHRoZW0gYmVmb3JlXG4gICAqIHRoZSBhcHAgbGF1bmNoZXMpLCBhbmQgaXQgaXMgdGhpcyByZWdpc3RyeSBcdTIwMTQgbm90IHRoZSBmaWxlc3lzdGVtIFx1MjAxNCB0aGF0XG4gICAqIE9ic2lkaWFuIGVudW1lcmF0ZXMgYXQgc3RhcnR1cCwgc28gbGVhdmluZyB0aGVtIGlzIHdoYXQgbWFrZXMgZWFjaCBmYWlsZWRcbiAgICogcnVuIHNsb3cgdGhlIG5leHQgb25lIGRvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICAvLyBQdXNoIGEgbWluaW1hbCAub2JzaWRpYW4gZGlyZWN0b3J5IHNvIE9ic2lkaWFuIHJlY29nbml6ZXMgaXQgYXMgYSB2YXVsdC5cbiAgICBhd2FpdCB0aGlzLnB1c2hPYnNpZGlhbk1hcmtlcihkZXZpY2VWYXVsdFBhdGgpO1xuXG4gICAgLy8gU3dpdGNoIHRvIFdlYlZpZXcgYW5kIGNvbmZpZ3VyZSBsb2NhbFN0b3JhZ2UuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgLy8gSW52YWxpZGF0ZSBiZWZvcmUgcmVsb2FkIFx1MjAxNCB0aGUgcGFnZSB3aWxsIG5hdmlnYXRlIGFuZCB0aGUgV2ViVmlld1xuICAgIC8vIENvbnRleHQgbWF5IGJlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlIGR1cmluZyByZWxvYWQuXG4gICAgdGhpcy5pc0luV2ViVmlld0NvbnRleHQgPSBmYWxzZTtcblxuICAgIGNvbnN0IHN0YWxlUHJlZml4ID0gdGhpcy5zaG91bGRTd2VlcExlZnRvdmVycyA/IGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke1RFTVBfVkFVTFRfRElSX1BSRUZJWH1gIDogJyc7XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZShcbiAgICAgIChwYXRoOiBzdHJpbmcsIHBydW5lUHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgbGV0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIGlmIChwcnVuZVByZWZpeCkge1xuICAgICAgICAgIGNvbnN0IHN0YWxlID0gZXhpc3RpbmcuZmlsdGVyKChyZWdpc3RlcmVkKSA9PiByZWdpc3RlcmVkICE9PSBwYXRoICYmIHJlZ2lzdGVyZWQuc3RhcnRzV2l0aChwcnVuZVByZWZpeCkpO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVnaXN0ZXJlZCBvZiBzdGFsZSkge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtyZWdpc3RlcmVkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBleGlzdGluZyA9IGV4aXN0aW5nLmZpbHRlcigocmVnaXN0ZXJlZCkgPT4gIXN0YWxlLmluY2x1ZGVzKHJlZ2lzdGVyZWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXhpc3RpbmcuaW5jbHVkZXMocGF0aCkpIHtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZXhpc3RpbmcpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcsIHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCwgJ3RydWUnKTtcbiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgZGV2aWNlVmF1bHRQYXRoLFxuICAgICAgc3RhbGVQcmVmaXhcbiAgICApO1xuXG4gICAgLy8gV2FpdCBmb3IgcmVsb2FkICsgdmF1bHQgaW5pdGlhbGl6YXRpb24sIGFzIHR3byBzZXBhcmF0ZWx5IGJ1ZGdldGVkIHBoYXNlczpcbiAgICAvLyBUaGUgYXBwJ3MgY29sZCBzdGFydCBmaXJzdCwgdGhlbiBPYnNpZGlhbidzIG93biB3b3JrLiBTZWUgYHdhaXRGb3JBcHBTdGFydGVkYC5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JBcHBTdGFydGVkKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTGF5b3V0UmVhZHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IG9uIG1vYmlsZSBieSByZW1vdmluZyBpdCBmcm9tIGxvY2FsU3RvcmFnZS5cbiAgICpcbiAgICogUHJlc2VydmVzIG90aGVyIHZhdWx0IHJlZ2lzdHJhdGlvbnMuIElmIHRoZSB1bnJlZ2lzdGVyZWQgdmF1bHQgd2FzIHNlbGVjdGVkLFxuICAgKiBzd2l0Y2hlcyB0byB0aGUgZmlyc3QgcmVtYWluaW5nIHZhdWx0IChvciBjbGVhcnMgdGhlIHNlbGVjdGlvbikuXG4gICAqXG4gICAqIFRoZSB2YXVsdCdzICoqZmlsZXMgYXJlIHRoZW4gcmVtb3ZlZCBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgd2hldGhlciBvclxuICAgKiBub3QgdGhlIGBsb2NhbFN0b3JhZ2VgIHN0ZXAgc3VjY2VlZGVkKiogXHUyMDE0IGRlbGliZXJhdGVseSwgYmVjYXVzZSB0aGVcbiAgICogYGxvY2FsU3RvcmFnZWAgc3RlcCBnb2VzIHRocm91Z2ggdGhlIFdlYlZpZXcgYW5kIGEgZGVhZCBXZWJWaWV3IGlzIGV4YWN0bHlcbiAgICogd2hhdCBtb3N0IEFuZHJvaWQgZmFpbHVyZXMgYXJlLiBSb3V0aW5nIHRoZSByZW1vdmFsIHRocm91Z2ggdGhlIGFwcCB3YXMgd2hhdFxuICAgKiBtYWRlIGV2ZXJ5IGZhaWxlZCBydW4gbGVhayBpdHMgdmF1bHQgKGBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiBub1xuICAgKiBzdWNoIHdpbmRvd2ApLCBzbyB0aGUgZmlsZXN5c3RlbS1sZXZlbCByZW1vdmFsIG11c3Qgbm90IGRlcGVuZCBvbiBpdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGV4aXN0aW5nLmZpbHRlcigodikgPT4gdiAhPT0gcGF0aCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWQpKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oYGVuYWJsZS1wbHVnaW4tJHtwYXRofWApO1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1zZWxlY3RlZC12YXVsdCcpID09PSBwYXRoKSB7XG4gICAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnLCBmaWx0ZXJlZFswXSA/PyAnJyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhcbiAgICAgICAgYFthcHBpdW0tdHJhbnNwb3J0XSBDb3VsZCBub3QgZGVyZWdpc3RlciAke2RldmljZVZhdWx0UGF0aH0gZnJvbSBsb2NhbFN0b3JhZ2UgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhlcnJvcil9KTsgcmVtb3ZpbmcgaXRzIGZpbGVzIGFueXdheS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucmVtb3ZlRGV2aWNlVmF1bHREaXJlY3RvcnkoZGV2aWNlVmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHRydXN0ZWQtaW5wdXQgY2hhbm5lbCwgaWYgb25lIGlzIG9wZW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3Bvc2VJbnB1dENoYW5uZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuaW5wdXRDaGFubmVsO1xuICAgIHRoaXMuaW5wdXRDaGFubmVsID0gbnVsbDtcbiAgICB0aGlzLnVucmVnaXN0ZXJJbnB1dENoYW5uZWxFeGl0SGFuZGxlcigpO1xuICAgIGF3YWl0IGNoYW5uZWw/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVucyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IG9wZW4sIGFuZCByZS1vcGVucyBpdCBpZiB0aGUgV2ViVmlldyB3ZW50IGF3YXkuXG4gICAqXG4gICAqIEluc3RhbGxzIGEgYFJ1bnRpbWUuYWRkQmluZGluZ2AgZnVuY3Rpb24gb24gdGhlIHBhZ2UgYW5kIHNlcnZpY2VzIGV2ZXJ5IGNhbGwgdG8gaXQgZm9yIHRoZSBsaWZlIG9mIHRoZVxuICAgKiBjb25uZWN0aW9uLiBUaGUgYmluZGluZyBpcyBleHBvc2VkIG9uICpldmVyeSogZXhlY3V0aW9uIGNvbnRleHQgb2YgdGhlIHBhZ2UsIHNvIGl0IHN1cnZpdmVzIHRoZVxuICAgKiBgbG9jYXRpb24ucmVsb2FkKClgIHRoYXQge0BsaW5rIEFwcGl1bVRyYW5zcG9ydC5yZWdpc3RlclZhdWx0fSBwZXJmb3Jtczsgb25seSBhIGZ1bGwgYXBwIHJlc3RhcnQsIHdoaWNoXG4gICAqIGRlc3Ryb3lzIHRoZSBXZWJWaWV3IHRhcmdldCwgbmVlZHMgdGhlIHJlY29ubmVjdCBiZWxvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5wdXRDaGFubmVsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlucHV0Q2hhbm5lbD8uaXNPcGVuIHx8IHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBjaGFubmVsIGlzIHJlYWNoYWJsZSBvbmx5IG92ZXIgbG9jYWwgYGFkYmAsIHNvIGl0IGRvZXMgbm90IGV4aXN0IG9uIGlPUyBvciBhZ2FpbnN0IGEgcmVtb3RlIGh1YlxuICAgIC8vIChCcm93c2VyU3RhY2spLiBUaG9zZSBhcmUgc3VwcG9ydGVkIHRyYW5zcG9ydHMsIHNvIHRoaXMgc3RheXMgKipiZXN0LWVmZm9ydCoqOiBhIHJ1biB0aGF0IG5ldmVyXG4gICAgLy8gRHJpdmVzIGlucHV0IG11c3Qgbm90IGZhaWwgYmVjYXVzZSB0aGUgY2hhbm5lbCBjb3VsZCBub3QgYmUgb3BlbmVkLiBBIHJ1biB0aGF0ICpkb2VzKiBkcml2ZSBpbnB1dFxuICAgIC8vIEdldHMgYSBsZWdpYmxlIGVycm9yIGZyb20gdGhlIHJlbmRlcmVyJ3Mgb3duIGd1YXJkLCB3aGljaCBuYW1lcyB0aGUgbWlzc2luZyBjaGFubmVsLlxuICAgIGlmICh0aGlzLnBsYXRmb3JtICE9PSAnYW5kcm9pZCcpIHtcbiAgICAgIHRoaXMuaXNJbnB1dENoYW5uZWxVbmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3RUb1dlYlZpZXdDZHAoeyBhcHBJZDogdGhpcy5hcHBJZCwgZGV2aWNlSWQ6IHRoaXMuZGV2aWNlSWQgfSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZW5hYmxlJyk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuYWRkQmluZGluZycsIHsgbmFtZTogTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSB9KTtcbiAgICAgIGNvbm5lY3Rpb24ub24oJ1J1bnRpbWUuYmluZGluZ0NhbGxlZCcsIChwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB7XG4gICAgICAgIGlmIChwYXJhbXNbJ25hbWUnXSAhPT0gTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBwYXJhbXNbJ3BheWxvYWQnXTtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IG5vdCBhd2FpdGVkOiB0aGlzIHJ1bnMgd2hpbGUgdGhlIHJlbmRlcmVyJ3MgYEV4ZWN1dGUgU2NyaXB0YCBpcyBzdGlsbCBwZW5kaW5nLCBhbmRcbiAgICAgICAgLy8gVGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgXHUyMDE0IHRoZSByZXF1ZXN0IGlzIHNlcnZpY2VkIGNvbmN1cnJlbnRseSBhbmQgYW5zd2VyZWQgYnkgcmVzb2x2aW5nIHRoZVxuICAgICAgICAvLyBSZW5kZXJlcidzIHByb21pc2Ugb3ZlciB0aGlzIHNhbWUgc29ja2V0LiBJdCBoYW5kbGVzIGl0cyBvd24gZmFpbHVyZXMsIHNvIG5vdGhpbmcgcmVhY2hlcyBoZXJlLlxuICAgICAgICB0aGlzLmhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uLCB0eXBlb2YgcGF5bG9hZCA9PT0gJ3N0cmluZycgPyBwYXlsb2FkIDogJycpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBVbnJlYWNoYWJsZTogYGhhbmRsZUlucHV0UmVxdWVzdGAgbmV2ZXIgcmVqZWN0cy5cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pbnB1dENoYW5uZWwgPSBjb25uZWN0aW9uO1xuXG4gICAgICAvLyBTZWxmLWNsZWFuaW5nLCBkZWxpYmVyYXRlbHk6IHRoaXMgdHJhbnNwb3J0IGNhbiBiZSBjcmVhdGVkIHN0cmFpZ2h0IGZyb20gYSB0ZXN0IHdvcmtlciwgd2l0aCBub1xuICAgICAgLy8gYGNvcmVTZXR1cGAgb3duaW5nIGl0cyBsaWZlY3ljbGUgYW5kIHRoZXJlZm9yZSBub3RoaW5nIHRoYXQgZXZlciBjYWxscyBgZGlzcG9zZWAvYGRpc3Bvc2VTeW5jYCBcdTIwMTRcbiAgICAgIC8vIFdoaWNoIGlzIGhvdyBhIHJ1biBsZWF2ZXMgaXRzIGFkYiBwb3J0IGZvcndhcmQgc3RyYW5kZWQgb24gdGhlIGRldmljZSAob2JzZXJ2ZWQgMjAyNi0wOC0zMCkuIFRoZVxuICAgICAgLy8gSGFuZGxlciBpcyByZW1vdmVkIGFnYWluIG9uIGRpc3Bvc2FsIHNvIHJlY29ubmVjdHMgZG8gbm90IHN0YWNrIGxpc3RlbmVycy5cbiAgICAgIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29ubmVjdGlvbi5kaXNwb3NlU3luYygpO1xuICAgICAgfTtcbiAgICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQtaW5wdXQgY2hhbm5lbCBvcGVuLicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBHaXZlIHVwIGZvciB0aGUgbGlmZSBvZiB0aGUgdHJhbnNwb3J0IHJhdGhlciB0aGFuIHBheWluZyBhbiBgYWRiYCByb3VuZC10cmlwIG9uIGV2ZXJ5IGV2YWwuXG4gICAgICAvLyBBIHNvY2tldCB0aGF0IG1lcmVseSAqY2xvc2VkKiBhZnRlciBhIHN1Y2Nlc3NmdWwgY29ubmVjdCBpcyBhIGRpZmZlcmVudCBjYXNlIFx1MjAxNCBgaXNPcGVuYCBpcyBmYWxzZVxuICAgICAgLy8gVGhlcmUgd2hpbGUgdGhpcyBmbGFnIHN0YXlzIHVuc2V0LCBzbyB0aGUgcmVjb25uZWN0IGFib3ZlIHN0aWxsIHJ1bnMuXG4gICAgICB0aGlzLmlzSW5wdXRDaGFubmVsVW5hdmFpbGFibGUgPSB0cnVlO1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gVHJ1c3RlZCBpbnB1dCBpcyB1bmF2YWlsYWJsZSBvbiB0aGlzIGRldmljZTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhlIGRyaXZlciB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQuXG4gICAqXG4gICAqIElmIHRoZSBjb250ZXh0IHdhcyBhbHJlYWR5IHZlcmlmaWVkIChjYWNoZWQgdmlhIHtAbGluayBpc0luV2ViVmlld0NvbnRleHR9KSxcbiAgICogcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IGNhbGxpbmcgYGdldENvbnRleHRzKClgIFx1MjAxNCB3aGljaCBydW5zXG4gICAqIGBhZGIgc2hlbGwgY2F0IC9wcm9jL25ldC91bml4YCBhbmQgY2FuIHRpbWUgb3V0IG9uIHNsb3cgZW11bGF0b3JzLlxuICAgKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgY29udGV4dCBiZWNvbWVzIGF2YWlsYWJsZSAodGhlIGFwcCBtYXkgc3RpbGwgYmUgbG9hZGluZykuXG4gICAqIFVzZXMgdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IHNwZWNpZmljYWxseSB0byBhdm9pZCBjb25uZWN0aW5nXG4gICAqIHRvIENocm9tZSBvciBvdGhlciBXZWJWaWV3cyBvbiB0aGUgZGV2aWNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVXZWJWaWV3Q29udGV4dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luV2ViVmlld0NvbnRleHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0ICh0aW1lb3V0PSR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjb250ZXh0cyA9IGF3YWl0IHRoaXMuYnJvd3Nlci5nZXRDb250ZXh0cygpO1xuICAgICAgY29uc3Qgb2JzaWRpYW5Db250ZXh0ID0gY29udGV4dHMuZmluZCgoY29udGV4dCk6IGNvbnRleHQgaXMgc3RyaW5nID0+IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJyAmJiBjb250ZXh0LnN0YXJ0c1dpdGgoV0VCVklFV19DT05URVhUX1BSRUZJWCkpO1xuXG4gICAgICBpZiAob2JzaWRpYW5Db250ZXh0KSB7XG4gICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEZvdW5kIFdlYlZpZXcgY29udGV4dDogJHtvYnNpZGlhbkNvbnRleHR9YCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQob2JzaWRpYW5Db250ZXh0KTtcbiAgICAgICAgICB0aGlzLmlzSW5XZWJWaWV3Q29udGV4dCA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXNldHRpbmcgdG8gTkFUSVZFX0FQUCBiZWZvcmUgcmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQoJ05BVElWRV9BUFAnKTtcbiAgICAgICAgICB9IGNhdGNoIChyZXNldEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBOQVRJVkVfQVBQIHJlc2V0IGFsc28gZmFpbGVkOiAke1N0cmluZyhyZXNldEVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2ViVmlldyBub3QgcmVhZHksIGF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeShjb250ZXh0cyl9LiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoV0VCVklFV19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgZm91bmQgd2l0aGluICR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuIElzIHRoZSBPYnNpZGlhbiBhcHAgZnVsbHkgbG9hZGVkP2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIEV4ZWN1dGUgU2NyaXB0IHVuZGVyIHRoZSBwZXItZXZhbCBjYXAsIHJhaXNpbmcge0BsaW5rIEV2YWxDYXBFeGNlZWRlZEVycm9yfSBpZiBpdCBvdXRsYXN0cyBpdC5cbiAgICpcbiAgICogVGhlIGNhcCBjb3ZlcnMgdGhlIHNjcmlwdCBBTE9ORSBcdTIwMTQgYGVuc3VyZVdlYlZpZXdDb250ZXh0YCBhbmQgYGVuc3VyZUlucHV0Q2hhbm5lbGAgcnVuIGJlZm9yZSBpdCxcbiAgICogYmVjYXVzZSBhIGBzd2l0Y2hDb250ZXh0YCBsZWdpdGltYXRlbHkgY29zdHMgfjE3cyAoKipMMTkqKikgYW5kIGNoYXJnaW5nIHRoYXQgdG8gYSB0ZXN0J3Mgb3duIGJ1ZGdldFxuICAgKiB3b3VsZCByZXBvcnQgdGhlIGhhcm5lc3MncyBzZXR1cCBhcyB0aGUgdGVzdCdzIG92ZXJydW4uXG4gICAqXG4gICAqIFRoZSBhYmFuZG9uZWQgcmVxdWVzdCBpcyBkZWxpYmVyYXRlbHkgbGVmdCBpbiBmbGlnaHQgcmF0aGVyIHRoYW4gY2FuY2VsbGVkLiBOb3RoaW5nIGNhbiBjYW5jZWwgaXQ6XG4gICAqIGBSdW50aW1lLnRlcm1pbmF0ZUV4ZWN1dGlvbmAgb3ZlciB0aGUgdHJhbnNwb3J0J3Mgb3duIENEUCBjaGFubmVsIHdhcyBtZWFzdXJlZCByZWxlYXNpbmcgbm90aGluZyxcbiAgICogYW5kIGEgZ3Vlc3Qtc2lkZSBhYm9ydCBob29rIGNvdWxkIG5vdCBldmVuIGJlIGluc3RhbGxlZCBpbiB0aW1lLiBXaGF0IHRoZSBzYW1lIHJ1bnMgZGlkIHNob3cgaXMgdGhhdFxuICAgKiB0aGUgc2Vzc2lvbiB1c3VhbGx5IGtlZXBzIHNlcnZpbmcgXHUyMDE0IGEgdmF1bHQgcmVhZC1iYWNrIHdhcyBhbnN3ZXJlZCA1MjhtcyBhZnRlciBvbmUgc3VjaCBhYmFuZG9ubWVudCxcbiAgICogd2l0aCB0aGUgc2Vzc2lvbiBmcmVlIFx1MjAxNCBzbyBib3VuZGluZyB0aGUgd2FpdCBjb3N0cyBhIHRlc3QgaXRzIGNsb3N1cmUsIG5vdCB0aGUgcmVzdCBvZiBpdHMgc3VpdGUuXG4gICAqXG4gICAqIEBwYXJhbSBzY3JpcHQgLSBUaGUgc2NyaXB0IHRvIHJ1biwgYWxyZWFkeSB3cmFwcGVkIGluIGl0cyBgcmV0dXJuICguLi4pYC5cbiAgICogQHJldHVybnMgVGhlIHNjcmlwdCdzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbHVhdGVXaXRoaW5DYXAoc2NyaXB0OiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCBzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvKlxuICAgICAqIFRoZSBldmFsIEFGVEVSIGFuIG92ZXJydW4gZ2V0cyBhIGdyYWNlIHBlcmlvZCBvbiB0b3Agb2YgdGhlIGNhcCwgYW5kIHRoaXMgaXMgbm90IGdlbmVyb3NpdHkuIEFwcGl1bVxuICAgICAqIFNlcmlhbGl6ZXMgY29tbWFuZHMgcGVyIHNlc3Npb24sIGFuZCBhbiBhYmFuZG9uZWQgY2xvc3VyZSBrZWVwcyBydW5uaW5nIGluIHRoZSBndWVzdCBcdTIwMTQgc28gdGhlIG5leHRcbiAgICAgKiBDb21tYW5kIHF1ZXVlcyBiZWhpbmQgd2hhdGV2ZXIgaXMgbGVmdCBvZiBpdCBhbmQsIG9uIHRoZSBiYXJlIGNhcCwgaXMgY2FwcGVkIGluIGl0cyB0dXJuLiBUaGF0IGlzXG4gICAgICogTWVhc3VyZWQ6IHdpdGggdGhlIGNhcCBmaXJpbmcgYXQgMzBzIGFnYWluc3QgYSA0MHMgY2xvc3VyZSwgdGhlIGZvbGxvd2luZyB2YXVsdCByZWFkLWJhY2sgZmFpbGVkIGF0XG4gICAgICogMzAgMjA2bXMsIHdoaWxlIHRoZSBzYW1lIHJlYWQtYmFjayBpc3N1ZWQgYWZ0ZXIgdGhlIGNsb3N1cmUgaGFkIGZpbmlzaGVkIHdhcyBhbnN3ZXJlZCBpbiA1Mjhtcy5cbiAgICAgKlxuICAgICAqIFdhaXRpbmcgb24gdGhlIGFiYW5kb25lZCByZXF1ZXN0IGluc3RlYWQgd291bGQgbm90IHdvcms6IHRoYXQgcHJvbWlzZSBpcyB0aGUgb25lIHRoYXQgbmV2ZXIgc2V0dGxlcy5cbiAgICAgKiBXaGF0IGZyZWVzIHRoZSBzZXNzaW9uIGlzIHRoZSBHVUVTVCBmaW5pc2hpbmcsIG9uIGEgc2NoZWR1bGUgdGhpcyBzaWRlIGNhbm5vdCBrbm93IFx1MjAxNCBzbyB0aGUgZ3JhY2UgaXNcbiAgICAgKiBhIGNlaWxpbmcsIG5vdCBhIGRlbGF5LiBJdCBjb3N0cyBub3RoaW5nIHdoZW4gdGhlIHNlc3Npb24gY29tZXMgYmFjayBwcm9tcHRseSwgd2hpY2ggaXMgdGhlIG5vcm0uXG4gICAgICovXG4gICAgY29uc3QgYnVkZ2V0SW5NaWxsaXNlY29uZHMgPSB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuXG4gICAgICA/IHRoaXMuc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzICsgQ0FQX1JFQ09WRVJZX0dSQUNFX0lOX01JTExJU0VDT05EU1xuICAgICAgOiB0aGlzLnNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gZmFsc2U7XG5cbiAgICBsZXQgY2FwVGltZXI6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY2FwID0gbmV3IFByb21pc2U8bmV2ZXI+KChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjYXBUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzUmVjb3ZlcmluZ0Zyb21DYXBPdmVycnVuID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFdmFsQ2FwRXhjZWVkZWRFcnJvcih7XG4gICAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogYnVkZ2V0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgICBjYXVzZTogbmV3IEVycm9yKGBUaGUgQXBwaXVtIEV4ZWN1dGUgU2NyaXB0IGNhcnJ5aW5nIHRoaXMgY2xvc3VyZSBkaWQgbm90IGFuc3dlciB3aXRoaW4gJHtTdHJpbmcoYnVkZ2V0SW5NaWxsaXNlY29uZHMpfW1zLmApLFxuICAgICAgICAgICAgb3B0aW9uTmFtZTogJ3NjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kcycsXG4gICAgICAgICAgICB0cmFuc3BvcnROYW1lOiAnQW5kcm9pZCAoQXBwaXVtKSdcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSwgYnVkZ2V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICB0aGlzLmJyb3dzZXIuZXhlY3V0ZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBbXT4oc2NyaXB0KSxcbiAgICAgICAgY2FwXG4gICAgICBdKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGNhcFRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGNhcFRpbWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBob3N0LXNpZGUgdmF1bHQgcGF0aCB0byB0aGUgZGV2aWNlLXNpZGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIEFic29sdXRlIHBhdGggb24gdGhlIGhvc3QgbWFjaGluZS5cbiAgICogQHJldHVybnMgVGhlIGRldmljZS1zaWRlIHZhdWx0IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudmF1bHRCYXNlUGF0aH0ke2V4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZpY2VzIG9uZSBpbnB1dCByZXF1ZXN0IGZyb20gdGhlIHJlbmRlcmVyOiBpbmplY3QsIHRoZW4gcmVzb2x2ZSB0aGUgcmVuZGVyZXIncyBwcm9taXNlLlxuICAgKlxuICAgKiBFdmVyeSBmYWlsdXJlIHBhdGggc3RpbGwgcmVzb2x2ZXMgdGhhdCBwcm9taXNlIFx1MjAxNCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgdGhlIHJlbmRlcmVyIHJlLXRocm93cyBcdTIwMTQgYmVjYXVzZVxuICAgKiBhIHJlcXVlc3QgdGhhdCBpcyBzaWxlbnRseSBkcm9wcGVkIHdvdWxkIGhhbmcgdGhlIGNsb3N1cmUgdW50aWwgdGhlIHdob2xlIHJ1biB0aW1lcyBvdXQsIGFuZCByZXBvcnRcbiAgICogbm90aGluZyBhYm91dCB3aHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIC0gVGhlIGNoYW5uZWwgdGhlIHJlcXVlc3QgYXJyaXZlZCBvbi5cbiAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcmF3IEpTT04gcGF5bG9hZCB0aGUgYmluZGluZyB3YXMgY2FsbGVkIHdpdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUlucHV0UmVxdWVzdChjb25uZWN0aW9uOiBXZWJWaWV3Q2RwQ29ubmVjdGlvbiwgcGF5bG9hZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlcXVlc3RJZCA9ICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGlkLCByZXF1ZXN0IH0gPSBKU09OLnBhcnNlKHBheWxvYWQpIGFzIE1vYmlsZUlucHV0RW52ZWxvcGU7XG4gICAgICByZXF1ZXN0SWQgPSBpZDtcblxuICAgICAgLy8gRXhhY3RseS1vbmNlIGFjcm9zcyBldmVyeSBhdHRhY2hlZCBob3N0LiBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCBpcyBicm9hZGNhc3QgdG8gQUxMIGF0dGFjaGVkXG4gICAgICAvLyBDRFAgc2Vzc2lvbnMsIHNvIHdpdGhvdXQgdGhpcyBlYWNoIHByb2Nlc3MgaW5qZWN0cyB0aGUgZ2VzdHVyZSBhZ2FpbjogbWVhc3VyZWQgMjAyNi0wOS0xMCwgYVxuICAgICAgLy8gVml0ZXN0IG1haW4gcHJvY2VzcyBhbmQgaXRzIHdvcmtlciBzZXJ2aWNlZCByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZCwgYW5kIG9uZVxuICAgICAgLy8gYGNsaWNrRWxlbWVudGAgcmVhY2hlZCB0aGUgcGFnZSBhcyB0d28gYHBvaW50ZXJkb3duYCAvIGB0b3VjaHN0YXJ0YCBwYWlycy5cbiAgICAgIC8vXG4gICAgICAvLyBBIExPU0VSIE1VU1QgUkVUVVJOIFNJTEVOVExZOiB0aGUgd2lubmVyIGlzIHRoZSBvbmUgdGhhdCBpbmplY3RzIGFuZCB0aGUgb25lIHRoYXQgcmVzb2x2ZXMgdGhlXG4gICAgICAvLyBSZW5kZXJlcidzIHByb21pc2UsIHNvIGFuc3dlcmluZyBoZXJlIGFzIHdlbGwgd291bGQgcmVzb2x2ZSBhIHJlcXVlc3Qgd2hvc2UgZ2VzdHVyZSB0aGlzXG4gICAgICAvLyBQcm9jZXNzIG5ldmVyIHNlbnQuXG4gICAgICBjb25zdCBjbGFpbSA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRDbGFpbUlucHV0RXhwcmVzc2lvbihpZCksIHJldHVybkJ5VmFsdWU6IHRydWUgfSk7XG4gICAgICBpZiAoIWNoZWNrSW5wdXRDbGFpbUdyYW50ZWQoY2xhaW0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29ubmVjdGlvbi5zZW5kQWxsKHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0KSk7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLnNlbmQoJ1J1bnRpbWUuZXZhbHVhdGUnLCB7IGV4cHJlc3Npb246IGJ1aWxkUmVzb2x2ZUlucHV0RXhwcmVzc2lvbihpZCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvclRvU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFRydXN0ZWQgaW5wdXQgZmFpbGVkOiAke21lc3NhZ2V9YCk7XG4gICAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZCgnUnVudGltZS5ldmFsdWF0ZScsIHsgZXhwcmVzc2lvbjogYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKHJlcXVlc3RJZCwgbWVzc2FnZSkgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVGhlIHNvY2tldCBpcyBnb25lOyB0aGUgcmVuZGVyZXIncyBvd24gdGltZW91dCBpcyB0aGUgcmVtYWluaW5nIGJhY2tzdG9wLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZXMgdGhlIFdlYlZpZXcgb25jZSBmb3IgaG93IGZhciBPYnNpZGlhbidzIHN0YXJ0dXAgaGFzIGdvdC5cbiAgICpcbiAgICogQSBwcm9iZSB0aGF0IHRocm93cyBpcyByZXBvcnRlZCBhcyBgdW5kZWZpbmVkYCByYXRoZXIgdGhhbiBwcm9wYWdhdGVkOiB0aGVcbiAgICogcGFnZSBpcyBtaWQtYGxvY2F0aW9uLnJlbG9hZCgpYCBmb3IgbW9zdCBvZiB0aGUgYXBwLXN0YXJ0IHBoYXNlLCBhbmQgYVxuICAgKiBXZWJWaWV3IHRoYXQgY2Fubm90IGFuc3dlciB5ZXQgaXMgdGhlICpleHBlY3RlZCogcmVhZGluZyB0aGVyZSwgbm90IGFuIGVycm9yLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGF0IHRoZSBwcm9iZSBzYXcsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgY291bGQgbm90IHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVTdGFydHVwKCk6IFByb21pc2U8U3RhcnR1cFByb2JlUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgoKTogU3RhcnR1cFByb2JlUmVzdWx0ID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIFdlIG5lZWQgZ2xvYmFsIGBhcHBgIHZhcmlhYmxlLlxuICAgICAgICBjb25zdCBhcHAgPSBnbG9iYWxUaGlzLmFwcCBhcyBMb2FkaW5nQXBwIHwgdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhhc0FwcDogISFhcHAsXG4gICAgICAgICAgaGFzV29ya3NwYWNlOiAhIWFwcD8ud29ya3NwYWNlLFxuICAgICAgICAgIGlzTGF5b3V0UmVhZHk6ICEhYXBwPy53b3Jrc3BhY2U/LmxheW91dFJlYWR5XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1c2hlcyB0aGUgbWluaW1hbCBgLm9ic2lkaWFuL2FwcC5qc29uYCB2YXVsdCBtYXJrZXIgdmlhIGBhZGIgcHVzaGAuXG4gICAqXG4gICAqIGBicm93c2VyLnB1c2hGaWxlYCAoV2ViRHJpdmVyIGJhc2U2NCkgaXMgYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNsb3dlciBvbiBhXG4gICAqIGNvbGQgb3IgbG9hZGVkIGVtdWxhdG9yIFx1MjAxNCBtZWFzdXJlZCBhdCA5XHUyMDEzMjFzIHBlciBjYWxsIGZvciB0aGlzIDItYnl0ZSBtYXJrZXIsXG4gICAqIHZlcnN1cyBzdWItc2Vjb25kIG92ZXIgYGFkYmAuIFRoaXMgbWlycm9ycyB7QGxpbmsgcHVzaEZpbGVzfSwgd2hpY2ggc3dpdGNoZWRcbiAgICogdG8gYGFkYmAgZm9yIHRoZSBzYW1lIHJlYXNvbi4gYG1rZGlyIC1wYCBndWFyYW50ZWVzIHRoZSBwYXJlbnQgZGlyZWN0b3J5LlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlVmF1bHRQYXRoIC0gVGhlIGRldmljZS1zaWRlIHZhdWx0IGRpcmVjdG9yeSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwdXNoT2JzaWRpYW5NYXJrZXIoZGV2aWNlVmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NhbE1hcmtlciA9IGpvaW4odG1wZGlyKCksIGBvYnNpZGlhbi1tYXJrZXItJHtyYW5kb21VVUlEKCl9Lmpzb25gKTtcbiAgICBjb25zdCByZW1vdGVNYXJrZXIgPSBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbi9hcHAuanNvbmA7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGxvY2FsTWFya2VyLCAne30nLCAndXRmLTgnKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnbWtkaXInLCAnLXAnLCBgJHtkZXZpY2VWYXVsdFBhdGh9Ly5vYnNpZGlhbmBdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbE1hcmtlciwgcmVtb3RlTWFya2VyXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBybShsb2NhbE1hcmtlciwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHZhdWx0IGRpcmVjdG9yeSBmcm9tIHRoZSBkZXZpY2Ugb3ZlciBgYWRiYCwgYW5kIENIRUNLUyB0aGF0IGl0IGlzXG4gICAqIGFjdHVhbGx5IGdvbmUuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0OiBhIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLCBzbyBhIHRlYXJkb3duIHByb2JsZW0gbmV2ZXJcbiAgICogbWFza3MgdGhlIHRlc3QgcmVzdWx0LiBUaGUgbmV4dCBydW4ncyBzdGFydC1vZi1ydW4gc3dlZXAgcGlja3MgdXAgd2hhdGV2ZXJcbiAgICogdGhpcyBjb3VsZCBub3QgcmVtb3ZlLlxuICAgKlxuICAgKiBUaGUgY2hlY2sgaXMgdGhlIHBvaW50LiBgcm0gLXJmYCBydW5zIHdpdGggYHNob3VsZElnbm9yZUV4aXRDb2RlYCwgc28gYW5cbiAgICogdW5yZW1vdmVkIGRpcmVjdG9yeSB1c2VkIHRvIGxlYXZlIG5vIHRyYWNlIGF0IGFsbCBcdTIwMTQgd2hpY2ggaXMgaG93IHJ1bnMgdGhhdFxuICAgKiBwYXNzZWQgZW5kIHRvIGVuZCB3ZXJlIHN0aWxsIGZvdW5kIHRvIGJlIGxlYWtpbmcgYSB2YXVsdCBhcGllY2UsIGludmlzaWJseSxcbiAgICogdW50aWwgc29tZW9uZSBjb3VudGVkIHRoZSBkaXJlY3RvcmllcyBvbiB0aGUgZGV2aWNlIGJ5IGhhbmQuIEEgbGVhayBpcyBub3dcbiAgICogbmFtZWQgaW4gdGhlIGxvZyBhdCB0aGUgbW9tZW50IGl0IGhhcHBlbnMuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VWYXVsdFBhdGggLSBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgZGlyZWN0b3J5IHBhdGguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlbW92ZURldmljZVZhdWx0RGlyZWN0b3J5KGRldmljZVZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGRpcmVjdG9yeSBmcm9tIGRldmljZTogJHtkZXZpY2VWYXVsdFBhdGh9YCk7XG4gICAgICBhd2FpdCBleGVjKFxuICAgICAgICBbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICdybScsICctcmYnLCBkZXZpY2VWYXVsdFBhdGhdLFxuICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9SRU1PVkVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfVxuICAgICAgKTtcblxuICAgICAgY29uc3QgbGlzdGluZyA9IGF3YWl0IGV4ZWMoXG4gICAgICAgIFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ2xzJywgJy1kJywgZGV2aWNlVmF1bHRQYXRoXSxcbiAgICAgICAgeyBpc1F1aWV0OiB0cnVlLCBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZSwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBBREJfVkFVTFRfUkVNT1ZFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChsaXN0aW5nLmluY2x1ZGVzKGRldmljZVZhdWx0UGF0aCkpIHtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FybmluZzogJHtkZXZpY2VWYXVsdFBhdGh9IHN1cnZpdmVkIHJlbW92YWwgYW5kIGlzIG5vdyBsZWFrZWQgcmVzaWR1ZS4gYFxuICAgICAgICAgICAgKyAnVGhlIG5leHQgcnVuXFwncyBzdGFydC1vZi1ydW4gc3dlZXAgd2lsbCByZXRyeSBpdC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFZhdWx0IGRpcmVjdG9yeSByZW1vdmFsIGZhaWxlZCAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEcm9wcyB0aGUgYHByb2Nlc3Mub24oJ2V4aXQnKWAgaGFuZGxlciB0aGF0IHdvdWxkIG90aGVyd2lzZSBjbG9zZSBhbiBhbHJlYWR5LWNsb3NlZCBjaGFubmVsLCBhbmQgd291bGRcbiAgICogc3RhY2sgYSBsaXN0ZW5lciBwZXIgcmVjb25uZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSB1bnJlZ2lzdGVySW5wdXRDaGFubmVsRXhpdEhhbmRsZXIoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpc3Bvc2VJbnB1dENoYW5uZWxPbkV4aXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcm9jZXNzLm9mZignZXhpdCcsIHRoaXMuZGlzcG9zZUlucHV0Q2hhbm5lbE9uRXhpdCk7XG4gICAgdGhpcy5kaXNwb3NlSW5wdXRDaGFubmVsT25FeGl0ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgZ2xvYmFsVGhpcy5hcHBgIGV4aXN0cyBpbiB0aGUgV2ViVmlldyBcdTIwMTQgdGhlIGFwcCBoYXMgZmluaXNoZWRcbiAgICogaXRzIGNvbGQgc3RhcnQgYW5kIE9ic2lkaWFuJ3Mgb3duIGJvb3QgaGFzIGJlZ3VuLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSAqKmZpcnN0Kiogb2YgdGhlIHR3byBidWRnZXRzIHNwZW50IGFmdGVyIGBsb2NhdGlvbi5yZWxvYWQoKWAsXG4gICAqIGFuZCB0aGUgZ2VuZXJvdXMgb25lLiBFdmVyeXRoaW5nIGl0IHBheXMgZm9yIGlzIG91dHNpZGUgT2JzaWRpYW4ncyBjb250cm9sOlxuICAgKiB0aGUgV2ViVmlldyByZWxvYWRpbmcsIGFuZCBhIGd1ZXN0IHRoYXQgbWF5IHN0aWxsIGJlIG9wdGltaXppbmcgcGFja2FnZXMuXG4gICAqIEtlZXBpbmcgaXQgc2VwYXJhdGUgaXMgdGhlIHBvaW50IG9mIHRoZSBzcGxpdCBcdTIwMTQgdGhlIG9sZCBzaW5nbGUgd2FsbCBjbG9ja1xuICAgKiBzdGFydGVkIGhlcmUgYW5kIGxlZnQgdGhlIHRpZ2h0IGxheW91dCBidWRnZXQgcGF5aW5nIGZvciBhIGNvbGQgc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBTdGFydGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHRoZSBhcHAgdG8gc3RhcnQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMpLi4uYCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yU3RhcnR1cE1pbGVzdG9uZSh7XG4gICAgICBpc1NhdGlzZmllZDogY2hlY2tBcHBTdGFydGVkLFxuICAgICAgcGhhc2U6ICdhcHAtc3RhcnQnLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGlzIGB0cnVlYCBpbiB0aGUgV2ViVmlldy5cbiAgICpcbiAgICogVGhlICoqc2Vjb25kKiogYnVkZ2V0LCBhbmQgdGhlIHRpZ2h0IG9uZTogYnkgdGhlIHRpbWUgaXQgc3RhcnRzLCB0aGUgYXBwIGlzXG4gICAqIGFscmVhZHkgdXAsIHNvIGFsbCBpdCBjb3ZlcnMgaXMgT2JzaWRpYW4gb3BlbmluZyB0aGUgdmF1bHQgYW5kIGxvYWRpbmdcbiAgICogcGx1Z2lucyBcdTIwMTQgfjFzIGluIHByYWN0aWNlLCBcdTIyNjQ4LjRzIHVuZGVyIGhlYXZ5IGhvc3Qgc3RyZXNzICgqKkwxOSoqKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIGxheW91dCByZWFkeSAodGltZW91dD0ke1N0cmluZyh0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JTdGFydHVwTWlsZXN0b25lKHtcbiAgICAgIGlzU2F0aXNmaWVkOiBjaGVja0xheW91dFJlYWR5LFxuICAgICAgcGhhc2U6ICdsYXlvdXQtcmVhZHknLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiB0aGlzLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdGhlIFdlYlZpZXcgdW50aWwgYSBzdGFydHVwIHBoYXNlJ3MgbWlsZXN0b25lIGlzIHNhdGlzZmllZCwgdHJhY2tpbmdcbiAgICogdGhlIGV2aWRlbmNlIHRoYXQgdGVsbHMgYSBzbG93IE9ic2lkaWFuIGZyb20gYSBjb250ZW5kZWQgZ3Vlc3QuXG4gICAqXG4gICAqIEVhY2ggcG9sbCBjb3N0cyBleGFjdGx5IG9uZSBgYnJvd3Nlci5leGVjdXRlYCByb3VuZC10cmlwIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90XG4gICAqIGFuIHtAbGluayBlbnN1cmVXZWJWaWV3Q29udGV4dH0gY2FsbCwgd2hvc2UgYGdldENvbnRleHRzKClgIHJ1bnNcbiAgICogYGFkYiBzaGVsbCBjYXQgL3Byb2MvbmV0L3VuaXhgIGFuZCB3YXMgbWVhc3VyZWQgYXQgfjE3cyBwZXIgKipMMTkqKi4gVGhlXG4gICAqIHJvdW5kLXRyaXAgaXMgdGltZWQsIGFuZCB0aGUgc2xvd2VzdCBvbmUgaXMgcmVwb3J0ZWQgb24gdGltZW91dDogYSBwaGFzZVxuICAgKiB0aGF0IHJhbiBvdXQgYWZ0ZXIgYSBoYW5kZnVsIG9mIHByb2JlcyBlYWNoIHRha2luZyB0ZW5zIG9mIHNlY29uZHMgd2FzXG4gICAqIHN0YXJ2ZWQgYnkgdGhlIGd1ZXN0LCBub3QgYnkgT2JzaWRpYW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGhhc2UsIGl0cyBidWRnZXQsIGFuZCB0aGUgcHJlZGljYXRlIHRoYXQgZW5kcyBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclN0YXJ0dXBNaWxlc3RvbmUocGFyYW1zOiBXYWl0Rm9yU3RhcnR1cE1pbGVzdG9uZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgaXNTYXRpc2ZpZWQsIHBoYXNlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBzdGFydCArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIGxldCBmdXJ0aGVzdE1pbGVzdG9uZTogQXBwU3RhcnR1cE1pbGVzdG9uZSA9ICduby13ZWJ2aWV3JztcbiAgICBsZXQgcG9sbENvdW50ID0gMDtcbiAgICBsZXQgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gMDtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IHJvdW5kVHJpcFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IG1pbGVzdG9uZSA9IGNsYXNzaWZ5QXBwU3RhcnR1cFByb2JlKGF3YWl0IHRoaXMucHJvYmVTdGFydHVwKCkpO1xuICAgICAgY29uc3Qgcm91bmRUcmlwSW5NaWxsaXNlY29uZHMgPSBEYXRlLm5vdygpIC0gcm91bmRUcmlwU3RhcnQ7XG5cbiAgICAgIHBvbGxDb3VudCsrO1xuICAgICAgc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzID0gTWF0aC5tYXgoc2xvd2VzdFJvdW5kVHJpcEluTWlsbGlzZWNvbmRzLCByb3VuZFRyaXBJbk1pbGxpc2Vjb25kcyk7XG4gICAgICBpZiAoY29tcGFyZUFwcFN0YXJ0dXBNaWxlc3RvbmVzKG1pbGVzdG9uZSwgZnVydGhlc3RNaWxlc3RvbmUpID4gMCkge1xuICAgICAgICBmdXJ0aGVzdE1pbGVzdG9uZSA9IG1pbGVzdG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzU2F0aXNmaWVkKG1pbGVzdG9uZSkpIHtcbiAgICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIHNhdGlzZmllZCBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zICgke1N0cmluZyhwb2xsQ291bnQpfSBwcm9iZShzKSkuYCk7XG4gICAgICAgIHRoaXMuaXNJbldlYlZpZXdDb250ZXh0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2coXG4gICAgICAgIGBbYXBwaXVtLXRyYW5zcG9ydF0gUGhhc2UgXCIke3BoYXNlfVwiIG5vdCBzYXRpc2ZpZWQgeWV0OiAke21pbGVzdG9uZX0gYFxuICAgICAgICAgICsgYChlbGFwc2VkPSR7U3RyaW5nKERhdGUubm93KCkgLSBzdGFydCl9bXMsIHJvdW5kLXRyaXA9JHtTdHJpbmcocm91bmRUcmlwSW5NaWxsaXNlY29uZHMpfW1zKS4gUmV0cnlpbmcuLi5gXG4gICAgICApO1xuICAgICAgYXdhaXQgZGVsYXkoTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRTdGFydHVwVGltZW91dE1lc3NhZ2Uoe1xuICAgICAgZWxhcHNlZEluTWlsbGlzZWNvbmRzOiBEYXRlLm5vdygpIC0gc3RhcnQsXG4gICAgICBtaWxlc3RvbmU6IGZ1cnRoZXN0TWlsZXN0b25lLFxuICAgICAgcGhhc2UsXG4gICAgICBwb2xsQ291bnQsXG4gICAgICBzbG93ZXN0Um91bmRUcmlwSW5NaWxsaXNlY29uZHMsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmF1bHQgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBwYXRoIHNlZ21lbnQgKHZhdWx0IGRpcmVjdG9yeSBuYW1lKS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YXVsdFBhdGgucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICBjb25zdCBsYXN0U2VwYXJhdG9yID0gTWF0aC5tYXgobm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycpLCBub3JtYWxpemVkLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShs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
|
|
@@ -37,7 +37,13 @@ export interface DesktopCdpTransportConfig {
|
|
|
37
37
|
cdpPort?: number;
|
|
38
38
|
/**
|
|
39
39
|
* Timeout in milliseconds for individual CDP commands.
|
|
40
|
-
*
|
|
40
|
+
*
|
|
41
|
+
* A test's closure travels as one `Runtime.evaluate` command, so this is also
|
|
42
|
+
* the desktop per-eval cap. The default is `DEFAULT_EVAL_CAP_IN_MILLISECONDS`,
|
|
43
|
+
* exported from the package root — import it rather than restating the number,
|
|
44
|
+
* so a closure sized against the cap follows it if it ever moves.
|
|
45
|
+
*
|
|
46
|
+
* @default `30000`
|
|
41
47
|
*/
|
|
42
48
|
commandTimeoutInMilliseconds?: number;
|
|
43
49
|
/**
|
|
@@ -191,6 +197,17 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
|
|
|
191
197
|
private messageId;
|
|
192
198
|
private readonly ownedConfig;
|
|
193
199
|
private ownedInstance;
|
|
200
|
+
/**
|
|
201
|
+
* The in-flight commands of every socket this transport has opened, keyed by
|
|
202
|
+
* the CDP message id each is waiting for. One entry per command, added by
|
|
203
|
+
* {@link sendCommand} and removed by whichever of the reply and the timeout
|
|
204
|
+
* comes first — see {@link getPendingCommands} for why this exists at all.
|
|
205
|
+
*
|
|
206
|
+
* Weak by socket so a closed temporary connection is collectable with its
|
|
207
|
+
* pending map; the dispatcher listener is the socket's own, so nothing here
|
|
208
|
+
* keeps it alive.
|
|
209
|
+
*/
|
|
210
|
+
private readonly pendingCommandsBySocket;
|
|
194
211
|
/**
|
|
195
212
|
* Vault paths THIS transport opened via {@link registerVault}, normalized by
|
|
196
213
|
* {@link normalizeVaultPathForComparison}. A worker attached to a
|
|
@@ -474,6 +491,32 @@ export declare class DesktopCdpTransport implements ObsidianTransport {
|
|
|
474
491
|
* @throws {Error} When no CDP endpoint is configured yet.
|
|
475
492
|
*/
|
|
476
493
|
private getPageTargets;
|
|
494
|
+
/**
|
|
495
|
+
* Returns a socket's in-flight command map, installing its reply dispatcher on
|
|
496
|
+
* first use.
|
|
497
|
+
*
|
|
498
|
+
* ONE `message` listener per socket, for the socket's whole life — not one per
|
|
499
|
+
* command. A listener per in-flight command makes the count scale with how many
|
|
500
|
+
* evaluations a suite has in flight at once, so a consumer that fires eleven
|
|
501
|
+
* concurrent `evalInObsidian` calls crosses Node's default `maxListeners` of 10
|
|
502
|
+
* and is told its transport is leaking memory, which it is not: measured
|
|
503
|
+
* 2026-09-15, fifteen concurrent evaluations registered fifteen listeners on the
|
|
504
|
+
* one long-lived socket and the count fell back to zero the moment they settled.
|
|
505
|
+
* A warning that fires on correct use is worse than no warning, because the real
|
|
506
|
+
* signal — an entry that is added and never removed — is then indistinguishable
|
|
507
|
+
* from it. With one dispatcher the listener count is a constant, and a genuine
|
|
508
|
+
* leak shows instead as a pending map that never empties.
|
|
509
|
+
*
|
|
510
|
+
* The dispatcher is deliberately forgiving about what arrives: a CDP **event**
|
|
511
|
+
* carries no `id` and belongs to no command, and a frame that is not JSON at all
|
|
512
|
+
* belongs to nothing this transport sent. Both are ignored. The old per-command
|
|
513
|
+
* handler parsed unguarded, so one frame that is not JSON threw once per
|
|
514
|
+
* in-flight command, out of the event dispatch, where nothing could catch it.
|
|
515
|
+
*
|
|
516
|
+
* @param ws - The socket whose replies are being awaited.
|
|
517
|
+
* @returns The socket's map of in-flight commands, keyed by CDP message id.
|
|
518
|
+
*/
|
|
519
|
+
private getPendingCommands;
|
|
477
520
|
/**
|
|
478
521
|
* Kills the currently-running owned instance (if any) and waits for it to exit,
|
|
479
522
|
* so the next launch gets a pristine single-window instance.
|