obsidian-integration-testing 12.1.0 → 12.1.2
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 +61 -0
- package/dist/lib/cjs/adb.d.cts +61 -0
- package/dist/lib/cjs/device-screenshot.cjs +42 -0
- package/dist/lib/cjs/device-screenshot.d.cts +36 -0
- package/dist/lib/cjs/device-setting-restore.cjs +45 -0
- package/dist/lib/cjs/device-setting-restore.d.cts +60 -0
- package/dist/lib/cjs/device-settings-command.cjs +49 -0
- package/dist/lib/cjs/device-settings-command.d.cts +76 -0
- package/dist/lib/cjs/device-settings.cjs +88 -0
- package/dist/lib/cjs/device-settings.d.cts +94 -0
- package/dist/lib/cjs/emulator-device-id.cjs +32 -0
- package/dist/lib/cjs/emulator-device-id.d.cts +49 -0
- package/dist/lib/cjs/index.cjs +56 -3
- package/dist/lib/cjs/index.d.cts +18 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/mobile-input.cjs +14 -1
- package/dist/lib/cjs/mobile-input.d.cts +30 -0
- package/dist/lib/cjs/namespace-bootstrap.cjs +9 -1
- package/dist/lib/cjs/resolve-emulator-device-id.cjs +54 -0
- package/dist/lib/cjs/resolve-emulator-device-id.d.cts +28 -0
- package/dist/lib/cjs/soft-keyboard-geometry.cjs +75 -0
- package/dist/lib/cjs/soft-keyboard-geometry.d.cts +156 -0
- package/dist/lib/cjs/soft-keyboard.cjs +118 -0
- package/dist/lib/cjs/soft-keyboard.d.cts +82 -0
- package/dist/lib/cjs/transport-appium.cjs +5 -1
- package/dist/lib/esm/adb.d.mts +61 -0
- package/dist/lib/esm/adb.mjs +35 -0
- package/dist/lib/esm/device-screenshot.d.mts +36 -0
- package/dist/lib/esm/device-screenshot.mjs +18 -0
- package/dist/lib/esm/device-setting-restore.d.mts +60 -0
- package/dist/lib/esm/device-setting-restore.mjs +20 -0
- package/dist/lib/esm/device-settings-command.d.mts +76 -0
- package/dist/lib/esm/device-settings-command.mjs +23 -0
- package/dist/lib/esm/device-settings.d.mts +94 -0
- package/dist/lib/esm/device-settings.mjs +67 -0
- package/dist/lib/esm/emulator-device-id.d.mts +49 -0
- package/dist/lib/esm/emulator-device-id.mjs +8 -0
- package/dist/lib/esm/index.d.mts +18 -0
- package/dist/lib/esm/index.mjs +58 -2
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/mobile-input.d.mts +30 -0
- package/dist/lib/esm/mobile-input.mjs +12 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +9 -1
- package/dist/lib/esm/resolve-emulator-device-id.d.mts +28 -0
- package/dist/lib/esm/resolve-emulator-device-id.mjs +33 -0
- package/dist/lib/esm/soft-keyboard-geometry.d.mts +156 -0
- package/dist/lib/esm/soft-keyboard-geometry.mjs +47 -0
- package/dist/lib/esm/soft-keyboard.d.mts +82 -0
- package/dist/lib/esm/soft-keyboard.mjs +91 -0
- package/dist/lib/esm/transport-appium.mjs +7 -1
- package/package.json +4 -3
|
@@ -111,6 +111,23 @@ export interface MobilePointerInputRequest {
|
|
|
111
111
|
*/
|
|
112
112
|
readonly y: number;
|
|
113
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Builds the expression the host evaluates to claim one input request before injecting it.
|
|
116
|
+
*
|
|
117
|
+
* CDP delivers `Runtime.bindingCalled` to **every** attached session, so each Node process holding an
|
|
118
|
+
* input channel to this WebView services the same request and injects the same gesture. The claim is
|
|
119
|
+
* what makes the injection exactly-once across all of them: the page is the only thing every host
|
|
120
|
+
* shares, and it runs the racing evaluates one after another on its single thread, so exactly one of
|
|
121
|
+
* them gets `true`.
|
|
122
|
+
*
|
|
123
|
+
* Optional chaining for the same reason as {@link buildResolveInputExpression}, and it is why
|
|
124
|
+
* {@link checkInputClaimGranted} treats a non-`false` result as claimed: a page that has dropped the
|
|
125
|
+
* namespace yields `undefined`, and injecting twice is a far better failure than never injecting.
|
|
126
|
+
*
|
|
127
|
+
* @param id - The request id to claim.
|
|
128
|
+
* @returns A self-contained expression to pass to `Runtime.evaluate`.
|
|
129
|
+
*/
|
|
130
|
+
export declare function buildClaimInputExpression(id: string): string;
|
|
114
131
|
/**
|
|
115
132
|
* Builds the expression the host evaluates to answer one input request.
|
|
116
133
|
*
|
|
@@ -123,6 +140,19 @@ export interface MobilePointerInputRequest {
|
|
|
123
140
|
* @returns A self-contained expression to pass to `Runtime.evaluate`.
|
|
124
141
|
*/
|
|
125
142
|
export declare function buildResolveInputExpression(id: string, errorMessage?: string): string;
|
|
143
|
+
/**
|
|
144
|
+
* Reads a `Runtime.evaluate` result for {@link buildClaimInputExpression} and says whether to inject.
|
|
145
|
+
*
|
|
146
|
+
* **Deliberately fails OPEN.** Only a literal `false` — the page actively saying another host already
|
|
147
|
+
* claimed this id — stops the injection. A missing namespace, a page mid-navigation, or any result
|
|
148
|
+
* shape this does not recognize yields `true`, because a gesture injected twice is a far better
|
|
149
|
+
* failure than a gesture never injected at all: the first is a doubled tap, the second is a test that
|
|
150
|
+
* hangs until the renderer's timeout and reports nothing useful.
|
|
151
|
+
*
|
|
152
|
+
* @param result - The raw `Runtime.evaluate` result object.
|
|
153
|
+
* @returns Whether this host should perform the injection.
|
|
154
|
+
*/
|
|
155
|
+
export declare function checkInputClaimGranted(result: unknown): boolean;
|
|
126
156
|
/**
|
|
127
157
|
* The first code point of a non-empty string.
|
|
128
158
|
*
|
|
@@ -61,10 +61,18 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
61
61
|
let hasWarnedMissingObsidianModule = false;
|
|
62
62
|
const pendingInputs = /* @__PURE__ */ new Map();
|
|
63
63
|
let nextInputId = 0;
|
|
64
|
+
const claimedInputIds = /* @__PURE__ */ new Set();
|
|
64
65
|
const ns = {
|
|
65
66
|
get app() {
|
|
66
67
|
return globalThis.app;
|
|
67
68
|
},
|
|
69
|
+
claimInput(id) {
|
|
70
|
+
if (claimedInputIds.has(id)) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
claimedInputIds.add(id);
|
|
74
|
+
return true;
|
|
75
|
+
},
|
|
68
76
|
contexts: existingContexts,
|
|
69
77
|
async destroyCurrentWindow() {
|
|
70
78
|
await this.ensureLayoutReady();
|
|
@@ -488,4 +496,4 @@ ${generateStackTraceLine(line)}`;
|
|
|
488
496
|
0 && (module.exports = {
|
|
489
497
|
ensureNamespaceBootstrapped
|
|
490
498
|
});
|
|
491
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkuY2pzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0KGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVsaWJlcmF0ZSBzZWFtIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHJlYWRzIG9uIG1vYmlsZSBcdTIwMTQgdGhlIG9uZSBuYW1lc3BhY2UgbWVtYmVyIHRoYXQgZXhpc3RzIGZvclxuICAgICAqIGFub3RoZXIgcGFja2FnZSByYXRoZXIgdGhhbiBmb3IgdGhlIGhhcm5lc3MuIEl0cyAqKkwxNyoqIG1pcnJvciAoYGRlc2t0b3AtdHJ1c3RlZC1pbnB1dC50c2ApIGNhblxuICAgICAqIHJlYWNoIGEgdHJ1c3RlZCBldmVudCBvbiBkZXNrdG9wIGJ5IGl0c2VsZiwgYnV0IG9uIG1vYmlsZSB0aGUgaW5qZWN0aW9uIGhhcyB0byBjb21lIGZyb20gdGhlIE5vZGVcbiAgICAgKiBzaWRlIG92ZXIgdGhlIGhhcm5lc3MncyBDRFAgY2hhbm5lbCAoKipMMzkqKiksIGFuZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBtdXN0IG5ldmVyIGltcG9ydCB0aGlzXG4gICAgICogcGFja2FnZSBhdCBydW50aW1lIChpdHMgb3duIHBlZXItZGVwZW5kZW5jeSBydWxlKS4gU28gaXQgcmVhZHMgdGhlc2Ugb2ZmXG4gICAgICogYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpbnN0ZWFkLCBkZWNsYXJpbmcgdGhlIHNoYXBlIGxvY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGVzZSBhcmUgdGhlICoqc2FtZSBmdW5jdGlvbiBvYmplY3RzKiogYGV2YWxXcmFwcGVyYCBwdXRzIGluIGEgY2xvc3VyZSdzIGBsaWJgIGJhZywgbm90IHdyYXBwZXJzOlxuICAgICAqIGVhY2ggYWxyZWFkeSBicmFuY2hlcyBvbiBgUGxhdGZvcm0uaXNNb2JpbGVgIGludGVybmFsbHksIHNvIHRoZSBtb2JpbGUgc2VtYW50aWNzIGxpdmUgaW4gZXhhY3RseSBvbmVcbiAgICAgKiBwbGFjZSBhbmQgb25lIHNlYW0gc2VydmVzIGJvdGggcGxhdGZvcm1zLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRydXN0ZWRJbnB1dDogVHJ1c3RlZElucHV0SGVscGVycztcbiAgfVxuXG4gIGludGVyZmFjZSBFdmFsV3JhcHBlclBhcmFtcyB7XG4gICAgY2FsbGJhY2soZnVuY3Rpb25Bcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBTYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyBUaGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIFVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gU3RydWN0dXJhbCBtaXJyb3Igb2YgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmNvbmZpZ0RpcmA7IHRoZSBuYW1lIGhhcyB0byBtYXRjaCBmb3IgdGhlIHByb2JlIHRvIHJlYWQgaXQuXG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyBVbmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgICBpc01vYmlsZTogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCBoYW5kZWQgdG8gdGhlIGhvc3Qgb3ZlciB0aGUgYFJ1bnRpbWUuYWRkQmluZGluZ2AgY2hhbm5lbC5cbiAgICpcbiAgICogU3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byBgTW9iaWxlSW5wdXRSZXF1ZXN0YCBpbiBgbW9iaWxlLWlucHV0LnRzYCwgcmVkZWNsYXJlZCBoZXJlIGJlY2F1c2UgdGhpc1xuICAgKiBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgY2Fubm90IGltcG9ydCAoKipMMTUqKikuIFRoZSB0d28gYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlXG4gICAqIHRoZW0gdG9nZXRoZXIuXG4gICAqL1xuICB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbiAgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkga2luZDogJ2tleSc7XG4gICAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgfVxuXG4gIGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHk6IG51bWJlcjtcbiAgfVxuXG4gIGludGVyZmFjZSBQZW5kaW5nSW5wdXQge1xuICAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkO1xuICAgIHJlc29sdmUoKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgY29uc3QgbnM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSA9IHtcbiAgICBnZXQgYXBwKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIGBhcHBgIGdldHRlciByZWFkcyBgd2luZG93LmFwcGAgd2hpY2ggaXMgc2V0IGJ5IE9ic2lkaWFuLlxuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IGdsb2JhbFRoaXMuZWxlY3Ryb25XaW5kb3c7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVjdHJvbldpbmRvdy5kZXN0cm95KCk7XG4gICAgICB9LCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZUxheW91dFJlYWR5KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZXJyb3JUb1N0cmluZyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcik7XG4gICAgfSxcblxuICAgIGFzeW5jIGV2YWxXcmFwcGVyKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiAoZS5nLiAwLjYueCkgcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJOiBgcGx1Z2luc2BcbiAgICAgIC8vIEV4aXN0cyBidXQgaGFzIG5vIGBpc0VuYWJsZWRgL2BzZXRFbmFibGVgLCBhbmQgdGhlcmUgYXJlIG5vIHRoaXJkLXBhcnR5XG4gICAgICAvLyBQbHVnaW5zIHRvIGVuYWJsZSwgc28gc2tpcCB0aGlzIHN0ZXAgd2hlbiB0aGUgQVBJIGlzIGFic2VudC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2lucy5pc0VuYWJsZWQgJiYgIXBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIC8vIEF2b2lkIGA/Pz1gOiBvbGQgT2JzaWRpYW4ncyBDaHJvbWl1bSAoZS5nLiAwLjYueCBvbiBDaHJvbWl1bSA4MCkgcHJlZGF0ZXNcbiAgICAgIC8vIEVTMjAyMSBsb2dpY2FsLWFzc2lnbm1lbnQgYW5kIGNhbm5vdCBwYXJzZSBpdCBpbiB0aGlzIHNlcmlhbGl6ZWQgYm9vdHN0cmFwLlxuICAgICAgbGV0IGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAocGFyYW1zLmNvbnRleHRJZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IGV4aXN0aW5nQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7XG4gICAgICAgIGNsaWNrRWxlbWVudCxcbiAgICAgICAgY2xpY2tNb3VzZSxcbiAgICAgICAgY3JlYXRlTm90ZSxcbiAgICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgICBtb3ZlTW91c2UsXG4gICAgICAgIG9wZW5TZXR0aW5nc1RhYixcbiAgICAgICAgcHJlc3NLZXksXG4gICAgICAgIHR5cGVJbnRvRWRpdG9yLFxuICAgICAgICB1bmhvdmVyRWxlbWVudCxcbiAgICAgICAgd2FpdFVudGlsXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3VtZW50cyA9IHsgLi4ucGFyYW1zLmlucHV0LCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuY2FsbGJhY2soZnVsbEFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICB9IGNhdGNoIChldmFsRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHRoaXMuZXJyb3JUb1N0cmluZyhldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdGVtcC1wbHVnaW4gdHJpY2sgYmVsb3cgcmVzb2x2ZXMgYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCBvbmx5XG4gICAgICAvLyBXb3JrcyBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBJdCBuZWVkcyB0aGUgY29tbXVuaXR5LXBsdWdpbiByZWdpc3RyeVxuICAgICAgLy8gKGBsb2FkUGx1Z2luYCArIGBtYW5pZmVzdHNgKSwgd2hpY2ggRklSU1QgYXBwZWFycyBpbiBPYnNpZGlhbiAwLjkuNzsgdGhlXG4gICAgICAvLyAwLjYuNC0wLjkuNiBiYW5kIGhhcyBubyByZWdpc3RyeSBhbmQgY2Fubm90IHJ1biBpdCwgc28gcmV0dXJuIGBudWxsYCAobm90XG4gICAgICAvLyBgdW5kZWZpbmVkYCkgLSBhcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgcnVuLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmICghcGx1Z2lucy5sb2FkUGx1Z2luIHx8ICFwbHVnaW5zLm1hbmlmZXN0cykge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICAgIGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ10gYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGA6IHRoaXMgT2JzaWRpYW4gdmVyc2lvbiBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEkgKGFkZGVkIGluIDAuOS43KSwgc28gdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGNhbm5vdCBiZSByZXNvbHZlZC4gQXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHdvcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlNb2R1bGVOYW1lID0gYGdldC1vYnNpZGlhbi1tb2R1bGUtJHtyYW5kb21TdWZmaXh9YDtcbiAgICAgIC8vIE9sZCB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGB2YXVsdC5jb25maWdEaXJgIHVuZGVmaW5lZDsgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBPYnNpZGlhbidzIGRlZmF1bHQgY29uZmlnIGRpciBzbyB0aGUgdGVtcCBwbHVnaW4gc3RpbGwgZ2V0cyBhIHZhbGlkIHBhdGgsXG4gICAgICAvLyBMb2FkcywgYW5kIGl0cyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgcmVzb2x2ZXMgdGhlIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBjb25maWdEaXIgaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSAodGhpcy5hcHAudmF1bHQgYXMgdW5rbm93biBhcyBWYXVsdExpa2UpLmNvbmZpZ0RpciA/PyAnLm9ic2lkaWFuJztcbiAgICAgIGNvbnN0IHBsdWdpbnNEaXJlY3RvcnkgPSBgJHtjb25maWdEaXJlY3Rvcnl9L3BsdWdpbnNgO1xuICAgICAgY29uc3QgZGlyZWN0b3J5ID0gYCR7cGx1Z2luc0RpcmVjdG9yeX0vJHt0ZW1wb3JhcnlNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wb3JhcnlNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlyYCBpcyBPYnNpZGlhbidzIG93biBgUGx1Z2luTWFuaWZlc3RgIG1lbWJlciBuYW1lLlxuICAgICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgICAgaWQ6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICAvLyBgYWRhcHRlci5ta2RpcmAgaXMgbm90IHJlY3Vyc2l2ZSwgYW5kIGFuIG9sZCB2ZXJzaW9uIG9uIGEgZnJlc2ggdmF1bHQgbWF5IG5vdFxuICAgICAgLy8gSGF2ZSB0aGUgY29uZmlnL3BsdWdpbnMgZGlycyB5ZXQgXHUyMDE0IGNyZWF0ZSB0aGUgY2hhaW4gc28gYGxvYWRQbHVnaW5gIGZpbmRzIHRoZVxuICAgICAgLy8gVGVtcCBwbHVnaW4gYXQgYDxjb25maWdEaXI+L3BsdWdpbnMvPGlkPmAuXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhjb25maWdEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwbHVnaW5zRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihwbHVnaW5zRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyZWN0b3J5KTtcblxuICAgICAgY29uc3QgcGx1Z2luRnVuY3Rpb25Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJlY3Rvcnl9L21haW4uanNgLCBwbHVnaW5GdW5jdGlvbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICAvLyBgdW5pbnN0YWxsUGx1Z2luYCBhcnJpdmVkIGFmdGVyIHRoZSBwbHVnaW4gQVBJIGl0c2VsZiwgc28gaXQgaXMgYWJzZW50IG9uXG4gICAgICAvLyAwLjkuNyAtIHRoZSBGSVJTVCB2ZXJzaW9uIHRvIGV4cG9zZSBgbG9hZFBsdWdpbmAvYG1hbmlmZXN0c2AgKDAuOS42IGFuZCBiZWxvd1xuICAgICAgLy8gSGF2ZSBuZWl0aGVyLCBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFib3ZlKS4gVGhlIG1vZHVsZSBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5XG4gICAgICAvLyBUaGUgcGx1Z2luJ3MgYG1haW4uanNgIGF0IHRoaXMgcG9pbnQsIHNvIG9ubHkgdW5pbnN0YWxsIHdoZW4gdGhlIG1ldGhvZCBleGlzdHM7XG4gICAgICAvLyBPbiAwLjkuNyB0aGUgdGVtcCBwbHVnaW4gbGluZ2VycyBoYXJtbGVzc2x5IGluIHRoZSBlcGhlbWVyYWwgb3duZWQgdmF1bHQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gdW5pbnN0YWxsUGx1Z2luIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgcGx1Z2luc0ZvckNsZWFudXAgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2luc0ZvckNsZWFudXAudW5pbnN0YWxsUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGdsb2JhbFRoaXMuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5jaGFubmVsQXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbGliUmVzb2x2ZXJzOiBib290c3RyYXBQYXJhbXMubGliUmVzb2x2ZXJzLFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gYHdpbmRvdy5hcHBgLCBpdHMgYHdvcmtzcGFjZWAsIGFuZCBsYXlvdXQgY2FuIGFsbCBiZSB0cmFuc2llbnRseVxuICAgICAgLy8gVW5hdmFpbGFibGUgZHVyaW5nIGJvb3Qgb3IgcmlnaHQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZCwgYW5kIG9sZFxuICAgICAgLy8gT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YC4gVGhpcyBydW5zIGluc2lkZSB0aGUgdHJhbnNwb3J0J3NcbiAgICAgIC8vIFJlYWRpbmVzcyBwb2xsLCB3aGljaCByZXRyaWVzIG9uIHRocm93LCBzbyBjaGVjayBgd2luZG93LmFwcGAgRklSU1QgYW5kIGJhaWxcbiAgICAgIC8vIENsZWFubHkgdW50aWwgaXQsIGl0cyB3b3Jrc3BhY2UsIGFuZCBsYXlvdXQgYXJlIGFsbCByZWFkeSBcdTIwMTQgbmV2ZXIgZGVyZWZlcmVuY2VcbiAgICAgIC8vIEFuIHVuZGVmaW5lZCBgd2luZG93LmFwcGAuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gd2luZG93LmFwcC93b3Jrc3BhY2UgYXJlIHJ1bnRpbWUtb3B0aW9uYWwgZHVyaW5nIGJvb3QuXG4gICAgICBjb25zdCBhcHAgPSB0aGlzLmFwcCBhcyB1bmtub3duIGFzIEFwcExpa2UgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwcD8ud29ya3NwYWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3duZWQgdmF1bHQgaXMgbm90IHJlYWR5IHlldCAod2luZG93LmFwcC93b3Jrc3BhY2Ugbm90IGluaXRpYWxpemVkKS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE9sZCBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgIGJ1dCBoYXMgYGxheW91dFJlYWR5ID09PSB0cnVlYFxuICAgICAgLy8gQnkgdGhlIHRpbWUgYSB3aW5kb3cgaXMgdXA7IG9ubHkgd2FpdCB2aWEgYGVuc3VyZUxheW91dFJlYWR5YCB3aGVuIGl0IGlzIG5vdFxuICAgICAgLy8gWWV0IHJlYWR5IChtb2Rlcm4gdmVyc2lvbnMgZWFybHkgaW4gYm9vdCksIHNvIHRoZSBtaXNzaW5nIG1ldGhvZCBpcyBuZXZlciBoaXQuXG4gICAgICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2U7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhZGFwdGVyLmdldEJhc2VQYXRoKCkgOiAoYWRhcHRlci5iYXNlUGF0aCA/PyAnJyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZVBhdGgpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nSW5wdXRzLmdldChpZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gVGhlIHNhbWUgZnVuY3Rpb24gb2JqZWN0cyBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90IHJlLWRlcml2ZWRcbiAgICAvLyBBbmQgbm90IHdyYXBwZWQsIHNvIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGdldHMgZXhhY3RseSB0aGUgaGFybmVzcydzIGJlaGF2aW9yIG9uIGJvdGggcGxhdGZvcm1zLlxuICAgIHRydXN0ZWRJbnB1dDoge1xuICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgY2xpY2tNb3VzZSxcbiAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgIG1vdmVNb3VzZSxcbiAgICAgIHByZXNzS2V5LFxuICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICB1bmhvdmVyRWxlbWVudFxuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPikuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZyA9IG5zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDMwMDtcblxuICAgIGNvbnN0IHsgZWRpdG9yLCB0ZXh0IH0gPSB0eXBlUGFyYW1zO1xuICAgIGNvbnN0IHZhbHVlQmVmb3JlVHlwaW5nID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAvLyBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgY29uc3QgbGFzdExpbmUgPSBlZGl0b3IubGFzdExpbmUoKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGxhc3RMaW5lLCBlZGl0b3IuZ2V0TGluZShsYXN0TGluZSkubGVuZ3RoKTtcblxuICAgIC8vIExldCBhbnkgZm9jdXMgdHJhcCAoYSBgc2V0VGltZW91dCgwKWAgcmUtZm9jdXMpIGZpcmUgYmVmb3JlIHR5cGluZywgc28gc3RvbGVuIGZvY3VzIGlzIGRldGVjdGVkLlxuICAgIGF3YWl0IHNsZWVwKEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgLy8gVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiBgcHJlc3NLZXlgIGluamVjdHMgdGhlIHNhbWUgdHJ1c3RlZFxuICAgIC8vIGBrZXlEb3duYCAtPiBgY2hhcmAgLT4gYGtleVVwYCBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgdGV4dCBsYW5kcyBvbmx5IGlmIHRoZSBlZGl0b3IgaG9sZHMgZm9jdXMuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHRleHQpIHtcbiAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiBjaGFyIH0pO1xuICAgIH1cblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciB0aGUgdGltZW91dCBlbGFwc2VzLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVkaXRvci5nZXRWYWx1ZSgpID09PSB2YWx1ZUJlZm9yZVR5cGluZyAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhpcyBjbG9zdXJlIGlzIHJ1bm5pbmcgaW4gT2JzaWRpYW4gTW9iaWxlIHJhdGhlciB0aGFuIHRoZSBFbGVjdHJvbiBkZXNrdG9wIGFwcC5cbiAgLy8gUmVhZGluZyBgUGxhdGZvcm1gIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTogYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdFxuICAvLyBNb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLCB3aGljaCBpcyB0aGUgc2FtZSBndWFyYW50ZWUgYHRvRWxlY3Ryb25Nb2RpZmllcnNgIHJlbGllcyBvbi5cbiAgZnVuY3Rpb24gY2hlY2tJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01vYmlsZTtcbiAgfVxuXG4gIC8vIEhhbmRzIG9uZSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBpbmplY3RlZC5cbiAgLy9cbiAgLy8gTW9iaWxlIGhhcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgYXQgYWxsIFx1MjAxNCBgZGlzcGF0Y2hFdmVudGAgYW5kIGBlbGVtZW50LmNsaWNrKClgIGFyZVxuICAvLyBgaXNUcnVzdGVkID09PSBmYWxzZWAgYnkgc3BlYyBcdTIwMTQgc28gdGhlIGluamVjdGlvbiBoYXMgdG8gaGFwcGVuIGZyb20gdGhlIE5vZGUgc2lkZSwgb3ZlciBhIENEUFxuICAvLyBDb25uZWN0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBBcHBpdW0gc2Vzc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGF3YWl0aW5nIHRoaXMgdmVyeSBjbG9zdXJlXG4gIC8vIChzZWUgTDM5KS4gYGJpbmRpbmdOYW1lYCBpcyBhIGhvc3QtaW5zdGFsbGVkIGdsb2JhbDsgY2FsbGluZyBpdCBkZWxpdmVycyB0aGUgcmVxdWVzdCwgYW5kIHRoZSBob3N0XG4gIC8vIEFuc3dlcnMgYnkgY2FsbGluZyBgbnMucmVzb2x2ZUlucHV0YC5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhvc3RJbnB1dChyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW5kaW5nTmFtZSA9IGJvb3RzdHJhcFBhcmFtcy5pbnB1dEJpbmRpbmdOYW1lO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBjYXN0OiB0aGUgYmluZGluZyBpcyBpbnN0YWxsZWQgYnkgdGhlIGhvc3QgYXQgcnVudGltZSB2aWEgYFJ1bnRpbWUuYWRkQmluZGluZ2AsIHNvIGl0IGNhbm5vdCBiZSBkZWNsYXJlZCBvbiBgV2luZG93YC5cbiAgICBjb25zdCBiaW5kaW5nID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYmluZGluZ05hbWVdIGFzICgocGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlOiB0aGUgaG9zdCBoYXMgbm90IGluc3RhbGxlZCB0aGUgXFxgJHtiaW5kaW5nTmFtZX1cXGAgY2hhbm5lbC4gYFxuICAgICAgICAgICsgJ09uIG1vYmlsZSB0aGVzZSBoZWxwZXJzIHJlcXVpcmUgdGhlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgQXBwaXVtIHRyYW5zcG9ydC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHRJbnB1dElkKys7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcobmV4dElucHV0SWQpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcGVuZGluZ0lucHV0cy5zZXQoaWQsIHsgcmVqZWN0LCByZXNvbHZlIH0pO1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFwZW5kaW5nSW5wdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSBob3N0IGRpZCBub3Qgc2VydmljZSB0aGUgdHJ1c3RlZCBpbnB1dCByZXF1ZXN0IHdpdGhpbiAke1N0cmluZyhib290c3RyYXBQYXJhbXMuaW5wdXRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLmApKTtcbiAgICAgIH0sIGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGJpbmRpbmcoSlNPTi5zdHJpbmdpZnkoeyBpZCwgcmVxdWVzdCB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIHBvaW50ZXIgaGVscGVyIHRoYXQgaGFzIG5vIHRvdWNoIGFuYWxvZyBpcyBhIGhhcmQgZXJyb3IsIG5ldmVyIGEgc2lsZW50IG5vLW9wOiBgOmhvdmVyYCBkb2VzIG5vdFxuICAvLyBFeGlzdCBvbiB0b3VjaCwgc28gYSB0ZXN0IHRoYXQgXCJob3ZlcmVkXCIgYW5kIHRoZW4gYXNzZXJ0ZWQgd291bGQgcGFzcyB3aGlsZSBleGVyY2lzaW5nIG5vdGhpbmcgXHUyMDE0XG4gIC8vIEV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0aGUgdHJ1c3RlZC1pbnB1dCB3b3JrIGV4aXN0cyB0byBlbmQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBJdCBjYW5ub3QgbW92ZSB0byB0aGUgb3V0ZXIgc2NvcGU6IHRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBtYXkgbm90IHJlZmVyZW5jZSBhbnl0aGluZyBvdXRzaWRlIGl0c2VsZiAoTDE1KS5cbiAgZnVuY3Rpb24gdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKGhlbHBlck5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxgJHtoZWxwZXJOYW1lfVxcYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBob3ZlciBzdGF0ZS4gYFxuICAgICAgICArICdCcmFuY2ggb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGggYGNsaWNrRWxlbWVudGAgaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBNaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLCBhbmQgZXF1YWwgQ0RQJ3NcbiAgICAvLyBQYWdlIGNvb3JkaW5hdGVzIGluIHRoZSBtb2JpbGUgV2ViVmlldyBcdTIwMTQgc28gbmVpdGhlciBwYXRoIG5lZWRzIGEgZGV2aWNlLXBpeGVsIGNvbnZlcnNpb24uXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RIb3N0SW5wdXQoeyBrZXksIGtpbmQ6ICdrZXknLCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG5cbiAgICAvLyBBIHRydXN0ZWQga2V5IHByZXNzIGlzIGtleURvd24gLT4gY2hhciAtPiBrZXlVcDoga2V5RG93biBmaXJlcyBga2V5ZG93bmAsIGNoYXIgZmlyZXNcbiAgICAvLyBga2V5cHJlc3NgL2BiZWZvcmVpbnB1dGAvYGlucHV0YCwga2V5VXAgZmlyZXMgYGtleXVwYCBcdTIwMTQgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUuXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlEb3duJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2NoYXInIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5VXAnIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXQgLS0gQXN5bmMgdG8gbWF0Y2ggaXRzIG1vYmlsZS1jYXBhYmxlIHNpYmxpbmdzIGFuZCB0byBrZWVwIG9uZSBgUHJvbWlzZTx2b2lkPmAgc2hhcGUgYWNyb3NzIHRoZSB0cnVzdGVkLWlucHV0IHNldDsgdGhlIGRlc2t0b3AgYm9keSBpcyBnZW51aW5lbHkgc3luY2hyb25vdXMuXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ21vdmVNb3VzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCd1bmhvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7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
|
|
499
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5janMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkuY2pzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5janMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzIHRoZSByZW5kZXJlciBoYWxmIG9mXG4gICAgICogdGhlIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwncyAqKmV4YWN0bHktb25jZSoqIGd1YXJhbnRlZSAoKipMMzkqKikuXG4gICAgICpcbiAgICAgKiBDRFAgYnJvYWRjYXN0cyBgUnVudGltZS5iaW5kaW5nQ2FsbGVkYCB0byAqKmV2ZXJ5KiogYXR0YWNoZWQgc2Vzc2lvbiwgc28gZXZlcnkgTm9kZSBwcm9jZXNzXG4gICAgICogaG9sZGluZyBhbiBpbnB1dCBjaGFubmVsIHRvIHRoaXMgV2ViVmlldyBzZXJ2aWNlcyB0aGUgc2FtZSByZXF1ZXN0IFx1MjAxNCBhbmQgZWFjaCBvbmUgaW5qZWN0cyB0aGVcbiAgICAgKiBmdWxsIGdlc3R1cmUuIFdpdGggdHdvIHByb2Nlc3NlcyBhdHRhY2hlZCAoYSBWaXRlc3QgbWFpbiBwcm9jZXNzIGFuZCBpdHMgd29ya2VyLCB3aGljaCBpcyB0aGVcbiAgICAgKiBvcmRpbmFyeSBjb25zdW1lciBzaGFwZSkgb25lIGBjbGlja0VsZW1lbnRgIHRoZXJlZm9yZSBhcnJpdmVkIGFzIFRXTyB0YXBzLCBhbmQgb25lIGBwcmVzc0tleWAgYXNcbiAgICAgKiB0d28ga2V5IHByZXNzZXMuIE1lYXN1cmVkIDIwMjYtMDktMTA6IHR3byBwaWRzIHNlcnZpY2luZyByZXF1ZXN0IGBpZD0xYCBpbiB0aGUgc2FtZSBtaWxsaXNlY29uZC5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFpbSBpcyBtYWRlIGluIHRoZSBQQUdFIHJhdGhlciB0aGFuIGluIGFueSBob3N0IGJlY2F1c2UgdGhlIHBhZ2UgaXMgdGhlIG9ubHkgdGhpbmcgYWxsIHRoZVxuICAgICAqIGhvc3RzIHNoYXJlLiBKYXZhU2NyaXB0IGlzIHNpbmdsZS10aHJlYWRlZCwgc28gdHdvIGBSdW50aW1lLmV2YWx1YXRlYCBjYWxscyByYWNpbmcgZm9yIHRoZSBzYW1lXG4gICAgICogaWQgYXJlIHNlcmlhbGl6ZWQgYW5kIGV4YWN0bHkgb25lIHNlZXMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdG8gY2xhaW0uXG4gICAgICogQHJldHVybnMgYHRydWVgIGZvciB0aGUgZmlyc3QgY2FsbGVyIHRvIGNsYWltIHRoaXMgaWQsIGBmYWxzZWAgZm9yIGV2ZXJ5IGxhdGVyIG9uZS5cbiAgICAgKi9cbiAgICBjbGFpbUlucHV0KGlkOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdFxuICAgICAqIG93bnMgdGhlIGhhcm5lc3MgdGVzdCB3aW5kb3cncyBsaWZlY3ljbGUgdmlhIEVsZWN0cm9uIChgd2luZG93LmVsZWN0cm9uV2luZG93YCksXG4gICAgICogd2hpY2ggaXMgdGhlIGhhcm5lc3MncyBjb25jZXJuLCBub3QgYSBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgZGVzdHJveUN1cnJlbnRXaW5kb3coKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYHdvcmtzcGFjZS50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVuc3VyZUxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGBlcnJvci50c2ApIFx1MjAxNCBzZWUgTDE3LlxuICAgICAqL1xuICAgIGVycm9yVG9TdHJpbmcoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIFRoaXNcbiAgICAgKiBpcyB0aGUgaGFybmVzcydzIG93biBldmFsIHBsdW1iaW5nIChidWlsZHMgdGhlIGBsaWJgIGJhZywgcmVzb2x2ZXMgdGhlXG4gICAgICogbW9kdWxlLCBpbnZva2VzIHRoZSBjbG9zdXJlLCBlbnZlbG9wZXMgdGhlIHJlc3VsdCkgXHUyMDE0IG1lYW5pbmdsZXNzIG91dHNpZGVcbiAgICAgKiB0aGUgaGFybmVzcy5cbiAgICAgKi9cbiAgICBldmFsV3JhcHBlcihuc1BhcmFtczogRXZhbFdyYXBwZXJQYXJhbXMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogdGhlIGhhcm5lc3MncyBvbmUtdGltZSBib290c3RyYXAgdGhhdCByZXNvbHZlcyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgZm9yXG4gICAgICogdGhlIHByb2Nlc3M7IGNsb3N1cmVzIG9idGFpbiBpdCBkaXJlY3RseSB2aWEgdGhlaXIgYG9ic2lkaWFuTW9kdWxlYCBhcmcuXG4gICAgICovXG4gICAgZ2V0T2JzaWRpYW5Nb2R1bGUoKTogUHJvbWlzZTx1bmtub3duPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gUmF3XG4gICAgICogRWxlY3Ryb24gSVBDIChgd2luZG93LmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jYCkgaXMgYSBoYXJuZXNzL3RyYW5zcG9ydFxuICAgICAqIHByaW1pdGl2ZSwgbm90IGEgZ2VuZXJhbC1wdXJwb3NlIGhlbHBlci5cbiAgICAgKi9cbiAgICBpcGNTZW5kU3luYyhuc1BhcmFtczogSXBjU2VuZFN5bmNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpc1xuICAgICAqIHBhcnQgb2YgdGhlIGhhcm5lc3MncyB2YXVsdC1wYXRoIGhhbmRzaGFrZSB3aXRoIHRoZSBOb2RlIHNpZGUsIG5vdCBhXG4gICAgICogZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIHBvbGxWYXVsdEJhc2VQYXRoKCk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXMgdGhlIHJlbmRlcmVyIGVuZCBvZiB0aGVcbiAgICAgKiBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsICgqKkwzOSoqKSBcdTIwMTQgdGhlIGhvc3QgY2FsbHMgaXQgb3ZlciBDRFAgdG8gYW5zd2VyIGEgcmVxdWVzdCB0aGlzXG4gICAgICogY2xvc3VyZSBpcyBhd2FpdGluZywgc28gaXQgaXMgbWVhbmluZ2xlc3Mgb3V0c2lkZSB0aGUgaGFybmVzcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpZCAtIFRoZSByZXF1ZXN0IGlkIGJlaW5nIGFuc3dlcmVkLlxuICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgLSBXaHkgdGhlIGluamVjdGlvbiBmYWlsZWQsIG9yIGBudWxsYCBvbiBzdWNjZXNzLlxuICAgICAqL1xuICAgIHJlc29sdmVJbnB1dChpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlbGliZXJhdGUgc2VhbSBgb2JzaWRpYW4tZGV2LXV0aWxzYCByZWFkcyBvbiBtb2JpbGUgXHUyMDE0IHRoZSBvbmUgbmFtZXNwYWNlIG1lbWJlciB0aGF0IGV4aXN0cyBmb3JcbiAgICAgKiBhbm90aGVyIHBhY2thZ2UgcmF0aGVyIHRoYW4gZm9yIHRoZSBoYXJuZXNzLiBJdHMgKipMMTcqKiBtaXJyb3IgKGBkZXNrdG9wLXRydXN0ZWQtaW5wdXQudHNgKSBjYW5cbiAgICAgKiByZWFjaCBhIHRydXN0ZWQgZXZlbnQgb24gZGVza3RvcCBieSBpdHNlbGYsIGJ1dCBvbiBtb2JpbGUgdGhlIGluamVjdGlvbiBoYXMgdG8gY29tZSBmcm9tIHRoZSBOb2RlXG4gICAgICogc2lkZSBvdmVyIHRoZSBoYXJuZXNzJ3MgQ0RQIGNoYW5uZWwgKCoqTDM5KiopLCBhbmQgYG9ic2lkaWFuLWRldi11dGlsc2AgbXVzdCBuZXZlciBpbXBvcnQgdGhpc1xuICAgICAqIHBhY2thZ2UgYXQgcnVudGltZSAoaXRzIG93biBwZWVyLWRlcGVuZGVuY3kgcnVsZSkuIFNvIGl0IHJlYWRzIHRoZXNlIG9mZlxuICAgICAqIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaW5zdGVhZCwgZGVjbGFyaW5nIHRoZSBzaGFwZSBsb2NhbGx5LlxuICAgICAqXG4gICAgICogVGhlc2UgYXJlIHRoZSAqKnNhbWUgZnVuY3Rpb24gb2JqZWN0cyoqIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcsIG5vdCB3cmFwcGVyczpcbiAgICAgKiBlYWNoIGFscmVhZHkgYnJhbmNoZXMgb24gYFBsYXRmb3JtLmlzTW9iaWxlYCBpbnRlcm5hbGx5LCBzbyB0aGUgbW9iaWxlIHNlbWFudGljcyBsaXZlIGluIGV4YWN0bHkgb25lXG4gICAgICogcGxhY2UgYW5kIG9uZSBzZWFtIHNlcnZlcyBib3RoIHBsYXRmb3Jtcy5cbiAgICAgKi9cbiAgICByZWFkb25seSB0cnVzdGVkSW5wdXQ6IFRydXN0ZWRJbnB1dEhlbHBlcnM7XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIGNhbGxiYWNrKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gICAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGdldEJhc2VQYXRoPzogKCkgPT4gc3RyaW5nO1xuICB9XG5cbiAgaW50ZXJmYWNlIElwY1NlbmRTeW5jUGFyYW1zIHtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY2hhbm5lbEFyZ3VtZW50czogdW5rbm93bltdO1xuICB9XG5cbiAgLy8gQ29tbXVuaXR5LXBsdWdpbiBBUEkgbWVtYmVycyB0aGF0IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgbGFjay5cbiAgLy8gYG9ic2lkaWFuLXR5cGluZ3NgIGRlY2xhcmVzIHRoZW0gYXMgYWx3YXlzLXByZXNlbnQsIHNvIHByb2JlIHRocm91Z2ggdGhpc1xuICAvLyBPcHRpb25hbC1tZW1iZXIgdmlldyB0byBkZXRlY3QgdGhlaXIgcnVudGltZSBhYnNlbmNlIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFBsdWdpbnNMaWtlIHtcbiAgICBpc0VuYWJsZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIGxvYWRQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtYW5pZmVzdHM/OiB1bmtub3duO1xuICAgIHVuaW5zdGFsbFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gIH1cblxuICAvLyBUaGUgc2hhcGUgb2YgdGhlIGB0cnVzdGVkSW5wdXRgIHNlYW0uIEV2ZXJ5IG1lbWJlciBpcyBvbmUgb2YgdGhlIEwxNy1zeW5jZWQgaGVscGVycywgZXhwb3NlZCBhcyB0aGVcbiAgLy8gU2FtZSBmdW5jdGlvbiBvYmplY3QgYGV2YWxXcmFwcGVyYCBwdXRzIGluIGEgY2xvc3VyZSdzIGBsaWJgIGJhZy5cbiAgaW50ZXJmYWNlIFRydXN0ZWRJbnB1dEhlbHBlcnMge1xuICAgIGNsaWNrRWxlbWVudChjbGlja1BhcmFtczogQ2xpY2tFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBjbGlja01vdXNlKGNsaWNrUGFyYW1zOiBDbGlja01vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gVGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyBVbm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gVW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gICAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogQSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgaGFuZGVkIHRvIHRoZSBob3N0IG92ZXIgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGNoYW5uZWwuXG4gICAqXG4gICAqIFN0cnVjdHVyYWxseSBpZGVudGljYWwgdG8gYE1vYmlsZUlucHV0UmVxdWVzdGAgaW4gYG1vYmlsZS1pbnB1dC50c2AsIHJlZGVjbGFyZWQgaGVyZSBiZWNhdXNlIHRoaXNcbiAgICogY2xvc3VyZSBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLiBUaGUgdHdvIGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZVxuICAgKiB0aGVtIHRvZ2V0aGVyLlxuICAgKi9cbiAgdHlwZSBNb2JpbGVJbnB1dFJlcXVlc3QgPSBNb2JpbGVLZXlJbnB1dFJlcXVlc3QgfCBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0O1xuXG4gIGludGVyZmFjZSBNb2JpbGVLZXlJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gIH1cblxuICBpbnRlcmZhY2UgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2luZDogJ2xvbmdQcmVzcycgfCAndGFwJztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHg6IG51bWJlcjtcbiAgICByZWFkb25seSB5OiBudW1iZXI7XG4gIH1cblxuICBpbnRlcmZhY2UgUGVuZGluZ0lucHV0IHtcbiAgICByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZDtcbiAgICByZXNvbHZlKCk6IHZvaWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSB0aW1lIChpbiBtcykge0BsaW5rIG9wZW5TZXR0aW5nc1RhYn0gd2FpdHMgZm9yIHRoZSBzZXR0aW5nc1xuICAgKiBtb2RhbCB0byBvcGVuIGFuZCBmb3IgdGhlIHJlcXVlc3RlZCB0YWIgdG8gcmVuZGVyLCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3RcbiAgICogb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGludGVydmFsIChpbiBtcykgYmV0d2VlbiB7QGxpbmsgd2FpdFVudGlsfSBwcmVkaWNhdGUgY2hlY2tzIHdoZW4gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgd2FpdFVudGlsfSB3YWl0cyBmb3IgaXRzIHByZWRpY2F0ZSB0b1xuICAgKiBiZWNvbWUgdHJ1dGh5IGJlZm9yZSByZWplY3RpbmcsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdCBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0aW1lcyB7QGxpbmsgY3JlYXRlTm90ZX0gcmV3cml0ZXMgYSBub3RlIHdob3NlIGNvbnRlbnQgZGlkIG5vdFxuICAgKiByZWFjaCB0aGUgZmlsZXN5c3RlbSBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKlxuICAgKiBUaGUgQW5kcm9pZCBlbXVsYXRvciBsb3NlcyByb3VnaGx5IDEgd3JpdGUgaW4gMTEwLCBzbyBhIHNpbmdsZSByZXBhaXJcbiAgICogYWxyZWFkeSBtYWtlcyBhIGxvc3Qgbm90ZSBhc3Ryb25vbWljYWxseSB1bmxpa2VseTsgdGhlIGV4dHJhIGF0dGVtcHRzIGNvc3RcbiAgICogbm90aGluZyB3aGVuIG5vdGhpbmcgaXMgbG9zdCwgYW5kIHRoZSBjYXAgaXMgd2hhdCBrZWVwcyBhIGdlbnVpbmVseSBicm9rZW5cbiAgICogd3JpdGUgZnJvbSBiZWluZyByZXRyaWVkIGZvcmV2ZXIgaW5zdGVhZCBvZiBmYWlsaW5nIHdpdGggYSByZWFkYWJsZSBlcnJvci5cbiAgICovXG4gIGNvbnN0IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UID0gMztcblxuICAvKipcbiAgICogUHJlZml4IHVzZWQgYnkge0BsaW5rIGVycm9yVG9TdHJpbmd9J3MgbmVzdGVkLWVycm9yIHNlcGFyYXRvciBsaW5lcywgbWF0Y2hpbmdcbiAgICogdGhlIGAgICAgYXRgIHByZWZpeCBvZiBhIFY4IHN0YWNrLXRyYWNlIGZyYW1lIHNvIHRoZSBzZXBhcmF0b3JzIGJsZW5kIGludG9cbiAgICogdGhlIHN1cnJvdW5kaW5nIHN0YWNrLiBLZXB0IGlkZW50aWNhbCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYCcgYGVycm9yVG9TdHJpbmdgLlxuICAgKi9cbiAgY29uc3QgU1RBQ0tfVFJBQ0VfUFJFRklYID0gJyAgICBhdCc7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIGNvbnN0IGhvbGRlciA9IGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IGV4aXN0aW5nQ29udGV4dHMgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMgPz8ge307XG4gIGNvbnN0IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8ub2JzaWRpYW5Nb2R1bGU7XG4gIC8vIFdhcm4gYXQgbW9zdCBvbmNlIHBlciBib290c3RyYXAgdGhhdCBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYCBvbiB0aGlzIHZlcnNpb24uXG4gIGxldCBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSBmYWxzZTtcblxuICAvLyBJbi1mbGlnaHQgbW9iaWxlIGlucHV0IHJlcXVlc3RzLCBrZXllZCBieSByZXF1ZXN0IGlkLCBhd2FpdGluZyB0aGUgaG9zdCdzIGFuc3dlciB2aWEgYHJlc29sdmVJbnB1dGAuXG4gIGNvbnN0IHBlbmRpbmdJbnB1dHMgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0lucHV0PigpO1xuICBsZXQgbmV4dElucHV0SWQgPSAwO1xuXG4gIC8vIFJlcXVlc3QgaWRzIGFscmVhZHkgY2xhaW1lZCBieSBzb21lIGhvc3QsIHNvIGEgc2Vjb25kIGF0dGFjaGVkIGhvc3QgZG9lcyBub3QgaW5qZWN0IHRoZSBnZXN0dXJlIGFcbiAgLy8gU2Vjb25kIHRpbWUgXHUyMDE0IHNlZSBgY2xhaW1JbnB1dGAuIElkcyBhcmUgbW9ub3RvbmljIHdpdGhpbiBhIHBhZ2UsIHNvIHRoaXMgb25seSBncm93cyBhcyBmYXN0IGFzIHRoZVxuICAvLyBSdW4gZHJpdmVzIGlucHV0LCBhbmQgaXQgZGllcyB3aXRoIHRoZSBwYWdlLlxuICBjb25zdCBjbGFpbWVkSW5wdXRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5hcHA7XG4gICAgfSxcblxuICAgIGNsYWltSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICBpZiAoY2xhaW1lZElucHV0SWRzLmhhcyhpZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjbGFpbWVkSW5wdXRJZHMuYWRkKGlkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IGdsb2JhbFRoaXMuZWxlY3Ryb25XaW5kb3c7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVjdHJvbldpbmRvdy5kZXN0cm95KCk7XG4gICAgICB9LCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZUxheW91dFJlYWR5KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZXJyb3JUb1N0cmluZyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcik7XG4gICAgfSxcblxuICAgIGFzeW5jIGV2YWxXcmFwcGVyKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiAoZS5nLiAwLjYueCkgcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJOiBgcGx1Z2luc2BcbiAgICAgIC8vIEV4aXN0cyBidXQgaGFzIG5vIGBpc0VuYWJsZWRgL2BzZXRFbmFibGVgLCBhbmQgdGhlcmUgYXJlIG5vIHRoaXJkLXBhcnR5XG4gICAgICAvLyBQbHVnaW5zIHRvIGVuYWJsZSwgc28gc2tpcCB0aGlzIHN0ZXAgd2hlbiB0aGUgQVBJIGlzIGFic2VudC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2lucy5pc0VuYWJsZWQgJiYgIXBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIC8vIEF2b2lkIGA/Pz1gOiBvbGQgT2JzaWRpYW4ncyBDaHJvbWl1bSAoZS5nLiAwLjYueCBvbiBDaHJvbWl1bSA4MCkgcHJlZGF0ZXNcbiAgICAgIC8vIEVTMjAyMSBsb2dpY2FsLWFzc2lnbm1lbnQgYW5kIGNhbm5vdCBwYXJzZSBpdCBpbiB0aGlzIHNlcmlhbGl6ZWQgYm9vdHN0cmFwLlxuICAgICAgbGV0IGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAocGFyYW1zLmNvbnRleHRJZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IGV4aXN0aW5nQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7XG4gICAgICAgIGNsaWNrRWxlbWVudCxcbiAgICAgICAgY2xpY2tNb3VzZSxcbiAgICAgICAgY3JlYXRlTm90ZSxcbiAgICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgICBtb3ZlTW91c2UsXG4gICAgICAgIG9wZW5TZXR0aW5nc1RhYixcbiAgICAgICAgcHJlc3NLZXksXG4gICAgICAgIHR5cGVJbnRvRWRpdG9yLFxuICAgICAgICB1bmhvdmVyRWxlbWVudCxcbiAgICAgICAgd2FpdFVudGlsXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3VtZW50cyA9IHsgLi4ucGFyYW1zLmlucHV0LCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuY2FsbGJhY2soZnVsbEFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICB9IGNhdGNoIChldmFsRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHRoaXMuZXJyb3JUb1N0cmluZyhldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdGVtcC1wbHVnaW4gdHJpY2sgYmVsb3cgcmVzb2x2ZXMgYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCBvbmx5XG4gICAgICAvLyBXb3JrcyBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBJdCBuZWVkcyB0aGUgY29tbXVuaXR5LXBsdWdpbiByZWdpc3RyeVxuICAgICAgLy8gKGBsb2FkUGx1Z2luYCArIGBtYW5pZmVzdHNgKSwgd2hpY2ggRklSU1QgYXBwZWFycyBpbiBPYnNpZGlhbiAwLjkuNzsgdGhlXG4gICAgICAvLyAwLjYuNC0wLjkuNiBiYW5kIGhhcyBubyByZWdpc3RyeSBhbmQgY2Fubm90IHJ1biBpdCwgc28gcmV0dXJuIGBudWxsYCAobm90XG4gICAgICAvLyBgdW5kZWZpbmVkYCkgLSBhcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgcnVuLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmICghcGx1Z2lucy5sb2FkUGx1Z2luIHx8ICFwbHVnaW5zLm1hbmlmZXN0cykge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICAgIGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ10gYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGA6IHRoaXMgT2JzaWRpYW4gdmVyc2lvbiBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEkgKGFkZGVkIGluIDAuOS43KSwgc28gdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGNhbm5vdCBiZSByZXNvbHZlZC4gQXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHdvcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlNb2R1bGVOYW1lID0gYGdldC1vYnNpZGlhbi1tb2R1bGUtJHtyYW5kb21TdWZmaXh9YDtcbiAgICAgIC8vIE9sZCB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGB2YXVsdC5jb25maWdEaXJgIHVuZGVmaW5lZDsgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBPYnNpZGlhbidzIGRlZmF1bHQgY29uZmlnIGRpciBzbyB0aGUgdGVtcCBwbHVnaW4gc3RpbGwgZ2V0cyBhIHZhbGlkIHBhdGgsXG4gICAgICAvLyBMb2FkcywgYW5kIGl0cyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgcmVzb2x2ZXMgdGhlIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBjb25maWdEaXIgaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSAodGhpcy5hcHAudmF1bHQgYXMgdW5rbm93biBhcyBWYXVsdExpa2UpLmNvbmZpZ0RpciA/PyAnLm9ic2lkaWFuJztcbiAgICAgIGNvbnN0IHBsdWdpbnNEaXJlY3RvcnkgPSBgJHtjb25maWdEaXJlY3Rvcnl9L3BsdWdpbnNgO1xuICAgICAgY29uc3QgZGlyZWN0b3J5ID0gYCR7cGx1Z2luc0RpcmVjdG9yeX0vJHt0ZW1wb3JhcnlNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wb3JhcnlNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlyYCBpcyBPYnNpZGlhbidzIG93biBgUGx1Z2luTWFuaWZlc3RgIG1lbWJlciBuYW1lLlxuICAgICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgICAgaWQ6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICAvLyBgYWRhcHRlci5ta2RpcmAgaXMgbm90IHJlY3Vyc2l2ZSwgYW5kIGFuIG9sZCB2ZXJzaW9uIG9uIGEgZnJlc2ggdmF1bHQgbWF5IG5vdFxuICAgICAgLy8gSGF2ZSB0aGUgY29uZmlnL3BsdWdpbnMgZGlycyB5ZXQgXHUyMDE0IGNyZWF0ZSB0aGUgY2hhaW4gc28gYGxvYWRQbHVnaW5gIGZpbmRzIHRoZVxuICAgICAgLy8gVGVtcCBwbHVnaW4gYXQgYDxjb25maWdEaXI+L3BsdWdpbnMvPGlkPmAuXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhjb25maWdEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwbHVnaW5zRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihwbHVnaW5zRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyZWN0b3J5KTtcblxuICAgICAgY29uc3QgcGx1Z2luRnVuY3Rpb25Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJlY3Rvcnl9L21haW4uanNgLCBwbHVnaW5GdW5jdGlvbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICAvLyBgdW5pbnN0YWxsUGx1Z2luYCBhcnJpdmVkIGFmdGVyIHRoZSBwbHVnaW4gQVBJIGl0c2VsZiwgc28gaXQgaXMgYWJzZW50IG9uXG4gICAgICAvLyAwLjkuNyAtIHRoZSBGSVJTVCB2ZXJzaW9uIHRvIGV4cG9zZSBgbG9hZFBsdWdpbmAvYG1hbmlmZXN0c2AgKDAuOS42IGFuZCBiZWxvd1xuICAgICAgLy8gSGF2ZSBuZWl0aGVyLCBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFib3ZlKS4gVGhlIG1vZHVsZSBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5XG4gICAgICAvLyBUaGUgcGx1Z2luJ3MgYG1haW4uanNgIGF0IHRoaXMgcG9pbnQsIHNvIG9ubHkgdW5pbnN0YWxsIHdoZW4gdGhlIG1ldGhvZCBleGlzdHM7XG4gICAgICAvLyBPbiAwLjkuNyB0aGUgdGVtcCBwbHVnaW4gbGluZ2VycyBoYXJtbGVzc2x5IGluIHRoZSBlcGhlbWVyYWwgb3duZWQgdmF1bHQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gdW5pbnN0YWxsUGx1Z2luIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgcGx1Z2luc0ZvckNsZWFudXAgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2luc0ZvckNsZWFudXAudW5pbnN0YWxsUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGdsb2JhbFRoaXMuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5jaGFubmVsQXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbGliUmVzb2x2ZXJzOiBib290c3RyYXBQYXJhbXMubGliUmVzb2x2ZXJzLFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gYHdpbmRvdy5hcHBgLCBpdHMgYHdvcmtzcGFjZWAsIGFuZCBsYXlvdXQgY2FuIGFsbCBiZSB0cmFuc2llbnRseVxuICAgICAgLy8gVW5hdmFpbGFibGUgZHVyaW5nIGJvb3Qgb3IgcmlnaHQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZCwgYW5kIG9sZFxuICAgICAgLy8gT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YC4gVGhpcyBydW5zIGluc2lkZSB0aGUgdHJhbnNwb3J0J3NcbiAgICAgIC8vIFJlYWRpbmVzcyBwb2xsLCB3aGljaCByZXRyaWVzIG9uIHRocm93LCBzbyBjaGVjayBgd2luZG93LmFwcGAgRklSU1QgYW5kIGJhaWxcbiAgICAgIC8vIENsZWFubHkgdW50aWwgaXQsIGl0cyB3b3Jrc3BhY2UsIGFuZCBsYXlvdXQgYXJlIGFsbCByZWFkeSBcdTIwMTQgbmV2ZXIgZGVyZWZlcmVuY2VcbiAgICAgIC8vIEFuIHVuZGVmaW5lZCBgd2luZG93LmFwcGAuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gd2luZG93LmFwcC93b3Jrc3BhY2UgYXJlIHJ1bnRpbWUtb3B0aW9uYWwgZHVyaW5nIGJvb3QuXG4gICAgICBjb25zdCBhcHAgPSB0aGlzLmFwcCBhcyB1bmtub3duIGFzIEFwcExpa2UgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwcD8ud29ya3NwYWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3duZWQgdmF1bHQgaXMgbm90IHJlYWR5IHlldCAod2luZG93LmFwcC93b3Jrc3BhY2Ugbm90IGluaXRpYWxpemVkKS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE9sZCBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgIGJ1dCBoYXMgYGxheW91dFJlYWR5ID09PSB0cnVlYFxuICAgICAgLy8gQnkgdGhlIHRpbWUgYSB3aW5kb3cgaXMgdXA7IG9ubHkgd2FpdCB2aWEgYGVuc3VyZUxheW91dFJlYWR5YCB3aGVuIGl0IGlzIG5vdFxuICAgICAgLy8gWWV0IHJlYWR5IChtb2Rlcm4gdmVyc2lvbnMgZWFybHkgaW4gYm9vdCksIHNvIHRoZSBtaXNzaW5nIG1ldGhvZCBpcyBuZXZlciBoaXQuXG4gICAgICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2U7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhZGFwdGVyLmdldEJhc2VQYXRoKCkgOiAoYWRhcHRlci5iYXNlUGF0aCA/PyAnJyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZVBhdGgpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nSW5wdXRzLmdldChpZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gVGhlIHNhbWUgZnVuY3Rpb24gb2JqZWN0cyBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90IHJlLWRlcml2ZWRcbiAgICAvLyBBbmQgbm90IHdyYXBwZWQsIHNvIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGdldHMgZXhhY3RseSB0aGUgaGFybmVzcydzIGJlaGF2aW9yIG9uIGJvdGggcGxhdGZvcm1zLlxuICAgIHRydXN0ZWRJbnB1dDoge1xuICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgY2xpY2tNb3VzZSxcbiAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgIG1vdmVNb3VzZSxcbiAgICAgIHByZXNzS2V5LFxuICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICB1bmhvdmVyRWxlbWVudFxuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPikuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZyA9IG5zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDMwMDtcblxuICAgIGNvbnN0IHsgZWRpdG9yLCB0ZXh0IH0gPSB0eXBlUGFyYW1zO1xuICAgIGNvbnN0IHZhbHVlQmVmb3JlVHlwaW5nID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAvLyBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgY29uc3QgbGFzdExpbmUgPSBlZGl0b3IubGFzdExpbmUoKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGxhc3RMaW5lLCBlZGl0b3IuZ2V0TGluZShsYXN0TGluZSkubGVuZ3RoKTtcblxuICAgIC8vIExldCBhbnkgZm9jdXMgdHJhcCAoYSBgc2V0VGltZW91dCgwKWAgcmUtZm9jdXMpIGZpcmUgYmVmb3JlIHR5cGluZywgc28gc3RvbGVuIGZvY3VzIGlzIGRldGVjdGVkLlxuICAgIGF3YWl0IHNsZWVwKEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgLy8gVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiBgcHJlc3NLZXlgIGluamVjdHMgdGhlIHNhbWUgdHJ1c3RlZFxuICAgIC8vIGBrZXlEb3duYCAtPiBgY2hhcmAgLT4gYGtleVVwYCBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgdGV4dCBsYW5kcyBvbmx5IGlmIHRoZSBlZGl0b3IgaG9sZHMgZm9jdXMuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHRleHQpIHtcbiAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiBjaGFyIH0pO1xuICAgIH1cblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciB0aGUgdGltZW91dCBlbGFwc2VzLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVkaXRvci5nZXRWYWx1ZSgpID09PSB2YWx1ZUJlZm9yZVR5cGluZyAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhpcyBjbG9zdXJlIGlzIHJ1bm5pbmcgaW4gT2JzaWRpYW4gTW9iaWxlIHJhdGhlciB0aGFuIHRoZSBFbGVjdHJvbiBkZXNrdG9wIGFwcC5cbiAgLy8gUmVhZGluZyBgUGxhdGZvcm1gIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTogYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdFxuICAvLyBNb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLCB3aGljaCBpcyB0aGUgc2FtZSBndWFyYW50ZWUgYHRvRWxlY3Ryb25Nb2RpZmllcnNgIHJlbGllcyBvbi5cbiAgZnVuY3Rpb24gY2hlY2tJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01vYmlsZTtcbiAgfVxuXG4gIC8vIEhhbmRzIG9uZSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBpbmplY3RlZC5cbiAgLy9cbiAgLy8gTW9iaWxlIGhhcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgYXQgYWxsIFx1MjAxNCBgZGlzcGF0Y2hFdmVudGAgYW5kIGBlbGVtZW50LmNsaWNrKClgIGFyZVxuICAvLyBgaXNUcnVzdGVkID09PSBmYWxzZWAgYnkgc3BlYyBcdTIwMTQgc28gdGhlIGluamVjdGlvbiBoYXMgdG8gaGFwcGVuIGZyb20gdGhlIE5vZGUgc2lkZSwgb3ZlciBhIENEUFxuICAvLyBDb25uZWN0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBBcHBpdW0gc2Vzc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGF3YWl0aW5nIHRoaXMgdmVyeSBjbG9zdXJlXG4gIC8vIChzZWUgTDM5KS4gYGJpbmRpbmdOYW1lYCBpcyBhIGhvc3QtaW5zdGFsbGVkIGdsb2JhbDsgY2FsbGluZyBpdCBkZWxpdmVycyB0aGUgcmVxdWVzdCwgYW5kIHRoZSBob3N0XG4gIC8vIEFuc3dlcnMgYnkgY2FsbGluZyBgbnMucmVzb2x2ZUlucHV0YC5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhvc3RJbnB1dChyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW5kaW5nTmFtZSA9IGJvb3RzdHJhcFBhcmFtcy5pbnB1dEJpbmRpbmdOYW1lO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBjYXN0OiB0aGUgYmluZGluZyBpcyBpbnN0YWxsZWQgYnkgdGhlIGhvc3QgYXQgcnVudGltZSB2aWEgYFJ1bnRpbWUuYWRkQmluZGluZ2AsIHNvIGl0IGNhbm5vdCBiZSBkZWNsYXJlZCBvbiBgV2luZG93YC5cbiAgICBjb25zdCBiaW5kaW5nID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYmluZGluZ05hbWVdIGFzICgocGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlOiB0aGUgaG9zdCBoYXMgbm90IGluc3RhbGxlZCB0aGUgXFxgJHtiaW5kaW5nTmFtZX1cXGAgY2hhbm5lbC4gYFxuICAgICAgICAgICsgJ09uIG1vYmlsZSB0aGVzZSBoZWxwZXJzIHJlcXVpcmUgdGhlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgQXBwaXVtIHRyYW5zcG9ydC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHRJbnB1dElkKys7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcobmV4dElucHV0SWQpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcGVuZGluZ0lucHV0cy5zZXQoaWQsIHsgcmVqZWN0LCByZXNvbHZlIH0pO1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFwZW5kaW5nSW5wdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSBob3N0IGRpZCBub3Qgc2VydmljZSB0aGUgdHJ1c3RlZCBpbnB1dCByZXF1ZXN0IHdpdGhpbiAke1N0cmluZyhib290c3RyYXBQYXJhbXMuaW5wdXRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLmApKTtcbiAgICAgIH0sIGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGJpbmRpbmcoSlNPTi5zdHJpbmdpZnkoeyBpZCwgcmVxdWVzdCB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIHBvaW50ZXIgaGVscGVyIHRoYXQgaGFzIG5vIHRvdWNoIGFuYWxvZyBpcyBhIGhhcmQgZXJyb3IsIG5ldmVyIGEgc2lsZW50IG5vLW9wOiBgOmhvdmVyYCBkb2VzIG5vdFxuICAvLyBFeGlzdCBvbiB0b3VjaCwgc28gYSB0ZXN0IHRoYXQgXCJob3ZlcmVkXCIgYW5kIHRoZW4gYXNzZXJ0ZWQgd291bGQgcGFzcyB3aGlsZSBleGVyY2lzaW5nIG5vdGhpbmcgXHUyMDE0XG4gIC8vIEV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0aGUgdHJ1c3RlZC1pbnB1dCB3b3JrIGV4aXN0cyB0byBlbmQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBJdCBjYW5ub3QgbW92ZSB0byB0aGUgb3V0ZXIgc2NvcGU6IHRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBtYXkgbm90IHJlZmVyZW5jZSBhbnl0aGluZyBvdXRzaWRlIGl0c2VsZiAoTDE1KS5cbiAgZnVuY3Rpb24gdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKGhlbHBlck5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxgJHtoZWxwZXJOYW1lfVxcYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBob3ZlciBzdGF0ZS4gYFxuICAgICAgICArICdCcmFuY2ggb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGggYGNsaWNrRWxlbWVudGAgaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBNaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLCBhbmQgZXF1YWwgQ0RQJ3NcbiAgICAvLyBQYWdlIGNvb3JkaW5hdGVzIGluIHRoZSBtb2JpbGUgV2ViVmlldyBcdTIwMTQgc28gbmVpdGhlciBwYXRoIG5lZWRzIGEgZGV2aWNlLXBpeGVsIGNvbnZlcnNpb24uXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RIb3N0SW5wdXQoeyBrZXksIGtpbmQ6ICdrZXknLCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG5cbiAgICAvLyBBIHRydXN0ZWQga2V5IHByZXNzIGlzIGtleURvd24gLT4gY2hhciAtPiBrZXlVcDoga2V5RG93biBmaXJlcyBga2V5ZG93bmAsIGNoYXIgZmlyZXNcbiAgICAvLyBga2V5cHJlc3NgL2BiZWZvcmVpbnB1dGAvYGlucHV0YCwga2V5VXAgZmlyZXMgYGtleXVwYCBcdTIwMTQgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUuXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlEb3duJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2NoYXInIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5VXAnIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXQgLS0gQXN5bmMgdG8gbWF0Y2ggaXRzIG1vYmlsZS1jYXBhYmxlIHNpYmxpbmdzIGFuZCB0byBrZWVwIG9uZSBgUHJvbWlzZTx2b2lkPmAgc2hhcGUgYWNyb3NzIHRoZSB0cnVzdGVkLWlucHV0IHNldDsgdGhlIGRlc2t0b3AgYm9keSBpcyBnZW51aW5lbHkgc3luY2hyb25vdXMuXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ21vdmVNb3VzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCd1bmhvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUNBLG9DQUFxQztBQUNyQywwQkFHTztBQUNQLDBCQUdPO0FBa0NQLGVBQXNCLDRCQUE0QixX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
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var resolve_emulator_device_id_exports = {};
|
|
20
|
+
__export(resolve_emulator_device_id_exports, {
|
|
21
|
+
resolveEmulatorDeviceId: () => resolveEmulatorDeviceId
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(resolve_emulator_device_id_exports);
|
|
24
|
+
var import_adb_device_list = require("./adb-device-list.cjs");
|
|
25
|
+
var import_adb = require("./adb.cjs");
|
|
26
|
+
var import_emulator_device_id = require("./emulator-device-id.cjs");
|
|
27
|
+
const EMULATOR_DEVICE_ID_PREFIX = "emulator-";
|
|
28
|
+
async function resolveEmulatorDeviceId(params) {
|
|
29
|
+
const candidates = await listEmulatorDeviceCandidates();
|
|
30
|
+
const deviceId = (0, import_emulator_device_id.selectEmulatorDeviceId)({ avdName: params.avdName, candidates });
|
|
31
|
+
if (!deviceId) {
|
|
32
|
+
const listed = candidates.map((candidate) => `${candidate.deviceId} (${candidate.avdName})`).join(", ") || "none";
|
|
33
|
+
throw new Error(
|
|
34
|
+
`resolveEmulatorDeviceId: no running emulator for AVD "${params.avdName}". Running emulators: ${listed}. Start it, or run this project once to have the harness start it.`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return deviceId;
|
|
38
|
+
}
|
|
39
|
+
async function listEmulatorDeviceCandidates() {
|
|
40
|
+
const devicesOutput = await (0, import_adb.runAdbTextWithoutDevice)(["devices"]);
|
|
41
|
+
const deviceIds = (0, import_adb_device_list.listOnlineDeviceIds)(devicesOutput).filter((deviceId) => deviceId.startsWith(EMULATOR_DEVICE_ID_PREFIX));
|
|
42
|
+
const candidates = [];
|
|
43
|
+
for (const deviceId of deviceIds) {
|
|
44
|
+
const output = await (0, import_adb.runAdbText)({ commandArguments: ["emu", "avd", "name"], deviceId });
|
|
45
|
+
const avdName = output.split("\n", 1)[0]?.trim() ?? "";
|
|
46
|
+
candidates.push({ avdName, deviceId });
|
|
47
|
+
}
|
|
48
|
+
return candidates;
|
|
49
|
+
}
|
|
50
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
51
|
+
0 && (module.exports = {
|
|
52
|
+
resolveEmulatorDeviceId
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3Jlc29sdmUtZW11bGF0b3ItZGV2aWNlLWlkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQXNrcyB0aGUgcnVubmluZyBlbXVsYXRvcnMgd2hpY2ggQVZEIGVhY2ggd2FzIHN0YXJ0ZWQgZnJvbSwgYW5kIHJlc29sdmVzIG9uZVxuICogYnkgbmFtZSB0aHJvdWdoIHtAbGluayAuL2VtdWxhdG9yLWRldmljZS1pZC50c30ncyBzZWxlY3Rpb24uXG4gKlxuICogRXZlcnkgZnVuY3Rpb24gaGVyZSBzaGVsbHMgb3V0LCBzbyB0aGUgd2hvbGUgbW9kdWxlIGlzIGludGVncmF0aW9uLXRpbWUgY29kZVxuICogXHUyMDE0IHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBzZWxlY3Rpb24gaXQgZGVsZWdhdGVzIHRvIGxpdmVzIGluIGl0cyBvd24gbW9kdWxlXG4gKiBhbmQgc3RheXMgdW5pdC10ZXN0ZWQuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgY29kZSAoc2hlbGxzIG91dCB0byBhIHJlYWwgZGV2aWNlKSBjb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbXVsYXRvckRldmljZUNhbmRpZGF0ZSB9IGZyb20gJy4vZW11bGF0b3ItZGV2aWNlLWlkLmNqcyc7XG5cbmltcG9ydCB7IGxpc3RPbmxpbmVEZXZpY2VJZHMgfSBmcm9tICcuL2FkYi1kZXZpY2UtbGlzdC5janMnO1xuaW1wb3J0IHtcbiAgcnVuQWRiVGV4dCxcbiAgcnVuQWRiVGV4dFdpdGhvdXREZXZpY2Vcbn0gZnJvbSAnLi9hZGIuY2pzJztcbmltcG9ydCB7IHNlbGVjdEVtdWxhdG9yRGV2aWNlSWQgfSBmcm9tICcuL2VtdWxhdG9yLWRldmljZS1pZC5janMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlRW11bGF0b3JEZXZpY2VJZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIEFWRCBuYW1lIHRvIG1hdGNoLCBlLmcuIGBvYnNpZGlhbl9zY3JlZW5zaG90c2AuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHByZWZpeCBgYWRiIGRldmljZXNgIGdpdmVzIGFuIGVtdWxhdG9yLCBhcyBvcHBvc2VkIHRvIGEgcGh5c2ljYWxseSBhdHRhY2hlZCBkZXZpY2UuXG4gKi9cbmNvbnN0IEVNVUxBVE9SX0RFVklDRV9JRF9QUkVGSVggPSAnZW11bGF0b3ItJztcblxuLyoqXG4gKiBGaW5kcyB0aGUgcnVubmluZyBlbXVsYXRvciB3aG9zZSBBVkQgaXMgdGhlIG5hbWVkIG9uZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIEFWRCB0byBtYXRjaC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGRldmljZSBVRElEIHRvIGFkZHJlc3MgaXQgYnkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIG5vIHJ1bm5pbmcgZW11bGF0b3Igd2FzIHN0YXJ0ZWQgZnJvbSB0aGF0IEFWRC4gVGhlIG1lc3NhZ2UgbGlzdHMgd2hhdCBJUyBydW5uaW5nLCBzaW5jZVxuICogICBcInRoZSB3cm9uZyBlbXVsYXRvciBpcyB1cFwiIGFuZCBcIm5vIGVtdWxhdG9yIGlzIHVwXCIgbmVlZCBkaWZmZXJlbnQgYW5zd2Vycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvckRldmljZUlkKHBhcmFtczogUmVzb2x2ZUVtdWxhdG9yRGV2aWNlSWRQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYW5kaWRhdGVzID0gYXdhaXQgbGlzdEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlcygpO1xuICBjb25zdCBkZXZpY2VJZCA9IHNlbGVjdEVtdWxhdG9yRGV2aWNlSWQoeyBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSwgY2FuZGlkYXRlcyB9KTtcblxuICBpZiAoIWRldmljZUlkKSB7XG4gICAgY29uc3QgbGlzdGVkID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gYCR7Y2FuZGlkYXRlLmRldmljZUlkfSAoJHtjYW5kaWRhdGUuYXZkTmFtZX0pYCkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJlc29sdmVFbXVsYXRvckRldmljZUlkOiBubyBydW5uaW5nIGVtdWxhdG9yIGZvciBBVkQgXCIke3BhcmFtcy5hdmROYW1lfVwiLiBSdW5uaW5nIGVtdWxhdG9yczogJHtsaXN0ZWR9LiBgXG4gICAgICAgICsgJ1N0YXJ0IGl0LCBvciBydW4gdGhpcyBwcm9qZWN0IG9uY2UgdG8gaGF2ZSB0aGUgaGFybmVzcyBzdGFydCBpdC4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZXZpY2VJZDtcbn1cblxuLyoqXG4gKiBBc2tzIGV2ZXJ5IG9ubGluZSBlbXVsYXRvciB3aGljaCBBVkQgaXQgd2FzIHN0YXJ0ZWQgZnJvbS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIG9uZSBlbnRyeSBwZXIgcnVubmluZyBlbXVsYXRvci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlcygpOiBQcm9taXNlPEVtdWxhdG9yRGV2aWNlQ2FuZGlkYXRlW10+IHtcbiAgY29uc3QgZGV2aWNlc091dHB1dCA9IGF3YWl0IHJ1bkFkYlRleHRXaXRob3V0RGV2aWNlKFsnZGV2aWNlcyddKTtcbiAgY29uc3QgZGV2aWNlSWRzID0gbGlzdE9ubGluZURldmljZUlkcyhkZXZpY2VzT3V0cHV0KS5maWx0ZXIoKGRldmljZUlkKSA9PiBkZXZpY2VJZC5zdGFydHNXaXRoKEVNVUxBVE9SX0RFVklDRV9JRF9QUkVGSVgpKTtcblxuICBjb25zdCBjYW5kaWRhdGVzOiBFbXVsYXRvckRldmljZUNhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgLy8gYGFkYiBlbXUgYXZkIG5hbWVgIGFuc3dlcnMgd2l0aCB0aGUgbmFtZSBhbmQgdGhlbiBgT0tgLCBlYWNoIG9uIGl0cyBvd24gbGluZS5cbiAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBydW5BZGJUZXh0KHsgY29tbWFuZEFyZ3VtZW50czogWydlbXUnLCAnYXZkJywgJ25hbWUnXSwgZGV2aWNlSWQgfSk7XG4gICAgY29uc3QgYXZkTmFtZSA9IG91dHB1dC5zcGxpdCgnXFxuJywgMSlbMF0/LnRyaW0oKSA/PyAnJztcbiAgICBjYW5kaWRhdGVzLnB1c2goeyBhdmROYW1lLCBkZXZpY2VJZCB9KTtcbiAgfVxuXG4gIHJldHVybiBjYW5kaWRhdGVzO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLDZCQUFvQztBQUNwQyxpQkFHTztBQUNQLGdDQUF1QztBQWV2QyxNQUFNLDRCQUE0QjtBQVVsQyxlQUFzQix3QkFBd0IsUUFBd0Q7QUFDcEcsUUFBTSxhQUFhLE1BQU0sNkJBQTZCO0FBQ3RELFFBQU0sZUFBVyxrREFBdUIsRUFBRSxTQUFTLE9BQU8sU0FBUyxXQUFXLENBQUM7QUFFL0UsTUFBSSxDQUFDLFVBQVU7QUFDYixVQUFNLFNBQVMsV0FBVyxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsUUFBUSxLQUFLLFVBQVUsT0FBTyxHQUFHLEVBQUUsS0FBSyxJQUFJLEtBQUs7QUFDM0csVUFBTSxJQUFJO0FBQUEsTUFDUix5REFBeUQsT0FBTyxPQUFPLHlCQUF5QixNQUFNO0FBQUEsSUFFeEc7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUO0FBT0EsZUFBZSwrQkFBbUU7QUFDaEYsUUFBTSxnQkFBZ0IsVUFBTSxvQ0FBd0IsQ0FBQyxTQUFTLENBQUM7QUFDL0QsUUFBTSxnQkFBWSw0Q0FBb0IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLFNBQVMsV0FBVyx5QkFBeUIsQ0FBQztBQUV4SCxRQUFNLGFBQXdDLENBQUM7QUFDL0MsYUFBVyxZQUFZLFdBQVc7QUFFaEMsVUFBTSxTQUFTLFVBQU0sdUJBQVcsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLE9BQU8sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUN0RixVQUFNLFVBQVUsT0FBTyxNQUFNLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUs7QUFDcEQsZUFBVyxLQUFLLEVBQUUsU0FBUyxTQUFTLENBQUM7QUFBQSxFQUN2QztBQUVBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Asks the running emulators which AVD each was started from, and resolves one
|
|
5
|
+
* by name through {@link ./emulator-device-id.ts}'s selection.
|
|
6
|
+
*
|
|
7
|
+
* Every function here shells out, so the whole module is integration-time code
|
|
8
|
+
* — which is exactly why the selection it delegates to lives in its own module
|
|
9
|
+
* and stays unit-tested.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Parameters for {@link resolveEmulatorDeviceId}.
|
|
13
|
+
*/
|
|
14
|
+
export interface ResolveEmulatorDeviceIdParams {
|
|
15
|
+
/**
|
|
16
|
+
* The AVD name to match, e.g. `obsidian_screenshots`.
|
|
17
|
+
*/
|
|
18
|
+
readonly avdName: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Finds the running emulator whose AVD is the named one.
|
|
22
|
+
*
|
|
23
|
+
* @param params - The AVD to match.
|
|
24
|
+
* @returns A {@link Promise} that resolves to the device UDID to address it by.
|
|
25
|
+
* @throws Error if no running emulator was started from that AVD. The message lists what IS running, since
|
|
26
|
+
* "the wrong emulator is up" and "no emulator is up" need different answers.
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveEmulatorDeviceId(params: ResolveEmulatorDeviceIdParams): Promise<string>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var soft_keyboard_geometry_exports = {};
|
|
20
|
+
__export(soft_keyboard_geometry_exports, {
|
|
21
|
+
DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS: () => DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
|
|
22
|
+
buildSoftKeyboardDiagnosticMessage: () => buildSoftKeyboardDiagnosticMessage,
|
|
23
|
+
checkIsSoftKeyboardUp: () => checkIsSoftKeyboardUp,
|
|
24
|
+
parseInputMethodState: () => parseInputMethodState,
|
|
25
|
+
resolveSoftKeyboardTapPoints: () => resolveSoftKeyboardTapPoints
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(soft_keyboard_geometry_exports);
|
|
28
|
+
const DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS = 100;
|
|
29
|
+
const INPUT_METHOD_STATE_REG_EXP = /mInputShown|mIsInputViewShown|mHaveConnection|mShowRequested/;
|
|
30
|
+
const CENTER_DIVISOR = 2;
|
|
31
|
+
function buildSoftKeyboardDiagnosticMessage(params) {
|
|
32
|
+
const { inputRect } = params.snapshot;
|
|
33
|
+
const inputBottom = inputRect ? inputRect.top + inputRect.height : null;
|
|
34
|
+
return [
|
|
35
|
+
`raiseSoftKeyboard: the keyboard did not come up. Device framebuffer written to ${params.screenshotPath}.`,
|
|
36
|
+
`page: innerHeight=${String(params.snapshot.innerHeight)} inputBottom=${inputBottom === null ? "(no input)" : String(inputBottom)}`,
|
|
37
|
+
`device: ${params.inputMethodState || "(no input_method state reported)"}`
|
|
38
|
+
].join("\n");
|
|
39
|
+
}
|
|
40
|
+
function checkIsSoftKeyboardUp(params) {
|
|
41
|
+
const { inputRect } = params.snapshot;
|
|
42
|
+
if (!inputRect) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const minimumKeyboardHeightInPixels = params.minimumKeyboardHeightInPixels ?? DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS;
|
|
46
|
+
return params.snapshot.innerHeight - (inputRect.top + inputRect.height) > minimumKeyboardHeightInPixels;
|
|
47
|
+
}
|
|
48
|
+
function parseInputMethodState(dumpsysOutput) {
|
|
49
|
+
return dumpsysOutput.split("\n").filter((line) => INPUT_METHOD_STATE_REG_EXP.test(line)).map((line) => line.trim()).join(" | ");
|
|
50
|
+
}
|
|
51
|
+
function resolveSoftKeyboardTapPoints(params) {
|
|
52
|
+
const { devicePixelRatio, inputRect, screenY } = params.snapshot;
|
|
53
|
+
if (!inputRect) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
const xInPixels = Math.round((inputRect.left + inputRect.width / CENTER_DIVISOR) * devicePixelRatio);
|
|
57
|
+
const centerYInPixels = Math.round((inputRect.top + inputRect.height / CENTER_DIVISOR) * devicePixelRatio);
|
|
58
|
+
const topOffsetInPixels = Math.round(screenY * devicePixelRatio);
|
|
59
|
+
if (topOffsetInPixels === 0) {
|
|
60
|
+
return [{ xInPixels, yInPixels: centerYInPixels }];
|
|
61
|
+
}
|
|
62
|
+
return [
|
|
63
|
+
{ xInPixels, yInPixels: centerYInPixels + topOffsetInPixels },
|
|
64
|
+
{ xInPixels, yInPixels: centerYInPixels }
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
68
|
+
0 && (module.exports = {
|
|
69
|
+
DEFAULT_MINIMUM_KEYBOARD_HEIGHT_IN_PIXELS,
|
|
70
|
+
buildSoftKeyboardDiagnosticMessage,
|
|
71
|
+
checkIsSoftKeyboardUp,
|
|
72
|
+
parseInputMethodState,
|
|
73
|
+
resolveSoftKeyboardTapPoints
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NvZnQta2V5Ym9hcmQtZ2VvbWV0cnkudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEZWNpZGVzIHdoZXRoZXIgdGhlIEFuZHJvaWQgc29mdCBrZXlib2FyZCBpcyB1cCwgYW5kIHdoZXJlIHRvIHRvdWNoIHRvIHJhaXNlXG4gKiBpdCBcdTIwMTQgZnJvbSBnZW9tZXRyeSBhbG9uZS5cbiAqXG4gKiAqKk5vdGhpbmcgaW4gdGhlIHBhZ2UgcmVwb3J0cyB0aGUga2V5Ym9hcmQuKiogYGlubmVySGVpZ2h0YCwgYHZpc3VhbFZpZXdwb3J0YFxuICogYW5kIHRoZSBtb2RhbCBjb250YWluZXIgYWxsIHN0YXkgYXQgdGhlaXIgZnVsbCBoZWlnaHQgd2l0aCB0aGUga2V5Ym9hcmQgc2hvd25cbiAqIGFuZCBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIHJlcG9ydGluZyBgbUlucHV0U2hvd249dHJ1ZWAgXHUyMDE0IE9ic2lkaWFuIE1vYmlsZSBrZWVwc1xuICogYSBmdWxsLXNjcmVlbiBjb250YWluZXIgYW5kIGxpZnRzIGl0cyBjb250ZW50cyBpbnNpZGUgaXQuIFRoZSBvbmx5IHNpZ25hbCBpc1xuICogdGhlIGZpZWxkJ3Mgb3duIG9mZnNldCBmcm9tIHRoZSBib3R0b20sIHdoaWNoIGlzIHdoeSB0aGUgZGV0ZWN0aW9uIGhlcmUgaXNcbiAqIGdlb21ldHJpYyByYXRoZXIgdGhhbiBhbiBBUEkgY2FsbC4gVHdvIHJ1bnMgZmFpbGVkIG9uIHRoYXQgYmVmb3JlIGEgZnJhbWVidWZmZXJcbiAqIGR1bXAgc2FpZCBzbywgd2hpY2ggaXMgYWxzbyB3aHkgdGhlIGRpYWdub3N0aWMgYmVsb3cgZXhpc3RzLlxuICpcbiAqIFB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgdG91Y2hpbmcgYW5kIHRoZSBjYXB0dXJlIGxpdmUgaW4gYHNvZnQta2V5Ym9hcmRgLlxuICovXG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGxpbmVzIG9mIGBkdW1wc3lzIGlucHV0X21ldGhvZGAgd29ydGggcmVhZGluZywgYXMge0BsaW5rIHBhcnNlSW5wdXRNZXRob2RTdGF0ZX0gcmV0dXJuZWQgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0TWV0aG9kU3RhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlcmUgdGhlIGRldmljZSBmcmFtZWJ1ZmZlciB3YXMgd3JpdHRlbiwgc28gdGhlIHJlYWRlciBjYW4gbG9vayBhdCB3aGF0IHRoZSBkZXZpY2Ugd2FzIHNob3dpbmcuXG4gICAqL1xuICByZWFkb25seSBzY3JlZW5zaG90UGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZ2VvbWV0cnkgcmVhZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbGVhc3QgYSByYWlzZWQga2V5Ym9hcmQgbGlmdHMgdGhlIGZpZWxkIGJ5LCBzbyBhIHN0cmF5IHJvdW5kaW5nIHBpeGVsIGlzIG5vdCByZWFkIGFzIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTfVxuICAgKi9cbiAgcmVhZG9ubHkgbWluaW11bUtleWJvYXJkSGVpZ2h0SW5QaXhlbHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBnZW9tZXRyeSB0byBqdWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBTb2Z0S2V5Ym9hcmRWaWV3cG9ydFNuYXBzaG90O1xufVxuXG4vKipcbiAqIEEgcmVjdGFuZ2xlIGFzIHRoZSByZW5kZXJlciByZXBvcnRzIGl0LCBpbiBDU1MgcGl4ZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRSZWN0IHtcbiAgLyoqXG4gICAqIFRoZSByZWN0YW5nbGUncyBoZWlnaHQuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGZyb20gdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbGVmdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgdmlld3BvcnQncyB0b3AgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHRvcDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVjdGFuZ2xlJ3Mgd2lkdGguXG4gICAqL1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBnZW9tZXRyeSB0aGUgdGFwIGlzIGFpbWVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzbmFwc2hvdDogU29mdEtleWJvYXJkVmlld3BvcnRTbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBBIHBvaW50IG9uIHRoZSBkZXZpY2UncyBzY3JlZW4sIGluIGRldmljZSBwaXhlbHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29mdEtleWJvYXJkVGFwUG9pbnQge1xuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGZyb20gdGhlIHNjcmVlbidzIGxlZnQgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IHhJblBpeGVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzdGFuY2UgZnJvbSB0aGUgc2NyZWVuJ3MgdG9wIGVkZ2UuXG4gICAqL1xuICByZWFkb25seSB5SW5QaXhlbHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBrbm93cyBhYm91dCBpdHMgb3duIGdlb21ldHJ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvZnRLZXlib2FyZFZpZXdwb3J0U25hcHNob3Qge1xuICAvKipcbiAgICogVGhlIHJhdGlvIGJldHdlZW4gQ1NTIHBpeGVscyBhbmQgdGhlIGRldmljZSBwaXhlbHMgYGFkYiBzaGVsbCBpbnB1dCB0YXBgIHNwZWFrcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZVBpeGVsUmF0aW86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0J3MgaGVpZ2h0IGluIENTUyBwaXhlbHMuXG4gICAqXG4gICAqIEtlcHQgZm9yIHRoZSBkaWFnbm9zdGljIGFzIG11Y2ggYXMgdGhlIGRlY2lzaW9uOiBpdCBkb2VzICoqbm90Kiogc2hyaW5rIHdoZW4gdGhlIGtleWJvYXJkIGNvbWVzIHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5uZXJIZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZpZWxkJ3MgcmVjdCwgd2hpY2ggaXMgd2hhdCBzYXlzIHdoZXRoZXIgdGhlIGtleWJvYXJkIGlzIHVwLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3Qgb24gc2NyZWVuLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXRSZWN0OiBFbGVtZW50UmVjdCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSB3aW5kb3cncyBvZmZzZXQgZnJvbSB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIGFzIHRoZSBwYWdlIHVuZGVyc3RhbmRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgc2NyZWVuWTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBsZWFzdCBhIHJhaXNlZCBrZXlib2FyZCBsaWZ0cyB0aGUgZmllbGQgYnksIHNvIGEgc3RyYXkgcm91bmRpbmcgcGl4ZWwgaXMgbm90IHJlYWQgYXMgb25lLlxuICpcbiAqIEV4cG9ydGVkIGJlY2F1c2UgaXQgaXMgdGhlIG51bWJlciBib3RoIHtAbGluayBjaGVja0lzU29mdEtleWJvYXJkVXB9IGFuZCBgcmFpc2VTb2Z0S2V5Ym9hcmRgIGRlZmF1bHQgdG8sXG4gKiBhbmQgYSBzdWl0ZSB0aWdodGVuaW5nIGl0IHdhbnRzIHRvIHNheSBzbyByZWxhdGl2ZSB0byB0aGlzIHJhdGhlciB0aGFuIGluIHRoZSBhYnN0cmFjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTID0gMTAwO1xuXG4vKipcbiAqIFRoZSBgZHVtcHN5cyBpbnB1dF9tZXRob2RgIGZpZWxkcyB0aGF0IHNheSB3aGV0aGVyIHRoZSBJTUUgaXMgYWN0dWFsbHkgc2hvd2luZy5cbiAqL1xuY29uc3QgSU5QVVRfTUVUSE9EX1NUQVRFX1JFR19FWFAgPSAvbUlucHV0U2hvd258bUlzSW5wdXRWaWV3U2hvd258bUhhdmVDb25uZWN0aW9ufG1TaG93UmVxdWVzdGVkLztcblxuLyoqXG4gKiBIb3cgbWFueSBlcXVhbCBwYXJ0cyB0aGUgZmllbGQgaXMgc3BsaXQgaW50byB0byBmaW5kIGl0cyBjZW50cmUuXG4gKi9cbmNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYSBmYWlsZWQgcmFpc2UgcmVwb3J0cy5cbiAqXG4gKiBBIGJhcmUgXCJ0aGUga2V5Ym9hcmQgZGlkIG5vdCBjb21lIHVwXCIgaXMgdW5yZWFkYWJsZSBcdTIwMTQgd2hhdCB0aGUgcmVhZGVyIG5lZWRzIGlzIHdoYXQgdGhlIHBhZ2Ugc2F3IGFuZCB3aGF0XG4gKiB0aGUgZGV2aWNlIHRob3VnaHQsIHNpZGUgYnkgc2lkZSwgYmVjYXVzZSB0aGUgdHdvIGRpc2FncmVlaW5nIGlzIHRoZSB3aG9sZSBkaWFnbm9zaXMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmlkZW5jZSBnYXRoZXJlZCBhZnRlciB0aGUgbGFzdCB0b3VjaC5cbiAqIEByZXR1cm5zIFRoZSBtZXNzYWdlLCByZWFkeSB0byB0aHJvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU29mdEtleWJvYXJkRGlhZ25vc3RpY01lc3NhZ2UocGFyYW1zOiBCdWlsZFNvZnRLZXlib2FyZERpYWdub3N0aWNNZXNzYWdlUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBpbnB1dFJlY3QgfSA9IHBhcmFtcy5zbmFwc2hvdDtcbiAgY29uc3QgaW5wdXRCb3R0b20gPSBpbnB1dFJlY3QgPyBpbnB1dFJlY3QudG9wICsgaW5wdXRSZWN0LmhlaWdodCA6IG51bGw7XG5cbiAgcmV0dXJuIFtcbiAgICBgcmFpc2VTb2Z0S2V5Ym9hcmQ6IHRoZSBrZXlib2FyZCBkaWQgbm90IGNvbWUgdXAuIERldmljZSBmcmFtZWJ1ZmZlciB3cml0dGVuIHRvICR7cGFyYW1zLnNjcmVlbnNob3RQYXRofS5gLFxuICAgIGBwYWdlOiBpbm5lckhlaWdodD0ke1N0cmluZyhwYXJhbXMuc25hcHNob3QuaW5uZXJIZWlnaHQpfSBpbnB1dEJvdHRvbT0ke2lucHV0Qm90dG9tID09PSBudWxsID8gJyhubyBpbnB1dCknIDogU3RyaW5nKGlucHV0Qm90dG9tKX1gLFxuICAgIGBkZXZpY2U6ICR7cGFyYW1zLmlucHV0TWV0aG9kU3RhdGUgfHwgJyhubyBpbnB1dF9tZXRob2Qgc3RhdGUgcmVwb3J0ZWQpJ31gXG4gIF0uam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIHRoZSBJTUUgaXMgdXAsIGZyb20gdGhlIHBhZ2UncyBvd24gZ2VvbWV0cnkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSB0byBqdWRnZSwgYW5kIGhvdyBmYXIgdGhlIGZpZWxkIG11c3QgaGF2ZSBsaWZ0ZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBmaWVsZCBoYXMgc3RvcHBlZCBzaG9ydCBvZiB0aGUgYm90dG9tIHRvIG1ha2Ugcm9vbSBmb3IgYSBrZXlib2FyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSXNTb2Z0S2V5Ym9hcmRVcChwYXJhbXM6IENoZWNrSXNTb2Z0S2V5Ym9hcmRVcFBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGlucHV0UmVjdCB9ID0gcGFyYW1zLnNuYXBzaG90O1xuICBpZiAoIWlucHV0UmVjdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzID0gcGFyYW1zLm1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzID8/IERFRkFVTFRfTUlOSU1VTV9LRVlCT0FSRF9IRUlHSFRfSU5fUElYRUxTO1xuICByZXR1cm4gcGFyYW1zLnNuYXBzaG90LmlubmVySGVpZ2h0IC0gKGlucHV0UmVjdC50b3AgKyBpbnB1dFJlY3QuaGVpZ2h0KSA+IG1pbmltdW1LZXlib2FyZEhlaWdodEluUGl4ZWxzO1xufVxuXG4vKipcbiAqIFJlZHVjZXMgYGR1bXBzeXMgaW5wdXRfbWV0aG9kYCB0byB0aGUgaGFuZGZ1bCBvZiBmaWVsZHMgdGhhdCBzYXkgd2hldGhlciB0aGUgSU1FIGlzIHNob3dpbmcuXG4gKlxuICogQHBhcmFtIGR1bXBzeXNPdXRwdXQgLSBSYXcgc3Rkb3V0IG9mIGBhZGIgc2hlbGwgZHVtcHN5cyBpbnB1dF9tZXRob2RgLlxuICogQHJldHVybnMgVGhlIGludGVyZXN0aW5nIGZpZWxkcywgdHJpbW1lZCBhbmQgam9pbmVkLCBvciBhbiBlbXB0eSBzdHJpbmcgd2hlbiBub25lIHdlcmUgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlucHV0TWV0aG9kU3RhdGUoZHVtcHN5c091dHB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGR1bXBzeXNPdXRwdXRcbiAgICAuc3BsaXQoJ1xcbicpXG4gICAgLmZpbHRlcigobGluZSkgPT4gSU5QVVRfTUVUSE9EX1NUQVRFX1JFR19FWFAudGVzdChsaW5lKSlcbiAgICAubWFwKChsaW5lKSA9PiBsaW5lLnRyaW0oKSlcbiAgICAuam9pbignIHwgJyk7XG59XG5cbi8qKlxuICogV29ya3Mgb3V0IHdoZXJlIHRvIHRvdWNoLCBpbiB0aGUgZGV2aWNlIHBpeGVscyBgYWRiIHNoZWxsIGlucHV0IHRhcGAgc3BlYWtzLlxuICpcbiAqIFR3byBjYW5kaWRhdGVzLCBub3Qgb25lOiB0aGUgV2ViVmlldyBtYXkgb3IgbWF5IG5vdCBzdGFydCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIGFuZCB0aGUgcGFnZSBjYW5ub3RcbiAqIHRlbGwgd2hpY2guIEJvdGggbGFuZCBpbnNpZGUgdGhlIGZpZWxkIFx1MjAxNCBpdCBpcyB0YWxsZXIgdGhhbiB0aGUgb2Zmc2V0IFx1MjAxNCBzbyBhIHdyb25nIGd1ZXNzIGNvc3RzIG9uZSB0b3VjaFxuICogcmF0aGVyIHRoYW4gYSBtaXMtdGFwIG9uIHdoYXRldmVyIHNpdHMgYmVsb3cuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBnZW9tZXRyeSB0aGUgdGFwIGlzIGFpbWVkIGZyb20uXG4gKiBAcmV0dXJucyBUaGUgcG9pbnRzIHRvIHRyeSwgaW4gb3JkZXIsIG9yIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlIGZpZWxkIGlzIG5vdCBvbiBzY3JlZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU29mdEtleWJvYXJkVGFwUG9pbnRzKHBhcmFtczogUmVzb2x2ZVNvZnRLZXlib2FyZFRhcFBvaW50c1BhcmFtcyk6IFNvZnRLZXlib2FyZFRhcFBvaW50W10ge1xuICBjb25zdCB7IGRldmljZVBpeGVsUmF0aW8sIGlucHV0UmVjdCwgc2NyZWVuWSB9ID0gcGFyYW1zLnNuYXBzaG90O1xuICBpZiAoIWlucHV0UmVjdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHhJblBpeGVscyA9IE1hdGgucm91bmQoKGlucHV0UmVjdC5sZWZ0ICsgaW5wdXRSZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IpICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIGNvbnN0IGNlbnRlcllJblBpeGVscyA9IE1hdGgucm91bmQoKGlucHV0UmVjdC50b3AgKyBpbnB1dFJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IpICogZGV2aWNlUGl4ZWxSYXRpbyk7XG4gIGNvbnN0IHRvcE9mZnNldEluUGl4ZWxzID0gTWF0aC5yb3VuZChzY3JlZW5ZICogZGV2aWNlUGl4ZWxSYXRpbyk7XG5cbiAgaWYgKHRvcE9mZnNldEluUGl4ZWxzID09PSAwKSB7XG4gICAgcmV0dXJuIFt7IHhJblBpeGVscywgeUluUGl4ZWxzOiBjZW50ZXJZSW5QaXhlbHMgfV07XG4gIH1cblxuICByZXR1cm4gW1xuICAgIHsgeEluUGl4ZWxzLCB5SW5QaXhlbHM6IGNlbnRlcllJblBpeGVscyArIHRvcE9mZnNldEluUGl4ZWxzIH0sXG4gICAgeyB4SW5QaXhlbHMsIHlJblBpeGVsczogY2VudGVyWUluUGl4ZWxzIH1cbiAgXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlJTyxNQUFNLDRDQUE0QztBQUt6RCxNQUFNLDZCQUE2QjtBQUtuQyxNQUFNLGlCQUFpQjtBQVdoQixTQUFTLG1DQUFtQyxRQUEwRDtBQUMzRyxRQUFNLEVBQUUsVUFBVSxJQUFJLE9BQU87QUFDN0IsUUFBTSxjQUFjLFlBQVksVUFBVSxNQUFNLFVBQVUsU0FBUztBQUVuRSxTQUFPO0FBQUEsSUFDTCxrRkFBa0YsT0FBTyxjQUFjO0FBQUEsSUFDdkcscUJBQXFCLE9BQU8sT0FBTyxTQUFTLFdBQVcsQ0FBQyxnQkFBZ0IsZ0JBQWdCLE9BQU8sZUFBZSxPQUFPLFdBQVcsQ0FBQztBQUFBLElBQ2pJLFdBQVcsT0FBTyxvQkFBb0Isa0NBQWtDO0FBQUEsRUFDMUUsRUFBRSxLQUFLLElBQUk7QUFDYjtBQVFPLFNBQVMsc0JBQXNCLFFBQThDO0FBQ2xGLFFBQU0sRUFBRSxVQUFVLElBQUksT0FBTztBQUM3QixNQUFJLENBQUMsV0FBVztBQUNkLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQ0FBZ0MsT0FBTyxpQ0FBaUM7QUFDOUUsU0FBTyxPQUFPLFNBQVMsZUFBZSxVQUFVLE1BQU0sVUFBVSxVQUFVO0FBQzVFO0FBUU8sU0FBUyxzQkFBc0IsZUFBK0I7QUFDbkUsU0FBTyxjQUNKLE1BQU0sSUFBSSxFQUNWLE9BQU8sQ0FBQyxTQUFTLDJCQUEyQixLQUFLLElBQUksQ0FBQyxFQUN0RCxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUN6QixLQUFLLEtBQUs7QUFDZjtBQVlPLFNBQVMsNkJBQTZCLFFBQW9FO0FBQy9HLFFBQU0sRUFBRSxrQkFBa0IsV0FBVyxRQUFRLElBQUksT0FBTztBQUN4RCxNQUFJLENBQUMsV0FBVztBQUNkLFdBQU8sQ0FBQztBQUFBLEVBQ1Y7QUFFQSxRQUFNLFlBQVksS0FBSyxPQUFPLFVBQVUsT0FBTyxVQUFVLFFBQVEsa0JBQWtCLGdCQUFnQjtBQUNuRyxRQUFNLGtCQUFrQixLQUFLLE9BQU8sVUFBVSxNQUFNLFVBQVUsU0FBUyxrQkFBa0IsZ0JBQWdCO0FBQ3pHLFFBQU0sb0JBQW9CLEtBQUssTUFBTSxVQUFVLGdCQUFnQjtBQUUvRCxNQUFJLHNCQUFzQixHQUFHO0FBQzNCLFdBQU8sQ0FBQyxFQUFFLFdBQVcsV0FBVyxnQkFBZ0IsQ0FBQztBQUFBLEVBQ25EO0FBRUEsU0FBTztBQUFBLElBQ0wsRUFBRSxXQUFXLFdBQVcsa0JBQWtCLGtCQUFrQjtBQUFBLElBQzVELEVBQUUsV0FBVyxXQUFXLGdCQUFnQjtBQUFBLEVBQzFDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|