obsidian-integration-testing 16.0.0 → 17.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/adb.cjs +2 -2
- package/dist/lib/cjs/adb.d.cts +10 -0
- package/dist/lib/cjs/avd-name-channel.cjs +74 -0
- package/dist/lib/cjs/avd-name-channel.d.cts +152 -0
- package/dist/lib/cjs/avd-probe-verdict.cjs +11 -4
- package/dist/lib/cjs/avd-probe-verdict.d.cts +7 -0
- package/dist/lib/cjs/device-screenshot.cjs +1 -1
- package/dist/lib/cjs/device-screenshot.d.cts +3 -1
- package/dist/lib/cjs/emulator-backend.cjs +22 -1
- package/dist/lib/cjs/emulator-backend.d.cts +81 -0
- package/dist/lib/cjs/emulator-reclaim.cjs +78 -34
- package/dist/lib/cjs/emulator-reclaim.d.cts +57 -9
- package/dist/lib/cjs/enable-plugin.cjs +17 -8
- package/dist/lib/cjs/enable-plugin.d.cts +3 -1
- package/dist/lib/cjs/host-process-query-verdict.cjs +103 -0
- package/dist/lib/cjs/host-process-query-verdict.d.cts +196 -0
- package/dist/lib/cjs/index.cjs +14 -1
- package/dist/lib/cjs/index.d.cts +3 -1
- package/dist/lib/cjs/launched-device-selection.cjs +46 -0
- package/dist/lib/cjs/launched-device-selection.d.cts +112 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/paint-out-status-bar.cjs +170 -0
- package/dist/lib/cjs/paint-out-status-bar.d.cts +236 -0
- package/dist/lib/cjs/port-owner-query-verdict.cjs +94 -0
- package/dist/lib/cjs/port-owner-query-verdict.d.cts +161 -0
- package/dist/lib/cjs/resolve-emulator-device-id.cjs +27 -4
- package/dist/lib/cjs/sharp-loader.cjs +1 -1
- package/dist/lib/cjs/sharp-loader.d.cts +67 -2
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +12 -2
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +17 -2
- package/dist/lib/cjs/soft-keyboard.cjs +130 -28
- package/dist/lib/cjs/soft-keyboard.d.cts +65 -6
- package/dist/lib/cjs/transport-appium.cjs +74 -4
- package/dist/lib/cjs/transport-appium.d.cts +49 -2
- package/dist/lib/cjs/transport-factory.cjs +162 -42
- package/dist/lib/esm/adb.d.mts +10 -0
- package/dist/lib/esm/adb.mjs +2 -2
- package/dist/lib/esm/avd-name-channel.d.mts +152 -0
- package/dist/lib/esm/avd-name-channel.mjs +45 -0
- package/dist/lib/esm/avd-probe-verdict.d.mts +7 -0
- package/dist/lib/esm/avd-probe-verdict.mjs +15 -4
- package/dist/lib/esm/device-screenshot.d.mts +3 -1
- package/dist/lib/esm/device-screenshot.mjs +1 -1
- package/dist/lib/esm/emulator-backend.d.mts +81 -0
- package/dist/lib/esm/emulator-backend.mjs +19 -1
- package/dist/lib/esm/emulator-reclaim.d.mts +57 -9
- package/dist/lib/esm/emulator-reclaim.mjs +84 -36
- package/dist/lib/esm/enable-plugin.d.mts +3 -1
- package/dist/lib/esm/enable-plugin.mjs +17 -8
- package/dist/lib/esm/host-process-query-verdict.d.mts +196 -0
- package/dist/lib/esm/host-process-query-verdict.mjs +74 -0
- package/dist/lib/esm/index.d.mts +3 -1
- package/dist/lib/esm/index.mjs +15 -1
- package/dist/lib/esm/launched-device-selection.d.mts +112 -0
- package/dist/lib/esm/launched-device-selection.mjs +21 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/paint-out-status-bar.d.mts +236 -0
- package/dist/lib/esm/paint-out-status-bar.mjs +142 -0
- package/dist/lib/esm/port-owner-query-verdict.d.mts +161 -0
- package/dist/lib/esm/port-owner-query-verdict.mjs +73 -0
- package/dist/lib/esm/resolve-emulator-device-id.mjs +32 -4
- package/dist/lib/esm/sharp-loader.d.mts +67 -2
- package/dist/lib/esm/sharp-loader.mjs +1 -1
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +17 -2
- package/dist/lib/esm/soft-keyboard-geometry.mjs +11 -2
- package/dist/lib/esm/soft-keyboard.d.mts +65 -6
- package/dist/lib/esm/soft-keyboard.mjs +131 -28
- package/dist/lib/esm/transport-appium.d.mts +49 -2
- package/dist/lib/esm/transport-appium.mjs +74 -4
- package/dist/lib/esm/transport-factory.mjs +176 -44
- package/package.json +1 -1
|
@@ -10,36 +10,25 @@ import { captureDeviceScreenshot } from "./device-screenshot.mjs";
|
|
|
10
10
|
import { evalInObsidian } from "./eval-in-obsidian.mjs";
|
|
11
11
|
import {
|
|
12
12
|
buildSoftKeyboardDiagnosticMessage,
|
|
13
|
+
checkIsInputMethodShown,
|
|
13
14
|
checkIsSoftKeyboardUp,
|
|
14
15
|
parseInputMethodState,
|
|
15
16
|
resolveSoftKeyboardTapPoints
|
|
16
17
|
} from "./soft-keyboard-geometry.mjs";
|
|
17
18
|
const DEFAULT_DIAGNOSTICS_DIRECTORY = join(process.cwd(), "dist", "screenshots");
|
|
18
19
|
const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
|
|
20
|
+
const KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS = 900;
|
|
21
|
+
const KEYBOARD_RETRACT_ATTEMPT_COUNT = 2;
|
|
22
|
+
const KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS = KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS;
|
|
19
23
|
async function raiseSoftKeyboard(params) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
break;
|
|
24
|
+
await lowerSoftKeyboardIfShown(params);
|
|
25
|
+
const textToRestore = await emptyFieldForTouch(params);
|
|
26
|
+
try {
|
|
27
|
+
return await tapUntilKeyboardIsUp(params);
|
|
28
|
+
} finally {
|
|
29
|
+
if (textToRestore !== null) {
|
|
30
|
+
await writeFieldText(params, textToRestore);
|
|
28
31
|
}
|
|
29
|
-
await tapDevice({ deviceId: params.deviceId, point });
|
|
30
|
-
await sleep(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
31
|
-
snapshot = await readSoftKeyboardViewport(params);
|
|
32
|
-
}
|
|
33
|
-
if (!checkIsUp(snapshot)) {
|
|
34
|
-
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
35
|
-
}
|
|
36
|
-
return snapshot;
|
|
37
|
-
function checkIsUp(current) {
|
|
38
|
-
return checkIsSoftKeyboardUp({
|
|
39
|
-
baselineSnapshot,
|
|
40
|
-
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
41
|
-
snapshot: current
|
|
42
|
-
});
|
|
43
32
|
}
|
|
44
33
|
}
|
|
45
34
|
async function tapDevice(params) {
|
|
@@ -53,17 +42,91 @@ async function buildFailureMessage(params, baselineSnapshot, snapshot) {
|
|
|
53
42
|
mkdirSync(diagnosticsDirectory, { recursive: true });
|
|
54
43
|
const screenshotPath = join(diagnosticsDirectory, "keyboard-not-raised.png");
|
|
55
44
|
writeFileSync(screenshotPath, await captureDeviceScreenshot({ deviceId: params.deviceId }));
|
|
56
|
-
const dumpsysOutput = await runAdbText({
|
|
57
|
-
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
58
|
-
deviceId: params.deviceId
|
|
59
|
-
});
|
|
60
45
|
return buildSoftKeyboardDiagnosticMessage({
|
|
61
46
|
baselineSnapshot,
|
|
62
|
-
inputMethodState:
|
|
47
|
+
inputMethodState: await readInputMethodState(params),
|
|
63
48
|
screenshotPath,
|
|
64
49
|
snapshot
|
|
65
50
|
});
|
|
66
51
|
}
|
|
52
|
+
async function checkIsFieldPresent(params) {
|
|
53
|
+
return await evalInObsidian({
|
|
54
|
+
callback({ inputSelector }) {
|
|
55
|
+
return document.querySelector(inputSelector) !== null;
|
|
56
|
+
},
|
|
57
|
+
input: { inputSelector: params.inputSelector },
|
|
58
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function emptyFieldForTouch(params) {
|
|
62
|
+
if (params.shouldEmptyFieldForTouch === false) {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const content = await readFieldContent(params);
|
|
66
|
+
if (!content || content.text === "") {
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (!content.canWrite) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`raiseSoftKeyboard: "${params.inputSelector}" holds text but is not an <input> or a <textarea>, so it cannot be emptied for the touch and written back. The touch would land inside text and draw a selection handle, which a device capture photographs. Empty the field yourself before calling, or pass shouldEmptyFieldForTouch: false to touch it as it stands.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
await writeFieldText(params, "");
|
|
75
|
+
return content.text;
|
|
76
|
+
}
|
|
77
|
+
async function lowerSoftKeyboardIfShown(params) {
|
|
78
|
+
let inputMethodState = await readInputMethodState(params);
|
|
79
|
+
for (let attempt = 0; attempt < KEYBOARD_RETRACT_ATTEMPT_COUNT; attempt++) {
|
|
80
|
+
if (!checkIsInputMethodShown(inputMethodState)) {
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await sleep(KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS);
|
|
84
|
+
inputMethodState = await readInputMethodState(params);
|
|
85
|
+
if (!checkIsInputMethodShown(inputMethodState)) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const isFieldPresentBeforePress = await checkIsFieldPresent(params);
|
|
89
|
+
await runAdbText({
|
|
90
|
+
commandArguments: ["shell", "input", "keyevent", "KEYCODE_BACK"],
|
|
91
|
+
deviceId: params.deviceId
|
|
92
|
+
});
|
|
93
|
+
await sleep(KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS);
|
|
94
|
+
if (isFieldPresentBeforePress && !await checkIsFieldPresent(params)) {
|
|
95
|
+
throw new Error(
|
|
96
|
+
`raiseSoftKeyboard: KEYCODE_BACK, pressed to put down a keyboard the device reported showing, reached the app instead and closed the UI holding "${params.inputSelector}" \u2014 it matched before the press and matches nothing after it. The keyboard went down between the last read and the press. Let the previous keyboard settle before opening the UI to raise it on.
|
|
97
|
+
device before the press: ${inputMethodState}`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
inputMethodState = await readInputMethodState(params);
|
|
101
|
+
}
|
|
102
|
+
if (checkIsInputMethodShown(inputMethodState)) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`raiseSoftKeyboard: a keyboard was already up and did not go down after ${String(KEYBOARD_RETRACT_ATTEMPT_COUNT)} presses of KEYCODE_BACK, so the lift that proves a raise could not be measured. The field would read as one that never moved under a keyboard that is plainly showing.
|
|
105
|
+
device: ${inputMethodState}`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async function readFieldContent(params) {
|
|
110
|
+
return await evalInObsidian({
|
|
111
|
+
callback({ inputSelector }) {
|
|
112
|
+
const element = document.querySelector(inputSelector);
|
|
113
|
+
if (!element) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const canWrite = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement;
|
|
117
|
+
return { canWrite, text: canWrite ? element.value : element.textContent };
|
|
118
|
+
},
|
|
119
|
+
input: { inputSelector: params.inputSelector },
|
|
120
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async function readInputMethodState(params) {
|
|
124
|
+
const dumpsysOutput = await runAdbText({
|
|
125
|
+
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
126
|
+
deviceId: params.deviceId
|
|
127
|
+
});
|
|
128
|
+
return parseInputMethodState(dumpsysOutput);
|
|
129
|
+
}
|
|
67
130
|
async function readSoftKeyboardViewport(params) {
|
|
68
131
|
return await evalInObsidian({
|
|
69
132
|
callback({ inputSelector }) {
|
|
@@ -87,8 +150,48 @@ async function readSoftKeyboardViewport(params) {
|
|
|
87
150
|
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
88
151
|
});
|
|
89
152
|
}
|
|
153
|
+
async function tapUntilKeyboardIsUp(params) {
|
|
154
|
+
const baselineSnapshot = await readSoftKeyboardViewport(params);
|
|
155
|
+
let snapshot = baselineSnapshot;
|
|
156
|
+
if (!snapshot.inputRect) {
|
|
157
|
+
throw new Error(`raiseSoftKeyboard: nothing matches "${params.inputSelector}", so there is no field to touch.`);
|
|
158
|
+
}
|
|
159
|
+
for (const point of resolveSoftKeyboardTapPoints({ snapshot })) {
|
|
160
|
+
if (checkIsUp(snapshot)) {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
await tapDevice({ deviceId: params.deviceId, point });
|
|
164
|
+
await sleep(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
165
|
+
snapshot = await readSoftKeyboardViewport(params);
|
|
166
|
+
}
|
|
167
|
+
if (!checkIsUp(snapshot)) {
|
|
168
|
+
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
169
|
+
}
|
|
170
|
+
return snapshot;
|
|
171
|
+
function checkIsUp(current) {
|
|
172
|
+
return checkIsSoftKeyboardUp({
|
|
173
|
+
baselineSnapshot,
|
|
174
|
+
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
175
|
+
snapshot: current
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function writeFieldText(params, text) {
|
|
180
|
+
await evalInObsidian({
|
|
181
|
+
callback({ inputSelector, text: value }) {
|
|
182
|
+
const element = document.querySelector(inputSelector);
|
|
183
|
+
if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) {
|
|
184
|
+
throw new TypeError(`raiseSoftKeyboard: "${inputSelector}" is not a field whose value can be written.`);
|
|
185
|
+
}
|
|
186
|
+
element.value = value;
|
|
187
|
+
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
188
|
+
},
|
|
189
|
+
input: { inputSelector: params.inputSelector, text },
|
|
190
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
191
|
+
});
|
|
192
|
+
}
|
|
90
193
|
export {
|
|
91
194
|
raiseSoftKeyboard,
|
|
92
195
|
tapDevice
|
|
93
196
|
};
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5tanMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc1NvZnRLZXlib2FyZFVwLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIHRvIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgYSBmYWlsZWQgYXR0ZW1wdCB3cml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlci5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBpdCBpcyBgZGlzdC9zY3JlZW5zaG90c2AgdW5kZXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IFx1MjAxNCByZXNvbHZlZCBhdCBsb2FkLCBzbyB0aGVyZSBpcyBub1xuICAgKiBsaXRlcmFsIGRlZmF1bHQgdG8gc3RhdGUgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIHNlbGVjdG9yIG9mIHRoZSBmaWVsZCB0byB0b3VjaCwgZS5nLiBgLnByb21wdC1pbnB1dGAuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlbGVjdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTYCBmcm9tIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YCBhcHBsaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipDYWxsIGl0IHdpdGggdGhlIGtleWJvYXJkIERPV04uKiogVGhlIGZpcnN0IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCxcbiAqIHNvIGEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGxlYXZlcyB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCB0aGlzIHRocm93cy4gVGhhdCBpcyB0aGVcbiAqIGRlbGliZXJhdGUgdHJhZGUgZm9yIHdvcmtpbmcgb24gYSBjZW50cmVkIG1vZGFsIGFzIHdlbGwgYXMgYSBib3R0b20tYW5jaG9yZWQgb25lIFx1MjAxNCBzZWVcbiAqIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBuZXZlciBtYXRjaGVkLCBvciBpZiBpdCBuZXZlciBsaWZ0ZWQsIHRoZSBsYXR0ZXIgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZGV2aWNlIGF0IGEgcG9pbnQsIHRoZSB3YXkgYSB0aHVtYiB3b3VsZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgd2hlcmUgdG8gdG91Y2ggaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHRvdWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YXBEZXZpY2UocGFyYW1zOiBUYXBEZXZpY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCBTdHJpbmcocGFyYW1zLnBvaW50LnhJblBpeGVscyksIFN0cmluZyhwYXJhbXMucG9pbnQueUluUGl4ZWxzKV0sXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgcmVhZHMgdGhlIGRldmljZSdzIGBpbnB1dF9tZXRob2RgIHN0YXRlLCB0aGVuIGNvbXBvc2VzIHRoZSBmYWlsdXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5LlxuICogQHBhcmFtIGJhc2VsaW5lU25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoLCB3aGljaCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdG91Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtZXNzYWdlIHRvIHRocm93LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEZhaWx1cmVNZXNzYWdlKFxuICBwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBiYXNlbGluZVNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90LFxuICBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NEaXJlY3RvcnkgPSBwYXJhbXMuZGlhZ25vc3RpY3NEaXJlY3RvcnkgPz8gREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlk7XG4gIG1rZGlyU3luYyhkaWFnbm9zdGljc0RpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBqb2luKGRpYWdub3N0aWNzRGlyZWN0b3J5LCAna2V5Ym9hcmQtbm90LXJhaXNlZC5wbmcnKTtcbiAgd3JpdGVGaWxlU3luYyhzY3JlZW5zaG90UGF0aCwgYXdhaXQgY2FwdHVyZURldmljZVNjcmVlbnNob3QoeyBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkIH0pKTtcblxuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogcGFyc2VJbnB1dE1ldGhvZFN0YXRlKGR1bXBzeXNPdXRwdXQpLFxuICAgIHNjcmVlbnNob3RQYXRoLFxuICAgIHNuYXBzaG90XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBtZWFzdXJlIGFuZCB0aGUgdmF1bHQgdG8gcmVhZCBpdCBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmlld3BvcnQgYW5kIHRoZSBmaWVsZCdzIHJlY3QsIGluIENTUyBwaXhlbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTb2Z0S2V5Ym9hcmRWaWV3cG9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90IHtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gVGhpcyBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgYW5kIGV2YWx1YXRlZCBpbiB0aGUgcmVuZGVyZXIsIHNvIGEgaGVscGVyIGhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHdvdWxkIG5vdCBleGlzdCB0aGVyZS5cbiAgICAgIGZ1bmN0aW9uIHRvUmVjdChyZWN0OiBET01SZWN0KTogRWxlbWVudFJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIGlubmVySGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgIGlucHV0UmVjdDogaW5wdXRFbCA/IHRvUmVjdChpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSA6IG51bGwsXG4gICAgICAgIHNjcmVlblk6IHdpbmRvdy5zY3JlZW5ZXG4gICAgICB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBK0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtBQUNwQixTQUFTLGNBQWMsYUFBYTtBQVFwQyxTQUFTLGtCQUFrQjtBQUMzQixTQUFTLCtCQUErQjtBQUN4QyxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBdURQLE1BQU0sZ0NBQWdDLEtBQUssUUFBUSxJQUFJLEdBQUcsUUFBUSxhQUFhO0FBSy9FLE1BQU0sd0NBQXdDO0FBa0I5QyxlQUFzQixrQkFBa0IsUUFBd0U7QUFDOUcsUUFBTSxtQkFBbUIsTUFBTSx5QkFBeUIsTUFBTTtBQUM5RCxNQUFJLFdBQVc7QUFFZixNQUFJLENBQUMsU0FBUyxXQUFXO0FBQ3ZCLFVBQU0sSUFBSSxNQUFNLHVDQUF1QyxPQUFPLGFBQWEsbUNBQW1DO0FBQUEsRUFDaEg7QUFFQSxhQUFXLFNBQVMsNkJBQTZCLEVBQUUsU0FBUyxDQUFDLEdBQUc7QUFDOUQsUUFBSSxVQUFVLFFBQVEsR0FBRztBQUN2QjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsRUFBRSxVQUFVLE9BQU8sVUFBVSxNQUFNLENBQUM7QUFDcEQsVUFBTSxNQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsV0FBTyxzQkFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVFBLGVBQXNCLFVBQVUsUUFBd0M7QUFDdEUsUUFBTSxXQUFXO0FBQUEsSUFDZixrQkFBa0IsQ0FBQyxTQUFTLFNBQVMsT0FBTyxPQUFPLE9BQU8sTUFBTSxTQUFTLEdBQUcsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQUEsSUFDMUcsVUFBVSxPQUFPO0FBQUEsRUFDbkIsQ0FBQztBQUNIO0FBVUEsZUFBZSxvQkFDYixRQUNBLGtCQUNBLFVBQ2lCO0FBQ2pCLFFBQU0sdUJBQXVCLE9BQU8sd0JBQXdCO0FBQzVELFlBQVUsc0JBQXNCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFFbkQsUUFBTSxpQkFBaUIsS0FBSyxzQkFBc0IseUJBQXlCO0FBQzNFLGdCQUFjLGdCQUFnQixNQUFNLHdCQUF3QixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQztBQUUxRixRQUFNLGdCQUFnQixNQUFNLFdBQVc7QUFBQSxJQUNyQyxrQkFBa0IsQ0FBQyxTQUFTLFdBQVcsY0FBYztBQUFBLElBQ3JELFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFFRCxTQUFPLG1DQUFtQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxrQkFBa0Isc0JBQXNCLGFBQWE7QUFBQSxJQUNyRDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVFBLGVBQWUseUJBQXlCLFFBQXdFO0FBQzlHLFNBQU8sTUFBTSxlQUFlO0FBQUEsSUFDMUIsU0FBUyxFQUFFLGNBQWMsR0FBaUM7QUFDeEQsWUFBTSxVQUFVLFNBQVMsY0FBYyxhQUFhO0FBR3BELGVBQVMsT0FBTyxNQUE0QjtBQUMxQyxlQUFPO0FBQUEsVUFDTCxRQUFRLEtBQUs7QUFBQSxVQUNiLE1BQU0sS0FBSztBQUFBLFVBQ1gsS0FBSyxLQUFLO0FBQUEsVUFDVixPQUFPLEtBQUs7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLGFBQU87QUFBQSxRQUNMLGtCQUFrQixPQUFPO0FBQUEsUUFDekIsYUFBYSxPQUFPO0FBQUEsUUFDcEIsV0FBVyxVQUFVLE9BQU8sUUFBUSxzQkFBc0IsQ0FBQyxJQUFJO0FBQUEsUUFDL0QsU0FBUyxPQUFPO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQSxPQUFPLEVBQUUsZUFBZSxPQUFPLGNBQWM7QUFBQSxJQUM3QyxHQUFJLE9BQU8sY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFVBQVU7QUFBQSxFQUN0RSxDQUFDO0FBQ0g7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5Lm1qcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5tanMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90Lm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc0lucHV0TWV0aG9kU2hvd24sXG4gIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcCxcbiAgcGFyc2VJbnB1dE1ldGhvZFN0YXRlLFxuICByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5tanMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgd3JpdGVzIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgaXQgaXMgYGRpc3Qvc2NyZWVuc2hvdHNgIHVuZGVyIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBcdTIwMTQgcmVzb2x2ZWQgYXQgbG9hZCwgc28gdGhlcmUgaXMgbm9cbiAgICogbGl0ZXJhbCBkZWZhdWx0IHRvIHN0YXRlIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBkaWFnbm9zdGljc0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENTUyBzZWxlY3RvciBvZiB0aGUgZmllbGQgdG8gdG91Y2gsIGUuZy4gYC5wcm9tcHQtaW5wdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRTZWxlY3Rvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVhc3QgYSByYWlzZWQga2V5Ym9hcmQgbGlmdHMgdGhlIGZpZWxkIGJ5LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU2AgZnJvbSBgc29mdC1rZXlib2FyZC1nZW9tZXRyeWAgYXBwbGllcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtcHR5IHRoZSBmaWVsZCBiZWZvcmUgdGhlIHRvdWNoLCBhbmQgd3JpdGUgaXRzIHRleHQgYmFjayBhZnRlcndhcmRzLlxuICAgKlxuICAgKiAqKk9uIGJ5IGRlZmF1bHQsIGJlY2F1c2UgdGhlIHRvdWNoIHRoYXQgcmFpc2VzIHRoZSBrZXlib2FyZCBhbHNvIGRyYXdzIGEgc2VsZWN0aW9uIGhhbmRsZSB3aGVuIGl0XG4gICAqIGxhbmRzIGluc2lkZSBURVhULioqIENocm9taXVtIHNob3dzIHRoZSBpbnNlcnRpb24gaGFuZGxlIG9uIGEgdGFwIGludG8gdGV4dCBhbmQgZHJhd3Mgbm9uZSBvbiBhIHRhcFxuICAgKiBpbnRvIGFuIEVNUFRZIGVkaXRhYmxlLCBhbmQgYSBkZXZpY2UgY2FwdHVyZSBwaG90b2dyYXBocyBpdCBcdTIwMTQgd2hpY2ggaXMgaG93IGBvYnNpZGlhbi1saW5rLXBpY2tlcmBcbiAgICogc2hpcHBlZCBhIHRlYWwgaGFuZGxlIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHVuZGVyc3Rvb2Qgd2hlcmUgaXQgY2FtZSBmcm9tLiBBXG4gICAqIHZhbHVlIHdyaXR0ZW4gYnkgc2NyaXB0IHJhaXNlcyBubyBoYW5kbGUsIHNvIGVtcHR5aW5nIHRoZSBmaWVsZCwgdG91Y2hpbmcgaXQsIGFuZCB3cml0aW5nIHRoZSB0ZXh0XG4gICAqIGJhY2sgbGVhdmVzIHRoZSBmcmFtZSBzaG93aW5nIHRoZSBzYW1lIHF1ZXJ5IHdpdGggbm90aGluZyBoYW5naW5nIG9mZiBpdC5cbiAgICpcbiAgICogT25seSBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAgaXMgZW1wdGllZC4gQSBgY29udGVudGVkaXRhYmxlYCBob2xkaW5nIHRleHQgaXMgUkVGVVNFRCByYXRoZXJcbiAgICogdGhhbiB3cml0dGVuIHRvOiBpdHMgY29udGVudCB1c3VhbGx5IGJlbG9uZ3MgdG8gYW4gZWRpdG9yIHRoYXQgb3ducyBpdHMgb3duIERPTSwgYW5kIGJsYW5raW5nIHRoYXRcbiAgICogYnkgaGFuZCBkZXN0cm95cyBpdC4gRW1wdHkgc3VjaCBhIGZpZWxkIHlvdXJzZWxmLCBvciB0dXJuIHRoaXMgb2ZmLlxuICAgKlxuICAgKiBUdXJuaW5nIGl0IG9mZiByZXN0b3JlcyB0aGUgcHJlLTIwMjYtMDktMjMgYmVoYXZpb3VyIGV4YWN0bHk6IHRoZSBmaWVsZCBpcyB0b3VjaGVkIGFzIGl0IHN0YW5kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgdW5kZXIgYGRpc3QvYCwgd2hpY2ggYSBwbHVnaW4gcmVwbyB1c2luZyB0aGlzIGhhcm5lc3MgZ2l0aWdub3JlcywgbGlrZSB0aGUgY2FwdHVyZSBzY3JhdGNoIGZpbGVzLlxuICovXG5jb25zdCBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Rpc3QnLCAnc2NyZWVuc2hvdHMnKTtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgaW4sIGFmdGVyIHdoaWNoIHRoZSBsYXlvdXQgaGFzIHNldHRsZWQuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxNTAwO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBvdXQgYWZ0ZXIgYEtFWUNPREVfQkFDS2AsIG1lYXN1cmVkIGluIHRoZSBjYXB0dXJlIHN1aXRlIHRoaXNcbiAqIHdhcyBtb3ZlZCBvdXQgb2YuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYmVmb3JlIGEga2V5Ym9hcmQgdGhhdCB3aWxsIG5vdCBnbyBkb3duIGlzIHJlcG9ydGVkLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGUgZmlyc3QgcHJlc3MgY2FuIGxhbmQgd2hpbGUgdGhlIElNRSBpcyBzdGlsbCBhbmltYXRpbmcgVVAgZnJvbSB0aGUgZm9jdXMgdGhhdCByYWlzZWRcbiAqIGl0LCBhbmQgYW4gSU1FIG1pZC1hbmltYXRpb24gc3dhbGxvd3MgdGhlIGtleSB3aXRob3V0IHJldHJhY3RpbmcuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCA9IDI7XG5cbi8qKlxuICogSG93IGxvbmcgYSBrZXlib2FyZCByZXBvcnRlZCBzaG93aW5nIGlzIHdhdGNoZWQgYmVmb3JlIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYXQgaXQuXG4gKlxuICogT25lIHJldHJhY3QgYW5pbWF0aW9uOiBhbiBJTUUgYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gXHUyMDE0IHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQgXHUyMDE0IGlzXG4gKiBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGJ5IGEgcmVhZCB0YWtlbiBhdCB0aGUgc3RhcnQgb2YgaXRzIHJldHJhY3QsIGFuZCBpcyBnb25lIGJ5IHRoZSBlbmQgb2YgaXQuIFByZXNzaW5nXG4gKiBhdCB0aGUgZmlyc3QgcmVhZCB0aGVuIGxhbmRzIHRoZSBrZXkgb24gdGhlIGFwcCBpbnN0ZWFkLCB3aGljaCBjbG9zZXMgdGhlIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0b1xuICogcGhvdG9ncmFwaC4gVHdvIHJlYWRzIHRoYXQgYWdyZWUgYWNyb3NzIHRoaXMgd2luZG93IHNheSB0aGUga2V5Ym9hcmQgaXMgc3RheWluZyB1cC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0hPV05fQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIFdoYXQgYSBmaWVsZCBob2xkcywgYW5kIHdoZXRoZXIgaXQgaXMgb25lIHRoaXMgY2FuIHB1dCBiYWNrLlxuICovXG5pbnRlcmZhY2UgRmllbGRDb250ZW50IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgY2FuIGJlIHdyaXR0ZW4gXHUyMDE0IHRydWUgZm9yIGFuIGA8aW5wdXQ+YCBvciBhIGA8dGV4dGFyZWE+YCwgZmFsc2UgZm9yXG4gICAqIGFueXRoaW5nIGVsc2UsIHdob3NlIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00uXG4gICAqL1xuICByZWFkb25seSBjYW5Xcml0ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdGhlIGZpZWxkIGN1cnJlbnRseSBob2xkcy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipBIGtleWJvYXJkIHRoYXQgaXMgYWxyZWFkeSB1cCBpcyBwdXQgRE9XTiBmaXJzdC4qKiBUaGUgZmlyc3QgZ2VvbWV0cnkgcmVhZCBpcyB0aGUgYmFzZWxpbmUgZXZlcnkgbGF0ZXJcbiAqIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCwgc28gYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIGxlYXZlIHRoZSBmaWVsZCBub3RoaW5nIHRvIGxpZnQgYnkgYW5kIHJlYWQgYXNcbiAqIG9uZSB0aGF0IG5ldmVyIGNhbWUuIFRoZSBkZXZpY2UgaXMgYXNrZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UsIGFuZCBhIHNob3dpbmcgSU1FIGlzIHJldHJhY3RlZCB3aXRoXG4gKiBgS0VZQ09ERV9CQUNLYCBcdTIwMTQgYXNrZWQgRklSU1QgYmVjYXVzZSwgd2l0aCBubyBJTUUgc2hvd2luZywgdGhhdCBrZXkgcmVhY2hlcyB0aGUgYXBwIGFuZCBjbG9zZXMgdGhlIHZlcnlcbiAqIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0byBwaG90b2dyYXBoLiBTbyB0aGUgaGVscGVyIGlzIHNhZmUgdG8gY2FsbCBvbmNlIHBlciBmcmFtZSBvZiBhIG11bHRpLWZyYW1lXG4gKiBzdWl0ZSwgYW5kIGV2ZXJ5IGNhbGwgc3RpbGwgcHJvdmVzIGl0cyBvd24gbGlmdC4gVGhlIG90aGVyIGFuc3dlciBcdTIwMTQgYWNjZXB0aW5nIGEgemVybyBsaWZ0IHdoZW5ldmVyIHRoZVxuICogZGV2aWNlIHJlcG9ydHMgYSBrZXlib2FyZCBcdTIwMTQgd2FzIHJlZnVzZWQsIGJlY2F1c2UgaXQgYWNjZXB0cyBhIGZyYW1lIHRoZSBoZWxwZXIgZGlkIG5vdCBwcm92ZS5cbiAqXG4gKiAqKlRoZSBmaWVsZCBpcyBFTVBUSUVEIGZvciB0aGUgdG91Y2ggYW5kIHdyaXR0ZW4gYmFjayBhZnRlcndhcmRzKiosIGJlY2F1c2UgYSB0b3VjaCB0aGF0IGxhbmRzIGluc2lkZVxuICogdGV4dCBkcmF3cyBDaHJvbWl1bSdzIHNlbGVjdGlvbiBoYW5kbGUgYW5kIHRoZSBmcmFtZWJ1ZmZlciBwaG90b2dyYXBocyBpdCBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMuc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNofSwgd2hpY2ggdHVybnMgdGhhdCBvZmYuXG4gKlxuICogKipUaGUgZ2VvbWV0cnkgcmV0dXJuZWQgaXMgcmVhZCB3aXRoIHRoZSBmaWVsZCBzdGlsbCBlbXB0eSoqLCBhbmQgdGhlIHRleHQgaXMgd3JpdHRlbiBiYWNrIGFmdGVyIGl0LlxuICogVGhhdCBpcyB0aGUgc3RhdGUgdGhlIHByb3ZlbiBjYXB0dXJlIHN1aXRlcyBhc3NlcnQgYWdhaW5zdCwgYW5kIGl0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW5cbiAqIGluY2lkZW50YWw6IHRoZSBiYXNlbGluZSBpcyByZWFkIEFGVEVSIHRoZSBmaWVsZCBpcyBlbXB0aWVkLCBzbyB0aGUgbGlmdCBpcyBtZWFzdXJlZCBiZXR3ZWVuIHR3byByZWFkc1xuICogb2YgdGhlIHNhbWUgZmllbGQgY29udGVudC4gQSBmaWVsZCB3aG9zZSBvd24gdGV4dCBjaGFuZ2VzIHRoZSBsYXlvdXQgYXJvdW5kIGl0IFx1MjAxNCBhIHN1Z2dlc3RlciB3aG9zZSByb3dcbiAqIGNvdW50IGFuc3dlcnMgdGhlIHF1ZXJ5IFx1MjAxNCBtb3ZlcyB3aGVuIGl0IGlzIGNsZWFyZWQsIGFuZCBhIGRlbHRhIG1lYXN1cmVkIGFjcm9zcyB0aGF0IG1vdmUgaXMgbm90IGFcbiAqIGtleWJvYXJkLiBSZWFkIHRoZSBnZW9tZXRyeSBhZ2FpbiB5b3Vyc2VsZiBpZiB0aGUgcmVzdG9yZWQgdGV4dCBtb3ZlcyBhbnl0aGluZyB5b3UgYXJlIGFib3V0IHRvIGFzc2VydFxuICogb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIG5vdCBnbyBkb3duLCBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgaWYgaXQgaG9sZHMgdGV4dFxuICogICB0aGlzIGNhbm5vdCBlbXB0eSBhbmQgcHV0IGJhY2ssIG9yIGlmIGl0IG5ldmVyIGxpZnRlZCBcdTIwMTQgdGhlIGxhc3QgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyXG4gKiAgIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGF3YWl0IGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXMpO1xuXG4gIGNvbnN0IHRleHRUb1Jlc3RvcmUgPSBhd2FpdCBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlc3RvcmVkIGV2ZW4gd2hlbiB0aGUgcmFpc2UgZmFpbGVkOiBhIGNhbGxlciB0aGF0IGlzIGFib3V0IHRvIHJlYWQgaXRzIG93biBkaWFnbm9zdGljIHNob3VsZCBub3RcbiAgICAvLyBhbHNvIGhhdmUgdG8gZGlzY292ZXIgdGhhdCBpdHMgcXVlcnkgaXMgZ29uZS5cbiAgICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgd3JpdGVGaWVsZFRleHQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBkZXZpY2UgYXQgYSBwb2ludCwgdGhlIHdheSBhIHRodW1iIHdvdWxkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB3aGVyZSB0byB0b3VjaCBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdG91Y2ggaGFzIGJlZW4gZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhcERldmljZShwYXJhbXM6IFRhcERldmljZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ3RhcCcsIFN0cmluZyhwYXJhbXMucG9pbnQueEluUGl4ZWxzKSwgU3RyaW5nKHBhcmFtcy5wb2ludC55SW5QaXhlbHMpXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIGFuZCByZWFkcyB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHRoZW4gY29tcG9zZXMgdGhlIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gYmFzZWxpbmVTbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2gsIHdoaWNoIHRoZSB2ZXJkaWN0IGlzIG1lYXN1cmVkIGFnYWluc3QuXG4gKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gdGhyb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmFpbHVyZU1lc3NhZ2UoXG4gIHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsXG4gIGJhc2VsaW5lU25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QsXG4gIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWFnbm9zdGljc0RpcmVjdG9yeSA9IHBhcmFtcy5kaWFnbm9zdGljc0RpcmVjdG9yeSA/PyBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWTtcbiAgbWtkaXJTeW5jKGRpYWdub3N0aWNzRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGpvaW4oZGlhZ25vc3RpY3NEaXJlY3RvcnksICdrZXlib2FyZC1ub3QtcmFpc2VkLnBuZycpO1xuICB3cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RQYXRoLCBhd2FpdCBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQgfSkpO1xuXG4gIHJldHVybiBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlKHtcbiAgICBiYXNlbGluZVNuYXBzaG90LFxuICAgIGlucHV0TWV0aG9kU3RhdGU6IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyksXG4gICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgc25hcHNob3RcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnl0aGluZyBpbiB0aGUgcGFnZSBtYXRjaGVzIHRoZSBmaWVsZCdzIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgaXQgbWF0Y2hlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpICE9PSBudWxsO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGZpZWxkIHRoZSB0b3VjaCBpcyBhYm91dCB0byBsYW5kIG9uLCBhbmQgcmVwb3J0cyB3aGF0IHRvIHdyaXRlIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBlbXB0eSwgYW5kIHdoZXRoZXIgdG8gZW1wdHkgaXQgYXQgYWxsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCB0byByZXN0b3JlLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdhcyBlbXB0aWVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgaG9sZHMgdGV4dCB0aGF0IGNhbm5vdCBiZSB3cml0dGVuIGJhY2sgXHUyMDE0IGEgYGNvbnRlbnRlZGl0YWJsZWAsIHdob3NlIGNvbnRlbnRcbiAqICAgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAocGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG5cbiAgLy8gTm90aGluZyBtYXRjaGVkLiBUaGUgZ2VvbWV0cnkgcmVhZCBkb2VzIHRoZSByZXBvcnRpbmcsIHdpdGggdGhlIG1lc3NhZ2UgaXQgYWx3YXlzIGhhZC5cbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY29udGVudC5jYW5Xcml0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGhvbGRzIHRleHQgYnV0IGlzIG5vdCBhbiA8aW5wdXQ+IG9yIGEgPHRleHRhcmVhPiwgc28gaXQgYFxuICAgICAgICArICdjYW5ub3QgYmUgZW1wdGllZCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2suIFRoZSB0b3VjaCB3b3VsZCBsYW5kIGluc2lkZSB0ZXh0IGFuZCBkcmF3IGEgJ1xuICAgICAgICArICdzZWxlY3Rpb24gaGFuZGxlLCB3aGljaCBhIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzLiBFbXB0eSB0aGUgZmllbGQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcsIG9yICdcbiAgICAgICAgKyAncGFzcyBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2g6IGZhbHNlIHRvIHRvdWNoIGl0IGFzIGl0IHN0YW5kcy4nXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgJycpO1xuXG4gIHJldHVybiBjb250ZW50LnRleHQ7XG59XG5cbi8qKlxuICogUHV0cyB0aGUga2V5Ym9hcmQgZG93biB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBvbmUgc2hvd2luZywgc28gdGhlIGJhc2VsaW5lIHJlYWQgbmV4dCBpcyBvbmUgdGhlIHRvdWNoXG4gKiBjYW4gbGlmdCB0aGUgZmllbGQgZnJvbS5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgaXMgcHJlc3NlZCBhdCBvbmx5IG9uY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgc2hvd2luZyBUV0lDRSwgb25lIHJldHJhY3QgYW5pbWF0aW9uIGFwYXJ0LioqXG4gKiBgS0VZQ09ERV9CQUNLYCBpcyByZXRyYWN0ZWQgYnkgdGhlIElNRSBvbmx5IHdoaWxlIHRoZSBJTUUgaXMgdXA7IG9uY2UgaXQgaGFzIGdvbmUsIHRoZSBrZXkgcmVhY2hlcyB0aGVcbiAqIGFwcCwgYW5kIE9ic2lkaWFuIGNsb3NlcyB0aGUgbW9kYWwgb24gc2NyZWVuIFx1MjAxNCB0aGUgb25lIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gQSBrZXlib2FyZFxuICogYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gKHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQsIGFuZCB0aGUgY2FsbGVyIG9wZW5lZCBhIGZyZXNoIG9uZVxuICogc3RyYWlnaHQgYWZ0ZXIpIGlzIHN0aWxsIHJlcG9ydGVkIHNob3dpbmcgYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBzbyBwcmVzc2luZyBhdCB0aGUgZmlyc3QgcmVhZFxuICogcmFjZWQgaXQuIEl0IGlzIHdhdGNoZWQgZm9yIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBmaXJzdCwgYW5kIGEga2V5Ym9hcmQgdGhhdCB3ZW50IGRvd24gb24gaXRzIG93biBpc1xuICogbGVmdCBhbG9uZS5cbiAqXG4gKiAqKkFuZCBhIHByZXNzIHRoYXQgcmVhY2hlZCB0aGUgYXBwIGFueXdheSBpcyBuYW1lZCBhcyB0aGF0LioqIFRoZSBmaWVsZCBpcyBsb29rZWQgdXAgYmVmb3JlIHRoZSBwcmVzc1xuICogYW5kIGFmdGVyIGl0OyBvbmUgdGhhdCBtYXRjaGVkIGJlZm9yZSBhbmQgbm90IGFmdGVyIHdhcyBjbG9zZWQgYnkgdGhlIGtleSwgYW5kIHNheWluZyBzbyBiZWF0cyB0aGVcbiAqIGBub3RoaW5nIG1hdGNoZXNgIHRoYXQgdGhlIHJhaXNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBzdGVwIGxhdGVyLCBhYm91dCBhIHNlbGVjdG9yIHRoYXQgd2FzIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIGFzaywgYW5kIHRoZSBmaWVsZCB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgcHJlc3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8ga2V5Ym9hcmQgaXMgc2hvd2luZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBpcyBzdGlsbCBzaG93aW5nIGFmdGVyIHtAbGluayBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlR9IHByZXNzZXMgb2ZcbiAqICAgYEtFWUNPREVfQkFDS2AgXHUyMDE0IHRoZSByYWlzZSB0aGF0IGZvbGxvd3MgY291bGQgcHJvdmUgbm90aGluZywgYW5kIGl0cyBvd24gZmFpbHVyZSB3b3VsZCBibGFtZSBhIGtleWJvYXJkXG4gKiAgIHRoYXQgbmV2ZXIgY2FtZSB3aGVuIHRoZSB0cnV0aCBpcyBvbmUgdGhhdCBuZXZlciBsZWZ0IFx1MjAxNCBvciBpZiBhIHByZXNzIGNsb3NlZCB0aGUgZmllbGQncyBvd24gVUkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuXG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmllbGRQcmVzZW50QmVmb3JlUHJlc3MgPSBhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcyk7XG4gICAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWUNPREVfQkFDSyddLFxuICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICAgIH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmIChpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzICYmICFhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JhaXNlU29mdEtleWJvYXJkOiBLRVlDT0RFX0JBQ0ssIHByZXNzZWQgdG8gcHV0IGRvd24gYSBrZXlib2FyZCB0aGUgZGV2aWNlIHJlcG9ydGVkIHNob3dpbmcsIHJlYWNoZWQgdGhlIGFwcCBpbnN0ZWFkIGFuZCAnXG4gICAgICAgICAgKyBgY2xvc2VkIHRoZSBVSSBob2xkaW5nIFwiJHtwYXJhbXMuaW5wdXRTZWxlY3Rvcn1cIiBcdTIwMTQgaXQgbWF0Y2hlZCBiZWZvcmUgdGhlIHByZXNzIGFuZCBtYXRjaGVzIG5vdGhpbmcgYWZ0ZXIgaXQuIFRoZSBgXG4gICAgICAgICAgKyAna2V5Ym9hcmQgd2VudCBkb3duIGJldHdlZW4gdGhlIGxhc3QgcmVhZCBhbmQgdGhlIHByZXNzLiBMZXQgdGhlIHByZXZpb3VzIGtleWJvYXJkIHNldHRsZSBiZWZvcmUgb3BlbmluZyB0aGUgVUkgJ1xuICAgICAgICAgICsgYHRvIHJhaXNlIGl0IG9uLlxuZGV2aWNlIGJlZm9yZSB0aGUgcHJlc3M6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuICB9XG5cbiAgaWYgKGNoZWNrSXNJbnB1dE1ldGhvZFNob3duKGlucHV0TWV0aG9kU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBhIGtleWJvYXJkIHdhcyBhbHJlYWR5IHVwIGFuZCBkaWQgbm90IGdvIGRvd24gYWZ0ZXIgJHtTdHJpbmcoS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UKX0gcHJlc3NlcyBvZiBgXG4gICAgICAgICsgJ0tFWUNPREVfQkFDSywgc28gdGhlIGxpZnQgdGhhdCBwcm92ZXMgYSByYWlzZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFRoZSBmaWVsZCB3b3VsZCByZWFkIGFzIG9uZSB0aGF0IG5ldmVyICdcbiAgICAgICAgKyBgbW92ZWQgdW5kZXIgYSBrZXlib2FyZCB0aGF0IGlzIHBsYWlubHkgc2hvd2luZy5cbmRldmljZTogJHtpbnB1dE1ldGhvZFN0YXRlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgZmllbGQgaG9sZHMsIGFuZCB3aGV0aGVyIGl0IGlzIG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbiBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWVsZENvbnRlbnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8RmllbGRDb250ZW50IHwgbnVsbD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogRmllbGRDb250ZW50IHwgbnVsbCB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5Xcml0ZSA9IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuXG4gICAgICByZXR1cm4geyBjYW5Xcml0ZSwgdGV4dDogY2FuV3JpdGUgPyBlbGVtZW50LnZhbHVlIDogZWxlbWVudC50ZXh0Q29udGVudCB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEFza3MgdGhlIGRldmljZSB3aGF0IGl0cyBJTUUgaXMgZG9pbmcgXHUyMDE0IHRoZSBvbmx5IHBsYWNlIHRoYXQga25vd3MsIHNpbmNlIG5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSB0byBhc2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWVsZHMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0ga2VlcHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbWVhc3VyZSBhbmQgdGhlIHZhdWx0IHRvIHJlYWQgaXQgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZpZXdwb3J0IGFuZCB0aGUgZmllbGQncyByZWN0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIFRoaXMgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGFuZCBldmFsdWF0ZWQgaW4gdGhlIHJlbmRlcmVyLCBzbyBhIGhlbHBlciBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSB3b3VsZCBub3QgZXhpc3QgdGhlcmUuXG4gICAgICBmdW5jdGlvbiB0b1JlY3QocmVjdDogRE9NUmVjdCk6IEVsZW1lbnRSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZVBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICBpbm5lckhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgICBpbnB1dFJlY3Q6IGlucHV0RWwgPyB0b1JlY3QoaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkgOiBudWxsLFxuICAgICAgICBzY3JlZW5ZOiB3aW5kb3cuc2NyZWVuWVxuICAgICAgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBmaWVsZCB1bnRpbCB0aGUga2V5Ym9hcmQgaXMgdXAsIGFuZCBzYXlzIHNvIHdoZW4gaXQgbmV2ZXIgY2FtZS5cbiAqXG4gKiBUaGUgYmFzZWxpbmUgaXMgcmVhZCBoZXJlIHJhdGhlciB0aGFuIGJ5IHRoZSBjYWxsZXIsIHNvIGl0IGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgaW4gdGhlIHN0YXRlIHRoZVxuICogdGFwcyBhcmUgZGlzcGF0Y2hlZCBhZ2FpbnN0IFx1MjAxNCBzZWUge0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfSBmb3Igd2h5IHRoZSB0d28gaGF2ZSB0byBtYXRjaC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSwgdGhlIGZpZWxkIHRvIHRvdWNoLCBhbmQgaG93IGZhciBpdCBtdXN0IGxpZnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBnZW9tZXRyeSByZWFkIG9uY2UgdGhlIGtleWJvYXJkIGlzIHVwLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgb3IgaWYgaXQgbmV2ZXIgbGlmdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZmllbGQncyB2YWx1ZSBhbmQgdGVsbHMgdGhlIHBhZ2UgaXQgY2hhbmdlZC5cbiAqXG4gKiBUaGUgYGlucHV0YCBldmVudCBpcyB3aGF0IGEgc2NyaXB0ZWQgd3JpdGUgb3dlcyB0aGUgcGFnZTogd2l0aG91dCBpdCBhIHN1Z2dlc3RlciBrZWVwcyB0aGUgcm93cyBpdCBoYWRcbiAqIGZvciB0aGUgdGV4dCB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZS4gSXQgYnViYmxlcywgYmVjYXVzZSB0aGF0IGlzIGhvdyBhIGZyYW1ld29yayBsaXN0ZW5pbmcgb24gYVxuICogY29udGFpbmVyIGhlYXJzIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgdG8gd3JpdGUgaW50byBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgd3JpdGUgaGFzIGJlZW4gbWFkZS5cbiAqIEB0aHJvd3MgVHlwZUVycm9yIGlmIHRoZSBmaWVsZCBpcyBub3Qgb25lIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciwgdGV4dDogdmFsdWUgfSk6IHZvaWQge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByYWlzZVNvZnRLZXlib2FyZDogXCIke2lucHV0U2VsZWN0b3J9XCIgaXMgbm90IGEgZmllbGQgd2hvc2UgdmFsdWUgY2FuIGJlIHdyaXR0ZW4uYCk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yLCB0ZXh0IH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBw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
|
|
@@ -303,7 +303,11 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
303
303
|
* Registers a vault on mobile by pushing files and configuring localStorage.
|
|
304
304
|
*
|
|
305
305
|
* The registration flow:
|
|
306
|
-
* 1. Push a minimal `.obsidian/app.json` to the device so Obsidian recognizes the vault
|
|
306
|
+
* 1. Push a minimal `.obsidian/app.json` to the device so Obsidian recognizes the vault —
|
|
307
|
+
* **unless one is already there**, which is the usual case, since `register` pushes the
|
|
308
|
+
* whole vault first and that carries the run's real `app.json` across. See
|
|
309
|
+
* {@link pushObsidianMarker}: the marker is a truncating overwrite, so pushing it
|
|
310
|
+
* unconditionally destroyed the headless defaults it had just been handed.
|
|
307
311
|
* 2. Switch to the WebView context
|
|
308
312
|
* 3. Add the vault to localStorage (`mobile-external-vaults`, `mobile-selected-vault`,
|
|
309
313
|
* `enable-plugin-<path>`)
|
|
@@ -398,6 +402,19 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
398
402
|
* @param payload - The raw JSON payload the binding was called with.
|
|
399
403
|
*/
|
|
400
404
|
private handleInputRequest;
|
|
405
|
+
/**
|
|
406
|
+
* Answers whether the device already holds a usable `app.json` at the given path.
|
|
407
|
+
*
|
|
408
|
+
* Reads the file rather than testing for it, for the reason
|
|
409
|
+
* {@link pushObsidianMarker} spells out: only output that parses as a JSON
|
|
410
|
+
* **object** counts as present, so a merged stderr, an empty file, or a read that
|
|
411
|
+
* failed outright all answer `false` and let the caller push. Never throws — a
|
|
412
|
+
* probe that cannot answer is an answer of `false`.
|
|
413
|
+
*
|
|
414
|
+
* @param remoteMarker - The device-side `app.json` path.
|
|
415
|
+
* @returns `true` when the device holds an `app.json` that parses as a JSON object.
|
|
416
|
+
*/
|
|
417
|
+
private hasDeviceAppJson;
|
|
401
418
|
/**
|
|
402
419
|
* Probes the WebView once for how far Obsidian's startup has got.
|
|
403
420
|
*
|
|
@@ -409,13 +426,43 @@ export declare class AppiumTransport implements ObsidianTransport {
|
|
|
409
426
|
*/
|
|
410
427
|
private probeStartup;
|
|
411
428
|
/**
|
|
412
|
-
* Pushes the minimal `.obsidian/app.json` vault marker via `adb push
|
|
429
|
+
* Pushes the minimal `.obsidian/app.json` vault marker via `adb push` — but
|
|
430
|
+
* only over a device that has not got one already.
|
|
413
431
|
*
|
|
414
432
|
* `browser.pushFile` (WebDriver base64) is an order of magnitude slower on a
|
|
415
433
|
* cold or loaded emulator — measured at 9–21s per call for this 2-byte marker,
|
|
416
434
|
* versus sub-second over `adb`. This mirrors {@link pushFiles}, which switched
|
|
417
435
|
* to `adb` for the same reason. `mkdir -p` guarantees the parent directory.
|
|
418
436
|
*
|
|
437
|
+
* ### Why it has to skip rather than always push
|
|
438
|
+
*
|
|
439
|
+
* `adb push` is a **truncating overwrite**, not a merge, and the marker is `{}`.
|
|
440
|
+
* `register` runs {@link pushFiles} first, which tars the whole host vault —
|
|
441
|
+
* dotfiles included — so by the time this runs the device is already holding the
|
|
442
|
+
* real `app.json` `ensureHeadlessVaultConfig` wrote for this run. Pushing the
|
|
443
|
+
* marker over it threw `alwaysUpdateLinks: true` away one call after it arrived,
|
|
444
|
+
* and Obsidian then opened the vault with the shipped default (off): every
|
|
445
|
+
* Android rename that touched links stopped on the interactive *"Update links?"*
|
|
446
|
+
* sheet, hanging the singleton `FileManager.updateQueue` behind it. That is the
|
|
447
|
+
* rename wall `src/headless-vault-config.ts` exists to remove, live on Android
|
|
448
|
+
* only, from 6.0.0 (when this push arrived) to 16.0.1. It cost two projects
|
|
449
|
+
* several runs apiece, and it surfaced as `EvalCapExceededError` naming the
|
|
450
|
+
* transport cap, which sends the reader after the waiting rather than the sheet.
|
|
451
|
+
*
|
|
452
|
+
* The marker exists solely to make Obsidian **recognize** the directory as a
|
|
453
|
+
* vault, and a real `app.json` does that better than `{}` does. So an existing
|
|
454
|
+
* one is left exactly as it is.
|
|
455
|
+
*
|
|
456
|
+
* ### Why the probe is `cat` and not the teardown's `ls -d`
|
|
457
|
+
*
|
|
458
|
+
* `adb shell` merges the device's stderr into stdout on a legacy shell protocol,
|
|
459
|
+
* and `ls`'s failure message *contains the path it was asked about* — so an
|
|
460
|
+
* `includes(path)` test can read **absent** as **present**, skip the push, and
|
|
461
|
+
* leave a genuinely unmarked vault that Obsidian will not open. Reading the file
|
|
462
|
+
* instead makes the ambiguity harmless: an error message does not parse as a JSON
|
|
463
|
+
* object, so anything unexpected falls through to the push, which is exactly the
|
|
464
|
+
* behaviour this replaces.
|
|
465
|
+
*
|
|
419
466
|
* @param deviceVaultPath - The device-side vault directory path.
|
|
420
467
|
*/
|
|
421
468
|
private pushObsidianMarker;
|