system-testing 1.0.119 → 1.0.121
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 +9 -1
- package/build/browser.d.ts +1 -1
- package/build/drivers/appium-driver.d.ts +15 -1
- package/build/drivers/appium-driver.js +36 -6
- package/build/system-test.d.ts +1 -1
- package/build/system-test.js +8 -2
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -116,7 +116,15 @@ describe("Sign in page", () => {
|
|
|
116
116
|
|
|
117
117
|
### Driver selection
|
|
118
118
|
|
|
119
|
-
SystemTest uses Selenium by default. To use Appium instead, pass a driver config when creating the instance
|
|
119
|
+
SystemTest uses Selenium by default. To use Appium instead, pass a driver config when creating the instance.
|
|
120
|
+
|
|
121
|
+
`appium` is an optional peer dependency, so browser-only installs stay lightweight. Install it (plus the Appium drivers you need) when you opt into the Appium driver:
|
|
122
|
+
|
|
123
|
+
```sh
|
|
124
|
+
npm install --save-dev appium appium-uiautomator2-driver
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Selecting `{driver: {type: "appium"}}` without `appium` installed throws an error with this instruction. If you point at an external Appium server with `serverUrl`, the `appium` package is not needed.
|
|
120
128
|
|
|
121
129
|
```js
|
|
122
130
|
await SystemTest.run({
|
package/build/browser.d.ts
CHANGED
|
@@ -72,7 +72,21 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
72
72
|
/** @type {string | undefined} */
|
|
73
73
|
chromeUserDataDir: string | undefined;
|
|
74
74
|
serverUrl: any;
|
|
75
|
-
appiumServer:
|
|
75
|
+
appiumServer: any;
|
|
76
|
+
/**
|
|
77
|
+
* Imports the optional `appium` package. Isolated as a seam so the missing-package
|
|
78
|
+
* path can be unit tested without uninstalling Appium. The specifier is widened to
|
|
79
|
+
* `string` so the build/typecheck does not statically require appium's types when the
|
|
80
|
+
* optional dependency is not installed.
|
|
81
|
+
* @returns {Promise<Record<string, any>>}
|
|
82
|
+
*/
|
|
83
|
+
loadAppiumModule(): Promise<Record<string, any>>;
|
|
84
|
+
/**
|
|
85
|
+
* Resolves Appium's `main()` for the embedded-server path, surfacing an actionable
|
|
86
|
+
* install instruction when the optional `appium` package is not installed.
|
|
87
|
+
* @returns {Promise<(serverArgs: Record<string, any>) => Promise<any>>}
|
|
88
|
+
*/
|
|
89
|
+
resolveAppiumMain(): Promise<(serverArgs: Record<string, any>) => Promise<any>>;
|
|
76
90
|
/** @returns {Promise<void>} */
|
|
77
91
|
cleanupChromeUserDataDir(): Promise<void>;
|
|
78
92
|
/**
|
|
@@ -281,11 +281,7 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
281
281
|
this.serverUrl = this.options.serverUrl;
|
|
282
282
|
}
|
|
283
283
|
else {
|
|
284
|
-
const
|
|
285
|
-
const appiumMain = appiumModule.main ?? appiumModule.default?.main;
|
|
286
|
-
if (!appiumMain) {
|
|
287
|
-
throw new Error("Appium main() is unavailable from the appium package");
|
|
288
|
-
}
|
|
284
|
+
const appiumMain = await this.resolveAppiumMain();
|
|
289
285
|
this.appiumServer = await appiumMain(serverArgs);
|
|
290
286
|
this.serverUrl = this.buildServerUrl(serverArgs);
|
|
291
287
|
}
|
|
@@ -315,6 +311,40 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
315
311
|
throw error;
|
|
316
312
|
}
|
|
317
313
|
}
|
|
314
|
+
/**
|
|
315
|
+
* Imports the optional `appium` package. Isolated as a seam so the missing-package
|
|
316
|
+
* path can be unit tested without uninstalling Appium. The specifier is widened to
|
|
317
|
+
* `string` so the build/typecheck does not statically require appium's types when the
|
|
318
|
+
* optional dependency is not installed.
|
|
319
|
+
* @returns {Promise<Record<string, any>>}
|
|
320
|
+
*/
|
|
321
|
+
async loadAppiumModule() {
|
|
322
|
+
const appiumPackage = /** @type {string} */ ("appium");
|
|
323
|
+
return await import(appiumPackage);
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Resolves Appium's `main()` for the embedded-server path, surfacing an actionable
|
|
327
|
+
* install instruction when the optional `appium` package is not installed.
|
|
328
|
+
* @returns {Promise<(serverArgs: Record<string, any>) => Promise<any>>}
|
|
329
|
+
*/
|
|
330
|
+
async resolveAppiumMain() {
|
|
331
|
+
let appiumModule;
|
|
332
|
+
try {
|
|
333
|
+
appiumModule = await this.loadAppiumModule();
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
const code = error instanceof Error ? /** @type {{code?: string}} */ (error).code : undefined;
|
|
337
|
+
if (code === "ERR_MODULE_NOT_FOUND" || code === "MODULE_NOT_FOUND") {
|
|
338
|
+
throw errorWithCause("The Appium driver requires the optional 'appium' package, which is not installed. Run `npm install --save-dev appium` (plus any Appium drivers you need, e.g. appium-uiautomator2-driver), or pass driver.options.serverUrl to use an external Appium server.", error);
|
|
339
|
+
}
|
|
340
|
+
throw error;
|
|
341
|
+
}
|
|
342
|
+
const appiumMain = appiumModule.main ?? appiumModule.default?.main;
|
|
343
|
+
if (!appiumMain) {
|
|
344
|
+
throw new Error("Appium main() is unavailable from the appium package");
|
|
345
|
+
}
|
|
346
|
+
return appiumMain;
|
|
347
|
+
}
|
|
318
348
|
/**
|
|
319
349
|
* @returns {Promise<void>}
|
|
320
350
|
*/
|
|
@@ -946,4 +976,4 @@ export default class AppiumDriver extends WebDriverDriver {
|
|
|
946
976
|
return `http://${address}:${port}${basePath}`;
|
|
947
977
|
}
|
|
948
978
|
}
|
|
949
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUMxQyxNQUFNLDBDQUEwQyxHQUFHLEdBQUcsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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TyxJQUFJLFdBQVcsQ0FBQTtRQUNqRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQTtRQUNwQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFbkksT0FBTyxVQUFVLE9BQU8sSUFBSSxJQUFJLEdBQUcsUUFBUSxFQUFFLENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQge0NvbW1hbmQsIE5hbWV9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2NvbW1hbmQuanNcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbmNvbnN0IE1BWF9OQVRJVkVfVklFV1BPUlRfU0NST0xMX1NURVBTID0gOFxuY29uc3QgREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTID0gMTgwXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogS2VlcHMgbmF0aXZlIEFwcGl1bSBzZXNzaW9ucyBhbGl2ZSB3aGlsZSB0aGUgUmVhY3QgTmF0aXZlIGFwcCBvcGVucyB0aGUgc3lzdGVtLXRlc3QgV2ViU29ja2V0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTmF0aXZlTmV3Q29tbWFuZFRpbWVvdXRDYXBhYmlsaXR5KHtjYXBhYmlsaXRpZXN9KSB7XG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhbmRyb2lkXCIpIHJldHVyblxuICBpZiAodHlwZW9mIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXNbXCJhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXRcIl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdID0gREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTXG59XG5cbi8qKlxuICogV2hldGhlciBhIGRyaXZlciBjb25maWcgcmVzb2x2ZXMgdG8gYSBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9uIHJhdGhlciB0aGFuIGEgYnJvd3Nlci5cbiAqIE5hdGl2ZSBhcHAgc2Vzc2lvbnMgbGF1bmNoIGFuIGluc3RhbGxlZCBhcHAgKG5vIGBicm93c2VyTmFtZWApLCBzbyB0aGUgc3lzdGVtLXRlc3QgaGFybmVzc1xuICogbXVzdCBzdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyBhbmQgYWxsb3cgdGhlIG5hdGl2ZS1zYWZlIGNvbm5lY3QgdGltZW91dC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5Ccm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXJDb25maWcpIHtcbiAgaWYgKGRyaXZlckNvbmZpZz8udHlwZSAhPT0gXCJhcHBpdW1cIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlckNvbmZpZy5vcHRpb25zID8/IHt9XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gb3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IG9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICByZXR1cm4gdHlwZW9mIGJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IGJyb3dzZXJOYW1lLmxlbmd0aCA9PT0gMFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhcHBpdW1cIilcbiAgICAgIGNvbnN0IGFwcGl1bU1haW4gPSBhcHBpdW1Nb2R1bGUubWFpbiA/PyBhcHBpdW1Nb2R1bGUuZGVmYXVsdD8ubWFpblxuXG4gICAgICBpZiAoIWFwcGl1bU1haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IGF3YWl0IGFwcGl1bU1haW4oc2VydmVyQXJncylcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5idWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMgPyB7Li4udGhpcy5vcHRpb25zLmNhcGFiaWxpdGllc30gOiB7fVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSAmJiAhY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBcIlwiXG4gICAgfVxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IGF3YWl0IGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7XG4gICAgICBicm93c2VyTmFtZTogdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lLFxuICAgICAgY2FwYWJpbGl0aWVzXG4gICAgfSlcbiAgICBlbnN1cmVOYXRpdmVOZXdDb21tYW5kVGltZW91dENhcGFiaWxpdHkoe2NhcGFiaWxpdGllc30pXG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS51c2luZ1NlcnZlcih0aGlzLnNlcnZlclVybClcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYXBhYmlsaXRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIud2l0aENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYkRyaXZlciA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKVxuXG4gICAgICB0aGlzLnNldFdlYkRyaXZlcih3ZWJEcml2ZXIpXG4gICAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnN0b3AoKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5hcHBpdW1TZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBBcHBpdW0gc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmFwcGl1bVNlcnZlcj59ICovICh0aGlzLmFwcGl1bVNlcnZlcikuY2xvc2UoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpIHtcbiAgICBpZiAoIXRoaXMuY2hyb21lVXNlckRhdGFEaXIpIHJldHVyblxuXG4gICAgY29uc3QgY2hyb21lVXNlckRhdGFEaXIgPSB0aGlzLmNocm9tZVVzZXJEYXRhRGlyXG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgZnMucm0oY2hyb21lVXNlckRhdGFEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzLiBTa2lwcGVkIGZvciBuYXRpdmUgYXBwIGNvbnRleHRzIHdoZXJlIGNvb2tpZVxuICAgKiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVWlBdXRvbWF0b3IyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVyblxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8ucGxhdGZvcm1OYW1lXG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIlxuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiAhYnJvd3Nlck5hbWUpIHtcbiAgICAgIGxldCBlbnRyaWVzXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQoXCJsb2djYXRcIilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nY2F0TG9ncyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaCA/IG1lc3NhZ2VNYXRjaFs0XSA6IGVudHJ5Lm1lc3NhZ2VcblxuICAgICAgICBsb2djYXRMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9nY2F0TG9nc1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgdGVzdElkU3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMudGVzdElkU3RyYXRlZ3kgPz8gXCJhY2Nlc3NpYmlsaXR5SWRcIlxuXG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImNzc1wiKSB7XG4gICAgICBjb25zdCB0ZXN0SWRBdHRyaWJ1dGUgPSB0aGlzLm9wdGlvbnMudGVzdElkQXR0cmlidXRlID8/IFwiZGF0YS10ZXN0aWRcIlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgWyR7dGVzdElkQXR0cmlidXRlfT0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBvd25zIGV4cGVjdGVkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciB1bmRlciB0aGUgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgYXdhaXQgc3VwZXIud2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IHNjb3BlZFRleHRYcGF0aCA9IGFuZHJvaWRTY29wZWRUZXh0WHBhdGgodGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2Ygc2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgc2VsZWN0b3IpKVxuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3ZXJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbMF0pIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZWRUZXh0RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS54cGF0aChzY29wZWRUZXh0WHBhdGgpKVxuICAgICAgaWYgKHNjb3BlZFRleHRFbGVtZW50c1swXSkgcmV0dXJuIHNjb3BlZFRleHRFbGVtZW50c1swXVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBBbmRyb2lkIGNvbnRyb2wgYnkgcmVzb3VyY2UgaWQsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgZmlyc3Qgd2hlbiByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SWQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwLCBzY3JvbGxUbzogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkOiAke3Rlc3RJZH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IFthbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCldXG4gICAgICB9LCBhcmdzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgY29udHJvbCwgdHJ5aW5nIGRpcmVjdCBsb29rdXAsIFVpU2Nyb2xsYWJsZSwgYW5kIHZpZXdwb3J0IGdlc3R1cmUgc2Nyb2xsaW5nLlxuICAgKiBAcGFyYW0ge05hdGl2ZUNvbnRyb2xMb29rdXB9IGxvb2t1cCBMb29rdXAgY2FsbGJhY2tzIGFuZCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyhsb29rdXAsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzID0gW10sIHNjcm9sbFRvID0gdHJ1ZSwgdGltZW91dCA9IDEwMDAwfSA9IGFyZ3NcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgIGlmICghYXR0ZW1wdGVkVWlTZWxlY3RvclNjcm9sbCkge1xuICAgICAgICAgIGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSB0cnVlXG4gICAgICAgICAgZm9yIChjb25zdCBzY3JvbGxTZWxlY3RvciBvZiBsb29rdXAuc2Nyb2xsU2VsZWN0b3JzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyhzY3JvbGxTZWxlY3Rvciwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2Nhbihsb29rdXAuZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQgPT09IDApIGJyZWFrXG4gICAgICBhd2FpdCB3YWl0KDEwMClcbiAgICB9IHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dClcblxuICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5ICR7bG9va3VwLmRlc2NyaXB0aW9ufWAsIGxhc3RFcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBuYXRpdmUgY29udGVudCBhcm91bmQgdGhlIGN1cnJlbnQgdmlld3BvcnQgc28gcmV0YWluZWQgb2Zmc2V0cyBhbmRcbiAgICogYmVsb3ctZm9sZCB0YXJnZXRzIGFyZSBib3RoIHJlYWNoYWJsZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIHRpbWVvdXQgYnVkZ2V0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBkaXJlY3RGaW5kIExvb2t1cCB0byByZXRyeSBhZnRlciBlYWNoIHNjcm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgY29udHJvbC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2NhbihkaXJlY3RGaW5kLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3QgdXBTY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG4gICAgY29uc3QgZG93blNjcm9sbFN0YXRlID0gdGhpcy5uZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKClcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUzsgaW5kZXggKz0gMSkge1xuICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydCh1cFNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcInVwXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQoZG93blNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcImRvd25cIilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIG5hdGl2ZSB2aWV3cG9ydCBzY2FuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IEZyZXNoIHNjcm9sbCBmYWxsYmFjayBzdGF0ZS5cbiAgICovXG4gIG5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyeUVsZW1lbnRTY3JvbGw6IHRydWUsXG4gICAgICB0cnlWaWV3cG9ydFNjcm9sbDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IG5hdGl2ZSBwb2xsaW5nIHdpdGhvdXQgQXBwaXVtJ3MgaW1wbGljaXQgd2FpdCBleHRlbmRpbmcgZXZlcnkgZmFpbGVkIHByb2JlLlxuICAgKiBAdGVtcGxhdGUgVFJlc3VsdCBSZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGltcGxpY2l0V2FpdE1zIEltcGxpY2l0IHdhaXQgZHVyYXRpb24gdG8gYXBwbHkgZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRSZXN1bHQ+fSBjYWxsYmFjayBXb3JrIHRoYXQgb3ducyBpdHMgb3duIHBvbGxpbmcgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhOYXRpdmVJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdGltZW91dHMgPSAvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRzfSAqLyAoYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5nZXRUaW1lb3V0cygpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiBpbXBsaWNpdFdhaXRNc30pKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKC8qKiBAdHlwZSB7TmF0aXZlVGltZW91dE9wdGlvbnN9ICovICh7aW1wbGljaXQ6IHRpbWVvdXRzLmltcGxpY2l0fSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpc2libGUgbmF0aXZlIHZpZXdwb3J0IHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHBhcmFtIHtOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvbn0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBzY3JvbGwgdGhlIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBBcHBpdW0gcGVyZm9ybXMgdGhlIGdlc3R1cmUuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVWaWV3cG9ydChzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgd2luZG93UmVjdCA9IC8qKiBAdHlwZSB7TmF0aXZlV2luZG93UmVjdH0gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkud2luZG93KCkuZ2V0UmVjdCgpKVxuICAgIGNvbnN0IGhvcml6b250YWxJbnNldCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC53aWR0aCAqIDAuMSkpXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuMikpXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCB3aW5kb3dSZWN0LndpZHRoIC0gaG9yaXpvbnRhbEluc2V0ICogMilcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3QuaGVpZ2h0ICogMC42KSlcblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsICYmIHNjcm9sbENvbnRhaW5lclRlc3RJRHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzY3JvbGxDb250YWluZXJUZXN0SUQgb2Ygc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlRWxlbWVudChzY3JvbGxDb250YWluZXJUZXN0SUQsIGRpcmVjdGlvbilcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IGhvcml6b250YWxJbnNldCxcbiAgICAgICAgICBwZXJjZW50OiAwLjc1LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZGlkU2Nyb2xsID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclggPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueCArIHdpbmRvd1JlY3Qud2lkdGggLyAyKVxuICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuNzggOiAwLjI4KSlcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIChkaXJlY3Rpb24gPT09IFwiZG93blwiID8gMC4yOCA6IDAuNzgpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlKG5ldyBDb21tYW5kKE5hbWUuQUNUSU9OUykuc2V0UGFyYW1ldGVyKFwiYWN0aW9uc1wiLCBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7ZHVyYXRpb246IDEwMCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogc3RhcnRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJEb3duXCJ9LFxuICAgICAgICAgIHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgdHlwZTogXCJwb2ludGVyTW92ZVwiLCB4OiBjZW50ZXJYLCB5OiBlbmRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJVcFwifVxuICAgICAgICBdLFxuICAgICAgICBpZDogXCJuYXRpdmUgc2Nyb2xsIGZpbmdlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcG9pbnRlclR5cGU6IFwidG91Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcInBvaW50ZXJcIlxuICAgICAgfVxuICAgIF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYSBzcGVjaWZpYyBuYXRpdmUgQW5kcm9pZCBlbGVtZW50IGJ5IHRlc3QgaWQgd2hlbiBBcHBpdW0gZXhwb3NlcyBpdCBhcyBhIHNjcm9sbCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBBcHBpdW0gcmVwb3J0ZWQgbW9yZSBjb250ZW50IHRvIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZUVsZW1lbnQodGVzdElkLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGVsZW1lbnRJZDogYXdhaXQgc2Nyb2xsRWxlbWVudC5nZXRJZCgpLFxuICAgICAgcGVyY2VudDogMC43NVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGlkU2Nyb2xsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYW4gb2Zmc2NyZWVuIEFuZHJvaWQgY29udHJvbCBpbnRvIGEgU2Nyb2xsVmlldy1iYWNrZWQgbmF0aXZlIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpU2VsZWN0b3IgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgY29udHJvbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBVaUF1dG9tYXRvciBhdHRlbXB0cyB0aGUgc2Nyb2xsLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVWlTZWxlY3RvckludG9WaWV3KHVpU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlU2VsZWN0b3JzID0gW1xuICAgICAgLi4uc2Nyb2xsQ29udGFpbmVyVGVzdElEcy5tYXAoKHNjcm9sbENvbnRhaW5lclRlc3RJRCkgPT4gYW5kcm9pZFJlc291cmNlSWRTZWxlY3RvcihzY3JvbGxDb250YWluZXJUZXN0SUQpKSxcbiAgICAgIFwibmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpXCJcbiAgICBdXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBsYXN0RXJyb3JcblxuICAgIGZvciAoY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9yIG9mIHNjcm9sbGFibGVTZWxlY3RvcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYG5ldyBVaVNjcm9sbGFibGUoJHtzY3JvbGxhYmxlU2VsZWN0b3J9KS5zY3JvbGxJbnRvVmlldygke3VpU2VsZWN0b3J9KWApKVxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsYXN0RXJyb3IpIHRocm93IGxhc3RFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
|
|
979
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUMxQyxNQUFNLDBDQUEwQyxHQUFHLEdBQUcsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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LENBQUE7SUFDL0MsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyLCBCeX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQge0NvbW1hbmQsIE5hbWV9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2NvbW1hbmQuanNcIlxuaW1wb3J0IHtPcmlnaW59IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2lucHV0LmpzXCJcbmltcG9ydCB7d2FpdH0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbmNvbnN0IE1BWF9OQVRJVkVfVklFV1BPUlRfU0NST0xMX1NURVBTID0gOFxuY29uc3QgREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTID0gMTgwXG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogS2VlcHMgbmF0aXZlIEFwcGl1bSBzZXNzaW9ucyBhbGl2ZSB3aGlsZSB0aGUgUmVhY3QgTmF0aXZlIGFwcCBvcGVucyB0aGUgc3lzdGVtLXRlc3QgV2ViU29ja2V0LlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlTmF0aXZlTmV3Q29tbWFuZFRpbWVvdXRDYXBhYmlsaXR5KHtjYXBhYmlsaXRpZXN9KSB7XG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhbmRyb2lkXCIpIHJldHVyblxuICBpZiAodHlwZW9mIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUubGVuZ3RoID4gMCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXNbXCJhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXRcIl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gIGlmIChjYXBhYmlsaXRpZXMubmV3Q29tbWFuZFRpbWVvdXQgIT09IHVuZGVmaW5lZCkgcmV0dXJuXG5cbiAgY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdID0gREVGQVVMVF9OQVRJVkVfTkVXX0NPTU1BTkRfVElNRU9VVF9TRUNPTkRTXG59XG5cbi8qKlxuICogV2hldGhlciBhIGRyaXZlciBjb25maWcgcmVzb2x2ZXMgdG8gYSBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9uIHJhdGhlciB0aGFuIGEgYnJvd3Nlci5cbiAqIE5hdGl2ZSBhcHAgc2Vzc2lvbnMgbGF1bmNoIGFuIGluc3RhbGxlZCBhcHAgKG5vIGBicm93c2VyTmFtZWApLCBzbyB0aGUgc3lzdGVtLXRlc3QgaGFybmVzc1xuICogbXVzdCBzdGFydCB0aGUgY2xpZW50IFdlYlNvY2tldCBiZWZvcmUgdGhlIGFwcCBsYXVuY2hlcyBhbmQgYWxsb3cgdGhlIG5hdGl2ZS1zYWZlIGNvbm5lY3QgdGltZW91dC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5Ccm93c2VyRHJpdmVyQ29uZmlnfSBbZHJpdmVyQ29uZmlnXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXJDb25maWcpIHtcbiAgaWYgKGRyaXZlckNvbmZpZz8udHlwZSAhPT0gXCJhcHBpdW1cIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3Qgb3B0aW9ucyA9IGRyaXZlckNvbmZpZy5vcHRpb25zID8/IHt9XG4gIGNvbnN0IGJyb3dzZXJOYW1lID0gb3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IG9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICByZXR1cm4gdHlwZW9mIGJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IGJyb3dzZXJOYW1lLmxlbmd0aCA9PT0gMFxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1NYWluID0gYXdhaXQgdGhpcy5yZXNvbHZlQXBwaXVtTWFpbigpXG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gYXdhaXQgYXBwaXVtTWFpbihzZXJ2ZXJBcmdzKVxuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLmJ1aWxkU2VydmVyVXJsKHNlcnZlckFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcyA/IHsuLi50aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzfSA6IHt9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lICYmICFjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IFwiXCJcbiAgICB9XG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gYXdhaXQgZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHtcbiAgICAgIGJyb3dzZXJOYW1lOiB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUsXG4gICAgICBjYXBhYmlsaXRpZXNcbiAgICB9KVxuICAgIGVuc3VyZU5hdGl2ZU5ld0NvbW1hbmRUaW1lb3V0Q2FwYWJpbGl0eSh7Y2FwYWJpbGl0aWVzfSlcblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpLnVzaW5nU2VydmVyKHRoaXMuc2VydmVyVXJsKVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGNhcGFiaWxpdGllcykubGVuZ3RoID4gMCkge1xuICAgICAgYnVpbGRlci53aXRoQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViRHJpdmVyID0gYXdhaXQgYnVpbGRlci5idWlsZCgpXG5cbiAgICAgIHRoaXMuc2V0V2ViRHJpdmVyKHdlYkRyaXZlcilcbiAgICAgIHRoaXMuaW5zdGFsbEV4aXRIYW5kbGVycygpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydHMgdGhlIG9wdGlvbmFsIGBhcHBpdW1gIHBhY2thZ2UuIElzb2xhdGVkIGFzIGEgc2VhbSBzbyB0aGUgbWlzc2luZy1wYWNrYWdlXG4gICAqIHBhdGggY2FuIGJlIHVuaXQgdGVzdGVkIHdpdGhvdXQgdW5pbnN0YWxsaW5nIEFwcGl1bS4gVGhlIHNwZWNpZmllciBpcyB3aWRlbmVkIHRvXG4gICAqIGBzdHJpbmdgIHNvIHRoZSBidWlsZC90eXBlY2hlY2sgZG9lcyBub3Qgc3RhdGljYWxseSByZXF1aXJlIGFwcGl1bSdzIHR5cGVzIHdoZW4gdGhlXG4gICAqIG9wdGlvbmFsIGRlcGVuZGVuY3kgaXMgbm90IGluc3RhbGxlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59XG4gICAqL1xuICBhc3luYyBsb2FkQXBwaXVtTW9kdWxlKCkge1xuICAgIGNvbnN0IGFwcGl1bVBhY2thZ2UgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKFwiYXBwaXVtXCIpXG5cbiAgICByZXR1cm4gYXdhaXQgaW1wb3J0KGFwcGl1bVBhY2thZ2UpXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQXBwaXVtJ3MgYG1haW4oKWAgZm9yIHRoZSBlbWJlZGRlZC1zZXJ2ZXIgcGF0aCwgc3VyZmFjaW5nIGFuIGFjdGlvbmFibGVcbiAgICogaW5zdGFsbCBpbnN0cnVjdGlvbiB3aGVuIHRoZSBvcHRpb25hbCBgYXBwaXVtYCBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPChzZXJ2ZXJBcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPGFueT4+fVxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUFwcGl1bU1haW4oKSB7XG4gICAgbGV0IGFwcGl1bU1vZHVsZVxuXG4gICAgdHJ5IHtcbiAgICAgIGFwcGl1bU1vZHVsZSA9IGF3YWl0IHRoaXMubG9hZEFwcGl1bU1vZHVsZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gLyoqIEB0eXBlIHt7Y29kZT86IHN0cmluZ319ICovIChlcnJvcikuY29kZSA6IHVuZGVmaW5lZFxuXG4gICAgICBpZiAoY29kZSA9PT0gXCJFUlJfTU9EVUxFX05PVF9GT1VORFwiIHx8IGNvZGUgPT09IFwiTU9EVUxFX05PVF9GT1VORFwiKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKFwiVGhlIEFwcGl1bSBkcml2ZXIgcmVxdWlyZXMgdGhlIG9wdGlvbmFsICdhcHBpdW0nIHBhY2thZ2UsIHdoaWNoIGlzIG5vdCBpbnN0YWxsZWQuIFJ1biBgbnBtIGluc3RhbGwgLS1zYXZlLWRldiBhcHBpdW1gIChwbHVzIGFueSBBcHBpdW0gZHJpdmVycyB5b3UgbmVlZCwgZS5nLiBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlciksIG9yIHBhc3MgZHJpdmVyLm9wdGlvbnMuc2VydmVyVXJsIHRvIHVzZSBhbiBleHRlcm5hbCBBcHBpdW0gc2VydmVyLlwiLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG5cbiAgICBjb25zdCBhcHBpdW1NYWluID0gYXBwaXVtTW9kdWxlLm1haW4gPz8gYXBwaXVtTW9kdWxlLmRlZmF1bHQ/Lm1haW5cblxuICAgIGlmICghYXBwaXVtTWFpbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgIH1cblxuICAgIHJldHVybiBhcHBpdW1NYWluXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5zdG9wKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuYXBwaXVtU2VydmVyPy5jbG9zZSkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgQXBwaXVtIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5hcHBpdW1TZXJ2ZXI+fSAqLyAodGhpcy5hcHBpdW1TZXJ2ZXIpLmNsb3NlKCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKSB7XG4gICAgaWYgKCF0aGlzLmNocm9tZVVzZXJEYXRhRGlyKSByZXR1cm5cblxuICAgIGNvbnN0IGNocm9tZVVzZXJEYXRhRGlyID0gdGhpcy5jaHJvbWVVc2VyRGF0YURpclxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IGZzLnJtKGNocm9tZVVzZXJEYXRhRGlyLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcy4gU2tpcHBlZCBmb3IgbmF0aXZlIGFwcCBjb250ZXh0cyB3aGVyZSBjb29raWVcbiAgICogbWFuYWdlbWVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFVpQXV0b21hdG9yMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDb29raWVzKCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm5cblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZUFsbENvb2tpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG4gICAgY29uc3QgaXNBbmRyb2lkID0gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCJcblxuICAgIGlmIChpc0FuZHJvaWQgJiYgIWJyb3dzZXJOYW1lKSB7XG4gICAgICBsZXQgZW50cmllc1xuXG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KFwibG9nY2F0XCIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvZ2NhdExvZ3MgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2ggPyBtZXNzYWdlTWF0Y2hbNF0gOiBlbnRyeS5tZXNzYWdlXG5cbiAgICAgICAgbG9nY2F0TG9ncy5wdXNoKGAke2VudHJ5LmxldmVsLm5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvZ2NhdExvZ3NcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuZ2V0QnJvd3NlckxvZ3MoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IHRlc3RJZFN0cmF0ZWd5ID0gdGhpcy5vcHRpb25zLnRlc3RJZFN0cmF0ZWd5ID8/IFwiYWNjZXNzaWJpbGl0eUlkXCJcblxuICAgIGlmICh0ZXN0SWRTdHJhdGVneSA9PT0gXCJjc3NcIikge1xuICAgICAgY29uc3QgdGVzdElkQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLnRlc3RJZEF0dHJpYnV0ZSA/PyBcImRhdGEtdGVzdGlkXCJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoYFske3Rlc3RJZEF0dHJpYnV0ZX09JyR7dGVzdElEfSddYCwgYXJncylcbiAgICB9XG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUlkKHRlc3RJRCwgYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiYWNjZXNzaWJpbGl0eSBpZFwiLCB0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaXMgZGlzcGxheWVkLiBGb3IgbmF0aXZlIGFwcCBjb250ZXh0cywgYWx3YXlzXG4gICAqIHJldHVybnMgdHJ1ZSBiZWNhdXNlIFNlbGVuaXVtJ3MgaXNEaXNwbGF5ZWQoKSBKUyBhdG9tIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICogYnkgVWlBdXRvbWF0b3IyIGluIG5hdGl2ZSBtb2RlLCBhbmQgZWxlbWVudHMgZm91bmQgYnkgVWlBdXRvbWF0b3IyJ3NcbiAgICogYWNjZXNzaWJpbGl0eSBpZCAvIGlkIHNlYXJjaCBhcmUgYWxyZWFkeSBpbiB0aGUgcmVuZGVyZWQgdmlldyBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBpc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpICYmIGFyZ3Muc2Nyb2xsVG8pIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHModGhpcy5pZExvY2F0b3IodGVzdElkKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgdGhpcy5pc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudClcblxuICAgICAgICBpZiAodmlzaWJsZSAmJiAhaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG4gICAgICAgIGlmICghdmlzaWJsZSAmJiBpc0Rpc3BsYXllZCkgY29udGludWVcblxuICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHNcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGltZUxlZnQgPT0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9LCB0aW1lTGVmdClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiICYmIGdldFRpbWVMZWZ0KCkgPiAwKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gaWQgbG9jYXRvciBmb3IgdGhlIGFjdGl2ZSBBcHBpdW0gY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBUZXN0IGlkIG9yIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEByZXR1cm5zIHtCeX0gU2VsZW5pdW0vQXBwaXVtIGxvY2F0b3IuXG4gICAqL1xuICBpZExvY2F0b3IodGVzdElkKSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICByZXR1cm4gbmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpKVxuICAgIH1cblxuICAgIHJldHVybiBCeS5pZCh0ZXN0SWQpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbmF0aXZlIEFuZHJvaWQgdmlzaWJsZSB0ZXh0IG9yIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgd2hlbiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTmF0aXZlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdGV4dC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeU5hdGl2ZVRleHQoZXhwZWN0ZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5kQnlOYXRpdmVUZXh0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBuYXRpdmUgQW5kcm9pZCBBcHBpdW0gc2Vzc2lvbnNcIilcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBbYW5kcm9pZFRleHRDb250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCksIGFuZHJvaWREZXNjcmlwdGlvbkNvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KV1cbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBzZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBzZWxlY3RvcikpXG5cbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgdGV4dCBvciBhY2Nlc3NpYmlsaXR5IGxhYmVsOiAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWAsXG4gICAgICAgIGRpcmVjdEZpbmQsXG4gICAgICAgIHNjcm9sbFNlbGVjdG9yczogc2VsZWN0b3JzXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgb3ducyBleHBlY3RlZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgdW5kZXIgdGhlIHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIGF3YWl0IHN1cGVyLndhaXRGb3JUZXN0SURUZXh0KHRlc3RJZCwgZXhwZWN0ZWRUZXh0LCBhcmdzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gbmF0aXZlVGVzdElEVGV4dFNlbGVjdG9ycyh0ZXN0SWQsIGV4cGVjdGVkVGV4dClcbiAgICBjb25zdCBzY29wZWRUZXh0WHBhdGggPSBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2VyZSBmb3VuZCBieSBpZCAke3Rlc3RJZH0gd2l0aCB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnRzWzBdKSByZXR1cm4gZWxlbWVudHNbMF1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NvcGVkVGV4dEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkueHBhdGgoc2NvcGVkVGV4dFhwYXRoKSlcbiAgICAgIGlmIChzY29wZWRUZXh0RWxlbWVudHNbMF0pIHJldHVybiBzY29wZWRUZXh0RWxlbWVudHNbMF1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBuYXRpdmVUZXN0SURUZXh0U2Nyb2xsU2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgICAgfSwgey4uLmFyZ3MsIHNjcm9sbFRvOiBhcmdzLnNjcm9sbFRvID8/IHRydWV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgQW5kcm9pZCBjb250cm9sIGJ5IHJlc291cmNlIGlkLCBzY3JvbGxpbmcgaXQgaW50byB2aWV3IGZpcnN0IHdoZW4gcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElkLCB7Li4uYXJncywgdGltZW91dDogMCwgc2Nyb2xsVG86IGZhbHNlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBpZDogJHt0ZXN0SWR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBbYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpXVxuICAgICAgfSwgYXJncylcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgbmF0aXZlIGNvbnRyb2wsIHRyeWluZyBkaXJlY3QgbG9va3VwLCBVaVNjcm9sbGFibGUsIGFuZCB2aWV3cG9ydCBnZXN0dXJlIHNjcm9sbGluZy5cbiAgICogQHBhcmFtIHtOYXRpdmVDb250cm9sTG9va3VwfSBsb29rdXAgTG9va3VwIGNhbGxiYWNrcyBhbmQgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcobG9va3VwLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcyA9IFtdLCBzY3JvbGxUbyA9IHRydWUsIHRpbWVvdXQgPSAxMDAwMH0gPSBhcmdzXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGxldCBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gZmFsc2VcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IGxhc3RFcnJvclxuXG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGxvb2t1cC5kaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgICBpZiAoIWF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwpIHtcbiAgICAgICAgICBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gdHJ1ZVxuICAgICAgICAgIGZvciAoY29uc3Qgc2Nyb2xsU2VsZWN0b3Igb2YgbG9va3VwLnNjcm9sbFNlbGVjdG9ycykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVVaVNlbGVjdG9ySW50b1ZpZXcoc2Nyb2xsU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgICAgdm9pZCBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4obG9va3VwLmRpcmVjdEZpbmQsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lb3V0ID09PSAwKSBicmVha1xuICAgICAgYXdhaXQgd2FpdCgxMDApXG4gICAgfSB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpXG5cbiAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSAke2xvb2t1cC5kZXNjcmlwdGlvbn1gLCBsYXN0RXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgbmF0aXZlIGNvbnRlbnQgYXJvdW5kIHRoZSBjdXJyZW50IHZpZXdwb3J0IHNvIHJldGFpbmVkIG9mZnNldHMgYW5kXG4gICAqIGJlbG93LWZvbGQgdGFyZ2V0cyBhcmUgYm90aCByZWFjaGFibGUgd2l0aG91dCBleGhhdXN0aW5nIHRoZSB0aW1lb3V0IGJ1ZGdldC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gZGlyZWN0RmluZCBMb29rdXAgdG8gcmV0cnkgYWZ0ZXIgZWFjaCBzY3JvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIGNvbnRyb2wuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4oZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgIGNvbnN0IHVwU2Nyb2xsU3RhdGUgPSB0aGlzLm5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKVxuICAgIGNvbnN0IGRvd25TY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTUFYX05BVElWRV9WSUVXUE9SVF9TQ1JPTExfU1RFUFM7IGluZGV4ICs9IDEpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQodXBTY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJ1cFwiKVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZGlyZWN0RmluZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVZpZXdwb3J0KGRvd25TY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJkb3duXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBuYXRpdmUgdmlld3BvcnQgc2NhblwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlfSBGcmVzaCBzY3JvbGwgZmFsbGJhY2sgc3RhdGUuXG4gICAqL1xuICBuZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cnlFbGVtZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgdHJ5Vmlld3BvcnRTY3JvbGw6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBuYXRpdmUgcG9sbGluZyB3aXRob3V0IEFwcGl1bSdzIGltcGxpY2l0IHdhaXQgZXh0ZW5kaW5nIGV2ZXJ5IGZhaWxlZCBwcm9iZS5cbiAgICogQHRlbXBsYXRlIFRSZXN1bHQgUmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbXBsaWNpdFdhaXRNcyBJbXBsaWNpdCB3YWl0IGR1cmF0aW9uIHRvIGFwcGx5IGR1cmluZyB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUUmVzdWx0Pn0gY2FsbGJhY2sgV29yayB0aGF0IG93bnMgaXRzIG93biBwb2xsaW5nIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRSZXN1bHQ+fSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoTmF0aXZlSW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHRpbWVvdXRzID0gLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0c30gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuZ2V0VGltZW91dHMoKSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0T3B0aW9uc30gKi8gKHtpbXBsaWNpdDogaW1wbGljaXRXYWl0TXN9KSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiB0aW1lb3V0cy5pbXBsaWNpdH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSB2aXNpYmxlIG5hdGl2ZSB2aWV3cG9ydCB3aGVuIFVpU2Nyb2xsYWJsZSBjYW5ub3QgaWRlbnRpZnkgdGhlIG93bmluZyBTY3JvbGxWaWV3LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IHNjcm9sbFN0YXRlIFBlci1sb29rdXAgQXBwaXVtIHNjcm9sbCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgQXBwaXVtIHBlcmZvcm1zIHRoZSBnZXN0dXJlLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVmlld3BvcnQoc2Nyb2xsU3RhdGUsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMsIGRpcmVjdGlvbikge1xuICAgIGNvbnN0IHdpbmRvd1JlY3QgPSAvKiogQHR5cGUge05hdGl2ZVdpbmRvd1JlY3R9ICovIChhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLndpbmRvdygpLmdldFJlY3QoKSlcbiAgICBjb25zdCBob3Jpem9udGFsSW5zZXQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3Qud2lkdGggKiAwLjEpKVxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC5oZWlnaHQgKiAwLjIpKVxuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgd2luZG93UmVjdC53aWR0aCAtIGhvcml6b250YWxJbnNldCAqIDIpXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuNikpXG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCAmJiBzY3JvbGxDb250YWluZXJUZXN0SURzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgc2Nyb2xsQ29udGFpbmVyVGVzdElEIG9mIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkaWRTY3JvbGwgPSBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZUVsZW1lbnQoc2Nyb2xsQ29udGFpbmVyVGVzdElELCBkaXJlY3Rpb24pXG4gICAgICAgICAgaWYgKGRpZFNjcm9sbCkgcmV0dXJuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCA9IGZhbHNlXG4gICAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBsZWZ0OiBob3Jpem9udGFsSW5zZXQsXG4gICAgICAgICAgcGVyY2VudDogMC43NSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgd2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGRpZFNjcm9sbCA9PT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjZW50ZXJYID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnggKyB3aW5kb3dSZWN0LndpZHRoIC8gMilcbiAgICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueSArIHdpbmRvd1JlY3QuaGVpZ2h0ICogKGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyAwLjc4IDogMC4yOCkpXG4gICAgY29uc3QgZW5kWSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuMjggOiAwLjc4KSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZShuZXcgQ29tbWFuZChOYW1lLkFDVElPTlMpLnNldFBhcmFtZXRlcihcImFjdGlvbnNcIiwgW1xuICAgICAge1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge2R1cmF0aW9uOiAxMDAsIG9yaWdpbjogT3JpZ2luLlZJRVdQT1JULCB0eXBlOiBcInBvaW50ZXJNb3ZlXCIsIHg6IGNlbnRlclgsIHk6IHN0YXJ0WX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyRG93blwifSxcbiAgICAgICAgICB7ZHVyYXRpb246IDI1MCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogZW5kWX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyVXBcIn1cbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IFwibmF0aXZlIHNjcm9sbCBmaW5nZXJcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHBvaW50ZXJUeXBlOiBcInRvdWNoXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogXCJwb2ludGVyXCJcbiAgICAgIH1cbiAgICBdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGEgc3BlY2lmaWMgbmF0aXZlIEFuZHJvaWQgZWxlbWVudCBieSB0ZXN0IGlkIHdoZW4gQXBwaXVtIGV4cG9zZXMgaXQgYXMgYSBzY3JvbGwgY29udGFpbmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsRGlyZWN0aW9ufSBkaXJlY3Rpb24gRGlyZWN0aW9uIHRvIHNjcm9sbCB0aGUgY29udGVudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgQXBwaXVtIHJlcG9ydGVkIG1vcmUgY29udGVudCB0byBzY3JvbGwuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVFbGVtZW50KHRlc3RJZCwgZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpKVxuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSBlbGVtZW50c1swXVxuXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50KSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBlbGVtZW50SWQ6IGF3YWl0IHNjcm9sbEVsZW1lbnQuZ2V0SWQoKSxcbiAgICAgIHBlcmNlbnQ6IDAuNzVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRpZFNjcm9sbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGFuIG9mZnNjcmVlbiBBbmRyb2lkIGNvbnRyb2wgaW50byBhIFNjcm9sbFZpZXctYmFja2VkIG5hdGl2ZSBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aVNlbGVjdG9yIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgVWlBdXRvbWF0b3IgYXR0ZW1wdHMgdGhlIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyh1aVNlbGVjdG9yLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAgIC4uLnNjcm9sbENvbnRhaW5lclRlc3RJRHMubWFwKChzY3JvbGxDb250YWluZXJUZXN0SUQpID0+IGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3Ioc2Nyb2xsQ29udGFpbmVyVGVzdElEKSksXG4gICAgICBcIm5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKVwiXG4gICAgXVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBmb3IgKGNvbnN0IHNjcm9sbGFibGVTZWxlY3RvciBvZiBzY3JvbGxhYmxlU2VsZWN0b3JzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGBuZXcgVWlTY3JvbGxhYmxlKCR7c2Nyb2xsYWJsZVNlbGVjdG9yfSkuc2Nyb2xsSW50b1ZpZXcoJHt1aVNlbGVjdG9yfSlgKSlcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGFzdEVycm9yKSB0aHJvdyBsYXN0RXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGEgbmF0aXZlIEFuZHJvaWQgYXBwLCBub3QgQW5kcm9pZCBDaHJvbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIHdoZW4gVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgbG9va3VwIHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybU5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5wbGF0Zm9ybU5hbWVcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiICYmICFicm93c2VyTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gc2VydmVyQXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRTZXJ2ZXJVcmwoc2VydmVyQXJncykge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXJBcmdzLmFkZHJlc3MgPz8gXCIxMjcuMC4wLjFcIlxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2ZXJBcmdzLnBvcnQgPz8gNDcyM1xuICAgIGNvbnN0IGJhc2VQYXRoID0gc2VydmVyQXJncy5iYXNlUGF0aCA/IChzZXJ2ZXJBcmdzLmJhc2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc2VydmVyQXJncy5iYXNlUGF0aCA6IGAvJHtzZXJ2ZXJBcmdzLmJhc2VQYXRofWApIDogXCJcIlxuXG4gICAgcmV0dXJuIGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9JHtiYXNlUGF0aH1gXG4gIH1cbn1cbiJdfQ==
|
package/build/system-test.d.ts
CHANGED
package/build/system-test.js
CHANGED
|
@@ -287,7 +287,7 @@ class SystemTest extends Browser {
|
|
|
287
287
|
}
|
|
288
288
|
}
|
|
289
289
|
/**
|
|
290
|
-
* Visits a path.
|
|
290
|
+
* Visits a path. Connected browser contexts navigate in-app to preserve local state; unavailable web bridges reload through the driver.
|
|
291
291
|
* @param {string} path
|
|
292
292
|
* @param {import("./browser.js").BrowserNavigationArgs} [args]
|
|
293
293
|
* @returns {Promise<void>}
|
|
@@ -297,6 +297,12 @@ class SystemTest extends Browser {
|
|
|
297
297
|
await super.visit(path, args);
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
|
+
const commandWebSocket = this.communicator?.ws;
|
|
301
|
+
const canUseInAppNavigation = this.communicatorExists() && commandWebSocket?.readyState === 1;
|
|
302
|
+
if (canUseInAppNavigation) {
|
|
303
|
+
await super.visit(this.buildSystemTestPath(path), args);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
300
306
|
await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while visiting path: ${path}` }, async () => {
|
|
301
307
|
await this.visitPathWithDriverAndReconnect(path);
|
|
302
308
|
await this.initializeBrowserContext();
|
|
@@ -1086,4 +1092,4 @@ class SystemTest extends Browser {
|
|
|
1086
1092
|
}
|
|
1087
1093
|
SystemTest.rootPath = "/blank?systemTest=true";
|
|
1088
1094
|
export default SystemTest;
|
|
1089
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFFeEUsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUE7QUFDN0MsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTTtJQUN2QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFO0lBQ2hFLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQTtBQUN0SCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSDs7R0FFRztBQUNIOzs7O0dBSUc7QUFDSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSDs7R0FFRztBQUNIOzs7R0FHRztBQUNIOzs7R0FHRztBQUVIOzs7R0FHRztBQUNILFNBQVMsc0NBQXNDLENBQUMsT0FBTztJQUNyRCxPQUFPLGdFQUFnRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUN2RixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQTtBQUU1QixNQUFxQixVQUFXLFNBQVEsT0FBTztJQXlCN0M7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQixTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdDLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdEMsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQTtJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRTtRQUNqQixJQUFJLE9BQU8sSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQTtRQUN0RCxJQUFJLGFBQWEsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQy9ELElBQUksb0JBQW9CLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFBO1FBQzVGLElBQUksb0JBQW9CLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFBO0lBQy9GLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsZUFBZTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFBO1FBQzdELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUE7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxJQUFJO1FBQ3RCLElBQUksSUFBSSxZQUFZLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7UUFDOUMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUE7UUFDckYsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFekMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtRQUV6RSxJQUFJLFVBQVUsWUFBWSxLQUFLLElBQUksT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFBRSxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUE7UUFDcEcsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRO1lBQUUsT0FBTyxVQUFVLENBQUE7UUFFckQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFJO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUU5QyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQTtZQUM5RCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUE7WUFDOUQsSUFBSSxzQ0FBc0MsQ0FBQyxPQUFPLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUE7UUFDbEUsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzNELE9BQU8sSUFBSSxDQUFBO1FBQ2IsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0g7Ozs7OztPQU1HO0lBQ0g7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUTtRQUM3QixNQUFNLGdCQUFnQixHQUFHLE9BQU8sSUFBSSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDckUsTUFBTSxFQUFDLHdCQUF3QixHQUFHLElBQUksRUFBRSxHQUFHLGNBQWMsRUFBQyxHQUFHLGdDQUFnQyxDQUFDLENBQUMsT0FBTyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUM1SSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRS9DLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtRQUN2RCxDQUFDO1FBRUQsVUFBVSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7UUFDOUIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxjQUFjLEVBQUMsQ0FBQyxDQUFBO1FBRTlGLFVBQVUsQ0FBQyxRQUFRLENBQUMsNkNBQTZDLENBQUMsQ0FBQTtRQUNsRSxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUU5QyxVQUFVLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUV6QyxNQUFNLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUVoRCxVQUFVLENBQUMsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUE7UUFDcEQsTUFBTSxVQUFVLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUUzQyxzQkFBc0I7UUFDdEIsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFBO1FBQ3hCLHNCQUFzQjtRQUN0QixJQUFJLGFBQWEsR0FBRyxTQUFTLENBQUE7UUFFN0IsSUFBSSxDQUFDO1lBQ0gsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1lBQzdDLE1BQU0sVUFBVSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtZQUNwRSxVQUFVLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFFdEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1lBQ3ZDLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbEMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLFFBQVEsQ0FBQyx3Q0FBd0MsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtZQUM3RyxNQUFNLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQTtZQUVqQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLENBQUM7Z0JBQVMsQ0FBQztZQUNULFVBQVUsQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsQ0FBQTtZQUNuRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFBO1lBQ2xELG1GQUFtRjtZQUNuRiwrRUFBK0U7WUFDL0Usa0RBQWtEO1lBQ2xELE1BQU0sUUFBUSxHQUFHLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFBO1lBRTFGLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ2IsVUFBVSxDQUFDLFFBQVEsQ0FBQyxpR0FBaUcsQ0FBQyxDQUFBO1lBQ3hILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBTSxFQUFFLFlBQVksRUFBRSwrQ0FBK0MsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUN6RyxNQUFNLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtvQkFDcEUsQ0FBQyxDQUFDLENBQUE7Z0JBQ0osQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLGFBQWEsR0FBRyxLQUFLLENBQUE7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDO1lBRUQsVUFBVSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUE7WUFDOUIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDckcsQ0FBQztRQUVELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUNsQixPQUFPLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxFQUFFLGFBQWEsQ0FBQyxDQUFBO1lBQ2hGLENBQUM7WUFFRCxJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQztvQkFDSCxVQUFVLENBQUMsUUFBUSxDQUFDLHNDQUFzQyxDQUFDLENBQUE7b0JBQzNELE1BQU0sVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFBO29CQUMvQixVQUFVLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7Z0JBQ2xFLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLG9EQUFvRCxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUM1RSxDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sUUFBUSxDQUFBO1FBQ2hCLENBQUM7UUFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUksd0JBQXdCLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDO29CQUNILFVBQVUsQ0FBQyxRQUFRLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtvQkFDaEUsTUFBTSxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUE7b0JBQy9CLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtnQkFDdkUsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsd0RBQXdELEVBQUUsS0FBSyxDQUFDLENBQUE7Z0JBQ2hGLENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxhQUFhLENBQUE7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFFBQVE7UUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQ0FBa0MsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUMzRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUVuRCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLG1FQUFtRSxDQUFDLENBQUE7WUFDbEYsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtZQUNoQyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFBO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsOEJBQThCLENBQUMsQ0FBQTtRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDekIsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUMzQyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzdCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxPQUFPLENBQ1gsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLEVBQUUsZ0NBQWdDLElBQUksRUFBRSxFQUFDLEVBQ3JHLEtBQUssSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDaEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQTtRQUN2QyxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLHdCQUF3QjtRQUM1QixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFNLEVBQUUsWUFBWSxFQUFFLGlEQUFpRCxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDM0csTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUE7UUFDaEUsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxJQUFJO1FBQ3hDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFBO1FBQ3JDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDaEMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLElBQUksRUFBRSxDQUFDLENBQUE7UUFDNUMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNEQUFzRCxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVELHNCQUFzQjtJQUN0Qiw4QkFBOEI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQTtRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksSUFBSSxDQUFDLDRCQUE0QixxREFBcUQsQ0FBQyxDQUFBO0lBQ25ILENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxzQkFBc0IsRUFBRSxJQUFJLEdBQUcsV0FBVyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsUUFBUSxHQUFHLFdBQVcsRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsR0FBRyxJQUFJLEVBQUUsa0JBQWtCLEdBQUcsS0FBSyxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLFFBQVEsRUFBQyxHQUFHLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1FBQ2hYLEtBQUssQ0FBQyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFBO1FBcFN4QixpREFBaUQ7UUFDakQsaUJBQVksR0FBRyxTQUFTLENBQUE7UUFFeEIsYUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNoQixrQkFBYSxHQUFHLElBQUksQ0FBQTtRQUNwQiw0QkFBdUIsR0FBRyxtQ0FBbUMsQ0FBQTtRQUM3RCxjQUFTLEdBQUcsV0FBVyxDQUFBO1FBQ3ZCLGNBQVMsR0FBRyxJQUFJLENBQUE7UUFDaEIsd0JBQW1CLEdBQUcsSUFBSSxDQUFBO1FBQzFCLHdCQUFtQixHQUFHLEtBQUssQ0FBQTtRQUMzQixvREFBb0Q7UUFDcEQsaUJBQVksR0FBRyxTQUFTLENBQUE7UUFDeEIsc0JBQXNCO1FBQ3RCLG1CQUFjLEdBQUcsRUFBRSxDQUFBO1FBQ25CLG1CQUFjLEdBQUcsSUFBSSxDQUFBO1FBQ3JCLHFCQUFxQjtRQUNyQixpQ0FBNEIsR0FBRyxDQUFDLENBQUE7UUFDaEMsMENBQTBDO1FBQzFDLGlCQUFZLEdBQUcsU0FBUyxDQUFBO1FBQ3hCLDBDQUEwQztRQUMxQyxjQUFTLEdBQUcsU0FBUyxDQUFBO1FBbTRCckI7Ozs7V0FJRztRQUNILHNCQUFpQixHQUFHLEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQTtZQUN0QixJQUFJLE1BQU0sQ0FBQTtZQUVWLElBQUksSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDO2dCQUM1QixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFFakQsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQzdDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7d0JBQzdCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDakMsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDM0MsQ0FBQztpQkFBTSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxvQkFBb0IsRUFBRSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3hCLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUE7WUFDdEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0NBQStDLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzdFLENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQTtRQUNmLENBQUMsQ0FBQTtRQUVEOzs7O1dBSUc7UUFDSCwwQkFBcUIsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7WUFDWixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQTtZQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUE7WUFFL0IsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBRTFELG1CQUFtQjtZQUNuQixJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtZQUU5RCxJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsb0NBQW9DLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3BELE9BQU8sSUFBSSxDQUFDLG9DQUFvQyxDQUFBO2dCQUNoRCxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQTtZQUNqRCxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsc0JBQXNCO1FBQ3RCLHFCQUFnQixHQUFHLEdBQUcsRUFBRTtZQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtZQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1lBRWhDLElBQUksSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDLENBQUE7Z0JBQ2hHLE9BQU8sSUFBSSxDQUFDLG1DQUFtQyxDQUFBO2dCQUMvQyxPQUFPLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQTtZQUNsRCxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBanJCQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTFDLElBQUksWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUE7UUFDakMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLHNCQUFzQixJQUFJLG9DQUFvQyxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQTtRQUN2RyxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQTtRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQTtRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFBO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFBO1FBQ25CLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQTtRQUM3QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUE7UUFDN0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUE7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUE7UUFFckMscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRXBCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksc0JBQXNCLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQTtRQUNuRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNaLElBQUksSUFBSSxDQUFDLFlBQVk7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUE7UUFFMUUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQTtRQUNwRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYTtRQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFlBQVksRUFBRSw2Q0FBNkMsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSw4Q0FBOEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ25NLENBQUM7UUFDRCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLDRCQUE0QixDQUFDLENBQUE7SUFDbEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLEtBQUs7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDcEQsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsa0VBQWtFLENBQUMsQ0FBQTtRQUNqRixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLCtDQUErQyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDNUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQTtRQUN0RSxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsNERBQTRELENBQUMsQ0FBQTtRQUUzRTs7O1dBR0c7UUFDSCxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxLQUFLLENBQUMsQ0FBQTtRQUV0RSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFBO1FBQ2hELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUE7UUFDL0UsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRS9ELElBQUksbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsbURBQW1ELG1CQUFtQixDQUFDLE1BQU0sYUFBYSxDQUFDLENBQUE7WUFDekcsT0FBTyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDNUQsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMseUZBQXlGLGVBQWUsQ0FBQyxNQUFNLGNBQWMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsQ0FBQTtRQUVoTCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxrREFBa0Q7UUFDbEQsSUFBSSxXQUFXLENBQUE7UUFDZixNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNuRCxDQUFDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLHdDQUF3QyxFQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQzNJLFdBQVcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQzt3QkFBRSxPQUFNO29CQUNqQyxlQUFlLEVBQUUsQ0FBQTtvQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO29CQUM3RCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ2pCLENBQUMsQ0FBQTtnQkFFRCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ2xELENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDTCxDQUFDO2dCQUFTLENBQUM7WUFDVCxlQUFlLEVBQUUsQ0FBQTtRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDM0IsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2hFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBRWxDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDOUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ25FLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBRWxDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDNUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ2pFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBRWxDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsSUFBSTtRQUNuQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtRQUNsQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUM5RCxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDakUsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFFbEMsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJO1FBQzdCLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN2RSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtRQUVsQyxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUk7UUFDMUIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3BFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBRWxDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxHQUFHLEVBQUU7UUFDbEMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3ZFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBRWxDLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxLQUFLLENBQUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUk7UUFDckQsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFDbEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7UUFDL0YsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUE7UUFFbEMsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUN2QyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUE7UUFFakIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQTtZQUNyQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsa0NBQWtDLENBQUMsRUFBRSxDQUFDO2dCQUMzRixTQUFTO1lBQ1gsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxFQUFFLENBQUMsQ0FBQTtRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3pDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO1FBQ2xDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFBO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsb0JBQW9CO1FBQ3hCLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDbkgsTUFBTSx3QkFBd0IsR0FBRyxFQUFFLENBQUE7UUFFbkMsS0FBSyxNQUFNLDBCQUEwQixJQUFJLDJCQUEyQixFQUFFLENBQUM7WUFDckUsTUFBTSxJQUFJLEdBQUcsTUFBTSwwQkFBMEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUV2RCx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDckMsQ0FBQztRQUVELE9BQU8sd0JBQXdCLENBQUE7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixFQUFFLElBQUksR0FBRyxFQUFFO1FBQ3BFLE1BQU0sRUFBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFDLEdBQUcsSUFBSSxDQUFBO1FBRTFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pFLENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLENBQUE7UUFDMUMsSUFBSSwrQkFBK0IsQ0FBQTtRQUNuQyxJQUFJLDZCQUE2QixDQUFBO1FBRWpDLE1BQU0sT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7WUFFcEgsS0FBSyxNQUFNLDBCQUEwQixJQUFJLDJCQUEyQixFQUFFLENBQUM7Z0JBQ3JFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsa0NBQWtDLEVBQUUsMEJBQTBCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLE1BQU0sMEJBQTBCLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBRXhMLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO29CQUNuRSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtnQkFDM0QsQ0FBQztnQkFFRCxJQUFJLG1CQUFtQixJQUFJLDJCQUEyQixFQUFFLENBQUM7b0JBQ3ZELCtCQUErQixHQUFHLDBCQUEwQixDQUFBO29CQUM1RCw2QkFBNkIsR0FBRyxNQUFNLDBCQUEwQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQTtvQkFDM0YsT0FBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLDJCQUEyQix3QkFBd0IsK0JBQStCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxSSxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksK0JBQStCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDL0MsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLCtCQUErQixFQUFFLE9BQU8sQ0FBQyxDQUFBLENBQUMsbUNBQW1DO1lBQ2pHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7WUFDdkUsQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9EQUFvRCw2QkFBNkIsSUFBSSxFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUE7UUFDL0ksQ0FBQztJQUNILENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsS0FBSyxDQUFDLDJCQUEyQjtRQUMvQixNQUFNLDJCQUEyQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxxQ0FBcUMsRUFBRSxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBRW5ILEtBQUssTUFBTSwwQkFBMEIsSUFBSSwyQkFBMkIsRUFBRSxDQUFDO1lBQ3JFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMxRCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMscUNBQXFDLEVBQUUsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQTtJQUMvRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQSxDQUFDLENBQUM7SUFFcEM7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQzdCLCtGQUErRjtRQUMvRixpR0FBaUc7UUFDakcsd0NBQXdDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUUxRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFBO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUN4QyxDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1lBQ3RELElBQUksQ0FBQyxRQUFRLENBQUMsNEJBQTRCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBO1FBQzlELENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUE7WUFDM0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7WUFFM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUNyRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQztnQkFDbkQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3BCLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7YUFDaEMsQ0FBQyxDQUFBO1lBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFBO1lBQ3JDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFBO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtZQUM1QyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFDLENBQUMsQ0FBQTtZQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUE7UUFDdEMsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHVFQUF1RSxDQUFDLENBQUE7UUFDMUYsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFbkQsK0VBQStFO1FBQy9FLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUseUVBQXlFO1FBQ3pFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzREFBc0QsQ0FBQyxDQUFBO1lBQ3JFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7WUFDakMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQzNDLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDaEMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFL0IsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUV2QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsZ0RBQWdEO1lBQ2hELElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtZQUMxQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtRQUMzQyxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLDJFQUEyRTtZQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUE7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1lBQ25DLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFFOUMsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtnQkFDbEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFBO2dCQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7Z0JBRWhELElBQUksQ0FBQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQTtnQkFDL0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMxRyxJQUFJLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLENBQUE7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtZQUN4RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsUUFBUSxDQUFDLG9FQUFvRSxDQUFDLENBQUE7Z0JBQ25GLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLHNFQUFzRSxDQUFDLENBQUE7Z0JBQ3JGLE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsK0NBQStDLENBQUMsQ0FBQTtnQkFDOUQsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO2dCQUMxRyxJQUFJLENBQUMsUUFBUSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7WUFDOUQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzRUFBc0UsQ0FBQyxDQUFBO2dCQUNyRixNQUFNLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtnQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFBO2dCQUN2RixNQUFNLEtBQUssQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO1FBRUQsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsbURBQW1ELENBQUMsQ0FBQTtRQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUE7UUFDdkMsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtRQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUE7UUFFM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLHlEQUF5RCxDQUFDLENBQUE7WUFDeEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyw4REFBOEQsQ0FBQyxDQUFBO1lBQ3BGLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUNwQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLFFBQVE7UUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUVoRCxPQUFPLElBQUksRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDO2dCQUNILE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDaEMsT0FBTTtZQUNSLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsK0JBQStCLENBQUMsQ0FBQTtnQkFDdEUsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQTtnQkFDbEMsTUFBTSxxQkFBcUIsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLDhCQUE4QixDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO2dCQUVqSSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUNyRCxNQUFNLFVBQVUsQ0FBQTtnQkFDbEIsQ0FBQztnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGlFQUFpRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO2dCQUN6RixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDN0YsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUE7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFdBQVcsQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILGFBQWE7UUFDWCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRTlELElBQUksQ0FBQyxRQUFRLENBQUMsMkJBQTJCLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFFcEQsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBQyxJQUFJO1FBQ3RCLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDaEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLGtCQUFrQixDQUFDLENBQUE7UUFDN0MsTUFBTSxXQUFXLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUUsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO2dCQUFFLE9BQU07WUFDakQsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzdDLENBQUMsQ0FBQTtRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsWUFBWSxlQUFlLEVBQUUsQ0FBQztnQkFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDekMsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDekIsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDekQsV0FBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQTtnQkFDekIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDeEMsV0FBVyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuRixXQUFXLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBQzNELENBQUM7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3JGLFdBQVcsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7UUFDN0QsQ0FBQztRQUVELElBQUksYUFBYTtZQUFFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQTtRQUVsQyxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtJQUNsRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQjtRQUMxQixJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLHVEQUF1RCxFQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xLLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO29CQUNaLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDbEIsT0FBTTtnQkFDUixDQUFDO2dCQUVELElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxNQUFNLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxPQUFPLENBQUE7WUFDckQsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNMLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsbUNBQW1DLENBQUE7WUFDL0MsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQUE7WUFDaEQsTUFBTSxLQUFLLENBQUE7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtRQUNoRSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDNUIsaURBQWlELENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUMvRixDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUV0QixJQUFJLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsbUNBQW1DLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUNuRyxPQUFPLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQTtnQkFDL0MsT0FBTyxJQUFJLENBQUMsb0NBQW9DLENBQUE7WUFDbEQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsUUFBUTtRQUNoQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFBO0lBQ3BDLENBQUM7SUFvRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxJQUFJO1FBQ2QsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTTtRQUV4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUE7UUFFN0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILG9CQUFvQixDQUFDLElBQUk7UUFDdkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsa0JBQWtCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFM0UsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFNBQVMsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDdkUsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRS9CLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILDJCQUEyQjtRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU07UUFFckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUUzQyxJQUFJLFlBQVk7WUFBRSxNQUFNLFlBQVksQ0FBQTtJQUN0QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQUk7UUFDUixNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUMxQixJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNaLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUE7WUFDZixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNoQixDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFBO1FBQzFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNqQyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUE7WUFDNUMsTUFBTSxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFlBQVksRUFBRSxtQ0FBbUMsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUN2SSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2hCLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFBO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFBO1FBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDMUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUE7UUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQTtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQTtRQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUNoQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsQ0FBQyxDQUFBO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUE7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQTtRQUNqQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsU0FBUyxDQUFBO1FBQ3BELElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxTQUFTLENBQUE7UUFDckQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHNCQUFzQixDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBQyxDQUFDLENBQUE7UUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFdkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3BCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsa0JBQWtCO1FBQ3hELElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTTtRQUVoQixNQUFNLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLHlCQUF5QixLQUFLLEVBQUUsRUFBQyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3SSxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUE7WUFDbkIsTUFBTSxlQUFlLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDO29CQUNILE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtnQkFDcEIsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsNEJBQTRCO2dCQUM5QixDQUFDO1lBQ0gsQ0FBQyxDQUFBO1lBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ3RGLElBQUksT0FBTztvQkFBRSxPQUFNO2dCQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFBO2dCQUNkLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNmLENBQUMsQ0FBQTtZQUVELEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUNuRCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ25ELElBQUksR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDdEMsQ0FBQztZQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDbEIsSUFBSSxLQUFLO29CQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7O29CQUMzQixNQUFNLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1lBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNMLENBQUM7O0FBdmxDTSxtQkFBUSxHQUFHLHdCQUF3QixBQUEzQixDQUEyQjtlQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZGlnZ30gZnJvbSBcImRpZ2dlcml6ZVwiXG5pbXBvcnQgU2VydmVyIGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvc2VydmVyL2luZGV4LmpzXCJcbmltcG9ydCBTZXJ2ZXJXZWJTb2NrZXQgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvY29ubmVjdGlvbnMvd2ViLXNvY2tldC9pbmRleC5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdENvbW11bmljYXRvciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1jb21tdW5pY2F0b3IuanNcIlxuaW1wb3J0IFN5c3RlbVRlc3RIdHRwU2VydmVyIGZyb20gXCIuL3N5c3RlbS10ZXN0LWh0dHAtc2VydmVyLmpzXCJcbmltcG9ydCB7d2FpdCwgd2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB7ZW5zdXJlRXJyb3J9IGZyb20gXCJ0eXBhbmljXCJcbmltcG9ydCB7V2ViU29ja2V0U2VydmVyfSBmcm9tIFwid3NcIlxuaW1wb3J0IEJyb3dzZXIgZnJvbSBcIi4vYnJvd3Nlci5qc1wiXG5pbXBvcnQge2lzQXBwaXVtTmF0aXZlQXBwRHJpdmVyQ29uZmlnfSBmcm9tIFwiLi9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanNcIlxuXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDMwMDAwXG5jb25zdCBJTklUSUFMX1JPT1RfVklTSVRfUkVUUllfREVMQVlfTVMgPSAxMDBcbmNvbnN0IE5BVElWRV9DTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDEyMDAwMFxuXG4vKipcbiAqIFdoZXRoZXIgYSBzeXN0ZW0gdGVzdCBydW5zIGFnYWluc3QgYSBuYXRpdmUgYXBwIHJhdGhlciB0aGFuIGEgd2ViL2Rpc3QgYnJvd3Nlci5cbiAqIFRydWUgZm9yIGBTWVNURU1fVEVTVF9IT1NUPW5hdGl2ZWAgYW5kIGZvciBuYXRpdmUgQXBwaXVtIGFwcCBzZXNzaW9ucyByZWdhcmRsZXNzIG9mIGhvc3QuXG4gKiBAcGFyYW0ge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlQXBwU2Vzc2lvbihkcml2ZXIpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCIgfHwgaXNBcHBpdW1OYXRpdmVBcHBEcml2ZXJDb25maWcoZHJpdmVyKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7e2RyaXZlcj86IFN5c3RlbVRlc3REcml2ZXJDb25maWd9fSBbYXJnc11cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2xpZW50V2ViU29ja2V0Q29ubmVjdFRpbWVvdXQoe2RyaXZlcn0gPSB7fSkge1xuICByZXR1cm4gaXNOYXRpdmVBcHBTZXNzaW9uKGRyaXZlcikgPyBOQVRJVkVfQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVMgOiBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NU1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3RBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIEhvc3RuYW1lIGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gUG9ydCBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBIb3N0XSBIb3N0bmFtZSBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHR0cFBvcnRdIFBvcnQgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBDb25uZWN0SG9zdF0gSG9zdG5hbWUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIHJlYWNoIHRoZSBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBhbnkpID0+IGJvb2xlYW59IFtlcnJvckZpbHRlcl0gRmlsdGVyIGZvciBicm93c2VyIGVycm9ycyAocmV0dXJuIGZhbHNlIHRvIGlnbm9yZSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsT25Ccm93c2VyRXJyb3JdIFRocm93IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMgZnJvbSBmaW5kZXIvaW50ZXJhY3QgaGVscGVycy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxPbkNvbnNvbGVFcnJvcl0gVHJlYXQgYnJvd3NlciBjb25zb2xlLmVycm9yIGNhbGxzIGFzIHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWVudFdzUG9ydF0gUG9ydCBmb3IgdGhlIGJyb3dzZXItY29tbWFuZCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGllbnRXc0Nvbm5lY3RUaW1lb3V0XSBUaW1lb3V0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBjbGllbnQgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2NvdW5kcmVsUG9ydF0gUG9ydCBmb3IgdGhlIFNjb3VuZHJlbCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbdXJsQXJnc10gUXVlcnkgcGFyYW1zIGFwcGVuZGVkIHRvIHRoZSByb290IHBhdGguXG4gKiBAcHJvcGVydHkge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtTeXN0ZW1UZXN0QXJncyAmIHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmU/OiBib29sZWFufX0gU3lzdGVtVGVzdFJ1bkFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge1wiYWN0aW9uc1wiIHwgXCJodW1hblwiIHwgXCJqc1wifSBbbWV0aG9kXSBPdmVycmlkZSB0aGUgY2xpY2sgcGF0aC4gYFwiYWN0aW9uc1wiYCB1c2VzIHRoZSBTZWxlbml1bSBBY3Rpb25zIEFQSSAocmVhbCBwb2ludGVyIG1vdmUgKyBjbGljayk7IGBcImh1bWFuXCJgIHVzZXMgbXVsdGlwbGUgcG9pbnRlciBtb3ZlcyBhbmQgcGF1c2VzIGJlZm9yZSBjbGlja2luZzsgYFwianNcImAgZGlzcGF0Y2hlcyBgZWxlbWVudC5jbGljaygpYCB2aWEgYGV4ZWN1dGVTY3JpcHRgIGluc2lkZSB0aGUgcGFnZSdzIEpTIGNvbnRleHQgYW5kIGlzIGZvciBkaWFnbm9zdGljcyBvbmx5LCBub3QgY29tbWl0dGVkIHN0YWJpbGl6YXRpb24gZml4ZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWNrT2Zmc2V0WF0gWCBvZmZzZXQgZm9yIGBhY3Rpb25zYC9gaHVtYW5gIHBvaW50ZXIgY2xpY2tzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRZXSBZIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBEZWxheV0gUGF1c2UgZHVyYXRpb24gaW4gbXMgYmV0d2VlbiBodW1hbiBwb2ludGVyIG1vdmVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBzXSBOdW1iZXIgb2YgaW50ZXJtZWRpYXRlIHBvaW50ZXIgbW92ZXMgYmVmb3JlIHRoZSBmaW5hbCBjbGljayB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzY3JvbGxDb250YWluZXJUZXN0SURzXSBOYXRpdmUgdGVzdCBJRHMgdGhhdCBzaG91bGQgYmUgdHJpZWQgYXMgc2Nyb2xsIGNvbnRhaW5lcnMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB2aWV3cG9ydCBnZXN0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7RmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn19IEludGVyYWN0QXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXRGb3JOb1NlbGVjdG9yQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWNhdGlvbk1lc3NhZ2VBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzXSBXaGV0aGVyIHRvIGRpc21pc3MgdGhlIG5vdGlmaWNhdGlvbiBhZnRlciBpdCBhcHBlYXJzLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSB7XG4gIHJldHVybiAvKD86XnxcXHMtXFxzKVxcW0RPTVxcXSBQYXNzd29yZCBmaWVsZCBpcyBub3QgY29udGFpbmVkIGluIGEgZm9ybTovaS50ZXN0KG1lc3NhZ2UpXG59XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbmNvbnN0IGdsb2JhbEFueSA9IGdsb2JhbFRoaXNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdCBleHRlbmRzIEJyb3dzZXIge1xuICBzdGF0aWMgcm9vdFBhdGggPSBcIi9ibGFuaz9zeXN0ZW1UZXN0PXRydWVcIlxuXG4gIC8qKiBAdHlwZSB7U3lzdGVtVGVzdENvbW11bmljYXRvciB8IHVuZGVmaW5lZH0gKi9cbiAgY29tbXVuaWNhdG9yID0gdW5kZWZpbmVkXG5cbiAgX3N0YXJ0ZWQgPSBmYWxzZVxuICBfY2xpZW50V3NQb3J0ID0gMTk4NVxuICBfY2xpZW50V3NDb25uZWN0VGltZW91dCA9IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TXG4gIF9odHRwSG9zdCA9IFwibG9jYWxob3N0XCJcbiAgX2h0dHBQb3J0ID0gMTk4NFxuICBfZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZVxuICBfZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2VcbiAgLyoqIEB0eXBlIHsoKGVycm9yOiBhbnkpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfSAqL1xuICBfZXJyb3JGaWx0ZXIgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvcltdfSAqL1xuICBfYnJvd3NlckVycm9ycyA9IFtdXG4gIF9zY291bmRyZWxQb3J0ID0gODA5MFxuICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIHNjb3VuZHJlbFdzcyA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgY2xpZW50V3NzID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtTeXN0ZW1UZXN0fVxuICAgKi9cbiAgc3RhdGljIGN1cnJlbnQoYXJncyA9IHt9KSB7XG4gICAgaWYgKCFnbG9iYWxBbnkuc3lzdGVtVGVzdCkge1xuICAgICAgZ2xvYmFsQW55LnN5c3RlbVRlc3QgPSBuZXcgU3lzdGVtVGVzdChhcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxBbnkuc3lzdGVtVGVzdC5hcHBseUFyZ3MoYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gZ2xvYmFsQW55LnN5c3RlbVRlc3RcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG11dGFibGUgb3B0aW9ucyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgc2luZ2xldG9uIFN5c3RlbVRlc3QuXG4gICAqIEBwYXJhbSB7UGFydGlhbDxTeXN0ZW1UZXN0QXJncz59IGFyZ3NcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhcHBseUFyZ3MoYXJncyA9IHt9KSB7XG4gICAgaWYgKFwiZGVidWdcIiBpbiBhcmdzKSB0aGlzLl9kZWJ1ZyA9IGFyZ3MuZGVidWcgPz8gZmFsc2VcbiAgICBpZiAoXCJlcnJvckZpbHRlclwiIGluIGFyZ3MpIHRoaXMuX2Vycm9yRmlsdGVyID0gYXJncy5lcnJvckZpbHRlclxuICAgIGlmIChcImZhaWxPbkJyb3dzZXJFcnJvclwiIGluIGFyZ3MpIHRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvciA9IGFyZ3MuZmFpbE9uQnJvd3NlckVycm9yID8/IHRydWVcbiAgICBpZiAoXCJmYWlsT25Db25zb2xlRXJyb3JcIiBpbiBhcmdzKSB0aGlzLl9mYWlsT25Db25zb2xlRXJyb3IgPSBhcmdzLmZhaWxPbkNvbnNvbGVFcnJvciA/PyBmYWxzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yfSAqL1xuICBnZXRDb21tdW5pY2F0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmNvbW11bmljYXRvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29tbXVuaWNhdG9yIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbW11bmljYXRvclxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIGFuIGVycm9yIG1lc3NhZ2UgaWYgcG9zc2libGUgZnJvbSB0aGUgcGF5bG9hZCBzZW50IGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119IHwgRXJyb3J9IGRhdGFcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSkge1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIGNvbnN0IGZpcnN0VmFsdWUgPSBBcnJheS5pc0FycmF5KGRhdGE/LnZhbHVlKSA/IGRhdGEudmFsdWVbMF0gOiB1bmRlZmluZWRcblxuICAgIGlmIChmaXJzdFZhbHVlIGluc3RhbmNlb2YgRXJyb3IgJiYgdHlwZW9mIGZpcnN0VmFsdWUubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWUubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZpcnN0VmFsdWVcblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYnJvd3NlciBlcnJvciBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBidWlsdC1pbiBydWxlcyBhbmQgYW4gb3B0aW9uYWwgZXJyb3IgZmlsdGVyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfX0gZGF0YVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHNob3VsZElnbm9yZUVycm9yKGRhdGEpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5leHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpXG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOFwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFwiTWluaWZpZWQgUmVhY3QgZXJyb3IgIzQxOVwiKSkgcmV0dXJuIHRydWVcbiAgICAgIGlmIChzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSkgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXJyb3JGaWx0ZXIgJiYgdGhpcy5fZXJyb3JGaWx0ZXIoZGF0YSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzfSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RSdW5BcmdzIHwgZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFthcmdzXVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbY2FsbGJhY2tdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJ1bihhcmdzLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHJlc29sdmVkQ2FsbGJhY2sgPSB0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8gYXJncyA6IGNhbGxiYWNrXG4gICAgY29uc3Qge3JlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSA9IHRydWUsIC4uLnN5c3RlbVRlc3RBcmdzfSA9IC8qKiBAdHlwZSB7U3lzdGVtVGVzdFJ1bkFyZ3N9ICovICh0eXBlb2YgYXJncyA9PT0gXCJmdW5jdGlvblwiID8ge30gOiBhcmdzIHx8IHt9KVxuICAgIGNvbnN0IHN5c3RlbVRlc3QgPSB0aGlzLmN1cnJlbnQoc3lzdGVtVGVzdEFyZ3MpXG5cbiAgICBpZiAoIXJlc29sdmVkQ2FsbGJhY2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN5c3RlbVRlc3QucnVuIHJlcXVpcmVzIGEgY2FsbGJhY2tcIilcbiAgICB9XG5cbiAgICBzeXN0ZW1UZXN0Ll9icm93c2VyRXJyb3JzID0gW11cbiAgICBzeXN0ZW1UZXN0LmFwcGx5QXJncyh7ZmFpbE9uQnJvd3NlckVycm9yOiB0cnVlLCBmYWlsT25Db25zb2xlRXJyb3I6IGZhbHNlLCAuLi5zeXN0ZW1UZXN0QXJnc30pXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVzZXR0aW5nIGJyb3dzZXIgY29va2llcyBiZWZvcmUgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZGVsZXRlQWxsQ29va2llcygpXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkJyb3dzZXIgY29va2llcyBjbGVhcmVkXCIpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZ2V0Um9vdFBhdGhcIilcbiAgICBjb25zdCByb290UGF0aCA9IHN5c3RlbVRlc3QuZ2V0Um9vdFBhdGgoKVxuXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5yZXNldFRvUm9vdFBhdGhGb3JSdW4ocm9vdFBhdGgpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIHN0YXJ0ZWQgLSBzZW5kIGluaXRpYWxpemVcIilcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG5cbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHJ1bkVycm9yID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCB0ZWFyZG93bkVycm9yID0gdW5kZWZpbmVkXG5cbiAgICB0cnkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcImZpbmRCeVRlc3RJRCBibGFua1RleHRcIilcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZmluZEJ5VGVzdElEKFwiYmxhbmtUZXh0XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJGb3VuZCBibGFua1RleHRcIilcblxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcInJlc29sdmVkQ2FsbGJhY2tcIilcbiAgICAgIGF3YWl0IHJlc29sdmVkQ2FsbGJhY2soc3lzdGVtVGVzdClcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gY2FsbGJhY2sgY29tcGxldGVkXCIpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYFJ1biBlcnJvciBjYXVnaHQsIHRha2luZyBzY3JlZW5zaG90OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YClcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QudGFrZVNjcmVlbnNob3QoKVxuXG4gICAgICBydW5FcnJvciA9IGVycm9yXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmluaXNoZWQgLSBzZW5kIHRlYXJkb3duXCIpXG4gICAgICBjb25zdCB0ZWFyZG93bldzID0gc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS53c1xuICAgICAgLy8gV2ViU29ja2V0LkNMT1NJTkcgKDIpIGFuZCBXZWJTb2NrZXQuQ0xPU0VEICgzKSBjYW5ub3QgcmVjb3Zlciwgc28gc2tpcCB0ZWFyZG93bi5cbiAgICAgIC8vIE9QRU4gKDEpIHNlbmRzIGltbWVkaWF0ZWx5LiBDT05ORUNUSU5HICgwKSBxdWV1ZXMgdGhlIGNvbW1hbmQgYW5kIGZsdXNoZXMgb25cbiAgICAgIC8vIG9uT3BlbiDigJQgdGhlIDEwcyB0aW1lb3V0IGJlbG93IGNvdmVycyB0aGUgd2FpdC5cbiAgICAgIGNvbnN0IHdzQ2xvc2VkID0gIXRlYXJkb3duV3MgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAyIHx8IHRlYXJkb3duV3MucmVhZHlTdGF0ZSA9PT0gM1xuXG4gICAgICBpZiAod3NDbG9zZWQpIHtcbiAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlNraXBwaW5nIHRlYXJkb3duIOKAlCBicm93c2VyIHdlYnNvY2tldCBpcyBjbG9zZWQgKGxpa2VseSBieSBuYXZpZ2F0aW9uL3NpZ24tb3V0IGR1cmluZyB0aGUgdGVzdClcIilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyB0ZWFyZG93biB0byB1c2VTeXN0ZW1UZXN0KCkgdGltZWQgb3V0XCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcInRlYXJkb3duXCJ9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGVhcmRvd25FcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3lzdGVtVGVzdC5fYnJvd3NlckVycm9ycyA9IFtdXG4gICAgICBzeXN0ZW1UZXN0LmFwcGx5QXJncyh7ZXJyb3JGaWx0ZXI6IHVuZGVmaW5lZCwgZmFpbE9uQnJvd3NlckVycm9yOiB0cnVlLCBmYWlsT25Db25zb2xlRXJyb3I6IGZhbHNlfSlcbiAgICB9XG5cbiAgICBpZiAocnVuRXJyb3IpIHtcbiAgICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCB0ZWFyZG93biBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIHRlYXJkb3duRXJyb3IpXG4gICAgICB9XG5cbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHJ1blwiKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCByZWluaXRpYWxpemUgZmFpbGVkIGFmdGVyIHRlc3QgZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBydW5FcnJvclxuICAgIH1cblxuICAgIGlmICh0ZWFyZG93bkVycm9yKSB7XG4gICAgICBpZiAocmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlRlYXJkb3duIGZhaWxlZCAtIHJlaW5pdGlhbGl6ZSBTeXN0ZW1UZXN0XCIpXG4gICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5yZWluaXRpYWxpemUoKVxuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZWluaXRpYWxpemVkIFN5c3RlbVRlc3QgYWZ0ZXIgZmFpbGVkIHRlYXJkb3duXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVhcmRvd24gZmFpbHVyZVwiLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyB0ZWFyZG93bkVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYXBwIHRvIHRoZSByb290IHRlc3Qgcm91dGUgYmVmb3JlIGVhY2ggcnVuLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXNldFRvUm9vdFBhdGhGb3JSdW4ocm9vdFBhdGgpIHtcbiAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdCByb290UGF0aCB3aXRoIGRpc21pc3NUbzogJHtyb290UGF0aH1gKVxuICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RvKHJvb3RQYXRoKVxuICAgIHRoaXMuZGVidWdMb2coYERpc21pc3NlZCB0byByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgaWYgKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gMSkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBub3QgY29ubmVjdGVkIGFmdGVyIGRpc21pc3NUbywgd2FpdGluZyBmb3IgcmVjb25uZWN0aW9uXCIpXG4gICAgICB0aGlzLndzID0gbnVsbFxuICAgICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQ2xpZW50IHdlYnNvY2tldCByZWNvbm5lY3RlZFwiKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWaXNpdHMgYSBwYXRoLiBOYXRpdmUgdXNlcyB0aGUgaW4tYXBwIGhlbHBlcjsgd2ViIHJlbG9hZHMgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCByZWNvbm5lY3RzIHRoZSB0ZXN0IGJyaWRnZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jyb3dzZXIuanNcIikuQnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAoaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnZpc2l0KHBhdGgsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBpbml0aWFsaXplQnJvd3NlckNvbnRleHQoKSB7XG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbml0aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYSB3ZWIgcm91dGUgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgY29tbWFuZCB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKSB7XG4gICAgdGhpcy5pZ25vcmVFeGlzdGluZ1Njb3VuZHJlbENsaWVudHMoKVxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHRoaXMuYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSlcbiAgICB0aGlzLmRlYnVnTG9nKGBEcml2ZXIgdmlzaXRlZCBwYXRoICR7cGF0aH1gKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWQgYWZ0ZXIgZHJpdmVyIG5hdmlnYXRpb25cIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgaWdub3JlRXhpc3RpbmdTY291bmRyZWxDbGllbnRzKCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzKCkubGVuZ3RoXG4gICAgdGhpcy5kZWJ1Z0xvZyhgSWdub3JpbmcgJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9IFNjb3VuZHJlbCBjbGllbnQocykgZnJvbSBwcmV2aW91cyBicm93c2VyIGNvbnRleHRzYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSlcbiAgICB0aGlzLl9odHRwSG9zdCA9IGh0dHBIb3N0XG4gICAgdGhpcy5faHR0cFBvcnQgPSBodHRwUG9ydFxuICAgIHRoaXMuX2h0dHBDb25uZWN0SG9zdCA9IGh0dHBDb25uZWN0SG9zdFxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9lcnJvckZpbHRlciA9IGVycm9yRmlsdGVyXG4gICAgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gZmFpbE9uQnJvd3NlckVycm9yXG4gICAgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gZmFpbE9uQ29uc29sZUVycm9yXG4gICAgdGhpcy5fc2NvdW5kcmVsUG9ydCA9IHNjb3VuZHJlbFBvcnRcbiAgICB0aGlzLl91cmxBcmdzID0gdXJsQXJnc1xuICAgIHRoaXMuX3Jvb3RQYXRoID0gdGhpcy5idWlsZFJvb3RQYXRoKClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgb2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZXNwb25zZXMgPSB7fVxuXG4gICAgdGhpcy5fc2VuZENvdW50ID0gMFxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe29uQ29tbWFuZDogdGhpcy5vbkNvbW1hbmRSZWNlaXZlZH0pXG4gICAgdGhpcy5zZXRDb21tdW5pY2F0b3IodGhpcy5jb21tdW5pY2F0b3IpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIFNjb3VuZHJlbCBzZXJ2ZXIgd2hpY2ggdGhlIGJyb3dzZXIgY29ubmVjdHMgdG8gZm9yIHJlbW90ZSBldmFsdWF0aW9uIGluIHRoZSBicm93c2VyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2NvdW5kcmVsV3NzKSB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGFscmVhZHkgc3RhcnRlZFwiKVxuXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB0aGlzLl9zY291bmRyZWxQb3J0fSlcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IG5ldyBTZXJ2ZXJXZWJTb2NrZXQodGhpcy5zY291bmRyZWxXc3MpXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKHRoaXMuc2VydmVyV2ViU29ja2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBzdG9wXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLnNlcnZlcj59ICovICh0aGlzLnNlcnZlcikuY2xvc2UoKSlcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLnNjb3VuZHJlbFdzcywgXCJTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgU2NvdW5kcmVsIGNsaWVudCAoYnJvd3NlcikgdG8gY29ubmVjdCBhbmQgcmV0dXJucyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0TXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBhc3luYyBnZXRTY291bmRyZWxDbGllbnQodGltZW91dE1zID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGlzIG5vdCBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogd2FpdGluZyBmb3IgYnJvd3NlciBTY291bmRyZWwgaW5pdGlhbGl6YXRpb25cIilcbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXMsIGVycm9yTWVzc2FnZTogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU2NvdW5kcmVsIHRvIGluaXRpYWxpemVcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwid2FpdEZvclNjb3VuZHJlbFwifSlcbiAgICB9KVxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IGJyb3dzZXIgcmVwb3J0ZWQgU2NvdW5kcmVsIGluaXRpYWxpemVkXCIpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2FueX0gY2xpZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29uc3QgaXNPcGVuQ2xpZW50ID0gKGNsaWVudCkgPT4gY2xpZW50Py5iYWNrZW5kPy53cz8ucmVhZHlTdGF0ZSA9PT0gMVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRzID0gdGhpcy5zZXJ2ZXIuZ2V0Q2xpZW50cygpXG4gICAgY29uc3QgY3VycmVudENsaWVudHMgPSBleGlzdGluZ0NsaWVudHMuc2xpY2UodGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50KVxuICAgIGNvbnN0IG9wZW5FeGlzdGluZ0NsaWVudHMgPSBjdXJyZW50Q2xpZW50cy5maWx0ZXIoaXNPcGVuQ2xpZW50KVxuXG4gICAgaWYgKG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHMubGVuZ3RofSwgaWdub3JlZDogJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9KWApXG5cbiAgICBpZiAoIXRoaXMuc2VydmVyLmV2ZW50cz8ub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgZXZlbnRzIGFyZSB1bmF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7KChjbGllbnQ6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9uTmV3Q2xpZW50XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKG9uTmV3Q2xpZW50KSB7XG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub2ZmKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCBjbGllbnRcIn0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG9uTmV3Q2xpZW50ID0gKC8qKiBAdHlwZSB7YW55fSAqLyBjbGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWlzT3BlbkNsaWVudChjbGllbnQpKSByZXR1cm5cbiAgICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHJlY2VpdmVkIG5ldyBvcGVuIGNsaWVudFwiKVxuICAgICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vbihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgQ1NTIHNlbGVjdG9yIG1hdGNoZXMgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmV4aXN0cyhzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdmlzaWJsZSB0ZXh0IGZyb20gYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50ZXh0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaGFzVGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIC8vIE5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIGxhdW5jaCBhbiBpbnN0YWxsZWQgYXBwIGluc3RlYWQgb2YgYSB3ZWIgcGFnZSwgc28gdGhleSBmb2xsb3cgdGhlXG4gICAgLy8gbmF0aXZlIGxpZmVjeWNsZSAobm8gZGlzdCBIVFRQIHNlcnZlciwgbm8gZHJpdmVyIG5hdmlnYXRpb24sIFdlYlNvY2tldCBzdGFydGVkIGJlZm9yZSB0aGUgYXBwKVxuICAgIC8vIGV2ZW4gd2hlbiBTWVNURU1fVEVTVF9IT1NUIGlzIFwiZGlzdFwiLlxuICAgIGNvbnN0IGlzTmF0aXZlQXBwID0gaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZylcblxuICAgIGlmIChpc05hdGl2ZUFwcCkge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gXCJuYXRpdmU6Ly9cIlxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlVzaW5nIG5hdGl2ZSBhcHAgaG9zdFwiKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImV4cG8tZGV2LXNlcnZlclwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faG9zdH06JHt0aGlzLl9wb3J0fWBcbiAgICAgIHRoaXMuZGVidWdMb2coYFVzaW5nIGV4cG8tZGV2LXNlcnZlciBhdCAke3RoaXMuY3VycmVudFVybH1gKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImRpc3RcIikge1xuICAgICAgY29uc3QgY29ubmVjdEhvc3QgPSB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPz8gdGhpcy5faHR0cEhvc3RcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHtjb25uZWN0SG9zdH06JHt0aGlzLl9odHRwUG9ydH1gXG5cbiAgICAgIHRoaXMuZGVidWdMb2coYFNwYXduaW5nIEhUVFAgc2VydmVyIGZvciBkaXN0IG9uICR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YClcbiAgICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSBuZXcgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIoe1xuICAgICAgICBob3N0OiB0aGlzLl9odHRwSG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5faHR0cFBvcnQsXG4gICAgICAgIGRlYnVnOiB0aGlzLl9kZWJ1ZyxcbiAgICAgICAgb25FcnJvcjogdGhpcy5vbkh0dHBTZXJ2ZXJFcnJvclxuICAgICAgfSlcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIEhUVFAgc2VydmVyXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLnN0YXJ0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDaGVja2luZyBIVFRQIHNlcnZlciBoZWFsdGhcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuYXNzZXJ0UmVhY2hhYmxlKHt0aW1lb3V0TXM6IHRoaXMuZ2V0VGltZW91dHMoKX0pXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicsICdkaXN0Jywgb3IgJ25hdGl2ZSdcIilcbiAgICB9XG5cbiAgICB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRCYXNlVXJsKHRoaXMuY3VycmVudFVybClcblxuICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgV2ViU29ja2V0IHNlcnZlciBiZWZvcmUgdGhlIGRyaXZlciBmb3IgbmF0aXZlIGFwcCBzZXNzaW9ucyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlQXBwKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlciAoYmVmb3JlIGRyaXZlciBmb3IgbmF0aXZlKVwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIGRyaXZlclwiKVxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnN0YXJ0KClcbiAgICB0aGlzLmRlYnVnTG9nKFwiRHJpdmVyIHN0YXJ0ZWRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMudmlzaXRJbml0aWFsUm9vdFBhdGgocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTZXR0aW5nIGJhc2Ugc2VsZWN0b3IgdG8gZm9jdXNlZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICB0aGlzLnNldEJhc2VTZWxlY3RvcihcIltkYXRhLXRlc3RpZD0nc3lzdGVtVGVzdGluZ0NvbXBvbmVudCddW2RhdGEtZm9jdXNzZWQ9J3RydWUnXVwiKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkJhc2Ugc2VsZWN0b3Igc2V0XCIpXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjb21wbGV0ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGJyb3dzZXIgZHJpdmVyIHRvIHJlYWNoIHRoZSByb290IHJvdXRlIGFmdGVyIHN0YXJ0dXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aCBJbml0aWFsIGFwcCByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdEluaXRpYWxSb290UGF0aChyb290UGF0aCkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMuZ2V0VGltZW91dHMoKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdmlzaXRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yLCBcImluaXRpYWwgcm9vdCBwYXRoIHZpc2l0IGVycm9yXCIpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB2aXNpdEVycm9yLm1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmV0cnlhYmxlTmV0d29ya0Vycm9yID0gbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0FERFJFU1NfVU5SRUFDSEFCTEVcIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0NPTk5FQ1RJT05fUkVGVVNFRFwiKVxuXG4gICAgICAgIGlmICghcmV0cnlhYmxlTmV0d29ya0Vycm9yIHx8IERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICB0aHJvdyB2aXNpdEVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnTG9nKGBJbml0aWFsIHJvb3QgcGF0aCB2aXNpdCB3YWl0aW5nIGZvciBkcml2ZXIgbmV0d29yayByZWFkaW5lc3M6ICR7bWVzc2FnZX1gKVxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUywgTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRSb290UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdFBhdGggPz8gU3lzdGVtVGVzdC5yb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5fcm9vdFBhdGggPSByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFJvb3RQYXRoKCkge1xuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5idWlsZFN5c3RlbVRlc3RQYXRoKFN5c3RlbVRlc3Qucm9vdFBhdGgpXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHN5c3RlbS10ZXN0IHF1ZXJ5IHBhcmFtcyB0byBhIHBhdGggdGhhdCB3aWxsIHJlbG9hZCB0aGUgd2ViIGFwcC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0XCIpKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RcIiwgXCJ0cnVlXCIpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIikgJiYgdGhpcy5fY2xpZW50V3NQb3J0ICE9PSAxOTg1KSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIiwgdGhpcy5fY2xpZW50V3NQb3J0KVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiKSAmJiB0aGlzLl9zY291bmRyZWxQb3J0ICE9PSA4MDkwKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIsIHRoaXMuX3Njb3VuZHJlbFBvcnQpXG4gICAgfVxuXG4gICAgaWYgKGlzQWJzb2x1dGVVcmwpIHJldHVybiB1cmwuaHJlZlxuXG4gICAgcmV0dXJuIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjbGllbnQgd2ViIHNvY2tldCB0byBjb25uZWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNsaWVudFdlYlNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5fY2xpZW50V3NDb25uZWN0VGltZW91dCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faHR0cFNlcnZlckVycm9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgICB0aGlzLnNldENvbW11bmljYXRvcih0aGlzLmNvbW11bmljYXRvcilcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSB3c3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbG9zZVdlYlNvY2tldFNlcnZlcih3c3MsIGxhYmVsID0gXCJXZWJTb2NrZXQgc2VydmVyXCIpIHtcbiAgICBpZiAoIXdzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgY2xvc2luZyAke2xhYmVsfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICBjb25zdCB0ZXJtaW5hdGVDbGllbnQgPSAoLyoqIEB0eXBlIHthbnl9ICovIGNsaWVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsaWVudC50ZXJtaW5hdGUoKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGVybWluYXRpb24gZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRsZSA9ICgvKiogQHR5cGUgeyh2YWx1ZTogYW55KSA9PiB2b2lkfSAqLyBjYWxsYmFjaywgLyoqIEB0eXBlIHthbnl9ICovIGFyZykgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKGFyZylcbiAgICAgIH1cblxuICAgICAgd3NzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKSlcbiAgICAgIHdzcy5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBzZXR0bGUocmVqZWN0LCBlcnJvcikpXG4gICAgICBpZiAod3NzLmNsaWVudHMgJiYgd3NzLmNsaWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgd3NzLmNsaWVudHMuZm9yRWFjaCh0ZXJtaW5hdGVDbGllbnQpXG4gICAgICB9XG4gICAgICB3c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgc2V0dGxlKHJlamVjdCwgZXJyb3IpXG4gICAgICAgIGVsc2Ugc2V0dGxlKHJlc29sdmUsIHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSkpXG4gIH1cbn1cbiJdfQ==
|
|
1095
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFFeEUsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUE7QUFDN0MsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBTTtJQUN2QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzNGLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsb0NBQW9DLENBQUMsRUFBQyxNQUFNLEVBQUMsR0FBRyxFQUFFO0lBQ2hFLE9BQU8sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLDBDQUEwQyxDQUFD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QUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUEvbENNLG1CQUFRLEdBQUcsd0JBQXdCLEFBQTNCLENBQTJCO2VBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBTZXJ2ZXIgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvaW5kZXguanNcIlxuaW1wb3J0IFNlcnZlcldlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIGZyb20gXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtaHR0cC1zZXJ2ZXIuanNcIlxuaW1wb3J0IHt3YWl0LCB3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IHtlbnN1cmVFcnJvcn0gZnJvbSBcInR5cGFuaWNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyLmpzXCJcbmltcG9ydCB7aXNBcHBpdW1OYXRpdmVBcHBEcml2ZXJDb25maWd9IGZyb20gXCIuL2RyaXZlcnMvYXBwaXVtLWRyaXZlci5qc1wiXG5cbmNvbnN0IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TID0gMzAwMDBcbmNvbnN0IElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUyA9IDEwMFxuY29uc3QgTkFUSVZFX0NMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TID0gMTIwMDAwXG5cbi8qKlxuICogV2hldGhlciBhIHN5c3RlbSB0ZXN0IHJ1bnMgYWdhaW5zdCBhIG5hdGl2ZSBhcHAgcmF0aGVyIHRoYW4gYSB3ZWIvZGlzdCBicm93c2VyLlxuICogVHJ1ZSBmb3IgYFNZU1RFTV9URVNUX0hPU1Q9bmF0aXZlYCBhbmQgZm9yIG5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIHJlZ2FyZGxlc3Mgb2YgaG9zdC5cbiAqIEBwYXJhbSB7U3lzdGVtVGVzdERyaXZlckNvbmZpZ30gW2RyaXZlcl1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYXRpdmVBcHBTZXNzaW9uKGRyaXZlcikge1xuICByZXR1cm4gcHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PT0gXCJuYXRpdmVcIiB8fCBpc0FwcGl1bU5hdGl2ZUFwcERyaXZlckNvbmZpZyhkcml2ZXIpXG59XG5cbi8qKlxuICogQHBhcmFtIHt7ZHJpdmVyPzogU3lzdGVtVGVzdERyaXZlckNvbmZpZ319IFthcmdzXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSA9IHt9KSB7XG4gIHJldHVybiBpc05hdGl2ZUFwcFNlc3Npb24oZHJpdmVyKSA/IE5BVElWRV9DTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA6IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3lzdGVtVGVzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSBQb3J0IGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cEhvc3RdIEhvc3RuYW1lIGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodHRwUG9ydF0gUG9ydCBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaHR0cENvbm5lY3RIb3N0XSBIb3N0bmFtZSB1c2VkIGJ5IHRoZSBkcml2ZXIgdG8gcmVhY2ggdGhlIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IGFueSkgPT4gYm9vbGVhbn0gW2Vycm9yRmlsdGVyXSBGaWx0ZXIgZm9yIGJyb3dzZXIgZXJyb3JzIChyZXR1cm4gZmFsc2UgdG8gaWdub3JlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxPbkJyb3dzZXJFcnJvcl0gVGhyb3cgcmVnaXN0ZXJlZCBicm93c2VyIGVycm9ycyBmcm9tIGZpbmRlci9pbnRlcmFjdCBoZWxwZXJzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbE9uQ29uc29sZUVycm9yXSBUcmVhdCBicm93c2VyIGNvbnNvbGUuZXJyb3IgY2FsbHMgYXMgcmVnaXN0ZXJlZCBicm93c2VyIGVycm9ycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpZW50V3NQb3J0XSBQb3J0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWVudFdzQ29ubmVjdFRpbWVvdXRdIFRpbWVvdXQgZm9yIHRoZSBicm93c2VyLWNvbW1hbmQgV2ViU29ja2V0IGNsaWVudCBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtzY291bmRyZWxQb3J0XSBQb3J0IGZvciB0aGUgU2NvdW5kcmVsIFdlYlNvY2tldCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFt1cmxBcmdzXSBRdWVyeSBwYXJhbXMgYXBwZW5kZWQgdG8gdGhlIHJvb3QgcGF0aC5cbiAqIEBwcm9wZXJ0eSB7U3lzdGVtVGVzdERyaXZlckNvbmZpZ30gW2RyaXZlcl0gRHJpdmVyIGNvbmZpZ3VyYXRpb24uXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge1N5c3RlbVRlc3RBcmdzICYge3JlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZT86IGJvb2xlYW59fSBTeXN0ZW1UZXN0UnVuQXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3REcml2ZXJDb25maWdcbiAqIEBwcm9wZXJ0eSB7XCJzZWxlbml1bVwifFwiYXBwaXVtXCJ9IFt0eXBlXSBEcml2ZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbb3B0aW9uc10gRHJpdmVyLXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7XCJhY3Rpb25zXCIgfCBcImh1bWFuXCIgfCBcImpzXCJ9IFttZXRob2RdIE92ZXJyaWRlIHRoZSBjbGljayBwYXRoLiBgXCJhY3Rpb25zXCJgIHVzZXMgdGhlIFNlbGVuaXVtIEFjdGlvbnMgQVBJIChyZWFsIHBvaW50ZXIgbW92ZSArIGNsaWNrKTsgYFwiaHVtYW5cImAgdXNlcyBtdWx0aXBsZSBwb2ludGVyIG1vdmVzIGFuZCBwYXVzZXMgYmVmb3JlIGNsaWNraW5nOyBgXCJqc1wiYCBkaXNwYXRjaGVzIGBlbGVtZW50LmNsaWNrKClgIHZpYSBgZXhlY3V0ZVNjcmlwdGAgaW5zaWRlIHRoZSBwYWdlJ3MgSlMgY29udGV4dCBhbmQgaXMgZm9yIGRpYWdub3N0aWNzIG9ubHksIG5vdCBjb21taXR0ZWQgc3RhYmlsaXphdGlvbiBmaXhlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRYXSBYIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGlja09mZnNldFldIFkgb2Zmc2V0IGZvciBgYWN0aW9uc2AvYGh1bWFuYCBwb2ludGVyIGNsaWNrcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcERlbGF5XSBQYXVzZSBkdXJhdGlvbiBpbiBtcyBiZXR3ZWVuIGh1bWFuIHBvaW50ZXIgbW92ZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcHNdIE51bWJlciBvZiBpbnRlcm1lZGlhdGUgcG9pbnRlciBtb3ZlcyBiZWZvcmUgdGhlIGZpbmFsIGNsaWNrIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufX0gSW50ZXJhY3RBcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdEZvck5vU2VsZWN0b3JBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpY2F0aW9uTWVzc2FnZUFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Rpc21pc3NdIFdoZXRoZXIgdG8gZGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uIGFmdGVyIGl0IGFwcGVhcnMuXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIC8oPzpefFxccy1cXHMpXFxbRE9NXFxdIFBhc3N3b3JkIGZpZWxkIGlzIG5vdCBjb250YWluZWQgaW4gYSBmb3JtOi9pLnRlc3QobWVzc2FnZSlcbn1cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqL1xuY29uc3QgZ2xvYmFsQW55ID0gZ2xvYmFsVGhpc1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeXN0ZW1UZXN0IGV4dGVuZHMgQnJvd3NlciB7XG4gIHN0YXRpYyByb290UGF0aCA9IFwiL2JsYW5rP3N5c3RlbVRlc3Q9dHJ1ZVwiXG5cbiAgLyoqIEB0eXBlIHtTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIHwgdW5kZWZpbmVkfSAqL1xuICBjb21tdW5pY2F0b3IgPSB1bmRlZmluZWRcblxuICBfc3RhcnRlZCA9IGZhbHNlXG4gIF9jbGllbnRXc1BvcnQgPSAxOTg1XG4gIF9jbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID0gQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVNcbiAgX2h0dHBIb3N0ID0gXCJsb2NhbGhvc3RcIlxuICBfaHR0cFBvcnQgPSAxOTg0XG4gIF9mYWlsT25Ccm93c2VyRXJyb3IgPSB0cnVlXG4gIF9mYWlsT25Db25zb2xlRXJyb3IgPSBmYWxzZVxuICAvKiogQHR5cGUgeygoZXJyb3I6IGFueSkgPT4gYm9vbGVhbikgfCB1bmRlZmluZWR9ICovXG4gIF9lcnJvckZpbHRlciA9IHVuZGVmaW5lZFxuICAvKiogQHR5cGUge0Vycm9yW119ICovXG4gIF9icm93c2VyRXJyb3JzID0gW11cbiAgX3Njb3VuZHJlbFBvcnQgPSA4MDkwXG4gIC8qKiBAdHlwZSB7bnVtYmVyfSAqL1xuICBfaWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50ID0gMFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBjbGllbnRXc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzeXN0ZW0gdGVzdCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1N5c3RlbVRlc3R9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudChhcmdzID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbEFueS5zeXN0ZW1UZXN0KSB7XG4gICAgICBnbG9iYWxBbnkuc3lzdGVtVGVzdCA9IG5ldyBTeXN0ZW1UZXN0KGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JhbEFueS5zeXN0ZW1UZXN0LmFwcGx5QXJncyhhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBnbG9iYWxBbnkuc3lzdGVtVGVzdFxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgbXV0YWJsZSBvcHRpb25zIHRvIGFuIGFscmVhZHktcnVubmluZyBzaW5nbGV0b24gU3lzdGVtVGVzdC5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPFN5c3RlbVRlc3RBcmdzPn0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5QXJncyhhcmdzID0ge30pIHtcbiAgICBpZiAoXCJkZWJ1Z1wiIGluIGFyZ3MpIHRoaXMuX2RlYnVnID0gYXJncy5kZWJ1ZyA/PyBmYWxzZVxuICAgIGlmIChcImVycm9yRmlsdGVyXCIgaW4gYXJncykgdGhpcy5fZXJyb3JGaWx0ZXIgPSBhcmdzLmVycm9yRmlsdGVyXG4gICAgaWYgKFwiZmFpbE9uQnJvd3NlckVycm9yXCIgaW4gYXJncykgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gYXJncy5mYWlsT25Ccm93c2VyRXJyb3IgPz8gdHJ1ZVxuICAgIGlmIChcImZhaWxPbkNvbnNvbGVFcnJvclwiIGluIGFyZ3MpIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGFyZ3MuZmFpbE9uQ29uc29sZUVycm9yID8/IGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RDb21tdW5pY2F0b3J9ICovXG4gIGdldENvbW11bmljYXRvcigpIHtcbiAgICBpZiAoIXRoaXMuY29tbXVuaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tdW5pY2F0b3IgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYW4gZXJyb3IgbWVzc2FnZSBpZiBwb3NzaWJsZSBmcm9tIHRoZSBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX0gfCBFcnJvcn0gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YVxuXG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZGF0YT8udmFsdWUpID8gZGF0YS52YWx1ZVswXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlb2YgZmlyc3RWYWx1ZS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBicm93c2VyIGVycm9yIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIGJ1aWx0LWluIHJ1bGVzIGFuZCBhbiBvcHRpb25hbCBlcnJvciBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119fSBkYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSlcblxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE4XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE5XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9lcnJvckZpbHRlciAmJiB0aGlzLl9lcnJvckZpbHRlcihkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3N9IGFyZ3NcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3MgfCBmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFtjYWxsYmFja11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcnVuKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRDYWxsYmFjayA9IHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyBhcmdzIDogY2FsbGJhY2tcbiAgICBjb25zdCB7cmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlID0gdHJ1ZSwgLi4uc3lzdGVtVGVzdEFyZ3N9ID0gLyoqIEB0eXBlIHtTeXN0ZW1UZXN0UnVuQXJnc30gKi8gKHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyB7fSA6IGFyZ3MgfHwge30pXG4gICAgY29uc3Qgc3lzdGVtVGVzdCA9IHRoaXMuY3VycmVudChzeXN0ZW1UZXN0QXJncylcblxuICAgIGlmICghcmVzb2x2ZWRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3lzdGVtVGVzdC5ydW4gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIHN5c3RlbVRlc3QuX2Jyb3dzZXJFcnJvcnMgPSBbXVxuICAgIHN5c3RlbVRlc3QuYXBwbHlBcmdzKHtmYWlsT25Ccm93c2VyRXJyb3I6IHRydWUsIGZhaWxPbkNvbnNvbGVFcnJvcjogZmFsc2UsIC4uLnN5c3RlbVRlc3RBcmdzfSlcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZXNldHRpbmcgYnJvd3NlciBjb29raWVzIGJlZm9yZSBpbml0aWFsaXplXCIpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5kZWxldGVBbGxDb29raWVzKClcbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiQnJvd3NlciBjb29raWVzIGNsZWFyZWRcIilcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJnZXRSb290UGF0aFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gc3lzdGVtVGVzdC5nZXRSb290UGF0aCgpXG5cbiAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlc2V0VG9Sb290UGF0aEZvclJ1bihyb290UGF0aClcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gc3RhcnRlZCAtIHNlbmQgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuaW5pdGlhbGl6ZUJyb3dzZXJDb250ZXh0KClcblxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgcnVuRXJyb3IgPSB1bmRlZmluZWRcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IHRlYXJkb3duRXJyb3IgPSB1bmRlZmluZWRcblxuICAgIHRyeSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiZmluZEJ5VGVzdElEIGJsYW5rVGV4dFwiKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC5maW5kQnlUZXN0SUQoXCJibGFua1RleHRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIkZvdW5kIGJsYW5rVGV4dFwiKVxuXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwicmVzb2x2ZWRDYWxsYmFja1wiKVxuICAgICAgYXdhaXQgcmVzb2x2ZWRDYWxsYmFjayhzeXN0ZW1UZXN0KVxuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBjYWxsYmFjayBjb21wbGV0ZWRcIilcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhgUnVuIGVycm9yIGNhdWdodCwgdGFraW5nIHNjcmVlbnNob3Q6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gKVxuICAgICAgYXdhaXQgc3lzdGVtVGVzdC50YWtlU2NyZWVuc2hvdCgpXG5cbiAgICAgIHJ1bkVycm9yID0gZXJyb3JcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBmaW5pc2hlZCAtIHNlbmQgdGVhcmRvd25cIilcbiAgICAgIGNvbnN0IHRlYXJkb3duV3MgPSBzeXN0ZW1UZXN0LmdldENvbW11bmljYXRvcigpLndzXG4gICAgICAvLyBXZWJTb2NrZXQuQ0xPU0lORyAoMikgYW5kIFdlYlNvY2tldC5DTE9TRUQgKDMpIGNhbm5vdCByZWNvdmVyLCBzbyBza2lwIHRlYXJkb3duLlxuICAgICAgLy8gT1BFTiAoMSkgc2VuZHMgaW1tZWRpYXRlbHkuIENPTk5FQ1RJTkcgKDApIHF1ZXVlcyB0aGUgY29tbWFuZCBhbmQgZmx1c2hlcyBvblxuICAgICAgLy8gb25PcGVuIOKAlCB0aGUgMTBzIHRpbWVvdXQgYmVsb3cgY292ZXJzIHRoZSB3YWl0LlxuICAgICAgY29uc3Qgd3NDbG9zZWQgPSAhdGVhcmRvd25XcyB8fCB0ZWFyZG93bldzLnJlYWR5U3RhdGUgPT09IDIgfHwgdGVhcmRvd25Xcy5yZWFkeVN0YXRlID09PSAzXG5cbiAgICAgIGlmICh3c0Nsb3NlZCkge1xuICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiU2tpcHBpbmcgdGVhcmRvd24g4oCUIGJyb3dzZXIgd2Vic29ja2V0IGlzIGNsb3NlZCAobGlrZWx5IGJ5IG5hdmlnYXRpb24vc2lnbi1vdXQgZHVyaW5nIHRoZSB0ZXN0KVwiKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiAxMF8wMDAsIGVycm9yTWVzc2FnZTogXCJTZW5kaW5nIHRlYXJkb3duIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwidGVhcmRvd25cIn0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0ZWFyZG93bkVycm9yID0gZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzeXN0ZW1UZXN0Ll9icm93c2VyRXJyb3JzID0gW11cbiAgICAgIHN5c3RlbVRlc3QuYXBwbHlBcmdzKHtlcnJvckZpbHRlcjogdW5kZWZpbmVkLCBmYWlsT25Ccm93c2VyRXJyb3I6IHRydWUsIGZhaWxPbkNvbnNvbGVFcnJvcjogZmFsc2V9KVxuICAgIH1cblxuICAgIGlmIChydW5FcnJvcikge1xuICAgICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHRlYXJkb3duIGZhaWxlZCBhZnRlciB0ZXN0IGZhaWx1cmVcIiwgdGVhcmRvd25FcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKHJlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgcnVuXCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIlN5c3RlbSB0ZXN0IHJlaW5pdGlhbGl6ZSBmYWlsZWQgYWZ0ZXIgdGVzdCBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHJ1bkVycm9yXG4gICAgfVxuXG4gICAgaWYgKHRlYXJkb3duRXJyb3IpIHtcbiAgICAgIGlmIChyZWluaXRpYWxpemVBZnRlckZhaWx1cmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiVGVhcmRvd24gZmFpbGVkIC0gcmVpbml0aWFsaXplIFN5c3RlbVRlc3RcIilcbiAgICAgICAgICBhd2FpdCBzeXN0ZW1UZXN0LnJlaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlaW5pdGlhbGl6ZWQgU3lzdGVtVGVzdCBhZnRlciBmYWlsZWQgdGVhcmRvd25cIilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciB0ZWFyZG93biBmYWlsdXJlXCIsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IHRlYXJkb3duRXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBhcHAgdG8gdGhlIHJvb3QgdGVzdCByb3V0ZSBiZWZvcmUgZWFjaCBydW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlc2V0VG9Sb290UGF0aEZvclJ1bihyb290UGF0aCkge1xuICAgIHRoaXMuZGVidWdMb2coYFZpc2l0IHJvb3RQYXRoIHdpdGggZGlzbWlzc1RvOiAke3Jvb3RQYXRofWApXG4gICAgYXdhaXQgdGhpcy5kaXNtaXNzVG8ocm9vdFBhdGgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhgRGlzbWlzc2VkIHRvIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICBpZiAoIXRoaXMud3MgfHwgdGhpcy53cy5yZWFkeVN0YXRlICE9PSAxKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IG5vdCBjb25uZWN0ZWQgYWZ0ZXIgZGlzbWlzc1RvLCB3YWl0aW5nIGZvciByZWNvbm5lY3Rpb25cIilcbiAgICAgIHRoaXMud3MgPSBudWxsXG4gICAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDbGllbnQgd2Vic29ja2V0IHJlY29ubmVjdGVkXCIpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0cyBhIHBhdGguIENvbm5lY3RlZCBicm93c2VyIGNvbnRleHRzIG5hdmlnYXRlIGluLWFwcCB0byBwcmVzZXJ2ZSBsb2NhbCBzdGF0ZTsgdW5hdmFpbGFibGUgd2ViIGJyaWRnZXMgcmVsb2FkIHRocm91Z2ggdGhlIGRyaXZlci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jyb3dzZXIuanNcIikuQnJvd3Nlck5hdmlnYXRpb25BcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdChwYXRoLCBhcmdzID0ge30pIHtcbiAgICBpZiAoaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZykpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnZpc2l0KHBhdGgsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb21tYW5kV2ViU29ja2V0ID0gdGhpcy5jb21tdW5pY2F0b3I/LndzXG4gICAgY29uc3QgY2FuVXNlSW5BcHBOYXZpZ2F0aW9uID0gdGhpcy5jb21tdW5pY2F0b3JFeGlzdHMoKSAmJiBjb21tYW5kV2ViU29ja2V0Py5yZWFkeVN0YXRlID09PSAxXG5cbiAgICBpZiAoY2FuVXNlSW5BcHBOYXZpZ2F0aW9uKSB7XG4gICAgICBhd2FpdCBzdXBlci52aXNpdCh0aGlzLmJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCksIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBpbml0aWFsaXplQnJvd3NlckNvbnRleHQoKSB7XG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbml0aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYSB3ZWIgcm91dGUgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgY29tbWFuZCB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKSB7XG4gICAgdGhpcy5pZ25vcmVFeGlzdGluZ1Njb3VuZHJlbENsaWVudHMoKVxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHRoaXMuYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSlcbiAgICB0aGlzLmRlYnVnTG9nKGBEcml2ZXIgdmlzaXRlZCBwYXRoICR7cGF0aH1gKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWQgYWZ0ZXIgZHJpdmVyIG5hdmlnYXRpb25cIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgaWdub3JlRXhpc3RpbmdTY291bmRyZWxDbGllbnRzKCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzKCkubGVuZ3RoXG4gICAgdGhpcy5kZWJ1Z0xvZyhgSWdub3JpbmcgJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9IFNjb3VuZHJlbCBjbGllbnQocykgZnJvbSBwcmV2aW91cyBicm93c2VyIGNvbnRleHRzYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCh7ZHJpdmVyfSlcbiAgICB0aGlzLl9odHRwSG9zdCA9IGh0dHBIb3N0XG4gICAgdGhpcy5faHR0cFBvcnQgPSBodHRwUG9ydFxuICAgIHRoaXMuX2h0dHBDb25uZWN0SG9zdCA9IGh0dHBDb25uZWN0SG9zdFxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9lcnJvckZpbHRlciA9IGVycm9yRmlsdGVyXG4gICAgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gZmFpbE9uQnJvd3NlckVycm9yXG4gICAgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gZmFpbE9uQ29uc29sZUVycm9yXG4gICAgdGhpcy5fc2NvdW5kcmVsUG9ydCA9IHNjb3VuZHJlbFBvcnRcbiAgICB0aGlzLl91cmxBcmdzID0gdXJsQXJnc1xuICAgIHRoaXMuX3Jvb3RQYXRoID0gdGhpcy5idWlsZFJvb3RQYXRoKClcblxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPG51bWJlciwgb2JqZWN0Pn0gKi9cbiAgICB0aGlzLl9yZXNwb25zZXMgPSB7fVxuXG4gICAgdGhpcy5fc2VuZENvdW50ID0gMFxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIHRoaXMuY29tbXVuaWNhdG9yID0gbmV3IFN5c3RlbVRlc3RDb21tdW5pY2F0b3Ioe29uQ29tbWFuZDogdGhpcy5vbkNvbW1hbmRSZWNlaXZlZH0pXG4gICAgdGhpcy5zZXRDb21tdW5pY2F0b3IodGhpcy5jb21tdW5pY2F0b3IpXG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIFNjb3VuZHJlbCBzZXJ2ZXIgd2hpY2ggdGhlIGJyb3dzZXIgY29ubmVjdHMgdG8gZm9yIHJlbW90ZSBldmFsdWF0aW9uIGluIHRoZSBicm93c2VyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhcnRTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2NvdW5kcmVsV3NzKSB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGFscmVhZHkgc3RhcnRlZFwiKVxuXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtwb3J0OiB0aGlzLl9zY291bmRyZWxQb3J0fSlcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IG5ldyBTZXJ2ZXJXZWJTb2NrZXQodGhpcy5zY291bmRyZWxXc3MpXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKHRoaXMuc2VydmVyV2ViU29ja2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RvcFNjb3VuZHJlbCgpIHtcbiAgICBpZiAodGhpcy5zZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBzdG9wXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLnNlcnZlcj59ICovICh0aGlzLnNlcnZlcikuY2xvc2UoKSlcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLnNjb3VuZHJlbFdzcywgXCJTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlclwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgU2NvdW5kcmVsIGNsaWVudCAoYnJvd3NlcikgdG8gY29ubmVjdCBhbmQgcmV0dXJucyBpdC5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0TXNdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdD59XG4gICAqL1xuICBhc3luYyBnZXRTY291bmRyZWxDbGllbnQodGltZW91dE1zID0gMTAwMDApIHtcbiAgICBpZiAoIXRoaXMuc2VydmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGlzIG5vdCBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcImdldFNjb3VuZHJlbENsaWVudDogd2FpdGluZyBmb3IgYnJvd3NlciBTY291bmRyZWwgaW5pdGlhbGl6YXRpb25cIilcbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aW1lb3V0TXMsIGVycm9yTWVzc2FnZTogXCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU2NvdW5kcmVsIHRvIGluaXRpYWxpemVcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwid2FpdEZvclNjb3VuZHJlbFwifSlcbiAgICB9KVxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IGJyb3dzZXIgcmVwb3J0ZWQgU2NvdW5kcmVsIGluaXRpYWxpemVkXCIpXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge2FueX0gY2xpZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgY29uc3QgaXNPcGVuQ2xpZW50ID0gKGNsaWVudCkgPT4gY2xpZW50Py5iYWNrZW5kPy53cz8ucmVhZHlTdGF0ZSA9PT0gMVxuXG4gICAgY29uc3QgZXhpc3RpbmdDbGllbnRzID0gdGhpcy5zZXJ2ZXIuZ2V0Q2xpZW50cygpXG4gICAgY29uc3QgY3VycmVudENsaWVudHMgPSBleGlzdGluZ0NsaWVudHMuc2xpY2UodGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50KVxuICAgIGNvbnN0IG9wZW5FeGlzdGluZ0NsaWVudHMgPSBjdXJyZW50Q2xpZW50cy5maWx0ZXIoaXNPcGVuQ2xpZW50KVxuXG4gICAgaWYgKG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHMubGVuZ3RofSwgaWdub3JlZDogJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9KWApXG5cbiAgICBpZiAoIXRoaXMuc2VydmVyLmV2ZW50cz8ub24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgZXZlbnRzIGFyZSB1bmF2YWlsYWJsZVwiKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7KChjbGllbnQ6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9ICovXG4gICAgbGV0IG9uTmV3Q2xpZW50XG4gICAgY29uc3QgY2xlYW51cExpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgaWYgKG9uTmV3Q2xpZW50KSB7XG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub2ZmKFwibmV3Q2xpZW50XCIsIG9uTmV3Q2xpZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCBjbGllbnRcIn0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG9uTmV3Q2xpZW50ID0gKC8qKiBAdHlwZSB7YW55fSAqLyBjbGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIWlzT3BlbkNsaWVudChjbGllbnQpKSByZXR1cm5cbiAgICAgICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgICAgICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHJlY2VpdmVkIG5ldyBvcGVuIGNsaWVudFwiKVxuICAgICAgICAgIHJlc29sdmUoY2xpZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXI/LmV2ZW50cy5vbihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH0pKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhbnVwTGlzdGVuZXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgQ1NTIHNlbGVjdG9yIG1hdGNoZXMgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmV4aXN0cyhzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdmlzaWJsZSB0ZXh0IGZyb20gYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS50ZXh0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCB0aGF0IGhhcyBjaGlsZHJlbiB3aGljaCBmaWxscyBvdXQgdGhlIGVsZW1lbnQgYW5kIHdvdWxkIG90aGVyd2lzZSBoYXZlIGNhdXNlZCBhIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5jbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kQnlUZXN0SUQodGVzdElELCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaGFzVGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuaW50ZXJhY3QoZWxlbWVudE9ySWRlbnRpZmllciwgbWV0aG9kTmFtZSwgLi4uYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRXhwZWN0cyBubyBlbGVtZW50IHRvIGJlIGZvdW5kIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm9FbGVtZW50KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZE5vV2FpdChzZWxlY3RvciwgYXJncylcbiAgICAgIGZvdW5kID0gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLnN0YXJ0c1dpdGgoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIFwiKSkge1xuICAgICAgICAvLyBJZ25vcmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIG5vdCB0byBmaW5kOiAke3NlbGVjdG9yfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge1dhaXRGb3JOb1NlbGVjdG9yQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS53YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBub3RpZmljYXRpb24gbWVzc2FnZXNcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgbm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZVRleHRzID0gW11cblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0VGV4dCgpXG5cbiAgICAgIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cy5wdXNoKHRleHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0c1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgYSBub3RpZmljYXRpb24gbWVzc2FnZSB0byBhcHBlYXIgYW5kIHdhaXRzIGZvciBpdCBpZiBuZWNlc3NhcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VcbiAgICogQHBhcmFtIHtOb3RpZmljYXRpb25NZXNzYWdlQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZXhwZWN0Tm90aWZpY2F0aW9uTWVzc2FnZShleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2UsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtkaXNtaXNzID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICBjb25zdCBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzID0gW11cbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgIGxldCBmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudFxuXG4gICAgYXdhaXQgd2FpdEZvcihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLXRlc3RpZD0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5nZXREcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwicmV0dXJuIGFyZ3VtZW50c1swXS50ZXh0Q29udGVudDtcIiwgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQpKT8udHJpbSgpIHx8IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICAgIGlmICghYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcy5pbmNsdWRlcyhub3RpZmljYXRpb25NZXNzYWdlKSkge1xuICAgICAgICAgIGFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMucHVzaChub3RpZmljYXRpb25NZXNzYWdlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vdGlmaWNhdGlvbk1lc3NhZ2UgPT0gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlKSB7XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCA9IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50XG4gICAgICAgICAgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQgPSBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvdW50XCIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3RpZmljYXRpb24gbWVzc2FnZSAke2V4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZX0gd2Fzbid0IGluY2x1ZGVkIGluOiAke2FsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuam9pbihcIiwgXCIpfWApXG4gICAgfSlcblxuICAgIGlmIChmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50ICYmIGRpc21pc3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW50ZXJhY3QoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKSAvLyBEaXNtaXNzIHRoZSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAgaWYgKCFmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBub3RpZmljYXRpb24gbWVzc2FnZSB0byBoYXZlIGEgZGF0YS1jb3VudFwiKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JOb1NlbGVjdG9yKGBbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11bZGF0YS1jb3VudD0nJHtmb3VuZE5vdGlmaWNhdGlvbk1lc3NhZ2VDb3VudH0nXWAsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGRpc21pc3NOb3RpZmljYXRpb25NZXNzYWdlcygpIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbChcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcblxuICAgIGZvciAoY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgb2Ygbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LCBcImNsaWNrXCIpXG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihcIltkYXRhLWNsYXNzPSdub3RpZmljYXRpb24tbWVzc2FnZSddXCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3lzdGVtIHRlc3QgaGFzIGJlZW4gc3RhcnRlZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzU3RhcnRlZCgpIHsgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIHN5c3RlbSB0ZXN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNhbGxlZFwiKVxuICAgIC8vIE5hdGl2ZSBBcHBpdW0gYXBwIHNlc3Npb25zIGxhdW5jaCBhbiBpbnN0YWxsZWQgYXBwIGluc3RlYWQgb2YgYSB3ZWIgcGFnZSwgc28gdGhleSBmb2xsb3cgdGhlXG4gICAgLy8gbmF0aXZlIGxpZmVjeWNsZSAobm8gZGlzdCBIVFRQIHNlcnZlciwgbm8gZHJpdmVyIG5hdmlnYXRpb24sIFdlYlNvY2tldCBzdGFydGVkIGJlZm9yZSB0aGUgYXBwKVxuICAgIC8vIGV2ZW4gd2hlbiBTWVNURU1fVEVTVF9IT1NUIGlzIFwiZGlzdFwiLlxuICAgIGNvbnN0IGlzTmF0aXZlQXBwID0gaXNOYXRpdmVBcHBTZXNzaW9uKHRoaXMuX2RyaXZlckNvbmZpZylcblxuICAgIGlmIChpc05hdGl2ZUFwcCkge1xuICAgICAgdGhpcy5jdXJyZW50VXJsID0gXCJuYXRpdmU6Ly9cIlxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlVzaW5nIG5hdGl2ZSBhcHAgaG9zdFwiKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImV4cG8tZGV2LXNlcnZlclwiKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBgaHR0cDovLyR7dGhpcy5faG9zdH06JHt0aGlzLl9wb3J0fWBcbiAgICAgIHRoaXMuZGVidWdMb2coYFVzaW5nIGV4cG8tZGV2LXNlcnZlciBhdCAke3RoaXMuY3VycmVudFVybH1gKVxuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU1lTVEVNX1RFU1RfSE9TVCA9PSBcImRpc3RcIikge1xuICAgICAgY29uc3QgY29ubmVjdEhvc3QgPSB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPz8gdGhpcy5faHR0cEhvc3RcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHtjb25uZWN0SG9zdH06JHt0aGlzLl9odHRwUG9ydH1gXG5cbiAgICAgIHRoaXMuZGVidWdMb2coYFNwYXduaW5nIEhUVFAgc2VydmVyIGZvciBkaXN0IG9uICR7dGhpcy5faHR0cEhvc3R9OiR7dGhpcy5faHR0cFBvcnR9YClcbiAgICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSBuZXcgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIoe1xuICAgICAgICBob3N0OiB0aGlzLl9odHRwSG9zdCxcbiAgICAgICAgcG9ydDogdGhpcy5faHR0cFBvcnQsXG4gICAgICAgIGRlYnVnOiB0aGlzLl9kZWJ1ZyxcbiAgICAgICAgb25FcnJvcjogdGhpcy5vbkh0dHBTZXJ2ZXJFcnJvclxuICAgICAgfSlcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIEhUVFAgc2VydmVyXCIpXG4gICAgICBhd2FpdCB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyLnN0YXJ0KClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJDaGVja2luZyBIVFRQIHNlcnZlciBoZWFsdGhcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuYXNzZXJ0UmVhY2hhYmxlKHt0aW1lb3V0TXM6IHRoaXMuZ2V0VGltZW91dHMoKX0pXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiSFRUUCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQbGVhc2Ugc2V0IFNZU1RFTV9URVNUX0hPU1QgdG8gJ2V4cG8tZGV2LXNlcnZlcicsICdkaXN0Jywgb3IgJ25hdGl2ZSdcIilcbiAgICB9XG5cbiAgICB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5zZXRCYXNlVXJsKHRoaXMuY3VycmVudFVybClcblxuICAgIC8vIFN0YXJ0IHRoZSBjbGllbnQgV2ViU29ja2V0IHNlcnZlciBiZWZvcmUgdGhlIGRyaXZlciBmb3IgbmF0aXZlIGFwcCBzZXNzaW9ucyxcbiAgICAvLyBiZWNhdXNlIHRoZSBuYXRpdmUgYXBwIGxhdW5jaGVzIGltbWVkaWF0ZWx5IG9uIGRyaXZlciBzdGFydCBhbmQgaXRzXG4gICAgLy8gdXNlU3lzdGVtVGVzdEV4cG8gaG9vayBjb25uZWN0cyB0byB0aGUgV2ViU29ja2V0IGFzIHNvb24gYXMgaXQgcmVuZGVycy5cbiAgICAvLyBJZiB0aGUgc2VydmVyIGlzbid0IGxpc3RlbmluZyB5ZXQsIHRoZSBjb25uZWN0aW9uIGZhaWxzIHdpdGggbm8gcmV0cnkuXG4gICAgaWYgKGlzTmF0aXZlQXBwKSB7XG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgV2ViU29ja2V0IHNlcnZlciAoYmVmb3JlIGRyaXZlciBmb3IgbmF0aXZlKVwiKVxuICAgICAgYXdhaXQgdGhpcy5zdGFydFdlYlNvY2tldFNlcnZlcigpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiV2ViU29ja2V0IHNlcnZlciBzdGFydGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIGRyaXZlclwiKVxuICAgIGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnN0YXJ0KClcbiAgICB0aGlzLmRlYnVnTG9nKFwiRHJpdmVyIHN0YXJ0ZWRcIilcblxuICAgIGF3YWl0IHRoaXMuc2V0VGltZW91dHMoMTAwMDApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlRpbWVvdXRzIHNldCBvbiBkcml2ZXJcIilcblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIC8vIFZpc2l0IHRoZSByb290IHBhZ2UgYW5kIHdhaXQgZm9yIEV4cG8gdG8gYmUgbG9hZGVkIGFuZCB0aGUgYXBwIHRvIGFwcGVhclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlZpc2l0aW5nIHJvb3QgcGF0aFwiKVxuICAgICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmdldFJvb3RQYXRoKClcbiAgICAgIGF3YWl0IHRoaXMudmlzaXRJbml0aWFsUm9vdFBhdGgocm9vdFBhdGgpXG4gICAgICB0aGlzLmRlYnVnTG9nKGBWaXNpdGVkIHJvb3QgcGF0aCAke3Jvb3RQYXRofWApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kKFwiYm9keSA+ICNyb290XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgZWxlbWVudCBib2R5ID4gI3Jvb3RcIilcblxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IHRydWV9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgcm9vdCBhbmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50LCB0YWtpbmcgc2NyZWVuc2hvdFwiKVxuICAgICAgICBhd2FpdCB0aGlzLnRha2VTY3JlZW5zaG90KClcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNjcmVlbnNob3QgY2FwdHVyZWQgYWZ0ZXIgcm9vdC9zeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGaW5kaW5nIHN5c3RlbVRlc3RpbmdDb21wb25lbnQgZm9yIG5hdGl2ZSBhcHBcIilcbiAgICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQoXCJzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIsIHt1c2VCYXNlU2VsZWN0b3I6IGZhbHNlLCB0aW1lb3V0OiAzMDAwMCwgdmlzaWJsZTogbnVsbH0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRXJyb3Igd2hpbGUgZmluZGluZyBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIG5hdGl2ZSBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGxvb2t1cCBmYWlsdXJlXCIpXG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2FpdCBmb3IgY2xpZW50IHRvIGNvbm5lY3RcbiAgICB0aGlzLmRlYnVnTG9nKFwiV2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uIChvcGVuaW5nKVwiKVxuICAgIHRoaXMuZGVidWdMb2coYFdTIHN0YXRlOiAke3RoaXMud3M/LnJlYWR5U3RhdGUgPz8gXCJub25lXCJ9YClcbiAgICB0aGlzLmRlYnVnTG9nKFwid2FpdEZvckNsaWVudFdlYlNvY2tldFwiKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGVkXCIpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZVxuICAgIHRoaXMuZGVidWdMb2coXCJNYXJrZWQgc3lzdGVtIHRlc3QgYXMgc3RhcnRlZFwiKVxuICAgIGlmICghaXNOYXRpdmVBcHApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTZXR0aW5nIGJhc2Ugc2VsZWN0b3IgdG8gZm9jdXNlZCBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50XCIpXG4gICAgICB0aGlzLnNldEJhc2VTZWxlY3RvcihcIltkYXRhLXRlc3RpZD0nc3lzdGVtVGVzdGluZ0NvbXBvbmVudCddW2RhdGEtZm9jdXNzZWQ9J3RydWUnXVwiKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkJhc2Ugc2VsZWN0b3Igc2V0XCIpXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjb21wbGV0ZWRcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGJyb3dzZXIgZHJpdmVyIHRvIHJlYWNoIHRoZSByb290IHJvdXRlIGFmdGVyIHN0YXJ0dXAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aCBJbml0aWFsIGFwcCByb3V0ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB2aXNpdEluaXRpYWxSb290UGF0aChyb290UGF0aCkge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMuZ2V0VGltZW91dHMoKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyVmlzaXQocm9vdFBhdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgdmlzaXRFcnJvciA9IGVuc3VyZUVycm9yKGVycm9yLCBcImluaXRpYWwgcm9vdCBwYXRoIHZpc2l0IGVycm9yXCIpXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB2aXNpdEVycm9yLm1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmV0cnlhYmxlTmV0d29ya0Vycm9yID0gbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0FERFJFU1NfVU5SRUFDSEFCTEVcIikgfHwgbWVzc2FnZS5pbmNsdWRlcyhcIm5ldDo6RVJSX0NPTk5FQ1RJT05fUkVGVVNFRFwiKVxuXG4gICAgICAgIGlmICghcmV0cnlhYmxlTmV0d29ya0Vycm9yIHx8IERhdGUubm93KCkgPj0gZGVhZGxpbmUpIHtcbiAgICAgICAgICB0aHJvdyB2aXNpdEVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRlYnVnTG9nKGBJbml0aWFsIHJvb3QgcGF0aCB2aXNpdCB3YWl0aW5nIGZvciBkcml2ZXIgbmV0d29yayByZWFkaW5lc3M6ICR7bWVzc2FnZX1gKVxuICAgICAgICBhd2FpdCB3YWl0KE1hdGgubWluKElOSVRJQUxfUk9PVF9WSVNJVF9SRVRSWV9ERUxBWV9NUywgTWF0aC5tYXgoMCwgZGVhZGxpbmUgLSBEYXRlLm5vdygpKSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRSb290UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdFBhdGggPz8gU3lzdGVtVGVzdC5yb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5fcm9vdFBhdGggPSByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFJvb3RQYXRoKCkge1xuICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5idWlsZFN5c3RlbVRlc3RQYXRoKFN5c3RlbVRlc3Qucm9vdFBhdGgpXG5cbiAgICB0aGlzLmRlYnVnTG9nKGBidWlsZFJvb3RQYXRoIHJvb3RQYXRoOiAke3Jvb3RQYXRofWApXG5cbiAgICByZXR1cm4gcm9vdFBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHN5c3RlbS10ZXN0IHF1ZXJ5IHBhcmFtcyB0byBhIHBhdGggdGhhdCB3aWxsIHJlbG9hZCB0aGUgd2ViIGFwcC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkU3lzdGVtVGVzdFBhdGgocGF0aCkge1xuICAgIGNvbnN0IGlzQWJzb2x1dGVVcmwgPSAvXlthLXpdKzpcXC9cXC8vaS50ZXN0KHBhdGgpXG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoLCBcImh0dHA6Ly9sb2NhbGhvc3RcIilcbiAgICBjb25zdCBhcHBlbmRQYXJhbSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8ga2V5LCAvKiogQHR5cGUge2FueX0gKi8gdmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm5cbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSlcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXJsQXJncykge1xuICAgICAgaWYgKHRoaXMuX3VybEFyZ3MgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fdXJsQXJncykge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX3VybEFyZ3MpKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0XCIpKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RcIiwgXCJ0cnVlXCIpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIikgJiYgdGhpcy5fY2xpZW50V3NQb3J0ICE9PSAxOTg1KSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RDbGllbnRXc1BvcnRcIiwgdGhpcy5fY2xpZW50V3NQb3J0KVxuICAgIH1cblxuICAgIGlmICghdXJsLnNlYXJjaFBhcmFtcy5oYXMoXCJzeXN0ZW1UZXN0U2NvdW5kcmVsUG9ydFwiKSAmJiB0aGlzLl9zY291bmRyZWxQb3J0ICE9PSA4MDkwKSB7XG4gICAgICBhcHBlbmRQYXJhbShcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIsIHRoaXMuX3Njb3VuZHJlbFBvcnQpXG4gICAgfVxuXG4gICAgaWYgKGlzQWJzb2x1dGVVcmwpIHJldHVybiB1cmwuaHJlZlxuXG4gICAgcmV0dXJuIGAke3VybC5wYXRobmFtZX0ke3VybC5zZWFyY2h9JHt1cmwuaGFzaH1gXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjbGllbnQgd2ViIHNvY2tldCB0byBjb25uZWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNsaWVudFdlYlNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5fY2xpZW50V3NDb25uZWN0VGltZW91dCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudCA9IDBcbiAgICB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faHR0cFNlcnZlckVycm9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jb21tdW5pY2F0b3IgPSBuZXcgU3lzdGVtVGVzdENvbW11bmljYXRvcih7b25Db21tYW5kOiB0aGlzLm9uQ29tbWFuZFJlY2VpdmVkfSlcbiAgICB0aGlzLnNldENvbW11bmljYXRvcih0aGlzLmNvbW11bmljYXRvcilcblxuICAgIHRoaXMuc3RhcnRTY291bmRyZWwoKVxuICAgIGF3YWl0IHRoaXMuc3RhcnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSB3c3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbF1cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbG9zZVdlYlNvY2tldFNlcnZlcih3c3MsIGxhYmVsID0gXCJXZWJTb2NrZXQgc2VydmVyXCIpIHtcbiAgICBpZiAoIXdzcykgcmV0dXJuXG5cbiAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogYHRpbWVvdXQgd2hpbGUgY2xvc2luZyAke2xhYmVsfWB9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlXG4gICAgICBjb25zdCB0ZXJtaW5hdGVDbGllbnQgPSAoLyoqIEB0eXBlIHthbnl9ICovIGNsaWVudCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsaWVudC50ZXJtaW5hdGUoKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBJZ25vcmUgdGVybWluYXRpb24gZXJyb3JzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNldHRsZSA9ICgvKiogQHR5cGUgeyh2YWx1ZTogYW55KSA9PiB2b2lkfSAqLyBjYWxsYmFjaywgLyoqIEB0eXBlIHthbnl9ICovIGFyZykgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuXG4gICAgICAgIHNldHRsZWQgPSB0cnVlXG4gICAgICAgIGNhbGxiYWNrKGFyZylcbiAgICAgIH1cblxuICAgICAgd3NzLm9uY2UoXCJjbG9zZVwiLCAoKSA9PiBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKSlcbiAgICAgIHdzcy5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiBzZXR0bGUocmVqZWN0LCBlcnJvcikpXG4gICAgICBpZiAod3NzLmNsaWVudHMgJiYgd3NzLmNsaWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgd3NzLmNsaWVudHMuZm9yRWFjaCh0ZXJtaW5hdGVDbGllbnQpXG4gICAgICB9XG4gICAgICB3c3MuY2xvc2UoKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgc2V0dGxlKHJlamVjdCwgZXJyb3IpXG4gICAgICAgIGVsc2Ugc2V0dGxlKHJlc29sdmUsIHVuZGVmaW5lZClcbiAgICAgIH0pXG4gICAgfSkpXG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "system-testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.121",
|
|
4
4
|
"description": "System testing with Selenium and browsers.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"system-testing": "build/cli.js"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"prepare:dummy": "npm run build && rm -rf spec/dummy/node_modules/system-testing && mkdir -p spec/dummy/node_modules/system-testing && cp -r build package.json spec/dummy/node_modules/system-testing/",
|
|
34
34
|
"build": "rm -rf build && npm run compile",
|
|
35
35
|
"compile": "tsc",
|
|
36
|
-
"build:apk:dummy": "npm run prepare:dummy && cd spec/dummy && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 npx expo prebuild --platform android --no-install --non-interactive && node ../../scripts/set-gradle-wrapper-network-timeout.mjs android/gradle/wrapper/gradle-wrapper.properties 60000 && cd android && SDK_ROOT=${ANDROID_SDK_ROOT:-/usr/lib/android-sdk} && echo \"sdk.dir=$SDK_ROOT\" > local.properties && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 ANDROID_SDK_ROOT=$SDK_ROOT ANDROID_HOME=$SDK_ROOT ANDROID_SDK_HOME=/tmp/android-sdk-home GRADLE_USER_HOME=/tmp/gradle-home ./gradlew --no-daemon --stacktrace assembleRelease",
|
|
36
|
+
"build:apk:dummy": "npm run prepare:dummy && cd spec/dummy && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 npx expo prebuild --platform android --no-install --non-interactive && node ../../scripts/set-gradle-wrapper-network-timeout.mjs android/gradle/wrapper/gradle-wrapper.properties 60000 && cd android && SDK_ROOT=${ANDROID_SDK_ROOT:-/usr/lib/android-sdk} && echo \"sdk.dir=$SDK_ROOT\" > local.properties && EXPO_PUBLIC_SYSTEM_TEST=true EXPO_PUBLIC_SYSTEM_TEST_HOST=10.0.2.2 ANDROID_SDK_ROOT=$SDK_ROOT ANDROID_HOME=$SDK_ROOT ANDROID_SDK_HOME=/tmp/android-sdk-home GRADLE_USER_HOME=/tmp/gradle-home HEARTBEAT_LABEL=\"Gradle assembleRelease\" node ../../../scripts/run-with-heartbeat.js ./gradlew --no-daemon --stacktrace assembleRelease",
|
|
37
37
|
"export:web": "npm run prepare:dummy && npm --prefix spec/dummy run export:web",
|
|
38
38
|
"lint": "npm run eslint && npm run typecheck",
|
|
39
39
|
"prepublishOnly": "npm run build",
|
|
@@ -48,7 +48,6 @@
|
|
|
48
48
|
"eslint": "eslint --max-warnings 0"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"appium": "3.5.2",
|
|
52
51
|
"awaitery": "^1.0.12",
|
|
53
52
|
"diggerize": "^1.0.9",
|
|
54
53
|
"eventemitter3": "^5.0.1",
|
|
@@ -64,10 +63,14 @@
|
|
|
64
63
|
"ya-use-event-emitter": "^0.1.2"
|
|
65
64
|
},
|
|
66
65
|
"peerDependencies": {
|
|
66
|
+
"appium": ">= 3.5.2",
|
|
67
67
|
"react": ">= 18.3.0",
|
|
68
68
|
"selenium-webdriver": ">= 4.34.0"
|
|
69
69
|
},
|
|
70
70
|
"peerDependenciesMeta": {
|
|
71
|
+
"appium": {
|
|
72
|
+
"optional": true
|
|
73
|
+
},
|
|
71
74
|
"react": {
|
|
72
75
|
"optional": true
|
|
73
76
|
}
|
|
@@ -79,6 +82,7 @@
|
|
|
79
82
|
"@types/qs": "^6.14.0",
|
|
80
83
|
"@types/react": "^19.2.7",
|
|
81
84
|
"@types/selenium-webdriver": "^4.35.4",
|
|
85
|
+
"appium": "3.5.2",
|
|
82
86
|
"appium-chromium-driver": "^2.1.6",
|
|
83
87
|
"appium-uiautomator2-driver": "^7.1.0",
|
|
84
88
|
"eslint": "^10.1.0",
|