obsidian-integration-testing 16.0.0 → 17.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +12 -0
- 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/namespace-bootstrap.cjs +62 -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/eval-in-obsidian.d.mts +12 -0
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- 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/namespace-bootstrap.mjs +62 -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
|
@@ -42,30 +42,18 @@ var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
|
42
42
|
var import_soft_keyboard_geometry = require("./soft-keyboard-geometry.cjs");
|
|
43
43
|
const DEFAULT_DIAGNOSTICS_DIRECTORY = (0, import_node_path.join)(import_node_process.default.cwd(), "dist", "screenshots");
|
|
44
44
|
const KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS = 1500;
|
|
45
|
+
const KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS = 900;
|
|
46
|
+
const KEYBOARD_RETRACT_ATTEMPT_COUNT = 2;
|
|
47
|
+
const KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS = KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS;
|
|
45
48
|
async function raiseSoftKeyboard(params) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
break;
|
|
49
|
+
await lowerSoftKeyboardIfShown(params);
|
|
50
|
+
const textToRestore = await emptyFieldForTouch(params);
|
|
51
|
+
try {
|
|
52
|
+
return await tapUntilKeyboardIsUp(params);
|
|
53
|
+
} finally {
|
|
54
|
+
if (textToRestore !== null) {
|
|
55
|
+
await writeFieldText(params, textToRestore);
|
|
54
56
|
}
|
|
55
|
-
await tapDevice({ deviceId: params.deviceId, point });
|
|
56
|
-
await (0, import_promises.setTimeout)(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
57
|
-
snapshot = await readSoftKeyboardViewport(params);
|
|
58
|
-
}
|
|
59
|
-
if (!checkIsUp(snapshot)) {
|
|
60
|
-
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
61
|
-
}
|
|
62
|
-
return snapshot;
|
|
63
|
-
function checkIsUp(current) {
|
|
64
|
-
return (0, import_soft_keyboard_geometry.checkIsSoftKeyboardUp)({
|
|
65
|
-
baselineSnapshot,
|
|
66
|
-
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
67
|
-
snapshot: current
|
|
68
|
-
});
|
|
69
57
|
}
|
|
70
58
|
}
|
|
71
59
|
async function tapDevice(params) {
|
|
@@ -79,17 +67,91 @@ async function buildFailureMessage(params, baselineSnapshot, snapshot) {
|
|
|
79
67
|
(0, import_node_fs.mkdirSync)(diagnosticsDirectory, { recursive: true });
|
|
80
68
|
const screenshotPath = (0, import_node_path.join)(diagnosticsDirectory, "keyboard-not-raised.png");
|
|
81
69
|
(0, import_node_fs.writeFileSync)(screenshotPath, await (0, import_device_screenshot.captureDeviceScreenshot)({ deviceId: params.deviceId }));
|
|
82
|
-
const dumpsysOutput = await (0, import_adb.runAdbText)({
|
|
83
|
-
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
84
|
-
deviceId: params.deviceId
|
|
85
|
-
});
|
|
86
70
|
return (0, import_soft_keyboard_geometry.buildSoftKeyboardDiagnosticMessage)({
|
|
87
71
|
baselineSnapshot,
|
|
88
|
-
inputMethodState:
|
|
72
|
+
inputMethodState: await readInputMethodState(params),
|
|
89
73
|
screenshotPath,
|
|
90
74
|
snapshot
|
|
91
75
|
});
|
|
92
76
|
}
|
|
77
|
+
async function checkIsFieldPresent(params) {
|
|
78
|
+
return await (0, import_eval_in_obsidian.evalInObsidian)({
|
|
79
|
+
callback({ inputSelector }) {
|
|
80
|
+
return document.querySelector(inputSelector) !== null;
|
|
81
|
+
},
|
|
82
|
+
input: { inputSelector: params.inputSelector },
|
|
83
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async function emptyFieldForTouch(params) {
|
|
87
|
+
if (params.shouldEmptyFieldForTouch === false) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
const content = await readFieldContent(params);
|
|
91
|
+
if (!content || content.text === "") {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (!content.canWrite) {
|
|
95
|
+
throw new Error(
|
|
96
|
+
`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.`
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
await writeFieldText(params, "");
|
|
100
|
+
return content.text;
|
|
101
|
+
}
|
|
102
|
+
async function lowerSoftKeyboardIfShown(params) {
|
|
103
|
+
let inputMethodState = await readInputMethodState(params);
|
|
104
|
+
for (let attempt = 0; attempt < KEYBOARD_RETRACT_ATTEMPT_COUNT; attempt++) {
|
|
105
|
+
if (!(0, import_soft_keyboard_geometry.checkIsInputMethodShown)(inputMethodState)) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
await (0, import_promises.setTimeout)(KEYBOARD_SHOWN_CONFIRMATION_DELAY_IN_MILLISECONDS);
|
|
109
|
+
inputMethodState = await readInputMethodState(params);
|
|
110
|
+
if (!(0, import_soft_keyboard_geometry.checkIsInputMethodShown)(inputMethodState)) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const isFieldPresentBeforePress = await checkIsFieldPresent(params);
|
|
114
|
+
await (0, import_adb.runAdbText)({
|
|
115
|
+
commandArguments: ["shell", "input", "keyevent", "KEYCODE_BACK"],
|
|
116
|
+
deviceId: params.deviceId
|
|
117
|
+
});
|
|
118
|
+
await (0, import_promises.setTimeout)(KEYBOARD_RETRACT_DELAY_IN_MILLISECONDS);
|
|
119
|
+
if (isFieldPresentBeforePress && !await checkIsFieldPresent(params)) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
`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.
|
|
122
|
+
device before the press: ${inputMethodState}`
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
inputMethodState = await readInputMethodState(params);
|
|
126
|
+
}
|
|
127
|
+
if ((0, import_soft_keyboard_geometry.checkIsInputMethodShown)(inputMethodState)) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`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.
|
|
130
|
+
device: ${inputMethodState}`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async function readFieldContent(params) {
|
|
135
|
+
return await (0, import_eval_in_obsidian.evalInObsidian)({
|
|
136
|
+
callback({ inputSelector }) {
|
|
137
|
+
const element = document.querySelector(inputSelector);
|
|
138
|
+
if (!element) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const canWrite = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement;
|
|
142
|
+
return { canWrite, text: canWrite ? element.value : element.textContent };
|
|
143
|
+
},
|
|
144
|
+
input: { inputSelector: params.inputSelector },
|
|
145
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
async function readInputMethodState(params) {
|
|
149
|
+
const dumpsysOutput = await (0, import_adb.runAdbText)({
|
|
150
|
+
commandArguments: ["shell", "dumpsys", "input_method"],
|
|
151
|
+
deviceId: params.deviceId
|
|
152
|
+
});
|
|
153
|
+
return (0, import_soft_keyboard_geometry.parseInputMethodState)(dumpsysOutput);
|
|
154
|
+
}
|
|
93
155
|
async function readSoftKeyboardViewport(params) {
|
|
94
156
|
return await (0, import_eval_in_obsidian.evalInObsidian)({
|
|
95
157
|
callback({ inputSelector }) {
|
|
@@ -113,9 +175,49 @@ async function readSoftKeyboardViewport(params) {
|
|
|
113
175
|
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
114
176
|
});
|
|
115
177
|
}
|
|
178
|
+
async function tapUntilKeyboardIsUp(params) {
|
|
179
|
+
const baselineSnapshot = await readSoftKeyboardViewport(params);
|
|
180
|
+
let snapshot = baselineSnapshot;
|
|
181
|
+
if (!snapshot.inputRect) {
|
|
182
|
+
throw new Error(`raiseSoftKeyboard: nothing matches "${params.inputSelector}", so there is no field to touch.`);
|
|
183
|
+
}
|
|
184
|
+
for (const point of (0, import_soft_keyboard_geometry.resolveSoftKeyboardTapPoints)({ snapshot })) {
|
|
185
|
+
if (checkIsUp(snapshot)) {
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
await tapDevice({ deviceId: params.deviceId, point });
|
|
189
|
+
await (0, import_promises.setTimeout)(KEYBOARD_SETTLE_DELAY_IN_MILLISECONDS);
|
|
190
|
+
snapshot = await readSoftKeyboardViewport(params);
|
|
191
|
+
}
|
|
192
|
+
if (!checkIsUp(snapshot)) {
|
|
193
|
+
throw new Error(await buildFailureMessage(params, baselineSnapshot, snapshot));
|
|
194
|
+
}
|
|
195
|
+
return snapshot;
|
|
196
|
+
function checkIsUp(current) {
|
|
197
|
+
return (0, import_soft_keyboard_geometry.checkIsSoftKeyboardUp)({
|
|
198
|
+
baselineSnapshot,
|
|
199
|
+
...params.minimumKeyboardHeightInPixels !== void 0 && { minimumKeyboardHeightInPixels: params.minimumKeyboardHeightInPixels },
|
|
200
|
+
snapshot: current
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async function writeFieldText(params, text) {
|
|
205
|
+
await (0, import_eval_in_obsidian.evalInObsidian)({
|
|
206
|
+
callback({ inputSelector, text: value }) {
|
|
207
|
+
const element = document.querySelector(inputSelector);
|
|
208
|
+
if (!(element instanceof HTMLInputElement) && !(element instanceof HTMLTextAreaElement)) {
|
|
209
|
+
throw new TypeError(`raiseSoftKeyboard: "${inputSelector}" is not a field whose value can be written.`);
|
|
210
|
+
}
|
|
211
|
+
element.value = value;
|
|
212
|
+
element.dispatchEvent(new Event("input", { bubbles: true }));
|
|
213
|
+
},
|
|
214
|
+
input: { inputSelector: params.inputSelector, text },
|
|
215
|
+
...params.vaultPath !== void 0 && { vaultPath: params.vaultPath }
|
|
216
|
+
});
|
|
217
|
+
}
|
|
116
218
|
// Annotate the CommonJS export names for ESM import in node:
|
|
117
219
|
0 && (module.exports = {
|
|
118
220
|
raiseSoftKeyboard,
|
|
119
221
|
tapDevice
|
|
120
222
|
});
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5janMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc1NvZnRLZXlib2FyZFVwLFxuICBwYXJzZUlucHV0TWV0aG9kU3RhdGUsXG4gIHJlc29sdmVTb2Z0S2V5Ym9hcmRUYXBQb2ludHNcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGV2aWNlIHRvIHRvdWNoLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgYSBmYWlsZWQgYXR0ZW1wdCB3cml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlci5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBpdCBpcyBgZGlzdC9zY3JlZW5zaG90c2AgdW5kZXIgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IFx1MjAxNCByZXNvbHZlZCBhdCBsb2FkLCBzbyB0aGVyZSBpcyBub1xuICAgKiBsaXRlcmFsIGRlZmF1bHQgdG8gc3RhdGUgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzRGlyZWN0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ1NTIHNlbGVjdG9yIG9mIHRoZSBmaWVsZCB0byB0b3VjaCwgZS5nLiBgLnByb21wdC1pbnB1dGAuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFNlbGVjdG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTYCBmcm9tIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YCBhcHBsaWVzLlxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCB0byByZWFkIHRoZSBnZW9tZXRyeSBmcm9tLiBXaGVuIG9taXR0ZWQsIHRoZSBjdXJyZW50IHRlc3QgY29udGV4dCdzIHZhdWx0IGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHRhcERldmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFwRGV2aWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdG8gdG91Y2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byB0b3VjaCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBvaW50OiBTb2Z0S2V5Ym9hcmRUYXBQb2ludDtcbn1cblxuLyoqXG4gKiBXaGVyZSBhIGZhaWxlZCBhdHRlbXB0IGxlYXZlcyBpdHMgZXZpZGVuY2UgXHUyMDE0IHVuZGVyIGBkaXN0L2AsIHdoaWNoIGEgcGx1Z2luIHJlcG8gdXNpbmcgdGhpcyBoYXJuZXNzIGdpdGlnbm9yZXMsIGxpa2UgdGhlIGNhcHR1cmUgc2NyYXRjaCBmaWxlcy5cbiAqL1xuY29uc3QgREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlkgPSBqb2luKHByb2Nlc3MuY3dkKCksICdkaXN0JywgJ3NjcmVlbnNob3RzJyk7XG5cbi8qKlxuICogSG93IGxvbmcgdGhlIElNRSB0YWtlcyB0byBmaW5pc2ggYW5pbWF0aW5nIGluLCBhZnRlciB3aGljaCB0aGUgbGF5b3V0IGhhcyBzZXR0bGVkLlxuICovXG5jb25zdCBLRVlCT0FSRF9TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTUwMDtcblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipDYWxsIGl0IHdpdGggdGhlIGtleWJvYXJkIERPV04uKiogVGhlIGZpcnN0IHJlYWQgaXMgdGhlIGJhc2VsaW5lIGV2ZXJ5IGxhdGVyIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCxcbiAqIHNvIGEga2V5Ym9hcmQgdGhhdCBpcyBhbHJlYWR5IHVwIGxlYXZlcyB0aGUgZmllbGQgbm90aGluZyB0byBsaWZ0IGJ5IGFuZCB0aGlzIHRocm93cy4gVGhhdCBpcyB0aGVcbiAqIGRlbGliZXJhdGUgdHJhZGUgZm9yIHdvcmtpbmcgb24gYSBjZW50cmVkIG1vZGFsIGFzIHdlbGwgYXMgYSBib3R0b20tYW5jaG9yZWQgb25lIFx1MjAxNCBzZWVcbiAqIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgZmllbGQgdG8gdG91Y2gsIGFuZCBob3cgZmFyIGl0IG11c3QgbGlmdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGdlb21ldHJ5IHJlYWQgb25jZSB0aGUga2V5Ym9hcmQgaXMgdXAuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBmaWVsZCBuZXZlciBtYXRjaGVkLCBvciBpZiBpdCBuZXZlciBsaWZ0ZWQsIHRoZSBsYXR0ZXIgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlXG4gKiAgIGZyYW1lYnVmZmVyIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVG91Y2hlcyB0aGUgZGV2aWNlIGF0IGEgcG9pbnQsIHRoZSB3YXkgYSB0aHVtYiB3b3VsZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgd2hlcmUgdG8gdG91Y2ggaXQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHRvdWNoIGhhcyBiZWVuIGRpc3BhdGNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0YXBEZXZpY2UocGFyYW1zOiBUYXBEZXZpY2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdpbnB1dCcsICd0YXAnLCBTdHJpbmcocGFyYW1zLnBvaW50LnhJblBpeGVscyksIFN0cmluZyhwYXJhbXMucG9pbnQueUluUGl4ZWxzKV0sXG4gICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICB9KTtcbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciBhbmQgcmVhZHMgdGhlIGRldmljZSdzIGBpbnB1dF9tZXRob2RgIHN0YXRlLCB0aGVuIGNvbXBvc2VzIHRoZSBmYWlsdXJlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB0aGUgZGlhZ25vc3RpY3MgZGlyZWN0b3J5LlxuICogQHBhcmFtIGJhc2VsaW5lU25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHRvdWNoLCB3aGljaCB0aGUgdmVyZGljdCBpcyBtZWFzdXJlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHNuYXBzaG90IC0gVGhlIGdlb21ldHJ5IHJlYWQgYWZ0ZXIgdGhlIGxhc3QgdG91Y2guXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtZXNzYWdlIHRvIHRocm93LlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZEZhaWx1cmVNZXNzYWdlKFxuICBwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLFxuICBiYXNlbGluZVNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90LFxuICBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NEaXJlY3RvcnkgPSBwYXJhbXMuZGlhZ25vc3RpY3NEaXJlY3RvcnkgPz8gREVGQVVMVF9ESUFHTk9TVElDU19ESVJFQ1RPUlk7XG4gIG1rZGlyU3luYyhkaWFnbm9zdGljc0RpcmVjdG9yeSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3Qgc2NyZWVuc2hvdFBhdGggPSBqb2luKGRpYWdub3N0aWNzRGlyZWN0b3J5LCAna2V5Ym9hcmQtbm90LXJhaXNlZC5wbmcnKTtcbiAgd3JpdGVGaWxlU3luYyhzY3JlZW5zaG90UGF0aCwgYXdhaXQgY2FwdHVyZURldmljZVNjcmVlbnNob3QoeyBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkIH0pKTtcblxuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2Uoe1xuICAgIGJhc2VsaW5lU25hcHNob3QsXG4gICAgaW5wdXRNZXRob2RTdGF0ZTogcGFyc2VJbnB1dE1ldGhvZFN0YXRlKGR1bXBzeXNPdXRwdXQpLFxuICAgIHNjcmVlbnNob3RQYXRoLFxuICAgIHNuYXBzaG90XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoYXQgdGhlIHJlbmRlcmVyIGtub3dzIGFib3V0IGl0cyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBtZWFzdXJlIGFuZCB0aGUgdmF1bHQgdG8gcmVhZCBpdCBmcm9tLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmlld3BvcnQgYW5kIHRoZSBmaWVsZCdzIHJlY3QsIGluIENTUyBwaXhlbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRTb2Z0S2V5Ym9hcmRWaWV3cG9ydChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90IHtcbiAgICAgIGNvbnN0IGlucHV0RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcgLS0gVGhpcyBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgYW5kIGV2YWx1YXRlZCBpbiB0aGUgcmVuZGVyZXIsIHNvIGEgaGVscGVyIGhvaXN0ZWQgdG8gbW9kdWxlIHNjb3BlIHdvdWxkIG5vdCBleGlzdCB0aGVyZS5cbiAgICAgIGZ1bmN0aW9uIHRvUmVjdChyZWN0OiBET01SZWN0KTogRWxlbWVudFJlY3Qge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQsXG4gICAgICAgICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgICAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGhcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGV2aWNlUGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICAgIGlubmVySGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgIGlucHV0UmVjdDogaW5wdXRFbCA/IHRvUmVjdChpbnB1dEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSA6IG51bGwsXG4gICAgICAgIHNjcmVlblk6IHdpbmRvdy5zY3JlZW5ZXG4gICAgICB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQStCQSxxQkFHTztBQUNQLHVCQUFxQjtBQUNyQiwwQkFBb0I7QUFDcEIsc0JBQW9DO0FBUXBDLGlCQUEyQjtBQUMzQiwrQkFBd0M7QUFDeEMsOEJBQStCO0FBQy9CLG9DQUtPO0FBdURQLE1BQU0sb0NBQWdDLHVCQUFLLG9CQUFBQSxRQUFRLElBQUksR0FBRyxRQUFRLGFBQWE7QUFLL0UsTUFBTSx3Q0FBd0M7QUFrQjlDLGVBQXNCLGtCQUFrQixRQUF3RTtBQUM5RyxRQUFNLG1CQUFtQixNQUFNLHlCQUF5QixNQUFNO0FBQzlELE1BQUksV0FBVztBQUVmLE1BQUksQ0FBQyxTQUFTLFdBQVc7QUFDdkIsVUFBTSxJQUFJLE1BQU0sdUNBQXVDLE9BQU8sYUFBYSxtQ0FBbUM7QUFBQSxFQUNoSDtBQUVBLGFBQVcsYUFBUyw0REFBNkIsRUFBRSxTQUFTLENBQUMsR0FBRztBQUM5RCxRQUFJLFVBQVUsUUFBUSxHQUFHO0FBQ3ZCO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBVSxFQUFFLFVBQVUsT0FBTyxVQUFVLE1BQU0sQ0FBQztBQUNwRCxjQUFNLGdCQUFBQyxZQUFNLHFDQUFxQztBQUNqRCxlQUFXLE1BQU0seUJBQXlCLE1BQU07QUFBQSxFQUNsRDtBQUVBLE1BQUksQ0FBQyxVQUFVLFFBQVEsR0FBRztBQUN4QixVQUFNLElBQUksTUFBTSxNQUFNLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLENBQUM7QUFBQSxFQUMvRTtBQUVBLFNBQU87QUFFUCxXQUFTLFVBQVUsU0FBZ0Q7QUFDakUsZUFBTyxxREFBc0I7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsR0FBSSxPQUFPLGtDQUFrQyxVQUFhLEVBQUUsK0JBQStCLE9BQU8sOEJBQThCO0FBQUEsTUFDaEksVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQVFBLGVBQXNCLFVBQVUsUUFBd0M7QUFDdEUsWUFBTSx1QkFBVztBQUFBLElBQ2Ysa0JBQWtCLENBQUMsU0FBUyxTQUFTLE9BQU8sT0FBTyxPQUFPLE1BQU0sU0FBUyxHQUFHLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUFBLElBQzFHLFVBQVUsT0FBTztBQUFBLEVBQ25CLENBQUM7QUFDSDtBQVVBLGVBQWUsb0JBQ2IsUUFDQSxrQkFDQSxVQUNpQjtBQUNqQixRQUFNLHVCQUF1QixPQUFPLHdCQUF3QjtBQUM1RCxnQ0FBVSxzQkFBc0IsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUVuRCxRQUFNLHFCQUFpQix1QkFBSyxzQkFBc0IseUJBQXlCO0FBQzNFLG9DQUFjLGdCQUFnQixVQUFNLGtEQUF3QixFQUFFLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQztBQUUxRixRQUFNLGdCQUFnQixVQUFNLHVCQUFXO0FBQUEsSUFDckMsa0JBQWtCLENBQUMsU0FBUyxXQUFXLGNBQWM7QUFBQSxJQUNyRCxVQUFVLE9BQU87QUFBQSxFQUNuQixDQUFDO0FBRUQsYUFBTyxrRUFBbUM7QUFBQSxJQUN4QztBQUFBLElBQ0Esc0JBQWtCLHFEQUFzQixhQUFhO0FBQUEsSUFDckQ7QUFBQSxJQUNBO0FBQUEsRUFDRixDQUFDO0FBQ0g7QUFRQSxlQUFlLHlCQUF5QixRQUF3RTtBQUM5RyxTQUFPLFVBQU0sd0NBQWU7QUFBQSxJQUMxQixTQUFTLEVBQUUsY0FBYyxHQUFpQztBQUN4RCxZQUFNLFVBQVUsU0FBUyxjQUFjLGFBQWE7QUFHcEQsZUFBUyxPQUFPLE1BQTRCO0FBQzFDLGVBQU87QUFBQSxVQUNMLFFBQVEsS0FBSztBQUFBLFVBQ2IsTUFBTSxLQUFLO0FBQUEsVUFDWCxLQUFLLEtBQUs7QUFBQSxVQUNWLE9BQU8sS0FBSztBQUFBLFFBQ2Q7QUFBQSxNQUNGO0FBRUEsYUFBTztBQUFBLFFBQ0wsa0JBQWtCLE9BQU87QUFBQSxRQUN6QixhQUFhLE9BQU87QUFBQSxRQUNwQixXQUFXLFVBQVUsT0FBTyxRQUFRLHNCQUFzQixDQUFDLElBQUk7QUFBQSxRQUMvRCxTQUFTLE9BQU87QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE9BQU8sRUFBRSxlQUFlLE9BQU8sY0FBYztBQUFBLElBQzdDLEdBQUksT0FBTyxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sVUFBVTtBQUFBLEVBQ3RFLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsicHJvY2VzcyIsICJzbGVlcCJdCn0K
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSYWlzZXMgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBmb3IgYSBzY3JlZW5zaG90LCBhbmQgcHJvdmVzIGl0IGNhbWUgdXAuXG4gKlxuICogVHdvIHRoaW5ncyBoYXZlIHRvIGJlIHRydWUsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvbmUgdGhhdCBpcyBlYXN5IHRvIG1pc3M6XG4gKlxuICogMS4gVGhlIGRldmljZSBtdXN0IGJlIGFsbG93ZWQgdG8gZHJhdyBhIGtleWJvYXJkIGF0IGFsbC4gVGhlIHNjcmVlbnNob3QgQVZEc1xuICogICAgYXJlIGJ1aWx0IGBody5rZXlib2FyZD15ZXNgLCBzbyBBbmRyb2lkIHN1cHByZXNzZXMgdGhlIG9uLXNjcmVlbiBvbmUgXHUyMDE0XG4gKiAgICBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIGluIGBkZXZpY2Utc2V0dGluZ3NgIGlzIHdoYXQgbGlmdHMgdGhhdC5cbiAqIDIuIFRoZSBJTUUgbXVzdCBiZSAqYXNrZWQqIGZvciBieSBhIGdlc3R1cmUuIEEgZmllbGQgdGhhdCB0YWtlcyBmb2N1c1xuICogICAgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdCBnZXQgb25lOiBhbiBBbmRyb2lkIFdlYlZpZXcgcmFpc2VzIHRoZSBJTUUgb24gYVxuICogICAgcmVhbCB0b3VjaCwgYW5kIGEgcnVuIHdpdGggdGhlIHNldHRpbmcgZmxpcHBlZCBhbmQgbm8gdG91Y2ggY29tZXMgYmFjayB3aXRoXG4gKiAgICBleGFjdGx5IHRoZSBlbXB0eSBiYW5kIGl0IGhhZCBiZWZvcmUuIGBhZGIgc2hlbGwgaW5wdXQgdGFwYCBpcyB0aGF0IGdlc3R1cmUuXG4gKlxuICogMy4gVGhlIHByb29mIHRoYXQgaXQgYXJyaXZlZCBpcyB0aGF0IHRoZSBmaWVsZCAqKm1vdmVkKiosIG1lYXN1cmVkIGFnYWluc3QgYVxuICogICAgYmFzZWxpbmUgcmVhZCBoZXJlIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2guIEFuIGFic29sdXRlIG9mZnNldCBmcm9tIHRoZVxuICogICAgdmlld3BvcnQgYm90dG9tIGlzIHRoZSBzYW1lIHRlc3Qgb25seSBmb3IgYSBib3R0b20tYW5jaG9yZWQgZmllbGQ7IGZvciBhXG4gKiAgICBjZW50cmVkIG1vZGFsIGl0IGlzIGFscmVhZHkgdHJ1ZSB3aXRoIG5vIGtleWJvYXJkLCB3aGljaCB1c2VkIHRvIGJyZWFrIHRoZVxuICogICAgbG9vcCBiZWxvdyBiZWZvcmUgaXQgaGFkIGRpc3BhdGNoZWQgYSBzaW5nbGUgdG91Y2ggYW5kIHJldHVybiBzdWNjZXNzXG4gKiAgICBoYXZpbmcgZG9uZSBub3RoaW5nLiBSZWFkaW5nIHRoZSBiYXNlbGluZSBmaXJzdCBhbHNvIG1ha2VzIHRoYXQgc2hhcGVcbiAqICAgIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHkgY29ycmVjdGVkOiB0aGUgZGVsdGEgb2YgdGhlIGJhc2VsaW5lXG4gKiAgICBhZ2FpbnN0IGl0c2VsZiBpcyB6ZXJvLCBzbyB0aGUgZmlyc3QgaXRlcmF0aW9uIGFsd2F5cyB0YXBzLlxuICpcbiAqICAgICoqQSBrZXlib2FyZCBBTFJFQURZIHVwIGlzIHB1dCBkb3duIGZpcnN0KiosIGJlY2F1c2UgYSBkZWx0YSBjYW5ub3Qgc2VlXG4gKiAgICBvbmU6IHRoZSBmaWVsZCBoYXMgYWxyZWFkeSBsaWZ0ZWQsIHNvIGl0IHJlYWRzIGFzIGEgZmllbGQgdGhhdCBuZXZlciBtb3ZlZC5cbiAqICAgIFRoYXQgd2FzIGV2ZXJ5IGZyYW1lIGFmdGVyIHRoZSBmaXJzdCBvZiBhIHN1aXRlIHRoYXQgdGFrZXMgc2V2ZXJhbCBcdTIwMTQgdGhlXG4gKiAgICBrZXlib2FyZCBsZWZ0IHVwIGJ5IG9uZSBmcmFtZSwgb3IgYnJvdWdodCBiYWNrIGJ5IE9ic2lkaWFuIGZvY3VzaW5nIHRoZVxuICogICAgbmV4dCBtb2RhbCdzIGZpZWxkLCBtYWRlIHRoZSBuZXh0IGJhc2VsaW5lIGFscmVhZHktbGlmdGVkIChtZWFzdXJlZFxuICogICAgMjAyNi0wOS0yMDogZnJhbWVzIDItNSBlYWNoIGZhaWxlZCBgbGlmdD0wYCBiZXNpZGUgYG1JbnB1dFNob3duPXRydWVgLFxuICogICAgZWFjaCBmcmFtZWJ1ZmZlciBzaG93aW5nIGEgY29ycmVjdGx5IGxpZnRlZCBmaWVsZCB1bmRlciBhIGZ1bGx5IGRyYXduXG4gKiAgICBrZXlib2FyZCkuIFRoZSBhbHRlcm5hdGl2ZSB3YXMgdG8gYWNjZXB0IGBsaWZ0PTBgIHdoZW5ldmVyIHRoZSBkZXZpY2Ugc2F5c1xuICogICAgYSBrZXlib2FyZCBpcyBzaG93aW5nLCBhbmQgaXQgd2FzIHJlZnVzZWQ6IHRoYXQgaXMgYSBmcmFtZSB0aGUgaGVscGVyIGRpZFxuICogICAgbm90IHByb3ZlLCB3aGljaCBpcyB0aGUgdmFjdW91cyBwYXNzIHRoZSBkZWx0YSB3YXMgaW50cm9kdWNlZCB0byBlbmQsXG4gKiAgICByZS1vcGVuZWQgYnkgYSBkaWZmZXJlbnQgZG9vci4gU28gdGhlIGRldmljZSBpcyBhc2tlZCwgYSBzaG93aW5nIElNRSBpc1xuICogICAgcmV0cmFjdGVkIHdpdGggYEtFWUNPREVfQkFDS2AsIGFuZCB0aGUgbGlmdCBpcyBwcm92ZWQgYXMgYmVmb3JlLiBJdCBoYXMgdG9cbiAqICAgIGhhcHBlbiBIRVJFLCBub3QgYWZ0ZXIgdGhlIHByZXZpb3VzIGNhcHR1cmU6IGxvd2VyaW5nIGl0IHRoZXJlIHdhcyB0cmllZCxcbiAqICAgIGFuZCB0aGUgSU1FIGNhbWUgYmFjayBvbiBpdHMgb3duIGJlZm9yZSB0aGUgbmV4dCBiYXNlbGluZSB3YXMgcmVhZC5cbiAqXG4gKiA0LiAqKlRoYXQgdG91Y2ggZHJhd3MgYSBzZWxlY3Rpb24gaGFuZGxlIHdoZW4gaXQgbGFuZHMgaW5zaWRlIFRFWFQqKiwgYW5kIGFcbiAqICAgIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzIGl0LiBDaHJvbWl1bSBzaG93cyB0aGUgaW5zZXJ0aW9uIGhhbmRsZSBvbiBhIHRhcFxuICogICAgaW50byB0ZXh0IGFuZCBub25lIG9uIGEgdGFwIGludG8gYW4gRU1QVFkgZWRpdGFibGUsIGFuZCBhIHZhbHVlIHdyaXR0ZW4gYnlcbiAqICAgIHNjcmlwdCByYWlzZXMgbm9uZSBhdCBhbGwgXHUyMDE0IHNvIHRoZSBmaWVsZCBpcyBlbXB0aWVkIGZvciB0aGUgdG91Y2ggYW5kIGl0c1xuICogICAgdGV4dCB3cml0dGVuIGJhY2sgYWZ0ZXJ3YXJkcy4gYG9ic2lkaWFuLWxpbmstcGlja2VyYCBzaGlwcGVkIGEgdGVhbCBoYW5kbGVcbiAqICAgIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHdvcmtlZCBvdXQgd2hlcmUgaXQgY2FtZSBmcm9tLFxuICogICAgYW5kIG5vdGhpbmcgaW4gdGhpcyBtb2R1bGUncyBvd24gZG9jdW1lbnRhdGlvbiBvZiB0aGUgdG91Y2ggaGludGVkIGF0IGl0LlxuICogICAgU2VlIGBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2hgLlxuICpcbiAqIFRoZSBnZW9tZXRyeSB0aGF0IGRlY2lkZXMgd2hldGhlciBpdCB3b3JrZWQgaXMgdW5pdC10ZXN0ZWQgaW5cbiAqIGBzb2Z0LWtleWJvYXJkLWdlb21ldHJ5YDsgZXZlcnl0aGluZyBoZXJlIGRyaXZlcyBhIHJlYWwgZGV2aWNlLCBzbyB0aGUgd2hvbGVcbiAqIG1vZHVsZSBpcyBpbnRlZ3JhdGlvbi10aW1lIGNvZGUuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoZHJpdmVzIGEgbGl2ZSBPYnNpZGlhbiBvbiBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgc2V0VGltZW91dCBhcyBzbGVlcCB9IGZyb20gJ25vZGU6dGltZXJzL3Byb21pc2VzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbGVtZW50UmVjdCxcbiAgU29mdEtleWJvYXJkVGFwUG9pbnQsXG4gIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Rcbn0gZnJvbSAnLi9zb2Z0LWtleWJvYXJkLWdlb21ldHJ5LmNqcyc7XG5cbmltcG9ydCB7IHJ1bkFkYlRleHQgfSBmcm9tICcuL2FkYi5janMnO1xuaW1wb3J0IHsgY2FwdHVyZURldmljZVNjcmVlbnNob3QgfSBmcm9tICcuL2RldmljZS1zY3JlZW5zaG90LmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHtcbiAgYnVpbGRTb2Z0S2V5Ym9hcmREaWFnbm9zdGljTWVzc2FnZSxcbiAgY2hlY2tJc0lucHV0TWV0aG9kU2hvd24sXG4gIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcCxcbiAgcGFyc2VJbnB1dE1ldGhvZFN0YXRlLFxuICByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzXG59IGZyb20gJy4vc29mdC1rZXlib2FyZC1nZW9tZXRyeS5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByYWlzZVNvZnRLZXlib2FyZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgd3JpdGVzIHRoZSBkZXZpY2UgZnJhbWVidWZmZXIuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgaXQgaXMgYGRpc3Qvc2NyZWVuc2hvdHNgIHVuZGVyIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBcdTIwMTQgcmVzb2x2ZWQgYXQgbG9hZCwgc28gdGhlcmUgaXMgbm9cbiAgICogbGl0ZXJhbCBkZWZhdWx0IHRvIHN0YXRlIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBkaWFnbm9zdGljc0RpcmVjdG9yeT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENTUyBzZWxlY3RvciBvZiB0aGUgZmllbGQgdG8gdG91Y2gsIGUuZy4gYC5wcm9tcHQtaW5wdXRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRTZWxlY3Rvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGVhc3QgYSByYWlzZWQga2V5Ym9hcmQgbGlmdHMgdGhlIGZpZWxkIGJ5LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGBERUZBVUxUX01JTklNVU1fS0VZQk9BUkRfSEVJR0hUX0lOX1BJWEVMU2AgZnJvbSBgc29mdC1rZXlib2FyZC1nZW9tZXRyeWAgYXBwbGllcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtcHR5IHRoZSBmaWVsZCBiZWZvcmUgdGhlIHRvdWNoLCBhbmQgd3JpdGUgaXRzIHRleHQgYmFjayBhZnRlcndhcmRzLlxuICAgKlxuICAgKiAqKk9uIGJ5IGRlZmF1bHQsIGJlY2F1c2UgdGhlIHRvdWNoIHRoYXQgcmFpc2VzIHRoZSBrZXlib2FyZCBhbHNvIGRyYXdzIGEgc2VsZWN0aW9uIGhhbmRsZSB3aGVuIGl0XG4gICAqIGxhbmRzIGluc2lkZSBURVhULioqIENocm9taXVtIHNob3dzIHRoZSBpbnNlcnRpb24gaGFuZGxlIG9uIGEgdGFwIGludG8gdGV4dCBhbmQgZHJhd3Mgbm9uZSBvbiBhIHRhcFxuICAgKiBpbnRvIGFuIEVNUFRZIGVkaXRhYmxlLCBhbmQgYSBkZXZpY2UgY2FwdHVyZSBwaG90b2dyYXBocyBpdCBcdTIwMTQgd2hpY2ggaXMgaG93IGBvYnNpZGlhbi1saW5rLXBpY2tlcmBcbiAgICogc2hpcHBlZCBhIHRlYWwgaGFuZGxlIGluIGEgc3RvcmUgbGlzdGluZyBpbWFnZSB0d2ljZSBiZWZvcmUgYW55b25lIHVuZGVyc3Rvb2Qgd2hlcmUgaXQgY2FtZSBmcm9tLiBBXG4gICAqIHZhbHVlIHdyaXR0ZW4gYnkgc2NyaXB0IHJhaXNlcyBubyBoYW5kbGUsIHNvIGVtcHR5aW5nIHRoZSBmaWVsZCwgdG91Y2hpbmcgaXQsIGFuZCB3cml0aW5nIHRoZSB0ZXh0XG4gICAqIGJhY2sgbGVhdmVzIHRoZSBmcmFtZSBzaG93aW5nIHRoZSBzYW1lIHF1ZXJ5IHdpdGggbm90aGluZyBoYW5naW5nIG9mZiBpdC5cbiAgICpcbiAgICogT25seSBhbiBgPGlucHV0PmAgb3IgYSBgPHRleHRhcmVhPmAgaXMgZW1wdGllZC4gQSBgY29udGVudGVkaXRhYmxlYCBob2xkaW5nIHRleHQgaXMgUkVGVVNFRCByYXRoZXJcbiAgICogdGhhbiB3cml0dGVuIHRvOiBpdHMgY29udGVudCB1c3VhbGx5IGJlbG9uZ3MgdG8gYW4gZWRpdG9yIHRoYXQgb3ducyBpdHMgb3duIERPTSwgYW5kIGJsYW5raW5nIHRoYXRcbiAgICogYnkgaGFuZCBkZXN0cm95cyBpdC4gRW1wdHkgc3VjaCBhIGZpZWxkIHlvdXJzZWxmLCBvciB0dXJuIHRoaXMgb2ZmLlxuICAgKlxuICAgKiBUdXJuaW5nIGl0IG9mZiByZXN0b3JlcyB0aGUgcHJlLTIwMjYtMDktMjMgYmVoYXZpb3VyIGV4YWN0bHk6IHRoZSBmaWVsZCBpcyB0b3VjaGVkIGFzIGl0IHN0YW5kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHZhdWx0IHRvIHJlYWQgdGhlIGdlb21ldHJ5IGZyb20uIFdoZW4gb21pdHRlZCwgdGhlIGN1cnJlbnQgdGVzdCBjb250ZXh0J3MgdmF1bHQgaXMgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdGFwRGV2aWNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBEZXZpY2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRldmljZSB0byB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHRvdWNoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcG9pbnQ6IFNvZnRLZXlib2FyZFRhcFBvaW50O1xufVxuXG4vKipcbiAqIFdoZXJlIGEgZmFpbGVkIGF0dGVtcHQgbGVhdmVzIGl0cyBldmlkZW5jZSBcdTIwMTQgdW5kZXIgYGRpc3QvYCwgd2hpY2ggYSBwbHVnaW4gcmVwbyB1c2luZyB0aGlzIGhhcm5lc3MgZ2l0aWdub3JlcywgbGlrZSB0aGUgY2FwdHVyZSBzY3JhdGNoIGZpbGVzLlxuICovXG5jb25zdCBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2Rpc3QnLCAnc2NyZWVuc2hvdHMnKTtcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgSU1FIHRha2VzIHRvIGZpbmlzaCBhbmltYXRpbmcgaW4sIGFmdGVyIHdoaWNoIHRoZSBsYXlvdXQgaGFzIHNldHRsZWQuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxNTAwO1xuXG4vKipcbiAqIEhvdyBsb25nIHRoZSBJTUUgdGFrZXMgdG8gZmluaXNoIGFuaW1hdGluZyBvdXQgYWZ0ZXIgYEtFWUNPREVfQkFDS2AsIG1lYXN1cmVkIGluIHRoZSBjYXB0dXJlIHN1aXRlIHRoaXNcbiAqIHdhcyBtb3ZlZCBvdXQgb2YuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gOTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IHRpbWVzIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYmVmb3JlIGEga2V5Ym9hcmQgdGhhdCB3aWxsIG5vdCBnbyBkb3duIGlzIHJlcG9ydGVkLlxuICpcbiAqIFR3bywgYmVjYXVzZSB0aGUgZmlyc3QgcHJlc3MgY2FuIGxhbmQgd2hpbGUgdGhlIElNRSBpcyBzdGlsbCBhbmltYXRpbmcgVVAgZnJvbSB0aGUgZm9jdXMgdGhhdCByYWlzZWRcbiAqIGl0LCBhbmQgYW4gSU1FIG1pZC1hbmltYXRpb24gc3dhbGxvd3MgdGhlIGtleSB3aXRob3V0IHJldHJhY3RpbmcuXG4gKi9cbmNvbnN0IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVCA9IDI7XG5cbi8qKlxuICogSG93IGxvbmcgYSBrZXlib2FyZCByZXBvcnRlZCBzaG93aW5nIGlzIHdhdGNoZWQgYmVmb3JlIGBLRVlDT0RFX0JBQ0tgIGlzIHByZXNzZWQgYXQgaXQuXG4gKlxuICogT25lIHJldHJhY3QgYW5pbWF0aW9uOiBhbiBJTUUgYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gXHUyMDE0IHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQgXHUyMDE0IGlzXG4gKiBzdGlsbCByZXBvcnRlZCBzaG93aW5nIGJ5IGEgcmVhZCB0YWtlbiBhdCB0aGUgc3RhcnQgb2YgaXRzIHJldHJhY3QsIGFuZCBpcyBnb25lIGJ5IHRoZSBlbmQgb2YgaXQuIFByZXNzaW5nXG4gKiBhdCB0aGUgZmlyc3QgcmVhZCB0aGVuIGxhbmRzIHRoZSBrZXkgb24gdGhlIGFwcCBpbnN0ZWFkLCB3aGljaCBjbG9zZXMgdGhlIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0b1xuICogcGhvdG9ncmFwaC4gVHdvIHJlYWRzIHRoYXQgYWdyZWUgYWNyb3NzIHRoaXMgd2luZG93IHNheSB0aGUga2V5Ym9hcmQgaXMgc3RheWluZyB1cC5cbiAqL1xuY29uc3QgS0VZQk9BUkRfU0hPV05fQ09ORklSTUFUSU9OX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTO1xuXG4vKipcbiAqIFdoYXQgYSBmaWVsZCBob2xkcywgYW5kIHdoZXRoZXIgaXQgaXMgb25lIHRoaXMgY2FuIHB1dCBiYWNrLlxuICovXG5pbnRlcmZhY2UgRmllbGRDb250ZW50IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkJ3MgdmFsdWUgY2FuIGJlIHdyaXR0ZW4gXHUyMDE0IHRydWUgZm9yIGFuIGA8aW5wdXQ+YCBvciBhIGA8dGV4dGFyZWE+YCwgZmFsc2UgZm9yXG4gICAqIGFueXRoaW5nIGVsc2UsIHdob3NlIGNvbnRlbnQgdXN1YWxseSBiZWxvbmdzIHRvIGFuIGVkaXRvciB0aGF0IG93bnMgaXRzIG93biBET00uXG4gICAqL1xuICByZWFkb25seSBjYW5Xcml0ZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdGhlIGZpZWxkIGN1cnJlbnRseSBob2xkcy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSYWlzZXMgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCB3aXRoIGEgcmVhbCB0b3VjaCBvbiBhIGZpZWxkLCBhbmQgY29uZmlybXMgaXQgY2FtZSB1cC5cbiAqXG4gKiBDYWxsIGl0IGluc2lkZSBgd2l0aFNvZnRLZXlib2FyZEVuYWJsZWRgIFx1MjAxNCB0aGUgZGV2aWNlIHNldHRpbmcgYWxvbmUgZG9lcyBub3QgcmFpc2UgdGhlIGtleWJvYXJkLCBhbmQgdGhpc1xuICogdG91Y2ggYWxvbmUgY2Fubm90IHdoaWxlIHRoZSBzZXR0aW5nIHN1cHByZXNzZXMgaXQuXG4gKlxuICogKipBIGtleWJvYXJkIHRoYXQgaXMgYWxyZWFkeSB1cCBpcyBwdXQgRE9XTiBmaXJzdC4qKiBUaGUgZmlyc3QgZ2VvbWV0cnkgcmVhZCBpcyB0aGUgYmFzZWxpbmUgZXZlcnkgbGF0ZXJcbiAqIHJlYWQgaXMgY29tcGFyZWQgYWdhaW5zdCwgc28gYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIGxlYXZlIHRoZSBmaWVsZCBub3RoaW5nIHRvIGxpZnQgYnkgYW5kIHJlYWQgYXNcbiAqIG9uZSB0aGF0IG5ldmVyIGNhbWUuIFRoZSBkZXZpY2UgaXMgYXNrZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UsIGFuZCBhIHNob3dpbmcgSU1FIGlzIHJldHJhY3RlZCB3aXRoXG4gKiBgS0VZQ09ERV9CQUNLYCBcdTIwMTQgYXNrZWQgRklSU1QgYmVjYXVzZSwgd2l0aCBubyBJTUUgc2hvd2luZywgdGhhdCBrZXkgcmVhY2hlcyB0aGUgYXBwIGFuZCBjbG9zZXMgdGhlIHZlcnlcbiAqIG1vZGFsIHRoZSBmcmFtZSBpcyBhYm91dCB0byBwaG90b2dyYXBoLiBTbyB0aGUgaGVscGVyIGlzIHNhZmUgdG8gY2FsbCBvbmNlIHBlciBmcmFtZSBvZiBhIG11bHRpLWZyYW1lXG4gKiBzdWl0ZSwgYW5kIGV2ZXJ5IGNhbGwgc3RpbGwgcHJvdmVzIGl0cyBvd24gbGlmdC4gVGhlIG90aGVyIGFuc3dlciBcdTIwMTQgYWNjZXB0aW5nIGEgemVybyBsaWZ0IHdoZW5ldmVyIHRoZVxuICogZGV2aWNlIHJlcG9ydHMgYSBrZXlib2FyZCBcdTIwMTQgd2FzIHJlZnVzZWQsIGJlY2F1c2UgaXQgYWNjZXB0cyBhIGZyYW1lIHRoZSBoZWxwZXIgZGlkIG5vdCBwcm92ZS5cbiAqXG4gKiAqKlRoZSBmaWVsZCBpcyBFTVBUSUVEIGZvciB0aGUgdG91Y2ggYW5kIHdyaXR0ZW4gYmFjayBhZnRlcndhcmRzKiosIGJlY2F1c2UgYSB0b3VjaCB0aGF0IGxhbmRzIGluc2lkZVxuICogdGV4dCBkcmF3cyBDaHJvbWl1bSdzIHNlbGVjdGlvbiBoYW5kbGUgYW5kIHRoZSBmcmFtZWJ1ZmZlciBwaG90b2dyYXBocyBpdCBcdTIwMTQgc2VlXG4gKiB7QGxpbmsgUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMuc2hvdWxkRW1wdHlGaWVsZEZvclRvdWNofSwgd2hpY2ggdHVybnMgdGhhdCBvZmYuXG4gKlxuICogKipUaGUgZ2VvbWV0cnkgcmV0dXJuZWQgaXMgcmVhZCB3aXRoIHRoZSBmaWVsZCBzdGlsbCBlbXB0eSoqLCBhbmQgdGhlIHRleHQgaXMgd3JpdHRlbiBiYWNrIGFmdGVyIGl0LlxuICogVGhhdCBpcyB0aGUgc3RhdGUgdGhlIHByb3ZlbiBjYXB0dXJlIHN1aXRlcyBhc3NlcnQgYWdhaW5zdCwgYW5kIGl0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW5cbiAqIGluY2lkZW50YWw6IHRoZSBiYXNlbGluZSBpcyByZWFkIEFGVEVSIHRoZSBmaWVsZCBpcyBlbXB0aWVkLCBzbyB0aGUgbGlmdCBpcyBtZWFzdXJlZCBiZXR3ZWVuIHR3byByZWFkc1xuICogb2YgdGhlIHNhbWUgZmllbGQgY29udGVudC4gQSBmaWVsZCB3aG9zZSBvd24gdGV4dCBjaGFuZ2VzIHRoZSBsYXlvdXQgYXJvdW5kIGl0IFx1MjAxNCBhIHN1Z2dlc3RlciB3aG9zZSByb3dcbiAqIGNvdW50IGFuc3dlcnMgdGhlIHF1ZXJ5IFx1MjAxNCBtb3ZlcyB3aGVuIGl0IGlzIGNsZWFyZWQsIGFuZCBhIGRlbHRhIG1lYXN1cmVkIGFjcm9zcyB0aGF0IG1vdmUgaXMgbm90IGFcbiAqIGtleWJvYXJkLiBSZWFkIHRoZSBnZW9tZXRyeSBhZ2FpbiB5b3Vyc2VsZiBpZiB0aGUgcmVzdG9yZWQgdGV4dCBtb3ZlcyBhbnl0aGluZyB5b3UgYXJlIGFib3V0IHRvIGFzc2VydFxuICogb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UsIHRoZSBmaWVsZCB0byB0b3VjaCwgYW5kIGhvdyBmYXIgaXQgbXVzdCBsaWZ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgZ2VvbWV0cnkgcmVhZCBvbmNlIHRoZSBrZXlib2FyZCBpcyB1cC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBhbHJlYWR5IHVwIHdvdWxkIG5vdCBnbyBkb3duLCBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgaWYgaXQgaG9sZHMgdGV4dFxuICogICB0aGlzIGNhbm5vdCBlbXB0eSBhbmQgcHV0IGJhY2ssIG9yIGlmIGl0IG5ldmVyIGxpZnRlZCBcdTIwMTQgdGhlIGxhc3QgYWZ0ZXIgd3JpdGluZyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyXG4gKiAgIGFuZCB0aGUgZGV2aWNlJ3Mgb3duIGBpbnB1dF9tZXRob2RgIHN0YXRlIHRvIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByYWlzZVNvZnRLZXlib2FyZChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGF3YWl0IGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXMpO1xuXG4gIGNvbnN0IHRleHRUb1Jlc3RvcmUgPSBhd2FpdCBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXMpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlc3RvcmVkIGV2ZW4gd2hlbiB0aGUgcmFpc2UgZmFpbGVkOiBhIGNhbGxlciB0aGF0IGlzIGFib3V0IHRvIHJlYWQgaXRzIG93biBkaWFnbm9zdGljIHNob3VsZCBub3RcbiAgICAvLyBhbHNvIGhhdmUgdG8gZGlzY292ZXIgdGhhdCBpdHMgcXVlcnkgaXMgZ29uZS5cbiAgICBpZiAodGV4dFRvUmVzdG9yZSAhPT0gbnVsbCkge1xuICAgICAgYXdhaXQgd3JpdGVGaWVsZFRleHQocGFyYW1zLCB0ZXh0VG9SZXN0b3JlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBkZXZpY2UgYXQgYSBwb2ludCwgdGhlIHdheSBhIHRodW1iIHdvdWxkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB3aGVyZSB0byB0b3VjaCBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgdG91Y2ggaGFzIGJlZW4gZGlzcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhcERldmljZShwYXJhbXM6IFRhcERldmljZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBydW5BZGJUZXh0KHtcbiAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ3RhcCcsIFN0cmluZyhwYXJhbXMucG9pbnQueEluUGl4ZWxzKSwgU3RyaW5nKHBhcmFtcy5wb2ludC55SW5QaXhlbHMpXSxcbiAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkXG4gIH0pO1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgZGV2aWNlIGZyYW1lYnVmZmVyIGFuZCByZWFkcyB0aGUgZGV2aWNlJ3MgYGlucHV0X21ldGhvZGAgc3RhdGUsIHRoZW4gY29tcG9zZXMgdGhlIGZhaWx1cmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkuXG4gKiBAcGFyYW0gYmFzZWxpbmVTbmFwc2hvdCAtIFRoZSBnZW9tZXRyeSByZWFkIGJlZm9yZSB0aGUgZmlyc3QgdG91Y2gsIHdoaWNoIHRoZSB2ZXJkaWN0IGlzIG1lYXN1cmVkIGFnYWluc3QuXG4gKiBAcGFyYW0gc25hcHNob3QgLSBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG1lc3NhZ2UgdG8gdGhyb3cuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRmFpbHVyZU1lc3NhZ2UoXG4gIHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMsXG4gIGJhc2VsaW5lU25hcHNob3Q6IFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3QsXG4gIHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkaWFnbm9zdGljc0RpcmVjdG9yeSA9IHBhcmFtcy5kaWFnbm9zdGljc0RpcmVjdG9yeSA/PyBERUZBVUxUX0RJQUdOT1NUSUNTX0RJUkVDVE9SWTtcbiAgbWtkaXJTeW5jKGRpYWdub3N0aWNzRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGpvaW4oZGlhZ25vc3RpY3NEaXJlY3RvcnksICdrZXlib2FyZC1ub3QtcmFpc2VkLnBuZycpO1xuICB3cml0ZUZpbGVTeW5jKHNjcmVlbnNob3RQYXRoLCBhd2FpdCBjYXB0dXJlRGV2aWNlU2NyZWVuc2hvdCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQgfSkpO1xuXG4gIHJldHVybiBidWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlKHtcbiAgICBiYXNlbGluZVNuYXBzaG90LFxuICAgIGlucHV0TWV0aG9kU3RhdGU6IGF3YWl0IHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtcyksXG4gICAgc2NyZWVuc2hvdFBhdGgsXG4gICAgc25hcHNob3RcbiAgfSk7XG59XG5cbi8qKlxuICogV2hldGhlciBhbnl0aGluZyBpbiB0aGUgcGFnZSBtYXRjaGVzIHRoZSBmaWVsZCdzIHNlbGVjdG9yLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbG9vayBmb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHdoZXRoZXIgaXQgbWF0Y2hlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tJc0ZpZWxkUHJlc2VudChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgY2FsbGJhY2soeyBpbnB1dFNlbGVjdG9yIH0pOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGlucHV0U2VsZWN0b3IpICE9PSBudWxsO1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGZpZWxkIHRoZSB0b3VjaCBpcyBhYm91dCB0byBsYW5kIG9uLCBhbmQgcmVwb3J0cyB3aGF0IHRvIHdyaXRlIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBmaWVsZCB0byBlbXB0eSwgYW5kIHdoZXRoZXIgdG8gZW1wdHkgaXQgYXQgYWxsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCB0byByZXN0b3JlLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHdhcyBlbXB0aWVkLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgaG9sZHMgdGV4dCB0aGF0IGNhbm5vdCBiZSB3cml0dGVuIGJhY2sgXHUyMDE0IGEgYGNvbnRlbnRlZGl0YWJsZWAsIHdob3NlIGNvbnRlbnRcbiAqICAgYmVsb25ncyB0byBhbiBlZGl0b3IgdGhhdCBvd25zIGl0cyBvd24gRE9NLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbXB0eUZpZWxkRm9yVG91Y2gocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBpZiAocGFyYW1zLnNob3VsZEVtcHR5RmllbGRGb3JUb3VjaCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmllbGRDb250ZW50KHBhcmFtcyk7XG5cbiAgLy8gTm90aGluZyBtYXRjaGVkLiBUaGUgZ2VvbWV0cnkgcmVhZCBkb2VzIHRoZSByZXBvcnRpbmcsIHdpdGggdGhlIG1lc3NhZ2UgaXQgYWx3YXlzIGhhZC5cbiAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghY29udGVudC5jYW5Xcml0ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByYWlzZVNvZnRLZXlib2FyZDogXCIke3BhcmFtcy5pbnB1dFNlbGVjdG9yfVwiIGhvbGRzIHRleHQgYnV0IGlzIG5vdCBhbiA8aW5wdXQ+IG9yIGEgPHRleHRhcmVhPiwgc28gaXQgYFxuICAgICAgICArICdjYW5ub3QgYmUgZW1wdGllZCBmb3IgdGhlIHRvdWNoIGFuZCB3cml0dGVuIGJhY2suIFRoZSB0b3VjaCB3b3VsZCBsYW5kIGluc2lkZSB0ZXh0IGFuZCBkcmF3IGEgJ1xuICAgICAgICArICdzZWxlY3Rpb24gaGFuZGxlLCB3aGljaCBhIGRldmljZSBjYXB0dXJlIHBob3RvZ3JhcGhzLiBFbXB0eSB0aGUgZmllbGQgeW91cnNlbGYgYmVmb3JlIGNhbGxpbmcsIG9yICdcbiAgICAgICAgKyAncGFzcyBzaG91bGRFbXB0eUZpZWxkRm9yVG91Y2g6IGZhbHNlIHRvIHRvdWNoIGl0IGFzIGl0IHN0YW5kcy4nXG4gICAgKTtcbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmllbGRUZXh0KHBhcmFtcywgJycpO1xuXG4gIHJldHVybiBjb250ZW50LnRleHQ7XG59XG5cbi8qKlxuICogUHV0cyB0aGUga2V5Ym9hcmQgZG93biB3aGVuIHRoZSBkZXZpY2UgcmVwb3J0cyBvbmUgc2hvd2luZywgc28gdGhlIGJhc2VsaW5lIHJlYWQgbmV4dCBpcyBvbmUgdGhlIHRvdWNoXG4gKiBjYW4gbGlmdCB0aGUgZmllbGQgZnJvbS5cbiAqXG4gKiAqKkEga2V5Ym9hcmQgaXMgcHJlc3NlZCBhdCBvbmx5IG9uY2UgaXQgaGFzIGJlZW4gcmVwb3J0ZWQgc2hvd2luZyBUV0lDRSwgb25lIHJldHJhY3QgYW5pbWF0aW9uIGFwYXJ0LioqXG4gKiBgS0VZQ09ERV9CQUNLYCBpcyByZXRyYWN0ZWQgYnkgdGhlIElNRSBvbmx5IHdoaWxlIHRoZSBJTUUgaXMgdXA7IG9uY2UgaXQgaGFzIGdvbmUsIHRoZSBrZXkgcmVhY2hlcyB0aGVcbiAqIGFwcCwgYW5kIE9ic2lkaWFuIGNsb3NlcyB0aGUgbW9kYWwgb24gc2NyZWVuIFx1MjAxNCB0aGUgb25lIHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gcGhvdG9ncmFwaC4gQSBrZXlib2FyZFxuICogYWxyZWFkeSBvbiBpdHMgd2F5IGRvd24gKHRoZSBtb2RhbCB0aGF0IHJhaXNlZCBpdCBoYXMganVzdCBjbG9zZWQsIGFuZCB0aGUgY2FsbGVyIG9wZW5lZCBhIGZyZXNoIG9uZVxuICogc3RyYWlnaHQgYWZ0ZXIpIGlzIHN0aWxsIHJlcG9ydGVkIHNob3dpbmcgYXQgdGhlIHN0YXJ0IG9mIGl0cyByZXRyYWN0LCBzbyBwcmVzc2luZyBhdCB0aGUgZmlyc3QgcmVhZFxuICogcmFjZWQgaXQuIEl0IGlzIHdhdGNoZWQgZm9yIG9uZSByZXRyYWN0IGFuaW1hdGlvbiBmaXJzdCwgYW5kIGEga2V5Ym9hcmQgdGhhdCB3ZW50IGRvd24gb24gaXRzIG93biBpc1xuICogbGVmdCBhbG9uZS5cbiAqXG4gKiAqKkFuZCBhIHByZXNzIHRoYXQgcmVhY2hlZCB0aGUgYXBwIGFueXdheSBpcyBuYW1lZCBhcyB0aGF0LioqIFRoZSBmaWVsZCBpcyBsb29rZWQgdXAgYmVmb3JlIHRoZSBwcmVzc1xuICogYW5kIGFmdGVyIGl0OyBvbmUgdGhhdCBtYXRjaGVkIGJlZm9yZSBhbmQgbm90IGFmdGVyIHdhcyBjbG9zZWQgYnkgdGhlIGtleSwgYW5kIHNheWluZyBzbyBiZWF0cyB0aGVcbiAqIGBub3RoaW5nIG1hdGNoZXNgIHRoYXQgdGhlIHJhaXNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBzdGVwIGxhdGVyLCBhYm91dCBhIHNlbGVjdG9yIHRoYXQgd2FzIHJpZ2h0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIHRvIGFzaywgYW5kIHRoZSBmaWVsZCB0aGF0IG11c3Qgc3Vydml2ZSB0aGUgcHJlc3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2Ugbm8ga2V5Ym9hcmQgaXMgc2hvd2luZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgYSBrZXlib2FyZCBpcyBzdGlsbCBzaG93aW5nIGFmdGVyIHtAbGluayBLRVlCT0FSRF9SRVRSQUNUX0FUVEVNUFRfQ09VTlR9IHByZXNzZXMgb2ZcbiAqICAgYEtFWUNPREVfQkFDS2AgXHUyMDE0IHRoZSByYWlzZSB0aGF0IGZvbGxvd3MgY291bGQgcHJvdmUgbm90aGluZywgYW5kIGl0cyBvd24gZmFpbHVyZSB3b3VsZCBibGFtZSBhIGtleWJvYXJkXG4gKiAgIHRoYXQgbmV2ZXIgY2FtZSB3aGVuIHRoZSB0cnV0aCBpcyBvbmUgdGhhdCBuZXZlciBsZWZ0IFx1MjAxNCBvciBpZiBhIHByZXNzIGNsb3NlZCB0aGUgZmllbGQncyBvd24gVUkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvd2VyU29mdEtleWJvYXJkSWZTaG93bihwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbnB1dE1ldGhvZFN0YXRlID0gYXdhaXQgcmVhZElucHV0TWV0aG9kU3RhdGUocGFyYW1zKTtcblxuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEtFWUJPQVJEX1JFVFJBQ1RfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1NIT1dOX0NPTkZJUk1BVElPTl9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuXG4gICAgaWYgKCFjaGVja0lzSW5wdXRNZXRob2RTaG93bihpbnB1dE1ldGhvZFN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmllbGRQcmVzZW50QmVmb3JlUHJlc3MgPSBhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcyk7XG4gICAgYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgICBjb21tYW5kQXJndW1lbnRzOiBbJ3NoZWxsJywgJ2lucHV0JywgJ2tleWV2ZW50JywgJ0tFWUNPREVfQkFDSyddLFxuICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZFxuICAgIH0pO1xuICAgIGF3YWl0IHNsZWVwKEtFWUJPQVJEX1JFVFJBQ1RfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmIChpc0ZpZWxkUHJlc2VudEJlZm9yZVByZXNzICYmICFhd2FpdCBjaGVja0lzRmllbGRQcmVzZW50KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3JhaXNlU29mdEtleWJvYXJkOiBLRVlDT0RFX0JBQ0ssIHByZXNzZWQgdG8gcHV0IGRvd24gYSBrZXlib2FyZCB0aGUgZGV2aWNlIHJlcG9ydGVkIHNob3dpbmcsIHJlYWNoZWQgdGhlIGFwcCBpbnN0ZWFkIGFuZCAnXG4gICAgICAgICAgKyBgY2xvc2VkIHRoZSBVSSBob2xkaW5nIFwiJHtwYXJhbXMuaW5wdXRTZWxlY3Rvcn1cIiBcdTIwMTQgaXQgbWF0Y2hlZCBiZWZvcmUgdGhlIHByZXNzIGFuZCBtYXRjaGVzIG5vdGhpbmcgYWZ0ZXIgaXQuIFRoZSBgXG4gICAgICAgICAgKyAna2V5Ym9hcmQgd2VudCBkb3duIGJldHdlZW4gdGhlIGxhc3QgcmVhZCBhbmQgdGhlIHByZXNzLiBMZXQgdGhlIHByZXZpb3VzIGtleWJvYXJkIHNldHRsZSBiZWZvcmUgb3BlbmluZyB0aGUgVUkgJ1xuICAgICAgICAgICsgYHRvIHJhaXNlIGl0IG9uLlxuZGV2aWNlIGJlZm9yZSB0aGUgcHJlc3M6ICR7aW5wdXRNZXRob2RTdGF0ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlucHV0TWV0aG9kU3RhdGUgPSBhd2FpdCByZWFkSW5wdXRNZXRob2RTdGF0ZShwYXJhbXMpO1xuICB9XG5cbiAgaWYgKGNoZWNrSXNJbnB1dE1ldGhvZFNob3duKGlucHV0TWV0aG9kU3RhdGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJhaXNlU29mdEtleWJvYXJkOiBhIGtleWJvYXJkIHdhcyBhbHJlYWR5IHVwIGFuZCBkaWQgbm90IGdvIGRvd24gYWZ0ZXIgJHtTdHJpbmcoS0VZQk9BUkRfUkVUUkFDVF9BVFRFTVBUX0NPVU5UKX0gcHJlc3NlcyBvZiBgXG4gICAgICAgICsgJ0tFWUNPREVfQkFDSywgc28gdGhlIGxpZnQgdGhhdCBwcm92ZXMgYSByYWlzZSBjb3VsZCBub3QgYmUgbWVhc3VyZWQuIFRoZSBmaWVsZCB3b3VsZCByZWFkIGFzIG9uZSB0aGF0IG5ldmVyICdcbiAgICAgICAgKyBgbW92ZWQgdW5kZXIgYSBrZXlib2FyZCB0aGF0IGlzIHBsYWlubHkgc2hvd2luZy5cbmRldmljZTogJHtpbnB1dE1ldGhvZFN0YXRlfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVhZHMgd2hhdCB0aGUgZmllbGQgaG9sZHMsIGFuZCB3aGV0aGVyIGl0IGlzIG9uZSB3aG9zZSB2YWx1ZSBjYW4gYmUgd3JpdHRlbiBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgbWF0Y2hlZCB0aGUgc2VsZWN0b3IuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWVsZENvbnRlbnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8RmllbGRDb250ZW50IHwgbnVsbD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogRmllbGRDb250ZW50IHwgbnVsbCB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5Xcml0ZSA9IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50O1xuXG4gICAgICByZXR1cm4geyBjYW5Xcml0ZSwgdGV4dDogY2FuV3JpdGUgPyBlbGVtZW50LnZhbHVlIDogZWxlbWVudC50ZXh0Q29udGVudCB9O1xuICAgIH0sXG4gICAgaW5wdXQ6IHsgaW5wdXRTZWxlY3RvcjogcGFyYW1zLmlucHV0U2VsZWN0b3IgfSxcbiAgICAuLi4ocGFyYW1zLnZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRQYXRoOiBwYXJhbXMudmF1bHRQYXRoIH0pXG4gIH0pO1xufVxuXG4vKipcbiAqIEFza3MgdGhlIGRldmljZSB3aGF0IGl0cyBJTUUgaXMgZG9pbmcgXHUyMDE0IHRoZSBvbmx5IHBsYWNlIHRoYXQga25vd3MsIHNpbmNlIG5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyBpdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSB0byBhc2suXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWVsZHMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0ga2VlcHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRJbnB1dE1ldGhvZFN0YXRlKHBhcmFtczogUmFpc2VTb2Z0S2V5Ym9hcmRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgcnVuQWRiVGV4dCh7XG4gICAgY29tbWFuZEFyZ3VtZW50czogWydzaGVsbCcsICdkdW1wc3lzJywgJ2lucHV0X21ldGhvZCddLFxuICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWRcbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlSW5wdXRNZXRob2RTdGF0ZShkdW1wc3lzT3V0cHV0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB3aGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gbWVhc3VyZSBhbmQgdGhlIHZhdWx0IHRvIHJlYWQgaXQgZnJvbS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZpZXdwb3J0IGFuZCB0aGUgZmllbGQncyByZWN0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zOiBSYWlzZVNvZnRLZXlib2FyZFBhcmFtcyk6IFByb21pc2U8U29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdD4ge1xuICByZXR1cm4gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciB9KTogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCB7XG4gICAgICBjb25zdCBpbnB1dEVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpbnB1dFNlbGVjdG9yKTtcblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIFRoaXMgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGFuZCBldmFsdWF0ZWQgaW4gdGhlIHJlbmRlcmVyLCBzbyBhIGhlbHBlciBob2lzdGVkIHRvIG1vZHVsZSBzY29wZSB3b3VsZCBub3QgZXhpc3QgdGhlcmUuXG4gICAgICBmdW5jdGlvbiB0b1JlY3QocmVjdDogRE9NUmVjdCk6IEVsZW1lbnRSZWN0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcbiAgICAgICAgICB0b3A6IHJlY3QudG9wLFxuICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRldmljZVBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgICBpbm5lckhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LFxuICAgICAgICBpbnB1dFJlY3Q6IGlucHV0RWwgPyB0b1JlY3QoaW5wdXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkgOiBudWxsLFxuICAgICAgICBzY3JlZW5ZOiB3aW5kb3cuc2NyZWVuWVxuICAgICAgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yIH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyoqXG4gKiBUb3VjaGVzIHRoZSBmaWVsZCB1bnRpbCB0aGUga2V5Ym9hcmQgaXMgdXAsIGFuZCBzYXlzIHNvIHdoZW4gaXQgbmV2ZXIgY2FtZS5cbiAqXG4gKiBUaGUgYmFzZWxpbmUgaXMgcmVhZCBoZXJlIHJhdGhlciB0aGFuIGJ5IHRoZSBjYWxsZXIsIHNvIGl0IGlzIHJlYWQgd2l0aCB0aGUgZmllbGQgaW4gdGhlIHN0YXRlIHRoZVxuICogdGFwcyBhcmUgZGlzcGF0Y2hlZCBhZ2FpbnN0IFx1MjAxNCBzZWUge0BsaW5rIHJhaXNlU29mdEtleWJvYXJkfSBmb3Igd2h5IHRoZSB0d28gaGF2ZSB0byBtYXRjaC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSwgdGhlIGZpZWxkIHRvIHRvdWNoLCBhbmQgaG93IGZhciBpdCBtdXN0IGxpZnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBnZW9tZXRyeSByZWFkIG9uY2UgdGhlIGtleWJvYXJkIGlzIHVwLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgZmllbGQgbmV2ZXIgbWF0Y2hlZCwgb3IgaWYgaXQgbmV2ZXIgbGlmdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiB0YXBVbnRpbEtleWJvYXJkSXNVcChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zKTogUHJvbWlzZTxTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90PiB7XG4gIGNvbnN0IGJhc2VsaW5lU25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgbGV0IHNuYXBzaG90ID0gYmFzZWxpbmVTbmFwc2hvdDtcblxuICBpZiAoIXNuYXBzaG90LmlucHV0UmVjdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFpc2VTb2Z0S2V5Ym9hcmQ6IG5vdGhpbmcgbWF0Y2hlcyBcIiR7cGFyYW1zLmlucHV0U2VsZWN0b3J9XCIsIHNvIHRoZXJlIGlzIG5vIGZpZWxkIHRvIHRvdWNoLmApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb2ludCBvZiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHsgc25hcHNob3QgfSkpIHtcbiAgICBpZiAoY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXdhaXQgdGFwRGV2aWNlKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgcG9pbnQgfSk7XG4gICAgYXdhaXQgc2xlZXAoS0VZQk9BUkRfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgc25hcHNob3QgPSBhd2FpdCByZWFkU29mdEtleWJvYXJkVmlld3BvcnQocGFyYW1zKTtcbiAgfVxuXG4gIGlmICghY2hlY2tJc1VwKHNuYXBzaG90KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihhd2FpdCBidWlsZEZhaWx1cmVNZXNzYWdlKHBhcmFtcywgYmFzZWxpbmVTbmFwc2hvdCwgc25hcHNob3QpKTtcbiAgfVxuXG4gIHJldHVybiBzbmFwc2hvdDtcblxuICBmdW5jdGlvbiBjaGVja0lzVXAoY3VycmVudDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjaGVja0lzU29mdEtleWJvYXJkVXAoe1xuICAgICAgYmFzZWxpbmVTbmFwc2hvdCxcbiAgICAgIC4uLihwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzOiBwYXJhbXMubWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHMgfSksXG4gICAgICBzbmFwc2hvdDogY3VycmVudFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgZmllbGQncyB2YWx1ZSBhbmQgdGVsbHMgdGhlIHBhZ2UgaXQgY2hhbmdlZC5cbiAqXG4gKiBUaGUgYGlucHV0YCBldmVudCBpcyB3aGF0IGEgc2NyaXB0ZWQgd3JpdGUgb3dlcyB0aGUgcGFnZTogd2l0aG91dCBpdCBhIHN1Z2dlc3RlciBrZWVwcyB0aGUgcm93cyBpdCBoYWRcbiAqIGZvciB0aGUgdGV4dCB0aGF0IGlzIG5vIGxvbmdlciB0aGVyZS4gSXQgYnViYmxlcywgYmVjYXVzZSB0aGF0IGlzIGhvdyBhIGZyYW1ld29yayBsaXN0ZW5pbmcgb24gYVxuICogY29udGFpbmVyIGhlYXJzIGl0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZmllbGQgdG8gd3JpdGUuXG4gKiBAcGFyYW0gdGV4dCAtIFdoYXQgdG8gd3JpdGUgaW50byBpdC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgd3JpdGUgaGFzIGJlZW4gbWFkZS5cbiAqIEB0aHJvd3MgVHlwZUVycm9yIGlmIHRoZSBmaWVsZCBpcyBub3Qgb25lIHdob3NlIHZhbHVlIGNhbiBiZSB3cml0dGVuLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUZpZWxkVGV4dChwYXJhbXM6IFJhaXNlU29mdEtleWJvYXJkUGFyYW1zLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgIGNhbGxiYWNrKHsgaW5wdXRTZWxlY3RvciwgdGV4dDogdmFsdWUgfSk6IHZvaWQge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaW5wdXRTZWxlY3Rvcik7XG5cbiAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGByYWlzZVNvZnRLZXlib2FyZDogXCIke2lucHV0U2VsZWN0b3J9XCIgaXMgbm90IGEgZmllbGQgd2hvc2UgdmFsdWUgY2FuIGJlIHdyaXR0ZW4uYCk7XG4gICAgICB9XG5cbiAgICAgIGVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0JywgeyBidWJibGVzOiB0cnVlIH0pKTtcbiAgICB9LFxuICAgIGlucHV0OiB7IGlucHV0U2VsZWN0b3I6IHBhcmFtcy5pbnB1dFNlbGVjdG9yLCB0ZXh0IH0sXG4gICAgLi4uKHBhcmFtcy52YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0UGF0aDogcGFyYW1zLnZhdWx0UGF0aCB9KVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBw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
|
|
@@ -22,6 +22,30 @@
|
|
|
22
22
|
* unrepresentable rather than merely corrected: the delta of the baseline
|
|
23
23
|
* against itself is zero, so the first iteration always taps.
|
|
24
24
|
*
|
|
25
|
+
* **A keyboard ALREADY up is put down first**, because a delta cannot see
|
|
26
|
+
* one: the field has already lifted, so it reads as a field that never moved.
|
|
27
|
+
* That was every frame after the first of a suite that takes several — the
|
|
28
|
+
* keyboard left up by one frame, or brought back by Obsidian focusing the
|
|
29
|
+
* next modal's field, made the next baseline already-lifted (measured
|
|
30
|
+
* 2026-09-20: frames 2-5 each failed `lift=0` beside `mInputShown=true`,
|
|
31
|
+
* each framebuffer showing a correctly lifted field under a fully drawn
|
|
32
|
+
* keyboard). The alternative was to accept `lift=0` whenever the device says
|
|
33
|
+
* a keyboard is showing, and it was refused: that is a frame the helper did
|
|
34
|
+
* not prove, which is the vacuous pass the delta was introduced to end,
|
|
35
|
+
* re-opened by a different door. So the device is asked, a showing IME is
|
|
36
|
+
* retracted with `KEYCODE_BACK`, and the lift is proved as before. It has to
|
|
37
|
+
* happen HERE, not after the previous capture: lowering it there was tried,
|
|
38
|
+
* and the IME came back on its own before the next baseline was read.
|
|
39
|
+
*
|
|
40
|
+
* 4. **That touch draws a selection handle when it lands inside TEXT**, and a
|
|
41
|
+
* device capture photographs it. Chromium shows the insertion handle on a tap
|
|
42
|
+
* into text and none on a tap into an EMPTY editable, and a value written by
|
|
43
|
+
* script raises none at all — so the field is emptied for the touch and its
|
|
44
|
+
* text written back afterwards. `obsidian-link-picker` shipped a teal handle
|
|
45
|
+
* in a store listing image twice before anyone worked out where it came from,
|
|
46
|
+
* and nothing in this module's own documentation of the touch hinted at it.
|
|
47
|
+
* See `shouldEmptyFieldForTouch`.
|
|
48
|
+
*
|
|
25
49
|
* The geometry that decides whether it worked is unit-tested in
|
|
26
50
|
* `soft-keyboard-geometry`; everything here drives a real device, so the whole
|
|
27
51
|
* module is integration-time code.
|
|
@@ -52,6 +76,25 @@ export interface RaiseSoftKeyboardParams {
|
|
|
52
76
|
* When omitted, `DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS` from `soft-keyboard-geometry` applies.
|
|
53
77
|
*/
|
|
54
78
|
readonly minimumKeyboardHeightInPixels?: number;
|
|
79
|
+
/**
|
|
80
|
+
* Whether to empty the field before the touch, and write its text back afterwards.
|
|
81
|
+
*
|
|
82
|
+
* **On by default, because the touch that raises the keyboard also draws a selection handle when it
|
|
83
|
+
* lands inside TEXT.** Chromium shows the insertion handle on a tap into text and draws none on a tap
|
|
84
|
+
* into an EMPTY editable, and a device capture photographs it — which is how `obsidian-link-picker`
|
|
85
|
+
* shipped a teal handle in a store listing image twice before anyone understood where it came from. A
|
|
86
|
+
* value written by script raises no handle, so emptying the field, touching it, and writing the text
|
|
87
|
+
* back leaves the frame showing the same query with nothing hanging off it.
|
|
88
|
+
*
|
|
89
|
+
* Only an `<input>` or a `<textarea>` is emptied. A `contenteditable` holding text is REFUSED rather
|
|
90
|
+
* than written to: its content usually belongs to an editor that owns its own DOM, and blanking that
|
|
91
|
+
* by hand destroys it. Empty such a field yourself, or turn this off.
|
|
92
|
+
*
|
|
93
|
+
* Turning it off restores the pre-2026-09-23 behaviour exactly: the field is touched as it stands.
|
|
94
|
+
*
|
|
95
|
+
* @default true
|
|
96
|
+
*/
|
|
97
|
+
readonly shouldEmptyFieldForTouch?: boolean;
|
|
55
98
|
/**
|
|
56
99
|
* The vault to read the geometry from. When omitted, the current test context's vault is used.
|
|
57
100
|
*/
|
|
@@ -76,15 +119,31 @@ export interface TapDeviceParams {
|
|
|
76
119
|
* Call it inside `withSoftKeyboardEnabled` — the device setting alone does not raise the keyboard, and this
|
|
77
120
|
* touch alone cannot while the setting suppresses it.
|
|
78
121
|
*
|
|
79
|
-
* **
|
|
80
|
-
* so a keyboard
|
|
81
|
-
*
|
|
82
|
-
*
|
|
122
|
+
* **A keyboard that is already up is put DOWN first.** The first geometry read is the baseline every later
|
|
123
|
+
* read is compared against, so a keyboard already up would leave the field nothing to lift by and read as
|
|
124
|
+
* one that never came. The device is asked before anything else, and a showing IME is retracted with
|
|
125
|
+
* `KEYCODE_BACK` — asked FIRST because, with no IME showing, that key reaches the app and closes the very
|
|
126
|
+
* modal the frame is about to photograph. So the helper is safe to call once per frame of a multi-frame
|
|
127
|
+
* suite, and every call still proves its own lift. The other answer — accepting a zero lift whenever the
|
|
128
|
+
* device reports a keyboard — was refused, because it accepts a frame the helper did not prove.
|
|
129
|
+
*
|
|
130
|
+
* **The field is EMPTIED for the touch and written back afterwards**, because a touch that lands inside
|
|
131
|
+
* text draws Chromium's selection handle and the framebuffer photographs it — see
|
|
132
|
+
* {@link RaiseSoftKeyboardParams.shouldEmptyFieldForTouch}, which turns that off.
|
|
133
|
+
*
|
|
134
|
+
* **The geometry returned is read with the field still empty**, and the text is written back after it.
|
|
135
|
+
* That is the state the proven capture suites assert against, and it is deliberate rather than
|
|
136
|
+
* incidental: the baseline is read AFTER the field is emptied, so the lift is measured between two reads
|
|
137
|
+
* of the same field content. A field whose own text changes the layout around it — a suggester whose row
|
|
138
|
+
* count answers the query — moves when it is cleared, and a delta measured across that move is not a
|
|
139
|
+
* keyboard. Read the geometry again yourself if the restored text moves anything you are about to assert
|
|
140
|
+
* on.
|
|
83
141
|
*
|
|
84
142
|
* @param params - The device, the field to touch, and how far it must lift.
|
|
85
143
|
* @returns A {@link Promise} that resolves to the geometry read once the keyboard is up.
|
|
86
|
-
* @throws Error if
|
|
87
|
-
*
|
|
144
|
+
* @throws Error if a keyboard already up would not go down, if the field never matched, if it holds text
|
|
145
|
+
* this cannot empty and put back, or if it never lifted — the last after writing the device framebuffer
|
|
146
|
+
* and the device's own `input_method` state to the diagnostics directory.
|
|
88
147
|
*/
|
|
89
148
|
export declare function raiseSoftKeyboard(params: RaiseSoftKeyboardParams): Promise<SoftKeyboardViewportSnapshot>;
|
|
90
149
|
/**
|