system-testing 1.0.110 → 1.0.112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/build/browser.d.ts +35 -0
- package/build/browser.js +36 -5
- package/build/drivers/appium-driver.d.ts +106 -0
- package/build/drivers/appium-driver.js +292 -3
- package/build/drivers/webdriver-driver.d.ts +23 -0
- package/build/drivers/webdriver-driver.js +37 -2
- package/build/system-test-browser-helper.js +2 -2
- package/build/system-test.d.ts +12 -1
- package/build/system-test.js +37 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -136,7 +136,19 @@ await SystemTest.run({
|
|
|
136
136
|
})
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
If you already run an Appium server, provide `serverUrl` instead of `serverArgs`. By default, `findByTestID` uses the Appium `accessibility id` strategy, which matches the `content-desc` attribute on Android (set by React Native's `accessibilityLabel` prop). To use CSS instead (for web contexts), set `options.testIdStrategy` to `"css"` and optionally `options.testIdAttribute` (defaults to `"data-testid"`).
|
|
139
|
+
If you already run an Appium server, provide `serverUrl` instead of `serverArgs`. By default, `findByTestID` uses the Appium `accessibility id` strategy, which matches the `content-desc` attribute on Android (set by React Native's `accessibilityLabel` prop). To use CSS instead (for web contexts), set `options.testIdStrategy` to `"css"` and optionally `options.testIdAttribute` (defaults to `"data-testid"`). For native Android apps, set `options.testIdStrategy` to `"id"`; system-testing matches React Native test IDs by resource-id suffix so package-qualified Android IDs work.
|
|
140
|
+
|
|
141
|
+
Native Android test ID lookups can scroll offscreen controls into the rendered hierarchy with `findByTestID("target", {scrollTo: true})`. If an app has a known scroll container test ID, pass it with `scrollContainerTestIDs` so system-testing tries that container before falling back to generic viewport gestures:
|
|
142
|
+
|
|
143
|
+
```js
|
|
144
|
+
await systemTest.findByTestID("projectShowScreen/editButton", {
|
|
145
|
+
scrollContainerTestIDs: ["projectShowScreen/content/scroll"],
|
|
146
|
+
scrollTo: true,
|
|
147
|
+
useBaseSelector: false
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Native Android text or accessibility-label assertions can use `findByNativeText("Visible label", {scrollTo: true})`.
|
|
140
152
|
|
|
141
153
|
For local or CI web runs against Chrome, `npm run test:appium:web` now resolves and downloads a matching Chrome for Testing `chromedriver` binary before it starts Appium. That keeps the Appium web path reproducible even when the installed Chrome patch version changes.
|
|
142
154
|
|
package/build/browser.d.ts
CHANGED
|
@@ -111,6 +111,12 @@ export default class Browser {
|
|
|
111
111
|
* @returns {Promise<import("selenium-webdriver").WebElement[]>}
|
|
112
112
|
*/
|
|
113
113
|
all(selector: string, args?: import("./system-test.js").FindArgs): Promise<import("selenium-webdriver").WebElement[]>;
|
|
114
|
+
/**
|
|
115
|
+
* @param {string} selector
|
|
116
|
+
* @param {import("./system-test.js").FindArgs} [args]
|
|
117
|
+
* @returns {Promise<boolean>}
|
|
118
|
+
*/
|
|
119
|
+
exists(selector: string, args?: import("./system-test.js").FindArgs): Promise<boolean>;
|
|
114
120
|
/**
|
|
115
121
|
* @param {string} selector
|
|
116
122
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
@@ -123,12 +129,25 @@ export default class Browser {
|
|
|
123
129
|
* @returns {Promise<import("selenium-webdriver").WebElement>}
|
|
124
130
|
*/
|
|
125
131
|
findByTestID(testID: string, args?: import("./system-test.js").FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
132
|
+
/**
|
|
133
|
+
* Finds native Android visible text or an accessibility label.
|
|
134
|
+
* @param {string} expectedText Text to locate.
|
|
135
|
+
* @param {import("./system-test.js").FindArgs} [args] Optional lookup settings.
|
|
136
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
|
|
137
|
+
*/
|
|
138
|
+
findByNativeText(expectedText: string, args?: import("./system-test.js").FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
126
139
|
/**
|
|
127
140
|
* @param {string} selector
|
|
128
141
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
129
142
|
* @returns {Promise<import("selenium-webdriver").WebElement>}
|
|
130
143
|
*/
|
|
131
144
|
findNoWait(selector: string, args?: import("./system-test.js").FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
145
|
+
/**
|
|
146
|
+
* @param {string} selector
|
|
147
|
+
* @param {import("./system-test.js").FindArgs} [args]
|
|
148
|
+
* @returns {Promise<string>}
|
|
149
|
+
*/
|
|
150
|
+
text(selector: string, args?: import("./system-test.js").FindArgs): Promise<string>;
|
|
132
151
|
/**
|
|
133
152
|
* @param {string | import("selenium-webdriver").WebElement} elementOrIdentifier
|
|
134
153
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
@@ -354,10 +373,26 @@ export type BrowserPathWaitArgs = {
|
|
|
354
373
|
timeout?: number | undefined;
|
|
355
374
|
};
|
|
356
375
|
export type BrowserTextWaitArgs = {
|
|
376
|
+
/**
|
|
377
|
+
* Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
|
|
378
|
+
*/
|
|
379
|
+
scrollContainerTestIDs?: string[] | undefined;
|
|
380
|
+
/**
|
|
381
|
+
* Whether to scroll found elements into view before returning them.
|
|
382
|
+
*/
|
|
383
|
+
scrollTo?: boolean | undefined;
|
|
357
384
|
/**
|
|
358
385
|
* Override the timeout for this text wait.
|
|
359
386
|
*/
|
|
360
387
|
timeout?: number | undefined;
|
|
388
|
+
/**
|
|
389
|
+
* Whether to scope by the base selector.
|
|
390
|
+
*/
|
|
391
|
+
useBaseSelector?: boolean | undefined;
|
|
392
|
+
/**
|
|
393
|
+
* Whether to require elements to be visible.
|
|
394
|
+
*/
|
|
395
|
+
visible?: boolean | null | undefined;
|
|
361
396
|
};
|
|
362
397
|
export type BrowserCurrentUrlWaitArgs = {
|
|
363
398
|
/**
|
package/build/browser.js
CHANGED
|
@@ -29,7 +29,11 @@ import AppiumDriver from "./drivers/appium-driver.js";
|
|
|
29
29
|
*/
|
|
30
30
|
/**
|
|
31
31
|
* @typedef {object} BrowserTextWaitArgs
|
|
32
|
+
* @property {string[]} [scrollContainerTestIDs] Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
|
|
33
|
+
* @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
|
|
32
34
|
* @property {number} [timeout] Override the timeout for this text wait.
|
|
35
|
+
* @property {boolean} [useBaseSelector] Whether to scope by the base selector.
|
|
36
|
+
* @property {boolean | null} [visible] Whether to require elements to be visible.
|
|
33
37
|
*/
|
|
34
38
|
/**
|
|
35
39
|
* @typedef {object} BrowserCurrentUrlWaitArgs
|
|
@@ -287,6 +291,14 @@ export default class Browser {
|
|
|
287
291
|
async all(selector, args = {}) {
|
|
288
292
|
return await this.getDriverAdapter().all(selector, args);
|
|
289
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* @param {string} selector
|
|
296
|
+
* @param {import("./system-test.js").FindArgs} [args]
|
|
297
|
+
* @returns {Promise<boolean>}
|
|
298
|
+
*/
|
|
299
|
+
async exists(selector, args = {}) {
|
|
300
|
+
return await this.getDriverAdapter().exists(selector, args);
|
|
301
|
+
}
|
|
290
302
|
/**
|
|
291
303
|
* @param {string} selector
|
|
292
304
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
@@ -303,6 +315,15 @@ export default class Browser {
|
|
|
303
315
|
async findByTestID(testID, args) {
|
|
304
316
|
return await this.getDriverAdapter().findByTestID(testID, args);
|
|
305
317
|
}
|
|
318
|
+
/**
|
|
319
|
+
* Finds native Android visible text or an accessibility label.
|
|
320
|
+
* @param {string} expectedText Text to locate.
|
|
321
|
+
* @param {import("./system-test.js").FindArgs} [args] Optional lookup settings.
|
|
322
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
|
|
323
|
+
*/
|
|
324
|
+
async findByNativeText(expectedText, args = {}) {
|
|
325
|
+
return await this.getDriverAdapter().findByNativeText(expectedText, args);
|
|
326
|
+
}
|
|
306
327
|
/**
|
|
307
328
|
* @param {string} selector
|
|
308
329
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
@@ -311,6 +332,14 @@ export default class Browser {
|
|
|
311
332
|
async findNoWait(selector, args = {}) {
|
|
312
333
|
return await this.getDriverAdapter().findNoWait(selector, args);
|
|
313
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* @param {string} selector
|
|
337
|
+
* @param {import("./system-test.js").FindArgs} [args]
|
|
338
|
+
* @returns {Promise<string>}
|
|
339
|
+
*/
|
|
340
|
+
async text(selector, args = {}) {
|
|
341
|
+
return await this.getDriverAdapter().text(selector, args);
|
|
342
|
+
}
|
|
314
343
|
/**
|
|
315
344
|
* @param {string | import("selenium-webdriver").WebElement} elementOrIdentifier
|
|
316
345
|
* @param {import("./system-test.js").FindArgs} [args]
|
|
@@ -360,8 +389,9 @@ export default class Browser {
|
|
|
360
389
|
* @returns {Promise<void>}
|
|
361
390
|
*/
|
|
362
391
|
async waitForTestIDText(testID, expectedText, args = {}) {
|
|
363
|
-
|
|
364
|
-
|
|
392
|
+
const { timeout: waitTimeout, ...findArgs } = args;
|
|
393
|
+
await waitFor({ timeout: this.getCommandTimeout(waitTimeout) }, async () => {
|
|
394
|
+
const element = await this.findByTestID(testID, { ...findArgs, timeout: 0 });
|
|
365
395
|
const actualText = await element.getText();
|
|
366
396
|
if (!actualText.includes(expectedText)) {
|
|
367
397
|
throw new Error(`Timed out waiting for text ${expectedText}. Last text was ${actualText}`);
|
|
@@ -376,8 +406,9 @@ export default class Browser {
|
|
|
376
406
|
* @returns {Promise<void>}
|
|
377
407
|
*/
|
|
378
408
|
async waitForTestIDTextExcludes(testID, excludedText, args = {}) {
|
|
379
|
-
|
|
380
|
-
|
|
409
|
+
const { timeout: waitTimeout, ...findArgs } = args;
|
|
410
|
+
await waitFor({ timeout: this.getCommandTimeout(waitTimeout) }, async () => {
|
|
411
|
+
const element = await this.findByTestID(testID, { ...findArgs, timeout: 0 });
|
|
381
412
|
const actualText = await element.getText();
|
|
382
413
|
if (actualText.includes(excludedText)) {
|
|
383
414
|
throw new Error(`Timed out waiting for text to exclude ${excludedText}. Last text was ${actualText}`);
|
|
@@ -631,4 +662,4 @@ export default class Browser {
|
|
|
631
662
|
}
|
|
632
663
|
}
|
|
633
664
|
}
|
|
634
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNoQyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQU07SUFDNUIsT0FBTyxpQkFBaUIsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQTtBQUN2RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBSztJQUM5QixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7QUFDbkUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxLQUFLO0lBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtJQUNoRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENB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QUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFBO1FBRTlCLE9BQU87WUFDTCxVQUFVO1lBQ1YsSUFBSTtZQUNKLFFBQVE7WUFDUixJQUFJO1lBQ0osUUFBUTtZQUNSLGNBQWM7U0FDZixDQUFBO0lBQ0gsQ0FBQztJQUVELCtCQUErQjtJQUMvQixLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQge0tleX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgbW9tZW50IGZyb20gXCJtb21lbnRcIlxuaW1wb3J0IHtwcmV0dGlmeX0gZnJvbSBcImh0bWxmeVwiXG5pbXBvcnQge3dhaXRGb3J9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgU2VsZW5pdW1Ecml2ZXIgZnJvbSBcIi4vZHJpdmVycy9zZWxlbml1bS1kcml2ZXIuanNcIlxuaW1wb3J0IEFwcGl1bURyaXZlciBmcm9tIFwiLi9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanNcIlxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0fSBbY29tbXVuaWNhdG9yXSBPcHRpb25hbCBjb21tYW5kIGNvbW11bmljYXRvciBmb3IgaGVscGVyLWRyaXZlbiBuYXZpZ2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JlZW5zaG90c1BhdGhdIERpcmVjdG9yeSB1c2VkIGZvciBzYXZlZCBzY3JlZW5zaG90cyBhbmQgYnJvd3NlciBhcnRpZmFjdHMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlckRyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtcInNlbGVuaXVtXCJ8XCJhcHBpdW1cIn0gW3R5cGVdIERyaXZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSBEcml2ZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyTmF2aWdhdGlvbkFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgbmF2aWdhdGlvbiBjb21tYW5kLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJQYXRoV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgcGF0aCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJUZXh0V2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgdGV4dCB3YWl0LlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgVVJMIHdhaXQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclRlc3RJRElucHV0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciB0aGUgaW5wdXQgbG9va3VwLlxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgZGF0YS10ZXN0aWQgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBSYXcgdmFsdWUgZnJvbSBhIGBkYXRhLXRlc3RpZGAgYXR0cmlidXRlLlxuICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gdGVzdElkU2VsZWN0b3IodGVzdElEKSB7XG4gIHJldHVybiBgW2RhdGEtdGVzdGlkPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh0ZXN0SUQpfVwiXWBcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHVzZSBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgUmF3IGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVzY2FwZWQgc2VsZWN0b3IgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpXG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIFJHQiBjaGFubmVscyBmcm9tIENTUyBgcmdiKC4uLilgL2ByZ2JhKC4uLilgIHZhbHVlcyBvciBhbiBSR0IgZnJhZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQ1NTIGNvbG9yIHZhbHVlIG9yIFJHQiBmcmFnbWVudCBsaWtlIGAzMCwgNDEsIDU5YC5cbiAqIEByZXR1cm5zIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGNzc1JnYkNoYW5uZWxzKHZhbHVlKSB7XG4gIGNvbnN0IHJnYk1hdGNoID0gdmFsdWUubWF0Y2goL3JnYmE/XFwoKFteKV0rKVxcKS8pXG4gIGNvbnN0IGNoYW5uZWxzVmFsdWUgPSByZ2JNYXRjaCA/IHJnYk1hdGNoWzFdIDogdmFsdWVcbiAgY29uc3QgY2hhbm5lbHMgPSBjaGFubmVsc1ZhbHVlXG4gICAgLnJlcGxhY2UoL1xccypcXC8uKiQvLCBcIlwiKVxuICAgIC5zcGxpdCgvWyxcXHNdKy8pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCAzKVxuICAgIC5tYXAoKGNoYW5uZWwpID0+IE51bWJlcihjaGFubmVsKSlcblxuICBpZiAoY2hhbm5lbHMubGVuZ3RoICE9PSAzIHx8IGNoYW5uZWxzLnNvbWUoKGNoYW5uZWwpID0+ICFOdW1iZXIuaXNGaW5pdGUoY2hhbm5lbCkpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdfSAqLyAoY2hhbm5lbHMpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBicm93c2VyLW5vcm1hbGl6ZWQgQ1NTIGNvbG9yIG1hdGNoZXMgdGhlIFJHQiB0cmlwbGV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdHVhbFZhbHVlIEJyb3dzZXItbm9ybWFsaXplZCBDU1MgY29sb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmdiRnJhZ21lbnQgUkdCIGZyYWdtZW50IGxpa2UgYDMwLCA0MSwgNTlgLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFJHQiBjaGFubmVscyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY3NzVmFsdWVNYXRjaGVzUmdiKGFjdHVhbFZhbHVlLCByZ2JGcmFnbWVudCkge1xuICBjb25zdCBhY3R1YWxDaGFubmVscyA9IGNzc1JnYkNoYW5uZWxzKGFjdHVhbFZhbHVlKVxuICBjb25zdCBleHBlY3RlZENoYW5uZWxzID0gY3NzUmdiQ2hhbm5lbHMocmdiRnJhZ21lbnQpXG5cbiAgaWYgKCFhY3R1YWxDaGFubmVscyB8fCAhZXhwZWN0ZWRDaGFubmVscykgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIGFjdHVhbENoYW5uZWxzLmV2ZXJ5KChhY3R1YWxDaGFubmVsLCBpbmRleCkgPT4gYWN0dWFsQ2hhbm5lbCA9PT0gZXhwZWN0ZWRDaGFubmVsc1tpbmRleF0pXG59XG5cbi8qKiBHZW5lcmljIGJyb3dzZXIgc2Vzc2lvbiB3cmFwcGVyIGFyb3VuZCB0aGUgY29uZmlndXJlZCBkcml2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyIHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXIgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gIGRyaXZlckFkYXB0ZXIgPSB1bmRlZmluZWRcblxuICBfZGVidWcgPSBmYWxzZVxuICAvKiogQHR5cGUge0Jyb3dzZXJEcml2ZXJDb25maWcgfCB1bmRlZmluZWR9ICovXG4gIF9kcml2ZXJDb25maWcgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgX2h0dHBTZXJ2ZXJFcnJvciA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAcGFyYW0ge0Jyb3dzZXJBcmdzfSBbYXJnc10gKi9cbiAgY29uc3RydWN0b3Ioe2RlYnVnID0gZmFsc2UsIGRyaXZlciwgY29tbXVuaWNhdG9yLCBzY3JlZW5zaG90c1BhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS90bXAvc2NyZWVuc2hvdHNgLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9kcml2ZXJDb25maWcgPSBkcml2ZXJcbiAgICB0aGlzLl9zY3JlZW5zaG90c1BhdGggPSBzY3JlZW5zaG90c1BhdGhcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IGNvbW11bmljYXRvclxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKGRyaXZlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJDb25maWddXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgY3JlYXRlRHJpdmVyKGRyaXZlckNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3Qge3R5cGUgPSBcInNlbGVuaXVtXCIsIG9wdGlvbnMsIC4uLnJlc3RBcmdzfSA9IGRyaXZlckNvbmZpZ1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHJpdmVyIGFyZ3M6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcInNlbGVuaXVtXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZW5pdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImFwcGl1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGl1bURyaXZlcih7YnJvd3NlcjogdGhpcywgb3B0aW9uc30pXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkcml2ZXIgdHlwZTogJHt0eXBlfWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb21tdW5pY2F0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDb21tdW5pY2F0b3IoY29tbXVuaWNhdG9yKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgY29tbXVuaWNhdG9yRXhpc3RzKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU2VsZWN0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRCYXNlU2VsZWN0b3IoYmFzZVNlbGVjdG9yKSB7IHRoaXMuX2Jhc2VTZWxlY3RvciA9IGJhc2VTZWxlY3RvciB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGdldEJhc2VTZWxlY3RvcigpIHsgcmV0dXJuIHRoaXMuX2Jhc2VTZWxlY3RvciB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCYXNlU2VsZWN0b3IoKSA/IGAke3RoaXMuZ2V0QmFzZVNlbGVjdG9yKCl9ICR7c2VsZWN0b3J9YCA6IHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0Vycm9yKC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW0Jyb3dzZXIgZXJyb3JdXCIsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0xvZyguLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltCcm93c2VyIGRlYnVnXVwiLCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgdGhyb3dJZkh0dHBTZXJ2ZXJFcnJvcigpIHtcbiAgICBpZiAodGhpcy5faHR0cFNlcnZlckVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke3RoaXMuX2h0dHBTZXJ2ZXJFcnJvci5tZXNzYWdlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25IdHRwU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcblxuICAgIHRoaXMuX2h0dHBTZXJ2ZXJFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgY29uc29sZS5lcnJvcihgSFRUUCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9ICovXG4gIGdldERyaXZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0V2ViRHJpdmVyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH0gKi9cbiAgZ2V0RHJpdmVyQWRhcHRlcigpIHtcbiAgICBpZiAoIXRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRyaXZlckFkYXB0ZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFRpbWVvdXRzKCkgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRUaW1lb3V0cyhuZXdUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldEJyb3dzZXJMb2dzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgcGF0aG5hbWUgZXhhY3RseSBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRQYXRoXG4gICAqIEBwYXJhbSB7QnJvd3NlclBhdGhXYWl0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclBhdGgoZXhwZWN0ZWRQYXRoLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gbmV3IFVSTChjdXJyZW50VXJsKS5wYXRobmFtZVxuXG4gICAgICBpZiAoY3VycmVudFBhdGggIT09IGV4cGVjdGVkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBwYXRoICR7ZXhwZWN0ZWRQYXRofS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgVVJMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRVcmwgRXhhY3QgVVJMIGV4cGVjdGVkLlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3N9IFthcmdzXSBPcHRpb25hbCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDdXJyZW50VXJsKGV4cGVjdGVkVXJsLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwgIT09IGV4cGVjdGVkVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIFVSTCAke2V4cGVjdGVkVXJsfS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGFwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsQ29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmICghY3VycmVudFVybC5pbmNsdWRlcyhleHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gaW5jbHVkZSAke2V4cGVjdGVkRnJhZ21lbnR9LiBDdXJyZW50IFVSTDogJHtjdXJyZW50VXJsfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgZG9lcyBub3QgY29udGFpbiBhIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5leHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGRpc2FwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsRXhjbHVkZXModW5leHBlY3RlZEZyYWdtZW50LCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwuaW5jbHVkZXModW5leHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gZXhjbHVkZSAke3VuZXhwZWN0ZWRGcmFnbWVudH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmFsbChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmQoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgaW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbiBpbnB1dCBhbmQgc2VuZHMgcmVwbGFjZW1lbnQga2V5cyB0aHJvdWdoIHJldHJ5YWJsZSBicm93c2VyIGludGVyYWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRWYWx1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsZWFyQW5kU2VuZEtleXMoZWxlbWVudE9ySWRlbnRpZmllciwgbmV4dFZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcImNsaWNrXCIpXG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcInNlbmRLZXlzXCIsIEtleS5jaG9yZChLZXkuQ09OVFJPTCwgXCJhXCIpLCBLZXkuQkFDS19TUEFDRSwgbmV4dFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFuIGlucHV0LWxpa2UgZWxlbWVudCdzIHZhbHVlIGJ5IHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRmllbGQgYGRhdGEtdGVzdGlkYCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0VmFsdWUgVGV4dCB0byBsZWF2ZSBpbiB0aGUgZmllbGQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRlc3RJRElucHV0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VUZXN0SURJbnB1dFZhbHVlKHRlc3RJRCwgbmV4dFZhbHVlLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFyQW5kU2VuZEtleXMoe1xuICAgICAgc2VsZWN0b3I6IHRlc3RJZFNlbGVjdG9yKHRlc3RJRCksXG4gICAgICB0aW1lb3V0OiBhcmdzLnRpbWVvdXQsXG4gICAgICB3aXRoRmFsbGJhY2s6IHRydWVcbiAgICB9LCBuZXh0VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgYSB0ZXN0IGlkIGNvbnRhaW5zIGV4cGVjdGVkIHZpc2libGUgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBGcmFnbWVudCB0aGF0IG11c3QgYXBwZWFyIGluIHRoZSBlbGVtZW50IHRleHQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRleHRXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElELCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KX0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHt0aW1lb3V0OiAwfSlcbiAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBpZiAoIWFjdHVhbFRleHQuaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBubyBsb25nZXIgY29udGFpbnMgZXhjbHVkZWQgdmlzaWJsZSB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhjbHVkZWRUZXh0IEZyYWdtZW50IHRoYXQgc2hvdWxkIGRpc2FwcGVhciBmcm9tIHRoZSBlbGVtZW50IHRleHQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRleHRXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHRFeGNsdWRlcyh0ZXN0SUQsIGV4Y2x1ZGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwge3RpbWVvdXQ6IDB9KVxuICAgICAgY29uc3QgYWN0dWFsVGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIGlmIChhY3R1YWxUZXh0LmluY2x1ZGVzKGV4Y2x1ZGVkVGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdGV4dCB0byBleGNsdWRlICR7ZXhjbHVkZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VydHMgYSByZW5kZXJlZCBlbGVtZW50IGhhcyBhIENTUyBjb2xvciBmcm9tIHRoZSBleHBlY3RlZCBwYWxldHRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgYGRhdGEtdGVzdGlkYCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lIENTUyBwcm9wZXJ0eSB0byByZWFkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRSZ2IgRXhwZWN0ZWQgUkdCIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlnaHRSZ2IgRGlzYWxsb3dlZCBSR0IgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvbiBIdW1hbi1yZWFkYWJsZSBlbGVtZW50IGRlc2NyaXB0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdFRlc3RJRENzc0NvbG9yKHRlc3RJRCwgcHJvcGVydHlOYW1lLCBleHBlY3RlZFJnYiwgbGlnaHRSZ2IsIGRlc2NyaXB0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRClcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGF3YWl0IGVsZW1lbnQuZ2V0Q3NzVmFsdWUocHJvcGVydHlOYW1lKVxuXG4gICAgaWYgKGNzc1ZhbHVlTWF0Y2hlc1JnYihhY3R1YWxWYWx1ZSwgbGlnaHRSZ2IpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkICR7ZGVzY3JpcHRpb259IHRvIGF2b2lkIHRoZSBsaWdodCBwYWxldHRlLCBnb3QgJHtwcm9wZXJ0eU5hbWV9ICR7YWN0dWFsVmFsdWV9YClcbiAgICB9XG4gICAgaWYgKCFjc3NWYWx1ZU1hdGNoZXNSZ2IoYWN0dWFsVmFsdWUsIGV4cGVjdGVkUmdiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2Rlc2NyaXB0aW9ufSB0byBpbmNsdWRlIHJnYigke2V4cGVjdGVkUmdifSksIGdvdCAke3Byb3BlcnR5TmFtZX0gJHthY3R1YWxWYWx1ZX1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGFuIGVsZW1lbnQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncykge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNjcm9sbFRlc3RJZEludG9WaWV3KHRlc3RJRCwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLldhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLndhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRIVE1MKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRIVE1MKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gdGltZW91dE92ZXJyaWRlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXRDb21tYW5kVGltZW91dCh0aW1lb3V0T3ZlcnJpZGUpIHtcbiAgICBpZiAodGltZW91dE92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aW1lb3V0T3ZlcnJpZGVcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyVmlzaXQocGF0aClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ29va2llcygpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb29raWUgdG8gdGhlIGFjdGl2ZSBkcml2ZXIgc2Vzc2lvbiBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAgICogb3JpZ2luLiBVc2VmdWwgd2hlbiBhbiBvdXQtb2YtYmFuZCBsb2dpbiAoY3VybCwgZmV0Y2gsIGV0Yy4pIHJldHVybmVkXG4gICAqIGEgYFNldC1Db29raWVgIHZhbHVlIGFuZCB0aGUgdGVzdCBuZWVkcyB0aGUgYnJvd3NlciB0byBzdGFydFxuICAgKiBhdXRoZW50aWNhdGVkIHdpdGhvdXQgZHJpdmluZyB0aGUgc2lnbi1pbiBVSS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBtdXN0IGFscmVhZHkgYmUgb24gYSBwYWdlIHdob3NlIG9yaWdpbi9kb21haW4gbWF0Y2hlcyB0aGVcbiAgICogY29va2llIGRvbWFpbiwgb3RoZXJ3aXNlIFNlbGVuaXVtIHdpbGwgcmVqZWN0IHRoZSBjYWxsLlxuICAgKiBAcGFyYW0ge3tuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGRvbWFpbj86IHN0cmluZywgcGF0aD86IHN0cmluZywgc2VjdXJlPzogYm9vbGVhbiwgaHR0cE9ubHk/OiBib29sZWFuLCBleHBpcnk/OiBudW1iZXIsIHNhbWVTaXRlPzogXCJTdHJpY3RcIiB8IFwiTGF4XCIgfCBcIk5vbmVcIn19IGNvb2tpZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGFkZENvb2tpZShjb29raWUpIHtcbiAgICBpZiAoIWNvb2tpZSB8fCB0eXBlb2YgY29va2llLm5hbWUgIT09IFwic3RyaW5nXCIgfHwgY29va2llLm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgYSBub24tZW1wdHkgYG5hbWVgXCIpXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb29raWUudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZENvb2tpZSByZXF1aXJlcyBhIHN0cmluZyBgdmFsdWVgXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5tYW5hZ2UoKS5hZGRDb29raWUoY29va2llKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhbiBhcmJpdHJhcnkgc2NyaXB0IGluIHRoZSBhY3RpdmUgYnJvd3NlciBzZXNzaW9uIGFuZCByZXR1cm4gdGhlXG4gICAqIHJlc29sdmVkIHZhbHVlLiBgc2NyaXB0YCBpcyB0aGUgZnVuY3Rpb24gYm9keSBleGVjdXRlZCBpbiB0aGUgYnJvd3NlclxuICAgKiAoYG5ldyBGdW5jdGlvbihcIi4uLlwiKWAtc3R5bGUpOyBgYXJnc2AgYXJlIGZvcndhcmRlZCBhcyBgYXJndW1lbnRzW2ldYC5cbiAgICogQXN5bmNocm9ub3VzIHNjcmlwdHMgbXVzdCBgcmV0dXJuYCBhIFByb21pc2UsIHdoaWNoIFNlbGVuaXVtIGF3YWl0cy5cbiAgICpcbiAgICogVXNlZnVsIGZvciB2ZXJpZmljYXRpb24gZmxvd3MgdGhhdCBuZWVkIHRvIGNhbGwgaW50byBhcHBsaWNhdGlvbiBjb2RlXG4gICAqIChlLmcuIGBmZXRjaChcIi9kZXZlbG9wbWVudC9zaWduLWluXCIsIHsuLi59KWApIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGVcbiAgICogVUksIG9yIHRvIHJlYWQgYnJvd3NlciBzdGF0ZSB0aGUgZXhpc3RpbmcgZmluZGVyL2ludGVyYWN0IGNvbW1hbmRzXG4gICAqIGRvbid0IGV4cG9zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjcmlwdFxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVNjcmlwdChzY3JpcHQsIC4uLmFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIHNjcmlwdCAhPT0gXCJzdHJpbmdcIiB8fCBzY3JpcHQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleGVjdXRlU2NyaXB0IHJlcXVpcmVzIGEgbm9uLWVtcHR5IGBzY3JpcHRgIHN0cmluZ1wiKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlcigpLmV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzZW5kQnJvd3NlckNvbW1hbmQodHlwZSwgcGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIHNlbmRpbmcgYnJvd3NlciBjb21tYW5kICR7dHlwZX06ICR7cGF0aH1gfSxcbiAgICAgIGFzeW5jICgpID0+IGF3YWl0IC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY29tbXVuaWNhdG9yPn0gKi8gKHRoaXMuY29tbXVuaWNhdG9yKS5zZW5kQ29tbWFuZCh7dHlwZSwgcGF0aH0pXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGggdXNpbmcgdGhlIGluamVjdGVkIGJyb3dzZXIgaGVscGVyIHdoZW4gYXZhaWxhYmxlLCBvdGhlcndpc2UgbmF2aWdhdGVzIGRpcmVjdGx5IHdpdGggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtCcm93c2VyTmF2aWdhdGlvbkFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHZpc2l0KHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpICYmICghdGhpcy5jb21tdW5pY2F0b3I/LndzIHx8IHRoaXMuY29tbXVuaWNhdG9yLndzLnJlYWR5U3RhdGUgPT09IDEpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcInZpc2l0XCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgdmlzaXRpbmcgcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0byBhIHBhdGggdmlhIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkaXNtaXNzVG8ocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuY29tbXVuaWNhdG9yRXhpc3RzKCkgJiYgKCF0aGlzLmNvbW11bmljYXRvcj8ud3MgfHwgdGhpcy5jb21tdW5pY2F0b3Iud3MucmVhZHlTdGF0ZSA9PT0gMSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZEJyb3dzZXJDb21tYW5kKFwiZGlzbWlzc1RvXCIsIHBhdGgsIGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoXG4gICAgICAgIHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgZGlzbWlzc2luZyB0byBwYXRoOiAke3BhdGh9YH0sXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocGF0aClcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBicm93c2VyIGxvZ3MgZm9yIGNvbnNvbGUgb3V0cHV0IGFuZCB0cnVuY2F0ZXMgb3Zlcmx5IGxvbmcgb3V0cHV0LlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBsb2dzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4TGluZXNdXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzLCBtYXhMaW5lcyA9IDIwMCkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShsb2dzKSB8fCBsb2dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtcIihubyBicm93c2VyIGxvZ3MpXCJdXG4gICAgfVxuXG4gICAgaWYgKGxvZ3MubGVuZ3RoIDw9IG1heExpbmVzKSB7XG4gICAgICByZXR1cm4gbG9nc1xuICAgIH1cblxuICAgIGNvbnN0IGtlcHRMb2dzID0gbG9ncy5zbGljZShsb2dzLmxlbmd0aCAtIG1heExpbmVzKVxuICAgIGNvbnN0IGhpZGRlbkNvdW50ID0gbG9ncy5sZW5ndGggLSBtYXhMaW5lc1xuXG4gICAgcmV0dXJuIFtgKHNob3dpbmcgbGFzdCAke21heExpbmVzfSBvZiAke2xvZ3MubGVuZ3RofSBicm93c2VyIGxvZ3MsICR7aGlkZGVuQ291bnR9IG9taXR0ZWQpYCwgLi4ua2VwdExvZ3NdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpIHtcbiAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nczpcIilcblxuICAgIGZvciAoY29uc3QgbGluZSBvZiB0aGlzLmZvcm1hdEJyb3dzZXJMb2dzRm9yQ29uc29sZShsb2dzKSkge1xuICAgICAgY29uc29sZS5sb2cobGluZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBzY3JlZW5zaG90LCB3cml0ZXMgSFRNTC9icm93c2VyIGxvZ3MgdG8gZGlzaywgYW5kIHJldHVybnMgdGhlIGNvbGxlY3RlZCBhcnRpZmFjdHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtjdXJyZW50VXJsOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgaHRtbFBhdGg6IHN0cmluZywgbG9nczogc3RyaW5nW10sIGxvZ3NQYXRoOiBzdHJpbmcsIHNjcmVlbnNob3RQYXRoOiBzdHJpbmd9Pn1cbiAgICovXG4gIGFzeW5jIHRha2VTY3JlZW5zaG90KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHBhdGggZm9yIHNjcmVlbnNob3RzXCIpXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuX3NjcmVlbnNob3RzUGF0aFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgQ3JlYXRpbmcgZGlyIHdpdGggcmVjdXJzaXZlOiAke3BhdGh9YClcbiAgICBhd2FpdCBmcy5ta2RpcihwYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIHNjcmVlbnNob3QgaW1hZ2UgY29udGVudFwiKVxuICAgIGNvbnN0IGltYWdlQ29udGVudCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHRha2luZyBzY3JlZW5zaG90XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50YWtlU2NyZWVuc2hvdCgpKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdlbmVyYXRpbmcgZGF0ZSB2YXJpYWJsZXNcIilcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3QgdGltZXN0YW1wID0gbW9tZW50KG5vdykuZm9ybWF0KFwiWVlZWS1NTS1ERC1ISC1NTS1TU1wiKVxuICAgIGNvbnN0IHNjcmVlbnNob3RQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LnBuZ2BcbiAgICBjb25zdCBodG1sUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5odG1sYFxuICAgIGNvbnN0IGxvZ3NQYXRoID0gYCR7cGF0aH0vJHt0aW1lc3RhbXB9LmxvZ3MudHh0YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkdldHRpbmcgYnJvd3NlciBsb2dzXCIpXG4gICAgY29uc3QgbG9ncyA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgYnJvd3NlciBsb2dzXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCkpXG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDUwMDAsIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHJlYWRpbmcgcGFnZSBIVE1MXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmdldEhUTUwoKSlcbiAgICBjb25zdCBodG1sUHJldHR5ID0gcHJldHRpZnkoaHRtbClcbiAgICB0aGlzLnByaW50QnJvd3NlckxvZ3NGb3JGYWlsdXJlKGxvZ3MpXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiV3JpdGluZyBmaWxlc1wiKVxuICAgIGF3YWl0IGZzLndyaXRlRmlsZShodG1sUGF0aCwgaHRtbFByZXR0eSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUobG9nc1BhdGgsIGxvZ3Muam9pbihcIlxcblwiKSlcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoc2NyZWVuc2hvdFBhdGgsIGltYWdlQ29udGVudCwgXCJiYXNlNjRcIilcblxuICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKVxuXG4gICAgY29uc29sZS5sb2coXCJDdXJyZW50IFVSTDpcIiwgY3VycmVudFVybClcbiAgICBjb25zb2xlLmxvZyhcIkxvZ3M6XCIsIGxvZ3NQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiU2NyZWVuc2hvdDpcIiwgc2NyZWVuc2hvdFBhdGgpXG4gICAgY29uc29sZS5sb2coXCJIVE1MOlwiLCBodG1sUGF0aClcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50VXJsLFxuICAgICAgaHRtbCxcbiAgICAgIGh0bWxQYXRoLFxuICAgICAgbG9ncyxcbiAgICAgIGxvZ3NQYXRoLFxuICAgICAgc2NyZWVuc2hvdFBhdGhcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIHN0b3BEcml2ZXIoKSB7XG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgfVxufVxuIl19
|
|
665
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUE7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUNoQyxPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGNBQWMsTUFBTSw4QkFBOEIsQ0FBQTtBQUN6RCxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRDs7Ozs7O0dBTUc7QUFDSDs7OztHQUlHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBQ0g7Ozs7Ozs7R0FPRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxNQUFNO0lBQzVCLE9BQU8saUJBQWlCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUE7QUFDdkQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQUs7SUFDOUIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBSztJQUMzQixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDaEQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FB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QztZQUN2QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDakMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHtLZXl9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCJcbmltcG9ydCB7cHJldHRpZnl9IGZyb20gXCJodG1sZnlcIlxuaW1wb3J0IHt3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFNlbGVuaXVtRHJpdmVyIGZyb20gXCIuL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzXCJcbmltcG9ydCBBcHBpdW1Ecml2ZXIgZnJvbSBcIi4vZHJpdmVycy9hcHBpdW0tZHJpdmVyLmpzXCJcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHtCcm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyXSBEcml2ZXIgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIikuZGVmYXVsdH0gW2NvbW11bmljYXRvcl0gT3B0aW9uYWwgY29tbWFuZCBjb21tdW5pY2F0b3IgZm9yIGhlbHBlci1kcml2ZW4gbmF2aWdhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2NyZWVuc2hvdHNQYXRoXSBEaXJlY3RvcnkgdXNlZCBmb3Igc2F2ZWQgc2NyZWVuc2hvdHMgYW5kIGJyb3dzZXIgYXJ0aWZhY3RzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJEcml2ZXJDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJzZWxlbml1bVwifFwiYXBwaXVtXCJ9IFt0eXBlXSBEcml2ZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gRHJpdmVyLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3Nlck5hdmlnYXRpb25BcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIG5hdmlnYXRpb24gY29tbWFuZC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyUGF0aFdhaXRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRoZSB0aW1lb3V0IGZvciB0aGlzIHBhdGggd2FpdC5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcm93c2VyVGV4dFdhaXRBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc2Nyb2xsQ29udGFpbmVyVGVzdElEc10gTmF0aXZlIHRlc3QgSURzIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGFzIHNjcm9sbCBjb250YWluZXJzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdmlld3BvcnQgZ2VzdHVyZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgdGV4dCB3YWl0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGhlIHRpbWVvdXQgZm9yIHRoaXMgVVJMIHdhaXQuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnJvd3NlclRlc3RJRElucHV0QXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciB0aGUgaW5wdXQgbG9va3VwLlxuICovXG5cbi8qKlxuICogQnVpbGRzIGEgZGF0YS10ZXN0aWQgQ1NTIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBSYXcgdmFsdWUgZnJvbSBhIGBkYXRhLXRlc3RpZGAgYXR0cmlidXRlLlxuICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gdGVzdElkU2VsZWN0b3IodGVzdElEKSB7XG4gIHJldHVybiBgW2RhdGEtdGVzdGlkPVwiJHtjc3NBdHRyaWJ1dGVWYWx1ZSh0ZXN0SUQpfVwiXWBcbn1cblxuLyoqXG4gKiBFc2NhcGVzIGEgdmFsdWUgZm9yIHVzZSBpbnNpZGUgYSBkb3VibGUtcXVvdGVkIENTUyBhdHRyaWJ1dGUgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdmFsdWUgUmF3IGF0dHJpYnV0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEVzY2FwZWQgc2VsZWN0b3IgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGNzc0F0dHJpYnV0ZVZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiBTdHJpbmcodmFsdWUpLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCBcIlxcXFxcXFwiXCIpXG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIFJHQiBjaGFubmVscyBmcm9tIENTUyBgcmdiKC4uLilgL2ByZ2JhKC4uLilgIHZhbHVlcyBvciBhbiBSR0IgZnJhZ21lbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQ1NTIGNvbG9yIHZhbHVlIG9yIFJHQiBmcmFnbWVudCBsaWtlIGAzMCwgNDEsIDU5YC5cbiAqIEByZXR1cm5zIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGNzc1JnYkNoYW5uZWxzKHZhbHVlKSB7XG4gIGNvbnN0IHJnYk1hdGNoID0gdmFsdWUubWF0Y2goL3JnYmE/XFwoKFteKV0rKVxcKS8pXG4gIGNvbnN0IGNoYW5uZWxzVmFsdWUgPSByZ2JNYXRjaCA/IHJnYk1hdGNoWzFdIDogdmFsdWVcbiAgY29uc3QgY2hhbm5lbHMgPSBjaGFubmVsc1ZhbHVlXG4gICAgLnJlcGxhY2UoL1xccypcXC8uKiQvLCBcIlwiKVxuICAgIC5zcGxpdCgvWyxcXHNdKy8pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5zbGljZSgwLCAzKVxuICAgIC5tYXAoKGNoYW5uZWwpID0+IE51bWJlcihjaGFubmVsKSlcblxuICBpZiAoY2hhbm5lbHMubGVuZ3RoICE9PSAzIHx8IGNoYW5uZWxzLnNvbWUoKGNoYW5uZWwpID0+ICFOdW1iZXIuaXNGaW5pdGUoY2hhbm5lbCkpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdfSAqLyAoY2hhbm5lbHMpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBicm93c2VyLW5vcm1hbGl6ZWQgQ1NTIGNvbG9yIG1hdGNoZXMgdGhlIFJHQiB0cmlwbGV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdHVhbFZhbHVlIEJyb3dzZXItbm9ybWFsaXplZCBDU1MgY29sb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmdiRnJhZ21lbnQgUkdCIGZyYWdtZW50IGxpa2UgYDMwLCA0MSwgNTlgLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIFJHQiBjaGFubmVscyBtYXRjaC5cbiAqL1xuZnVuY3Rpb24gY3NzVmFsdWVNYXRjaGVzUmdiKGFjdHVhbFZhbHVlLCByZ2JGcmFnbWVudCkge1xuICBjb25zdCBhY3R1YWxDaGFubmVscyA9IGNzc1JnYkNoYW5uZWxzKGFjdHVhbFZhbHVlKVxuICBjb25zdCBleHBlY3RlZENoYW5uZWxzID0gY3NzUmdiQ2hhbm5lbHMocmdiRnJhZ21lbnQpXG5cbiAgaWYgKCFhY3R1YWxDaGFubmVscyB8fCAhZXhwZWN0ZWRDaGFubmVscykgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIGFjdHVhbENoYW5uZWxzLmV2ZXJ5KChhY3R1YWxDaGFubmVsLCBpbmRleCkgPT4gYWN0dWFsQ2hhbm5lbCA9PT0gZXhwZWN0ZWRDaGFubmVsc1tpbmRleF0pXG59XG5cbi8qKiBHZW5lcmljIGJyb3dzZXIgc2Vzc2lvbiB3cmFwcGVyIGFyb3VuZCB0aGUgY29uZmlndXJlZCBkcml2ZXIuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyIHtcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyIHwgdW5kZWZpbmVkfSAqL1xuICBkcml2ZXIgPSB1bmRlZmluZWRcblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vZHJpdmVycy93ZWJkcml2ZXItZHJpdmVyLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9ICovXG4gIGRyaXZlckFkYXB0ZXIgPSB1bmRlZmluZWRcblxuICBfZGVidWcgPSBmYWxzZVxuICAvKiogQHR5cGUge0Jyb3dzZXJEcml2ZXJDb25maWcgfCB1bmRlZmluZWR9ICovXG4gIF9kcml2ZXJDb25maWcgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvciB8IHVuZGVmaW5lZH0gKi9cbiAgX2h0dHBTZXJ2ZXJFcnJvciA9IHVuZGVmaW5lZFxuXG4gIC8qKiBAcGFyYW0ge0Jyb3dzZXJBcmdzfSBbYXJnc10gKi9cbiAgY29uc3RydWN0b3Ioe2RlYnVnID0gZmFsc2UsIGRyaXZlciwgY29tbXVuaWNhdG9yLCBzY3JlZW5zaG90c1BhdGggPSBgJHtwcm9jZXNzLmN3ZCgpfS90bXAvc2NyZWVuc2hvdHNgLCAuLi5yZXN0QXJnc30gPSB7fSkge1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYnJvd3NlciBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9kcml2ZXJDb25maWcgPSBkcml2ZXJcbiAgICB0aGlzLl9zY3JlZW5zaG90c1BhdGggPSBzY3JlZW5zaG90c1BhdGhcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IGNvbW11bmljYXRvclxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKGRyaXZlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJEcml2ZXJDb25maWd9IFtkcml2ZXJDb25maWddXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RyaXZlcnMvd2ViZHJpdmVyLWRyaXZlci5qc1wiKS5kZWZhdWx0fVxuICAgKi9cbiAgY3JlYXRlRHJpdmVyKGRyaXZlckNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3Qge3R5cGUgPSBcInNlbGVuaXVtXCIsIG9wdGlvbnMsIC4uLnJlc3RBcmdzfSA9IGRyaXZlckNvbmZpZ1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZHJpdmVyIGFyZ3M6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcInNlbGVuaXVtXCIpIHtcbiAgICAgIHJldHVybiBuZXcgU2VsZW5pdW1Ecml2ZXIoe2Jyb3dzZXI6IHRoaXMsIG9wdGlvbnN9KVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImFwcGl1bVwiKSB7XG4gICAgICByZXR1cm4gbmV3IEFwcGl1bURyaXZlcih7YnJvd3NlcjogdGhpcywgb3B0aW9uc30pXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkcml2ZXIgdHlwZTogJHt0eXBlfWApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb21tdW5pY2F0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRDb21tdW5pY2F0b3IoY29tbXVuaWNhdG9yKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBjb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgY29tbXVuaWNhdG9yRXhpc3RzKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlU2VsZWN0b3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRCYXNlU2VsZWN0b3IoYmFzZVNlbGVjdG9yKSB7IHRoaXMuX2Jhc2VTZWxlY3RvciA9IGJhc2VTZWxlY3RvciB9XG5cbiAgLyoqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGdldEJhc2VTZWxlY3RvcigpIHsgcmV0dXJuIHRoaXMuX2Jhc2VTZWxlY3RvciB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCYXNlU2VsZWN0b3IoKSA/IGAke3RoaXMuZ2V0QmFzZVNlbGVjdG9yKCl9ICR7c2VsZWN0b3J9YCA6IHNlbGVjdG9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0Vycm9yKC4uLmFyZ3MpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiW0Jyb3dzZXIgZXJyb3JdXCIsIC4uLmFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBkZWJ1Z0xvZyguLi5hcmdzKSB7XG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltCcm93c2VyIGRlYnVnXVwiLCAuLi5hcmdzKVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgdGhyb3dJZkh0dHBTZXJ2ZXJFcnJvcigpIHtcbiAgICBpZiAodGhpcy5faHR0cFNlcnZlckVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgc2VydmVyIGVycm9yOiAke3RoaXMuX2h0dHBTZXJ2ZXJFcnJvci5tZXNzYWdlfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgb25IdHRwU2VydmVyRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcblxuICAgIHRoaXMuX2h0dHBTZXJ2ZXJFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpXG4gICAgY29uc29sZS5lcnJvcihgSFRUUCBzZXJ2ZXIgZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWApXG4gIH1cblxuICAvKiogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9ICovXG4gIGdldERyaXZlcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0V2ViRHJpdmVyKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanNcIikuZGVmYXVsdH0gKi9cbiAgZ2V0RHJpdmVyQWRhcHRlcigpIHtcbiAgICBpZiAoIXRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRyaXZlckFkYXB0ZXJcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldFRpbWVvdXRzKCkgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IG5ld1RpbWVvdXRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJTZXRUaW1lb3V0cyhuZXdUaW1lb3V0KSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRUaW1lb3V0cyhuZXdUaW1lb3V0KVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmdldEJyb3dzZXJMb2dzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgcGF0aG5hbWUgZXhhY3RseSBtYXRjaGVzIHRoZSBleHBlY3RlZCBwYXRoLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRQYXRoXG4gICAqIEBwYXJhbSB7QnJvd3NlclBhdGhXYWl0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclBhdGgoZXhwZWN0ZWRQYXRoLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gbmV3IFVSTChjdXJyZW50VXJsKS5wYXRobmFtZVxuXG4gICAgICBpZiAoY3VycmVudFBhdGggIT09IGV4cGVjdGVkUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBwYXRoICR7ZXhwZWN0ZWRQYXRofS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGV4YWN0bHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgVVJMLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRVcmwgRXhhY3QgVVJMIGV4cGVjdGVkLlxuICAgKiBAcGFyYW0ge0Jyb3dzZXJDdXJyZW50VXJsV2FpdEFyZ3N9IFthcmdzXSBPcHRpb25hbCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JDdXJyZW50VXJsKGV4cGVjdGVkVXJsLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwgIT09IGV4cGVjdGVkVXJsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIFVSTCAke2V4cGVjdGVkVXJsfS4gQ3VycmVudCBVUkw6ICR7Y3VycmVudFVybH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgdGhlIGN1cnJlbnQgVVJMIGNvbnRhaW5zIGEgZnJhZ21lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGFwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsQ29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFVybCA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVybCgpXG5cbiAgICAgIGlmICghY3VycmVudFVybC5pbmNsdWRlcyhleHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gaW5jbHVkZSAke2V4cGVjdGVkRnJhZ21lbnR9LiBDdXJyZW50IFVSTDogJHtjdXJyZW50VXJsfWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCB0aGUgY3VycmVudCBVUkwgZG9lcyBub3QgY29udGFpbiBhIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdW5leHBlY3RlZEZyYWdtZW50IEZyYWdtZW50IHRoYXQgc2hvdWxkIGRpc2FwcGVhci5cbiAgICogQHBhcmFtIHtCcm93c2VyQ3VycmVudFVybFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVXJsRXhjbHVkZXModW5leHBlY3RlZEZyYWdtZW50LCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB0aGlzLmdldENvbW1hbmRUaW1lb3V0KGFyZ3MudGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgICAgaWYgKGN1cnJlbnRVcmwuaW5jbHVkZXModW5leHBlY3RlZEZyYWdtZW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciBVUkwgdG8gZXhjbHVkZSAke3VuZXhwZWN0ZWRGcmFnbWVudH0uIEN1cnJlbnQgVVJMOiAke2N1cnJlbnRVcmx9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmFsbChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBleGlzdHMoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5leGlzdHMoc2VsZWN0b3IsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5hdGl2ZSBBbmRyb2lkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYXRpdmVUZXh0KGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmRCeU5hdGl2ZVRleHQoZXhwZWN0ZWRUZXh0LCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50ZXh0KHNlbGVjdG9yLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgaW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbiBpbnB1dCBhbmQgc2VuZHMgcmVwbGFjZW1lbnQga2V5cyB0aHJvdWdoIHJldHJ5YWJsZSBicm93c2VyIGludGVyYWN0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5JbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRWYWx1ZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsZWFyQW5kU2VuZEtleXMoZWxlbWVudE9ySWRlbnRpZmllciwgbmV4dFZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcImNsaWNrXCIpXG4gICAgYXdhaXQgdGhpcy5pbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBcInNlbmRLZXlzXCIsIEtleS5jaG9yZChLZXkuQ09OVFJPTCwgXCJhXCIpLCBLZXkuQkFDS19TUEFDRSwgbmV4dFZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFuIGlucHV0LWxpa2UgZWxlbWVudCdzIHZhbHVlIGJ5IHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRmllbGQgYGRhdGEtdGVzdGlkYCB0byB0YXJnZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0VmFsdWUgVGV4dCB0byBsZWF2ZSBpbiB0aGUgZmllbGQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRlc3RJRElucHV0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCB0aW1lb3V0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VUZXN0SURJbnB1dFZhbHVlKHRlc3RJRCwgbmV4dFZhbHVlLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmNsZWFyQW5kU2VuZEtleXMoe1xuICAgICAgc2VsZWN0b3I6IHRlc3RJZFNlbGVjdG9yKHRlc3RJRCksXG4gICAgICB0aW1lb3V0OiBhcmdzLnRpbWVvdXQsXG4gICAgICB3aXRoRmFsbGJhY2s6IHRydWVcbiAgICB9LCBuZXh0VmFsdWUpXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgYSB0ZXN0IGlkIGNvbnRhaW5zIGV4cGVjdGVkIHZpc2libGUgdGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBGcmFnbWVudCB0aGF0IG11c3QgYXBwZWFyIGluIHRoZSBlbGVtZW50IHRleHQuXG4gICAqIEBwYXJhbSB7QnJvd3NlclRleHRXYWl0QXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElELCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHt0aW1lb3V0OiB3YWl0VGltZW91dCwgLi4uZmluZEFyZ3N9ID0gYXJnc1xuXG4gICAgYXdhaXQgd2FpdEZvcih7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dCh3YWl0VGltZW91dCl9LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCB7Li4uZmluZEFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgY29uc3QgYWN0dWFsVGV4dCA9IGF3YWl0IGVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIGlmICghYWN0dWFsVGV4dC5pbmNsdWRlcyhleHBlY3RlZFRleHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHRleHQgJHtleHBlY3RlZFRleHR9LiBMYXN0IHRleHQgd2FzICR7YWN0dWFsVGV4dH1gKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgdW50aWwgYSB0ZXN0IGlkIG5vIGxvbmdlciBjb250YWlucyBleGNsdWRlZCB2aXNpYmxlIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRWxlbWVudCBgZGF0YS10ZXN0aWRgIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGNsdWRlZFRleHQgRnJhZ21lbnQgdGhhdCBzaG91bGQgZGlzYXBwZWFyIGZyb20gdGhlIGVsZW1lbnQgdGV4dC5cbiAgICogQHBhcmFtIHtCcm93c2VyVGV4dFdhaXRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dEV4Y2x1ZGVzKHRlc3RJRCwgZXhjbHVkZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dGltZW91dDogd2FpdFRpbWVvdXQsIC4uLmZpbmRBcmdzfSA9IGFyZ3NcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQod2FpdFRpbWVvdXQpfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmZpbmRBcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBpZiAoYWN0dWFsVGV4dC5pbmNsdWRlcyhleGNsdWRlZFRleHQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IHdhaXRpbmcgZm9yIHRleHQgdG8gZXhjbHVkZSAke2V4Y2x1ZGVkVGV4dH0uIExhc3QgdGV4dCB3YXMgJHthY3R1YWxUZXh0fWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlcnRzIGEgcmVuZGVyZWQgZWxlbWVudCBoYXMgYSBDU1MgY29sb3IgZnJvbSB0aGUgZXhwZWN0ZWQgcGFsZXR0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRCBFbGVtZW50IGBkYXRhLXRlc3RpZGAgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZSBDU1MgcHJvcGVydHkgdG8gcmVhZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkUmdiIEV4cGVjdGVkIFJHQiBmcmFnbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpZ2h0UmdiIERpc2FsbG93ZWQgUkdCIGZyYWdtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gSHVtYW4tcmVhZGFibGUgZWxlbWVudCBkZXNjcmlwdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3RUZXN0SURDc3NDb2xvcih0ZXN0SUQsIHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRSZ2IsIGxpZ2h0UmdiLCBkZXNjcmlwdGlvbikge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQpXG4gICAgY29uc3QgYWN0dWFsVmFsdWUgPSBhd2FpdCBlbGVtZW50LmdldENzc1ZhbHVlKHByb3BlcnR5TmFtZSlcblxuICAgIGlmIChjc3NWYWx1ZU1hdGNoZXNSZ2IoYWN0dWFsVmFsdWUsIGxpZ2h0UmdiKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAke2Rlc2NyaXB0aW9ufSB0byBhdm9pZCB0aGUgbGlnaHQgcGFsZXR0ZSwgZ290ICR7cHJvcGVydHlOYW1lfSAke2FjdHVhbFZhbHVlfWApXG4gICAgfVxuICAgIGlmICghY3NzVmFsdWVNYXRjaGVzUmdiKGFjdHVhbFZhbHVlLCBleHBlY3RlZFJnYikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJHtkZXNjcmlwdGlvbn0gdG8gaW5jbHVkZSByZ2IoJHtleHBlY3RlZFJnYn0pLCBnb3QgJHtwcm9wZXJ0eU5hbWV9ICR7YWN0dWFsVmFsdWV9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyBhbiBlbGVtZW50IGludG8gdmlldy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHxzdHJpbmd8e3NlbGVjdG9yOiBzdHJpbmd9ICYgaW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5GaW5kQXJnc30gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3lzdGVtLXRlc3QuanNcIikuRmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxJbnRvVmlldyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeXN0ZW0tdGVzdC5qc1wiKS5XYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5c3RlbS10ZXN0LmpzXCIpLkZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBleHBlY3ROb0VsZW1lbnQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGxldCBmb3VuZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgICAgZm91bmQgPSB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIC8vIElnbm9yZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgbm90IHRvIGZpbmQ6ICR7c2VsZWN0b3J9YClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0SFRNTCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZ2V0SFRNTCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IHRpbWVvdXRPdmVycmlkZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0Q29tbWFuZFRpbWVvdXQodGltZW91dE92ZXJyaWRlKSB7XG4gICAgaWYgKHRpbWVvdXRPdmVycmlkZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGltZW91dE92ZXJyaWRlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGltZW91dHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyVmlzaXQocGF0aCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmRyaXZlclZpc2l0KHBhdGgpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgY29va2llIHRvIHRoZSBhY3RpdmUgZHJpdmVyIHNlc3Npb24gZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gICAqIG9yaWdpbi4gVXNlZnVsIHdoZW4gYW4gb3V0LW9mLWJhbmQgbG9naW4gKGN1cmwsIGZldGNoLCBldGMuKSByZXR1cm5lZFxuICAgKiBhIGBTZXQtQ29va2llYCB2YWx1ZSBhbmQgdGhlIHRlc3QgbmVlZHMgdGhlIGJyb3dzZXIgdG8gc3RhcnRcbiAgICogYXV0aGVudGljYXRlZCB3aXRob3V0IGRyaXZpbmcgdGhlIHNpZ24taW4gVUkuXG4gICAqXG4gICAqIFRoZSBkcml2ZXIgbXVzdCBhbHJlYWR5IGJlIG9uIGEgcGFnZSB3aG9zZSBvcmlnaW4vZG9tYWluIG1hdGNoZXMgdGhlXG4gICAqIGNvb2tpZSBkb21haW4sIG90aGVyd2lzZSBTZWxlbml1bSB3aWxsIHJlamVjdCB0aGUgY2FsbC5cbiAgICogQHBhcmFtIHt7bmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBkb21haW4/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcsIHNlY3VyZT86IGJvb2xlYW4sIGh0dHBPbmx5PzogYm9vbGVhbiwgZXhwaXJ5PzogbnVtYmVyLCBzYW1lU2l0ZT86IFwiU3RyaWN0XCIgfCBcIkxheFwiIHwgXCJOb25lXCJ9fSBjb29raWVcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBhZGRDb29raWUoY29va2llKSB7XG4gICAgaWYgKCFjb29raWUgfHwgdHlwZW9mIGNvb2tpZS5uYW1lICE9PSBcInN0cmluZ1wiIHx8IGNvb2tpZS5uYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWRkQ29va2llIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGBuYW1lYFwiKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29va2llLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhZGRDb29raWUgcmVxdWlyZXMgYSBzdHJpbmcgYHZhbHVlYFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkubWFuYWdlKCkuYWRkQ29va2llKGNvb2tpZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYW4gYXJiaXRyYXJ5IHNjcmlwdCBpbiB0aGUgYWN0aXZlIGJyb3dzZXIgc2Vzc2lvbiBhbmQgcmV0dXJuIHRoZVxuICAgKiByZXNvbHZlZCB2YWx1ZS4gYHNjcmlwdGAgaXMgdGhlIGZ1bmN0aW9uIGJvZHkgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXJcbiAgICogKGBuZXcgRnVuY3Rpb24oXCIuLi5cIilgLXN0eWxlKTsgYGFyZ3NgIGFyZSBmb3J3YXJkZWQgYXMgYGFyZ3VtZW50c1tpXWAuXG4gICAqIEFzeW5jaHJvbm91cyBzY3JpcHRzIG11c3QgYHJldHVybmAgYSBQcm9taXNlLCB3aGljaCBTZWxlbml1bSBhd2FpdHMuXG4gICAqXG4gICAqIFVzZWZ1bCBmb3IgdmVyaWZpY2F0aW9uIGZsb3dzIHRoYXQgbmVlZCB0byBjYWxsIGludG8gYXBwbGljYXRpb24gY29kZVxuICAgKiAoZS5nLiBgZmV0Y2goXCIvZGV2ZWxvcG1lbnQvc2lnbi1pblwiLCB7Li4ufSlgKSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlXG4gICAqIFVJLCBvciB0byByZWFkIGJyb3dzZXIgc3RhdGUgdGhlIGV4aXN0aW5nIGZpbmRlci9pbnRlcmFjdCBjb21tYW5kc1xuICAgKiBkb24ndCBleHBvc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY3JpcHRcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAuLi5hcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBzY3JpcHQgIT09IFwic3RyaW5nXCIgfHwgc2NyaXB0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhlY3V0ZVNjcmlwdCByZXF1aXJlcyBhIG5vbi1lbXB0eSBgc2NyaXB0YCBzdHJpbmdcIilcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KHNjcmlwdCwgLi4uYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2VuZEJyb3dzZXJDb21tYW5kKHR5cGUsIHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBzZW5kaW5nIGJyb3dzZXIgY29tbWFuZCAke3R5cGV9OiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmNvbW11bmljYXRvcj59ICovICh0aGlzLmNvbW11bmljYXRvcikuc2VuZENvbW1hbmQoe3R5cGUsIHBhdGh9KVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBwYXRoIHVzaW5nIHRoZSBpbmplY3RlZCBicm93c2VyIGhlbHBlciB3aGVuIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG5hdmlnYXRlcyBkaXJlY3RseSB3aXRoIHRoZSBkcml2ZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5jb21tdW5pY2F0b3JFeGlzdHMoKSAmJiAoIXRoaXMuY29tbXVuaWNhdG9yPy53cyB8fCB0aGlzLmNvbW11bmljYXRvci53cy5yZWFkeVN0YXRlID09PSAxKSkge1xuICAgICAgYXdhaXQgdGhpcy5zZW5kQnJvd3NlckNvbW1hbmQoXCJ2aXNpdFwiLCBwYXRoLCBhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIHZpc2l0aW5nIHBhdGg6ICR7cGF0aH1gfSxcbiAgICAgICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChwYXRoKVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdG8gYSBwYXRoIHZpYSB0aGUgaW5qZWN0ZWQgYnJvd3NlciBoZWxwZXIgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZSBuYXZpZ2F0ZXMgZGlyZWN0bHkgd2l0aCB0aGUgZHJpdmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGlzbWlzc1RvKHBhdGgsIGFyZ3MgPSB7fSkge1xuICAgIGlmICh0aGlzLmNvbW11bmljYXRvckV4aXN0cygpICYmICghdGhpcy5jb21tdW5pY2F0b3I/LndzIHx8IHRoaXMuY29tbXVuaWNhdG9yLndzLnJlYWR5U3RhdGUgPT09IDEpKSB7XG4gICAgICBhd2FpdCB0aGlzLnNlbmRCcm93c2VyQ29tbWFuZChcImRpc21pc3NUb1wiLCBwYXRoLCBhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAgICB7dGltZW91dDogdGhpcy5nZXRDb21tYW5kVGltZW91dChhcmdzLnRpbWVvdXQpLCBlcnJvck1lc3NhZ2U6IGB0aW1lb3V0IHdoaWxlIGRpc21pc3NpbmcgdG8gcGF0aDogJHtwYXRofWB9LFxuICAgICAgICBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHBhdGgpXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYnJvd3NlciBsb2dzIGZvciBjb25zb2xlIG91dHB1dCBhbmQgdHJ1bmNhdGVzIG92ZXJseSBsb25nIG91dHB1dC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gbG9nc1xuICAgKiBAcGFyYW0ge251bWJlcn0gW21heExpbmVzXVxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmb3JtYXRCcm93c2VyTG9nc0ZvckNvbnNvbGUobG9ncywgbWF4TGluZXMgPSAyMDApIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobG9ncykgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXCIobm8gYnJvd3NlciBsb2dzKVwiXVxuICAgIH1cblxuICAgIGlmIChsb2dzLmxlbmd0aCA8PSBtYXhMaW5lcykge1xuICAgICAgcmV0dXJuIGxvZ3NcbiAgICB9XG5cbiAgICBjb25zdCBrZXB0TG9ncyA9IGxvZ3Muc2xpY2UobG9ncy5sZW5ndGggLSBtYXhMaW5lcylcbiAgICBjb25zdCBoaWRkZW5Db3VudCA9IGxvZ3MubGVuZ3RoIC0gbWF4TGluZXNcblxuICAgIHJldHVybiBbYChzaG93aW5nIGxhc3QgJHttYXhMaW5lc30gb2YgJHtsb2dzLmxlbmd0aH0gYnJvd3NlciBsb2dzLCAke2hpZGRlbkNvdW50fSBvbWl0dGVkKWAsIC4uLmtlcHRMb2dzXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGxvZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBwcmludEJyb3dzZXJMb2dzRm9yRmFpbHVyZShsb2dzKSB7XG4gICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ3M6XCIpXG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5mb3JtYXRCcm93c2VyTG9nc0ZvckNvbnNvbGUobG9ncykpIHtcbiAgICAgIGNvbnNvbGUubG9nKGxpbmUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIGEgc2NyZWVuc2hvdCwgd3JpdGVzIEhUTUwvYnJvd3NlciBsb2dzIHRvIGRpc2ssIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0ZWQgYXJ0aWZhY3RzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7Y3VycmVudFVybDogc3RyaW5nLCBodG1sOiBzdHJpbmcsIGh0bWxQYXRoOiBzdHJpbmcsIGxvZ3M6IHN0cmluZ1tdLCBsb2dzUGF0aDogc3RyaW5nLCBzY3JlZW5zaG90UGF0aDogc3RyaW5nfT59XG4gICAqL1xuICBhc3luYyB0YWtlU2NyZWVuc2hvdCgpIHtcbiAgICB0aGlzLmRlYnVnTG9nKFwiR2V0dGluZyBwYXRoIGZvciBzY3JlZW5zaG90c1wiKVxuICAgIGNvbnN0IHBhdGggPSB0aGlzLl9zY3JlZW5zaG90c1BhdGhcblxuICAgIHRoaXMuZGVidWdMb2coYENyZWF0aW5nIGRpciB3aXRoIHJlY3Vyc2l2ZTogJHtwYXRofWApXG4gICAgYXdhaXQgZnMubWtkaXIocGF0aCwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiR2V0dGluZyBzY3JlZW5zaG90IGltYWdlIGNvbnRlbnRcIilcbiAgICBjb25zdCBpbWFnZUNvbnRlbnQgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB0YWtpbmcgc2NyZWVuc2hvdFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGFrZVNjcmVlbnNob3QoKSlcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZW5lcmF0aW5nIGRhdGUgdmFyaWFibGVzXCIpXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IG1vbWVudChub3cpLmZvcm1hdChcIllZWVktTU0tREQtSEgtTU0tU1NcIilcbiAgICBjb25zdCBzY3JlZW5zaG90UGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5wbmdgXG4gICAgY29uc3QgaHRtbFBhdGggPSBgJHtwYXRofS8ke3RpbWVzdGFtcH0uaHRtbGBcbiAgICBjb25zdCBsb2dzUGF0aCA9IGAke3BhdGh9LyR7dGltZXN0YW1wfS5sb2dzLnR4dGBcblxuICAgIHRoaXMuZGVidWdMb2coXCJHZXR0aW5nIGJyb3dzZXIgbG9nc1wiKVxuICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSByZWFkaW5nIGJyb3dzZXIgbG9nc1wifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpKVxuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiA1MDAwLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSByZWFkaW5nIHBhZ2UgSFRNTFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5nZXRIVE1MKCkpXG4gICAgY29uc3QgaHRtbFByZXR0eSA9IHByZXR0aWZ5KGh0bWwpXG4gICAgdGhpcy5wcmludEJyb3dzZXJMb2dzRm9yRmFpbHVyZShsb2dzKVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldyaXRpbmcgZmlsZXNcIilcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoaHRtbFBhdGgsIGh0bWxQcmV0dHkpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKGxvZ3NQYXRoLCBsb2dzLmpvaW4oXCJcXG5cIikpXG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHNjcmVlbnNob3RQYXRoLCBpbWFnZUNvbnRlbnQsIFwiYmFzZTY0XCIpXG5cbiAgICBjb25zdCBjdXJyZW50VXJsID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKClcblxuICAgIGNvbnNvbGUubG9nKFwiQ3VycmVudCBVUkw6XCIsIGN1cnJlbnRVcmwpXG4gICAgY29uc29sZS5sb2coXCJMb2dzOlwiLCBsb2dzUGF0aClcbiAgICBjb25zb2xlLmxvZyhcIlNjcmVlbnNob3Q6XCIsIHNjcmVlbnNob3RQYXRoKVxuICAgIGNvbnNvbGUubG9nKFwiSFRNTDpcIiwgaHRtbFBhdGgpXG5cbiAgICByZXR1cm4ge1xuICAgICAgY3VycmVudFVybCxcbiAgICAgIGh0bWwsXG4gICAgICBodG1sUGF0aCxcbiAgICAgIGxvZ3MsXG4gICAgICBsb2dzUGF0aCxcbiAgICAgIHNjcmVlbnNob3RQYXRoXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBzdG9wRHJpdmVyKCkge1xuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
* @returns {string} UiAutomator selector source.
|
|
5
5
|
*/
|
|
6
6
|
export function androidResourceIdSelector(testId: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Builds a UiAutomator selector that matches visible text.
|
|
9
|
+
* @param {string} expectedText Text to locate.
|
|
10
|
+
* @returns {string} UiAutomator selector source.
|
|
11
|
+
*/
|
|
12
|
+
export function androidTextContainsSelector(expectedText: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Builds a UiAutomator selector that matches an accessibility label.
|
|
15
|
+
* @param {string} expectedText Text to locate.
|
|
16
|
+
* @returns {string} UiAutomator selector source.
|
|
17
|
+
*/
|
|
18
|
+
export function androidDescriptionContainsSelector(expectedText: string): string;
|
|
7
19
|
/**
|
|
8
20
|
* Ensures Chrome Appium capabilities use a caller-owned user-data directory.
|
|
9
21
|
* This avoids repeated sessions leaking temp profiles under `/tmp` in CI.
|
|
@@ -33,6 +45,7 @@ export function ensureChromeUserDataDirCapability({ browserName, capabilities, t
|
|
|
33
45
|
* @property {number} [timeout] Override timeout for lookup.
|
|
34
46
|
* @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
|
|
35
47
|
* @property {boolean} [scrollTo] Whether to scroll found elements into view before returning them.
|
|
48
|
+
* @property {string[]} [scrollContainerTestIDs] Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
|
|
36
49
|
* @property {boolean} [useBaseSelector] Whether to scope by the base selector.
|
|
37
50
|
*/
|
|
38
51
|
/**
|
|
@@ -98,6 +111,55 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
98
111
|
* @returns {By} Selenium/Appium locator.
|
|
99
112
|
*/
|
|
100
113
|
idLocator(testId: string): By;
|
|
114
|
+
/**
|
|
115
|
+
* Finds native Android visible text or an accessibility label, scrolling it into view when needed.
|
|
116
|
+
* @param {string} expectedText Text to locate.
|
|
117
|
+
* @param {FindArgs} [args] Optional lookup settings.
|
|
118
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Native element containing the text.
|
|
119
|
+
*/
|
|
120
|
+
findByNativeText(expectedText: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
121
|
+
/**
|
|
122
|
+
* Finds a native Android control by resource id, scrolling it into view first when requested.
|
|
123
|
+
* @param {string} testId Stable native resource id suffix.
|
|
124
|
+
* @param {FindArgs} [args] Optional lookup settings.
|
|
125
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
|
|
126
|
+
*/
|
|
127
|
+
findNativeControlById(testId: string, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
128
|
+
/**
|
|
129
|
+
* Finds a native control, trying direct lookup, UiScrollable, and viewport gesture scrolling.
|
|
130
|
+
* @param {NativeControlLookup} lookup Lookup callbacks and diagnostics.
|
|
131
|
+
* @param {FindArgs} [args] Optional lookup settings.
|
|
132
|
+
* @returns {Promise<import("selenium-webdriver").WebElement>} Matching native element.
|
|
133
|
+
*/
|
|
134
|
+
findNativeControlWithScrolling(lookup: NativeControlLookup, args?: FindArgs): Promise<import("selenium-webdriver").WebElement>;
|
|
135
|
+
/**
|
|
136
|
+
* Runs explicit native polling without Appium's implicit wait extending every failed probe.
|
|
137
|
+
* @template TResult Result type.
|
|
138
|
+
* @param {number} implicitWaitMs Implicit wait duration to apply during the callback.
|
|
139
|
+
* @param {() => Promise<TResult>} callback Work that owns its own polling timeout.
|
|
140
|
+
* @returns {Promise<TResult>} Callback result.
|
|
141
|
+
*/
|
|
142
|
+
withNativeImplicitWait<TResult>(implicitWaitMs: number, callback: () => Promise<TResult>): Promise<TResult>;
|
|
143
|
+
/**
|
|
144
|
+
* Scrolls the visible native viewport down when UiScrollable cannot identify the owning ScrollView.
|
|
145
|
+
* @param {NativeViewportScrollState} scrollState Per-lookup Appium scroll state.
|
|
146
|
+
* @param {string[]} scrollContainerTestIDs Native test IDs that may identify scroll containers.
|
|
147
|
+
* @returns {Promise<void>} Resolves after Appium performs the gesture.
|
|
148
|
+
*/
|
|
149
|
+
scrollNativeViewportDown(scrollState: NativeViewportScrollState, scrollContainerTestIDs: string[]): Promise<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Scrolls a specific native Android element by test id when Appium exposes it as a scroll container.
|
|
152
|
+
* @param {string} testId Stable native resource id suffix.
|
|
153
|
+
* @returns {Promise<boolean>} Whether Appium reported more content to scroll.
|
|
154
|
+
*/
|
|
155
|
+
scrollNativeElementDown(testId: string): Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* Moves an offscreen Android control into a ScrollView-backed native hierarchy.
|
|
158
|
+
* @param {string} uiSelector UiAutomator selector for the target control.
|
|
159
|
+
* @param {string[]} scrollContainerTestIDs Native test IDs that may identify scroll containers.
|
|
160
|
+
* @returns {Promise<void>} Resolves after UiAutomator attempts the scroll.
|
|
161
|
+
*/
|
|
162
|
+
scrollNativeUiSelectorIntoView(uiSelector: string, scrollContainerTestIDs: string[]): Promise<void>;
|
|
101
163
|
/**
|
|
102
164
|
* Checks whether the current session is a native Android app, not Android Chrome.
|
|
103
165
|
* @returns {boolean} True when UiAutomator resource-id lookup should be used.
|
|
@@ -109,6 +171,46 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
109
171
|
*/
|
|
110
172
|
buildServerUrl(serverArgs: Record<string, any>): string;
|
|
111
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Appium timeout values returned by Selenium.
|
|
176
|
+
*/
|
|
177
|
+
export type NativeTimeouts = {
|
|
178
|
+
implicit: number;
|
|
179
|
+
pageLoad?: number;
|
|
180
|
+
script?: number;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Appium timeout update shape accepted by Selenium.
|
|
184
|
+
*/
|
|
185
|
+
export type NativeTimeoutOptions = {
|
|
186
|
+
implicit?: number;
|
|
187
|
+
pageLoad?: number;
|
|
188
|
+
script?: number;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* Native Appium window dimensions.
|
|
192
|
+
*/
|
|
193
|
+
export type NativeWindowRect = {
|
|
194
|
+
x: number;
|
|
195
|
+
y: number;
|
|
196
|
+
width: number;
|
|
197
|
+
height: number;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Tracks native scroll fallbacks that already reported no movement.
|
|
201
|
+
*/
|
|
202
|
+
export type NativeViewportScrollState = {
|
|
203
|
+
tryElementScroll: boolean;
|
|
204
|
+
tryViewportScroll: boolean;
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Native Android lookup work executed by the scrolling poller.
|
|
208
|
+
*/
|
|
209
|
+
export type NativeControlLookup = {
|
|
210
|
+
description: string;
|
|
211
|
+
directFind: () => Promise<import("selenium-webdriver").WebElement>;
|
|
212
|
+
scrollSelectors: string[];
|
|
213
|
+
};
|
|
112
214
|
export type AppiumDriverOptions = {
|
|
113
215
|
/**
|
|
114
216
|
* Remote Appium server URL to connect to.
|
|
@@ -152,6 +254,10 @@ export type FindArgs = {
|
|
|
152
254
|
* Whether to scroll found elements into view before returning them.
|
|
153
255
|
*/
|
|
154
256
|
scrollTo?: boolean | undefined;
|
|
257
|
+
/**
|
|
258
|
+
* Native test IDs that should be tried as scroll containers before falling back to viewport gestures.
|
|
259
|
+
*/
|
|
260
|
+
scrollContainerTestIDs?: string[] | undefined;
|
|
155
261
|
/**
|
|
156
262
|
* Whether to scope by the base selector.
|
|
157
263
|
*/
|