system-testing 1.0.114 → 1.0.116

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.
@@ -4,11 +4,13 @@ import Server from "scoundrel-remote-eval/build/server/index.js";
4
4
  import ServerWebSocket from "scoundrel-remote-eval/build/server/connections/web-socket/index.js";
5
5
  import SystemTestCommunicator from "./system-test-communicator.js";
6
6
  import SystemTestHttpServer from "./system-test-http-server.js";
7
- import { waitFor } from "awaitery";
7
+ import { wait, waitFor } from "awaitery";
8
8
  import timeout from "awaitery/build/timeout.js";
9
+ import { ensureError } from "typanic";
9
10
  import { WebSocketServer } from "ws";
10
11
  import Browser from "./browser.js";
11
12
  const CLIENT_WEBSOCKET_CONNECT_TIMEOUT_MS = 30000;
13
+ const INITIAL_ROOT_VISIT_RETRY_DELAY_MS = 100;
12
14
  const NATIVE_CLIENT_WEBSOCKET_CONNECT_TIMEOUT_MS = 120000;
13
15
  /** @returns {number} */
14
16
  export function defaultClientWebSocketConnectTimeout() {
@@ -43,7 +45,7 @@ export function defaultClientWebSocketConnectTimeout() {
43
45
  * @typedef {object} FindArgs
44
46
  * @property {number} [timeout] Override timeout for lookup.
45
47
  * @property {boolean | null} [visible] Whether to require elements to be visible (`true`) or hidden (`false`). Use `null` to disable visibility filtering.
46
- * @property {"actions" | "human" | "js"} [method] Override the click path. `"actions"` uses the Selenium Actions API (real pointer move + click); `"human"` uses multiple pointer moves and pauses before clicking; `"js"` dispatches `element.click()` via `executeScript` inside the page's JS context (skips WebDriver's pointer synthesis entirely — useful when the default click is dropped by a framework responder that refuses synthetic WebDriver pointer events).
48
+ * @property {"actions" | "human" | "js"} [method] Override the click path. `"actions"` uses the Selenium Actions API (real pointer move + click); `"human"` uses multiple pointer moves and pauses before clicking; `"js"` dispatches `element.click()` via `executeScript` inside the page's JS context and is for diagnostics only, not committed stabilization fixes.
47
49
  * @property {number} [clickOffsetX] X offset for `actions`/`human` pointer clicks relative to the target element.
48
50
  * @property {number} [clickOffsetY] Y offset for `actions`/`human` pointer clicks relative to the target element.
49
51
  * @property {number} [humanStepDelay] Pause duration in ms between human pointer moves.
@@ -181,20 +183,9 @@ class SystemTest extends Browser {
181
183
  systemTest.debugLog("Browser cookies cleared");
182
184
  systemTest.debugLog("getRootPath");
183
185
  const rootPath = systemTest.getRootPath();
184
- systemTest.debugLog(`Visit rootPath with dismissTo: ${rootPath}`);
185
- await systemTest.dismissTo(rootPath);
186
- systemTest.debugLog(`Dismissed to root path ${rootPath}`);
187
- if (!systemTest.ws || systemTest.ws.readyState !== 1) {
188
- systemTest.debugLog("WebSocket not connected after dismissTo, waiting for reconnection");
189
- systemTest.ws = null;
190
- systemTest.getCommunicator().ws = null;
191
- await systemTest.waitForClientWebSocket();
192
- systemTest.debugLog("Client websocket reconnected");
193
- }
186
+ await systemTest.resetToRootPathForRun(rootPath);
194
187
  systemTest.debugLog("Run started - send initialize");
195
- await timeout({ timeout: 10000, errorMessage: "Sending intialize to useSystemTest() timed out" }, async () => {
196
- await systemTest.getCommunicator().sendCommand({ type: "initialize" });
197
- });
188
+ await systemTest.initializeBrowserContext();
198
189
  /** @type {unknown} */
199
190
  let runError = undefined;
200
191
  /** @type {unknown} */
@@ -232,6 +223,8 @@ class SystemTest extends Browser {
232
223
  teardownError = error;
233
224
  }
234
225
  }
226
+ systemTest._browserErrors = [];
227
+ systemTest.applyArgs({ errorFilter: undefined, failOnBrowserError: true, failOnConsoleError: false });
235
228
  }
236
229
  if (runError) {
237
230
  if (teardownError) {
@@ -263,6 +256,67 @@ class SystemTest extends Browser {
263
256
  throw teardownError;
264
257
  }
265
258
  }
259
+ /**
260
+ * Resets the app to the root test route before each run.
261
+ * @param {string} rootPath
262
+ * @returns {Promise<void>}
263
+ */
264
+ async resetToRootPathForRun(rootPath) {
265
+ this.debugLog(`Visit rootPath with dismissTo: ${rootPath}`);
266
+ await this.dismissTo(rootPath);
267
+ this.debugLog(`Dismissed to root path ${rootPath}`);
268
+ if (!this.ws || this.ws.readyState !== 1) {
269
+ this.debugLog("WebSocket not connected after dismissTo, waiting for reconnection");
270
+ this.ws = null;
271
+ this.getCommunicator().ws = null;
272
+ await this.waitForClientWebSocket();
273
+ this.debugLog("Client websocket reconnected");
274
+ }
275
+ }
276
+ /**
277
+ * Visits a path. Native uses the in-app helper; web reloads through the driver and reconnects the test bridge.
278
+ * @param {string} path
279
+ * @param {import("./browser.js").BrowserNavigationArgs} [args]
280
+ * @returns {Promise<void>}
281
+ */
282
+ async visit(path, args = {}) {
283
+ if (process.env.SYSTEM_TEST_HOST === "native") {
284
+ await super.visit(path, args);
285
+ return;
286
+ }
287
+ await timeout({ timeout: this.getCommandTimeout(args.timeout), errorMessage: `timeout while visiting path: ${path}` }, async () => {
288
+ await this.visitPathWithDriverAndReconnect(path);
289
+ await this.initializeBrowserContext();
290
+ });
291
+ }
292
+ /** @returns {Promise<void>} */
293
+ async initializeBrowserContext() {
294
+ await timeout({ timeout: 10000, errorMessage: "Sending initialize to useSystemTest() timed out" }, async () => {
295
+ await this.getCommunicator().sendCommand({ type: "initialize" });
296
+ });
297
+ }
298
+ /**
299
+ * Reloads a web route through the driver and waits for the browser command websocket.
300
+ * @param {string} path
301
+ * @returns {Promise<void>}
302
+ */
303
+ async visitPathWithDriverAndReconnect(path) {
304
+ this.ignoreExistingScoundrelClients();
305
+ this.ws = null;
306
+ this.getCommunicator().ws = null;
307
+ await this.driverVisit(this.buildSystemTestPath(path));
308
+ this.debugLog(`Driver visited path ${path}`);
309
+ await this.waitForClientWebSocket();
310
+ this.debugLog("Client websocket reconnected after driver navigation");
311
+ }
312
+ /** @returns {void} */
313
+ ignoreExistingScoundrelClients() {
314
+ if (!this.server) {
315
+ throw new Error("Scoundrel server is not started");
316
+ }
317
+ this._ignoredScoundrelClientCount = this.server.getClients().length;
318
+ this.debugLog(`Ignoring ${this._ignoredScoundrelClientCount} Scoundrel client(s) from previous browser contexts`);
319
+ }
266
320
  /**
267
321
  * Creates a new SystemTest instance
268
322
  * @param {SystemTestArgs} [args]
@@ -283,6 +337,8 @@ class SystemTest extends Browser {
283
337
  /** @type {Error[]} */
284
338
  this._browserErrors = [];
285
339
  this._scoundrelPort = 8090;
340
+ /** @type {number} */
341
+ this._ignoredScoundrelClientCount = 0;
286
342
  /** @type {WebSocketServer | undefined} */
287
343
  this.scoundrelWss = undefined;
288
344
  /** @type {WebSocketServer | undefined} */
@@ -411,13 +467,14 @@ class SystemTest extends Browser {
411
467
  * @returns {boolean}
412
468
  */
413
469
  const isOpenClient = (client) => client?.backend?.ws?.readyState === 1;
414
- const existingClients = this.server.getClients?.();
415
- const openExistingClients = existingClients?.filter(isOpenClient);
416
- if (openExistingClients && openExistingClients.length > 0) {
470
+ const existingClients = this.server.getClients();
471
+ const currentClients = existingClients.slice(this._ignoredScoundrelClientCount);
472
+ const openExistingClients = currentClients.filter(isOpenClient);
473
+ if (openExistingClients.length > 0) {
417
474
  this.debugLog(`getScoundrelClient: using existing open client (${openExistingClients.length} available)`);
418
475
  return openExistingClients[openExistingClients.length - 1];
419
476
  }
420
- this.debugLog(`getScoundrelClient: no open cached clients, waiting for new connection (cached total: ${existingClients?.length ?? 0})`);
477
+ this.debugLog(`getScoundrelClient: no open cached clients, waiting for new connection (cached total: ${existingClients.length}, ignored: ${this._ignoredScoundrelClientCount})`);
421
478
  if (!this.server.events?.on) {
422
479
  throw new Error("Scoundrel server events are unavailable");
423
480
  }
@@ -715,7 +772,7 @@ class SystemTest extends Browser {
715
772
  // Visit the root page and wait for Expo to be loaded and the app to appear
716
773
  this.debugLog("Visiting root path");
717
774
  const rootPath = this.getRootPath();
718
- await this.driverVisit(rootPath);
775
+ await this.visitInitialRootPath(rootPath);
719
776
  this.debugLog(`Visited root path ${rootPath}`);
720
777
  try {
721
778
  this.debugLog("Finding root element body > #root");
@@ -761,6 +818,30 @@ class SystemTest extends Browser {
761
818
  }
762
819
  this.debugLog("Start completed");
763
820
  }
821
+ /**
822
+ * Waits for the browser driver to reach the root route after startup.
823
+ * @param {string} rootPath Initial app route.
824
+ * @returns {Promise<void>}
825
+ */
826
+ async visitInitialRootPath(rootPath) {
827
+ const deadline = Date.now() + this.getTimeouts();
828
+ while (true) {
829
+ try {
830
+ await this.driverVisit(rootPath);
831
+ return;
832
+ }
833
+ catch (error) {
834
+ const visitError = ensureError(error, "initial root path visit error");
835
+ const message = visitError.message;
836
+ const retryableNetworkError = message.includes("net::ERR_ADDRESS_UNREACHABLE") || message.includes("net::ERR_CONNECTION_REFUSED");
837
+ if (!retryableNetworkError || Date.now() >= deadline) {
838
+ throw visitError;
839
+ }
840
+ this.debugLog(`Initial root path visit waiting for driver network readiness: ${message}`);
841
+ await wait(Math.min(INITIAL_ROOT_VISIT_RETRY_DELAY_MS, Math.max(0, deadline - Date.now())));
842
+ }
843
+ }
844
+ }
764
845
  /**
765
846
  * @returns {string}
766
847
  */
@@ -778,7 +859,18 @@ class SystemTest extends Browser {
778
859
  * @returns {string}
779
860
  */
780
861
  buildRootPath() {
781
- const url = new URL(SystemTest.rootPath, "http://localhost");
862
+ const rootPath = this.buildSystemTestPath(SystemTest.rootPath);
863
+ this.debugLog(`buildRootPath rootPath: ${rootPath}`);
864
+ return rootPath;
865
+ }
866
+ /**
867
+ * Adds system-test query params to a path that will reload the web app.
868
+ * @param {string} path
869
+ * @returns {string}
870
+ */
871
+ buildSystemTestPath(path) {
872
+ const isAbsoluteUrl = /^[a-z]+:\/\//i.test(path);
873
+ const url = new URL(path, "http://localhost");
782
874
  const appendParam = (/** @type {string} */ key, /** @type {any} */ value) => {
783
875
  if (value === undefined || value === null)
784
876
  return;
@@ -796,15 +888,18 @@ class SystemTest extends Browser {
796
888
  }
797
889
  }
798
890
  }
891
+ if (!url.searchParams.has("systemTest")) {
892
+ appendParam("systemTest", "true");
893
+ }
799
894
  if (!url.searchParams.has("systemTestClientWsPort") && this._clientWsPort !== 1985) {
800
895
  appendParam("systemTestClientWsPort", this._clientWsPort);
801
896
  }
802
897
  if (!url.searchParams.has("systemTestScoundrelPort") && this._scoundrelPort !== 8090) {
803
898
  appendParam("systemTestScoundrelPort", this._scoundrelPort);
804
899
  }
805
- const rootPath = `${url.pathname}${url.search}${url.hash}`;
806
- this.debugLog(`buildRootPath rootPath: ${rootPath}`);
807
- return rootPath;
900
+ if (isAbsoluteUrl)
901
+ return url.href;
902
+ return `${url.pathname}${url.search}${url.hash}`;
808
903
  }
809
904
  /**
810
905
  * Waits for the client web socket to connect
@@ -925,6 +1020,7 @@ class SystemTest extends Browser {
925
1020
  this.scoundrelWss = undefined;
926
1021
  this.server = undefined;
927
1022
  this.serverWebSocket = undefined;
1023
+ this._ignoredScoundrelClientCount = 0;
928
1024
  this.systemTestHttpServer = undefined;
929
1025
  this._httpServerError = undefined;
930
1026
  this.waitForClientWebSocketPromiseReject = undefined;
@@ -974,4 +1070,4 @@ class SystemTest extends Browser {
974
1070
  }
975
1071
  SystemTest.rootPath = "/blank?systemTest=true";
976
1072
  export default SystemTest;
977
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDaEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFFbEMsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQsd0JBQXdCO0FBQ3hCLE1BQU0sVUFBVSxvQ0FBb0M7SUFDbEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFBO0FBQ3JJLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIOztHQUVHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxzQ0FBc0MsQ0FBQyxPQUFPO0lBQ3JELE9BQU8sZ0VBQWdFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQ3ZGLENBQUM7QUFFRCxrQ0FBa0M7QUFDbEMsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFB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QUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDbkQsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUN0QyxDQUFDO1lBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUNsQixJQUFJLEtBQUs7b0JBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTs7b0JBQzNCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDakMsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQzs7QUF0K0JNLG1CQUFRLEdBQUcsd0JBQXdCLEFBQTNCLENBQTJCO2VBRHZCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtkaWdnfSBmcm9tIFwiZGlnZ2VyaXplXCJcbmltcG9ydCBTZXJ2ZXIgZnJvbSBcInNjb3VuZHJlbC1yZW1vdGUtZXZhbC9idWlsZC9zZXJ2ZXIvaW5kZXguanNcIlxuaW1wb3J0IFNlcnZlcldlYlNvY2tldCBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9jb25uZWN0aW9ucy93ZWItc29ja2V0L2luZGV4LmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yIGZyb20gXCIuL3N5c3RlbS10ZXN0LWNvbW11bmljYXRvci5qc1wiXG5pbXBvcnQgU3lzdGVtVGVzdEh0dHBTZXJ2ZXIgZnJvbSBcIi4vc3lzdGVtLXRlc3QtaHR0cC1zZXJ2ZXIuanNcIlxuaW1wb3J0IHt3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IHtXZWJTb2NrZXRTZXJ2ZXJ9IGZyb20gXCJ3c1wiXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyLmpzXCJcblxuY29uc3QgQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVMgPSAzMDAwMFxuY29uc3QgTkFUSVZFX0NMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TID0gMTIwMDAwXG5cbi8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCgpIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCIgPyBOQVRJVkVfQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVMgOiBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NU1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5c3RlbVRlc3RBcmdzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIEhvc3RuYW1lIGZvciB0aGUgYXBwIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gUG9ydCBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBIb3N0XSBIb3N0bmFtZSBmb3IgdGhlIHN0YXRpYyBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHR0cFBvcnRdIFBvcnQgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2h0dHBDb25uZWN0SG9zdF0gSG9zdG5hbWUgdXNlZCBieSB0aGUgZHJpdmVyIHRvIHJlYWNoIHRoZSBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnXSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBhbnkpID0+IGJvb2xlYW59IFtlcnJvckZpbHRlcl0gRmlsdGVyIGZvciBicm93c2VyIGVycm9ycyAocmV0dXJuIGZhbHNlIHRvIGlnbm9yZSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsT25Ccm93c2VyRXJyb3JdIFRocm93IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMgZnJvbSBmaW5kZXIvaW50ZXJhY3QgaGVscGVycy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxPbkNvbnNvbGVFcnJvcl0gVHJlYXQgYnJvd3NlciBjb25zb2xlLmVycm9yIGNhbGxzIGFzIHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWVudFdzUG9ydF0gUG9ydCBmb3IgdGhlIGJyb3dzZXItY29tbWFuZCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGllbnRXc0Nvbm5lY3RUaW1lb3V0XSBUaW1lb3V0IGZvciB0aGUgYnJvd3Nlci1jb21tYW5kIFdlYlNvY2tldCBjbGllbnQgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbc2NvdW5kcmVsUG9ydF0gUG9ydCBmb3IgdGhlIFNjb3VuZHJlbCBXZWJTb2NrZXQgc2VydmVyLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbdXJsQXJnc10gUXVlcnkgcGFyYW1zIGFwcGVuZGVkIHRvIHRoZSByb290IHBhdGguXG4gKiBAcHJvcGVydHkge1N5c3RlbVRlc3REcml2ZXJDb25maWd9IFtkcml2ZXJdIERyaXZlciBjb25maWd1cmF0aW9uLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtTeXN0ZW1UZXN0QXJncyAmIHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmU/OiBib29sZWFufX0gU3lzdGVtVGVzdFJ1bkFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnXG4gKiBAcHJvcGVydHkge1wic2VsZW5pdW1cInxcImFwcGl1bVwifSBbdHlwZV0gRHJpdmVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIERyaXZlci1zcGVjaWZpYyBvcHRpb25zLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZpbmRBcmdzXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdIE92ZXJyaWRlIHRpbWVvdXQgZm9yIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IG51bGx9IFt2aXNpYmxlXSBXaGV0aGVyIHRvIHJlcXVpcmUgZWxlbWVudHMgdG8gYmUgdmlzaWJsZSAoYHRydWVgKSBvciBoaWRkZW4gKGBmYWxzZWApLiBVc2UgYG51bGxgIHRvIGRpc2FibGUgdmlzaWJpbGl0eSBmaWx0ZXJpbmcuXG4gKiBAcHJvcGVydHkge1wiYWN0aW9uc1wiIHwgXCJodW1hblwiIHwgXCJqc1wifSBbbWV0aG9kXSBPdmVycmlkZSB0aGUgY2xpY2sgcGF0aC4gYFwiYWN0aW9uc1wiYCB1c2VzIHRoZSBTZWxlbml1bSBBY3Rpb25zIEFQSSAocmVhbCBwb2ludGVyIG1vdmUgKyBjbGljayk7IGBcImh1bWFuXCJgIHVzZXMgbXVsdGlwbGUgcG9pbnRlciBtb3ZlcyBhbmQgcGF1c2VzIGJlZm9yZSBjbGlja2luZzsgYFwianNcImAgZGlzcGF0Y2hlcyBgZWxlbWVudC5jbGljaygpYCB2aWEgYGV4ZWN1dGVTY3JpcHRgIGluc2lkZSB0aGUgcGFnZSdzIEpTIGNvbnRleHQgKHNraXBzIFdlYkRyaXZlcidzIHBvaW50ZXIgc3ludGhlc2lzIGVudGlyZWx5IOKAlCB1c2VmdWwgd2hlbiB0aGUgZGVmYXVsdCBjbGljayBpcyBkcm9wcGVkIGJ5IGEgZnJhbWV3b3JrIHJlc3BvbmRlciB0aGF0IHJlZnVzZXMgc3ludGhldGljIFdlYkRyaXZlciBwb2ludGVyIGV2ZW50cykuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWNrT2Zmc2V0WF0gWCBvZmZzZXQgZm9yIGBhY3Rpb25zYC9gaHVtYW5gIHBvaW50ZXIgY2xpY2tzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRZXSBZIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBEZWxheV0gUGF1c2UgZHVyYXRpb24gaW4gbXMgYmV0d2VlbiBodW1hbiBwb2ludGVyIG1vdmVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtodW1hblN0ZXBzXSBOdW1iZXIgb2YgaW50ZXJtZWRpYXRlIHBvaW50ZXIgbW92ZXMgYmVmb3JlIHRoZSBmaW5hbCBjbGljayB0YXJnZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzY3JvbGxUb10gV2hldGhlciB0byBzY3JvbGwgZm91bmQgZWxlbWVudHMgaW50byB2aWV3IGJlZm9yZSByZXR1cm5pbmcgdGhlbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtzY3JvbGxDb250YWluZXJUZXN0SURzXSBOYXRpdmUgdGVzdCBJRHMgdGhhdCBzaG91bGQgYmUgdHJpZWQgYXMgc2Nyb2xsIGNvbnRhaW5lcnMgYmVmb3JlIGZhbGxpbmcgYmFjayB0byB2aWV3cG9ydCBnZXN0dXJlcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7RmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn19IEludGVyYWN0QXJnc1xuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXRGb3JOb1NlbGVjdG9yQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWNhdGlvbk1lc3NhZ2VBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNtaXNzXSBXaGV0aGVyIHRvIGRpc21pc3MgdGhlIG5vdGlmaWNhdGlvbiBhZnRlciBpdCBhcHBlYXJzLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVDaHJvbWVQYXNzd29yZEZpZWxkV2FybmluZyhtZXNzYWdlKSB7XG4gIHJldHVybiAvKD86XnxcXHMtXFxzKVxcW0RPTVxcXSBQYXNzd29yZCBmaWVsZCBpcyBub3QgY29udGFpbmVkIGluIGEgZm9ybTovaS50ZXN0KG1lc3NhZ2UpXG59XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gKi9cbmNvbnN0IGdsb2JhbEFueSA9IGdsb2JhbFRoaXNcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3lzdGVtVGVzdCBleHRlbmRzIEJyb3dzZXIge1xuICBzdGF0aWMgcm9vdFBhdGggPSBcIi9ibGFuaz9zeXN0ZW1UZXN0PXRydWVcIlxuXG4gIC8qKiBAdHlwZSB7U3lzdGVtVGVzdENvbW11bmljYXRvciB8IHVuZGVmaW5lZH0gKi9cbiAgY29tbXVuaWNhdG9yID0gdW5kZWZpbmVkXG5cbiAgX3N0YXJ0ZWQgPSBmYWxzZVxuICBfY2xpZW50V3NQb3J0ID0gMTk4NVxuICBfY2xpZW50V3NDb25uZWN0VGltZW91dCA9IENMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TXG4gIF9odHRwSG9zdCA9IFwibG9jYWxob3N0XCJcbiAgX2h0dHBQb3J0ID0gMTk4NFxuICBfZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZVxuICBfZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2VcbiAgLyoqIEB0eXBlIHsoKGVycm9yOiBhbnkpID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkfSAqL1xuICBfZXJyb3JGaWx0ZXIgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtFcnJvcltdfSAqL1xuICBfYnJvd3NlckVycm9ycyA9IFtdXG4gIF9zY291bmRyZWxQb3J0ID0gODA5MFxuICAvKiogQHR5cGUge1dlYlNvY2tldFNlcnZlciB8IHVuZGVmaW5lZH0gKi9cbiAgc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBjbGllbnRXc3MgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzeXN0ZW0gdGVzdCBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1N5c3RlbVRlc3RBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1N5c3RlbVRlc3R9XG4gICAqL1xuICBzdGF0aWMgY3VycmVudChhcmdzID0ge30pIHtcbiAgICBpZiAoIWdsb2JhbEFueS5zeXN0ZW1UZXN0KSB7XG4gICAgICBnbG9iYWxBbnkuc3lzdGVtVGVzdCA9IG5ldyBTeXN0ZW1UZXN0KGFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JhbEFueS5zeXN0ZW1UZXN0LmFwcGx5QXJncyhhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBnbG9iYWxBbnkuc3lzdGVtVGVzdFxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgbXV0YWJsZSBvcHRpb25zIHRvIGFuIGFscmVhZHktcnVubmluZyBzaW5nbGV0b24gU3lzdGVtVGVzdC5cbiAgICogQHBhcmFtIHtQYXJ0aWFsPFN5c3RlbVRlc3RBcmdzPn0gYXJnc1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFwcGx5QXJncyhhcmdzID0ge30pIHtcbiAgICBpZiAoXCJkZWJ1Z1wiIGluIGFyZ3MpIHRoaXMuX2RlYnVnID0gYXJncy5kZWJ1ZyA/PyBmYWxzZVxuICAgIGlmIChcImVycm9yRmlsdGVyXCIgaW4gYXJncykgdGhpcy5fZXJyb3JGaWx0ZXIgPSBhcmdzLmVycm9yRmlsdGVyXG4gICAgaWYgKFwiZmFpbE9uQnJvd3NlckVycm9yXCIgaW4gYXJncykgdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yID0gYXJncy5mYWlsT25Ccm93c2VyRXJyb3IgPz8gdHJ1ZVxuICAgIGlmIChcImZhaWxPbkNvbnNvbGVFcnJvclwiIGluIGFyZ3MpIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGFyZ3MuZmFpbE9uQ29uc29sZUVycm9yID8/IGZhbHNlXG4gIH1cblxuICAvKiogQHJldHVybnMge1N5c3RlbVRlc3RDb21tdW5pY2F0b3J9ICovXG4gIGdldENvbW11bmljYXRvcigpIHtcbiAgICBpZiAoIXRoaXMuY29tbXVuaWNhdG9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tdW5pY2F0b3IgaGFzbid0IGJlZW4gaW5pdGlhbGl6ZWQgeWV0XCIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tbXVuaWNhdG9yXG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgYW4gZXJyb3IgbWVzc2FnZSBpZiBwb3NzaWJsZSBmcm9tIHRoZSBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgYnJvd3Nlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX0gfCBFcnJvcn0gZGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKSB7XG4gICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGRhdGEubWVzc2FnZVxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgZGF0YS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YVxuXG4gICAgY29uc3QgZmlyc3RWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZGF0YT8udmFsdWUpID8gZGF0YS52YWx1ZVswXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKGZpcnN0VmFsdWUgaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlb2YgZmlyc3RWYWx1ZS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3RWYWx1ZVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBicm93c2VyIGVycm9yIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIGJ1aWx0LWluIHJ1bGVzIGFuZCBhbiBvcHRpb25hbCBlcnJvciBmaWx0ZXIuXG4gICAqIEBwYXJhbSB7e21lc3NhZ2U/OiBzdHJpbmcsIHZhbHVlPzogYW55W119fSBkYXRhXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmV4dHJhY3RFcnJvck1lc3NhZ2UoZGF0YSlcblxuICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE4XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoXCJNaW5pZmllZCBSZWFjdCBlcnJvciAjNDE5XCIpKSByZXR1cm4gdHJ1ZVxuICAgICAgaWYgKHNob3VsZElnbm9yZUNocm9tZVBhc3N3b3JkRmllbGRXYXJuaW5nKG1lc3NhZ2UpKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9lcnJvckZpbHRlciAmJiB0aGlzLl9lcnJvckZpbHRlcihkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBvdmVybG9hZFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3N9IGFyZ3NcbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICAvKipcbiAgICogUnVucyBhIHN5c3RlbSB0ZXN0XG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdFJ1bkFyZ3MgfCBmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2FyZ3NdXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IFtjYWxsYmFja11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcnVuKGFyZ3MsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgcmVzb2x2ZWRDYWxsYmFjayA9IHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyBhcmdzIDogY2FsbGJhY2tcbiAgICBjb25zdCB7cmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlID0gdHJ1ZSwgLi4uc3lzdGVtVGVzdEFyZ3N9ID0gLyoqIEB0eXBlIHtTeXN0ZW1UZXN0UnVuQXJnc30gKi8gKHR5cGVvZiBhcmdzID09PSBcImZ1bmN0aW9uXCIgPyB7fSA6IGFyZ3MgfHwge30pXG4gICAgY29uc3Qgc3lzdGVtVGVzdCA9IHRoaXMuY3VycmVudChzeXN0ZW1UZXN0QXJncylcblxuICAgIGlmICghcmVzb2x2ZWRDYWxsYmFjaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3lzdGVtVGVzdC5ydW4gcmVxdWlyZXMgYSBjYWxsYmFja1wiKVxuICAgIH1cblxuICAgIHN5c3RlbVRlc3QuX2Jyb3dzZXJFcnJvcnMgPSBbXVxuICAgIHN5c3RlbVRlc3QuYXBwbHlBcmdzKHtmYWlsT25Ccm93c2VyRXJyb3I6IHRydWUsIGZhaWxPbkNvbnNvbGVFcnJvcjogZmFsc2UsIC4uLnN5c3RlbVRlc3RBcmdzfSlcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSZXNldHRpbmcgYnJvd3NlciBjb29raWVzIGJlZm9yZSBpbml0aWFsaXplXCIpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5kZWxldGVBbGxDb29raWVzKClcbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiQnJvd3NlciBjb29raWVzIGNsZWFyZWRcIilcblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJnZXRSb290UGF0aFwiKVxuICAgIGNvbnN0IHJvb3RQYXRoID0gc3lzdGVtVGVzdC5nZXRSb290UGF0aCgpXG5cbiAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKGBWaXNpdCByb290UGF0aCB3aXRoIGRpc21pc3NUbzogJHtyb290UGF0aH1gKVxuICAgIGF3YWl0IHN5c3RlbVRlc3QuZGlzbWlzc1RvKHJvb3RQYXRoKVxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coYERpc21pc3NlZCB0byByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgaWYgKCFzeXN0ZW1UZXN0LndzIHx8IHN5c3RlbVRlc3Qud3MucmVhZHlTdGF0ZSAhPT0gMSkge1xuICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIldlYlNvY2tldCBub3QgY29ubmVjdGVkIGFmdGVyIGRpc21pc3NUbywgd2FpdGluZyBmb3IgcmVjb25uZWN0aW9uXCIpXG4gICAgICBzeXN0ZW1UZXN0LndzID0gbnVsbFxuICAgICAgc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3Qud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiQ2xpZW50IHdlYnNvY2tldCByZWNvbm5lY3RlZFwiKVxuICAgIH1cblxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJSdW4gc3RhcnRlZCAtIHNlbmQgaW5pdGlhbGl6ZVwiKVxuICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDEwXzAwMCwgZXJyb3JNZXNzYWdlOiBcIlNlbmRpbmcgaW50aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBydW5FcnJvciA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgdGVhcmRvd25FcnJvciA9IHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJmaW5kQnlUZXN0SUQgYmxhbmtUZXh0XCIpXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LmZpbmRCeVRlc3RJRChcImJsYW5rVGV4dFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiRm91bmQgYmxhbmtUZXh0XCIpXG5cbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJyZXNvbHZlZENhbGxiYWNrXCIpXG4gICAgICBhd2FpdCByZXNvbHZlZENhbGxiYWNrKHN5c3RlbVRlc3QpXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGNhbGxiYWNrIGNvbXBsZXRlZFwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKGBSdW4gZXJyb3IgY2F1Z2h0LCB0YWtpbmcgc2NyZWVuc2hvdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWApXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LnRha2VTY3JlZW5zaG90KClcblxuICAgICAgcnVuRXJyb3IgPSBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGZpbmlzaGVkIC0gc2VuZCB0ZWFyZG93blwiKVxuICAgICAgY29uc3QgdGVhcmRvd25XcyA9IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkud3NcbiAgICAgIC8vIFdlYlNvY2tldC5DTE9TSU5HICgyKSBhbmQgV2ViU29ja2V0LkNMT1NFRCAoMykgY2Fubm90IHJlY292ZXIsIHNvIHNraXAgdGVhcmRvd24uXG4gICAgICAvLyBPUEVOICgxKSBzZW5kcyBpbW1lZGlhdGVseS4gQ09OTkVDVElORyAoMCkgcXVldWVzIHRoZSBjb21tYW5kIGFuZCBmbHVzaGVzIG9uXG4gICAgICAvLyBvbk9wZW4g4oCUIHRoZSAxMHMgdGltZW91dCBiZWxvdyBjb3ZlcnMgdGhlIHdhaXQuXG4gICAgICBjb25zdCB3c0Nsb3NlZCA9ICF0ZWFyZG93bldzIHx8IHRlYXJkb3duV3MucmVhZHlTdGF0ZSA9PT0gMiB8fCB0ZWFyZG93bldzLnJlYWR5U3RhdGUgPT09IDNcblxuICAgICAgaWYgKHdzQ2xvc2VkKSB7XG4gICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJTa2lwcGluZyB0ZWFyZG93biDigJQgYnJvd3NlciB3ZWJzb2NrZXQgaXMgY2xvc2VkIChsaWtlbHkgYnkgbmF2aWdhdGlvbi9zaWduLW91dCBkdXJpbmcgdGhlIHRlc3QpXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDEwXzAwMCwgZXJyb3JNZXNzYWdlOiBcIlNlbmRpbmcgdGVhcmRvd24gdG8gdXNlU3lzdGVtVGVzdCgpIHRpbWVkIG91dFwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJ0ZWFyZG93blwifSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRlYXJkb3duRXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJ1bkVycm9yKSB7XG4gICAgICBpZiAodGVhcmRvd25FcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgdGVhcmRvd24gZmFpbGVkIGFmdGVyIHRlc3QgZmFpbHVyZVwiLCB0ZWFyZG93bkVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBmYWlsZWQgLSByZWluaXRpYWxpemUgU3lzdGVtVGVzdFwiKVxuICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QucmVpbml0aWFsaXplKClcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVpbml0aWFsaXplZCBTeXN0ZW1UZXN0IGFmdGVyIGZhaWxlZCBydW5cIilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciB0ZXN0IGZhaWx1cmVcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgcnVuRXJyb3JcbiAgICB9XG5cbiAgICBpZiAodGVhcmRvd25FcnJvcikge1xuICAgICAgaWYgKHJlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJUZWFyZG93biBmYWlsZWQgLSByZWluaXRpYWxpemUgU3lzdGVtVGVzdFwiKVxuICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QucmVpbml0aWFsaXplKClcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVpbml0aWFsaXplZCBTeXN0ZW1UZXN0IGFmdGVyIGZhaWxlZCB0ZWFyZG93blwiKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCByZWluaXRpYWxpemUgZmFpbGVkIGFmdGVyIHRlYXJkb3duIGZhaWx1cmVcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgdGVhcmRvd25FcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCgpXG4gICAgdGhpcy5faHR0cEhvc3QgPSBodHRwSG9zdFxuICAgIHRoaXMuX2h0dHBQb3J0ID0gaHR0cFBvcnRcbiAgICB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPSBodHRwQ29ubmVjdEhvc3RcbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZXJyb3JGaWx0ZXIgPSBlcnJvckZpbHRlclxuICAgIHRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvciA9IGZhaWxPbkJyb3dzZXJFcnJvclxuICAgIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGZhaWxPbkNvbnNvbGVFcnJvclxuICAgIHRoaXMuX3Njb3VuZHJlbFBvcnQgPSBzY291bmRyZWxQb3J0XG4gICAgdGhpcy5fdXJsQXJncyA9IHVybEFyZ3NcbiAgICB0aGlzLl9yb290UGF0aCA9IHRoaXMuYnVpbGRSb290UGF0aCgpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVzcG9uc2VzID0ge31cblxuICAgIHRoaXMuX3NlbmRDb3VudCA9IDBcbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBTY291bmRyZWwgc2VydmVyIHdoaWNoIHRoZSBicm93c2VyIGNvbm5lY3RzIHRvIGZvciByZW1vdGUgZXZhbHVhdGlvbiBpbiB0aGUgYnJvd3NlclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXJ0U2NvdW5kcmVsKCkge1xuICAgIGlmICh0aGlzLnNjb3VuZHJlbFdzcykgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWRcIilcblxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogdGhpcy5fc2NvdW5kcmVsUG9ydH0pXG4gICAgdGhpcy5zZXJ2ZXJXZWJTb2NrZXQgPSBuZXcgU2VydmVyV2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3NzKVxuICAgIHRoaXMuc2VydmVyID0gbmV3IFNlcnZlcih0aGlzLnNlcnZlcldlYlNvY2tldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3BTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyPy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTY291bmRyZWwgdG8gc3RvcFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5zZXJ2ZXI+fSAqLyAodGhpcy5zZXJ2ZXIpLmNsb3NlKCkpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xvc2VXZWJTb2NrZXRTZXJ2ZXIodGhpcy5zY291bmRyZWxXc3MsIFwiU2NvdW5kcmVsIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIFNjb3VuZHJlbCBjbGllbnQgKGJyb3dzZXIpIHRvIGNvbm5lY3QgYW5kIHJldHVybnMgaXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dE1zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCIpLmRlZmF1bHQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0U2NvdW5kcmVsQ2xpZW50KHRpbWVvdXRNcyA9IDEwMDAwKSB7XG4gICAgaWYgKCF0aGlzLnNlcnZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBpcyBub3Qgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHdhaXRpbmcgZm9yIGJyb3dzZXIgU2NvdW5kcmVsIGluaXRpYWxpemF0aW9uXCIpXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBpbml0aWFsaXplXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcIndhaXRGb3JTY291bmRyZWxcIn0pXG4gICAgfSlcbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiBicm93c2VyIHJlcG9ydGVkIFNjb3VuZHJlbCBpbml0aWFsaXplZFwiKVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthbnl9IGNsaWVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnN0IGlzT3BlbkNsaWVudCA9IChjbGllbnQpID0+IGNsaWVudD8uYmFja2VuZD8ud3M/LnJlYWR5U3RhdGUgPT09IDFcblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50cyA9IHRoaXMuc2VydmVyLmdldENsaWVudHM/LigpXG4gICAgY29uc3Qgb3BlbkV4aXN0aW5nQ2xpZW50cyA9IGV4aXN0aW5nQ2xpZW50cz8uZmlsdGVyKGlzT3BlbkNsaWVudClcblxuICAgIGlmIChvcGVuRXhpc3RpbmdDbGllbnRzICYmIG9wZW5FeGlzdGluZ0NsaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhgZ2V0U2NvdW5kcmVsQ2xpZW50OiB1c2luZyBleGlzdGluZyBvcGVuIGNsaWVudCAoJHtvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aH0gYXZhaWxhYmxlKWApXG4gICAgICByZXR1cm4gb3BlbkV4aXN0aW5nQ2xpZW50c1tvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCAtIDFdXG4gICAgfVxuICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogbm8gb3BlbiBjYWNoZWQgY2xpZW50cywgd2FpdGluZyBmb3IgbmV3IGNvbm5lY3Rpb24gKGNhY2hlZCB0b3RhbDogJHtleGlzdGluZ0NsaWVudHM/Lmxlbmd0aCA/PyAwfSlgKVxuXG4gICAgaWYgKCF0aGlzLnNlcnZlci5ldmVudHM/Lm9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGV2ZW50cyBhcmUgdW5hdmFpbGFibGVcIilcbiAgICB9XG5cbiAgICAvKiogQHR5cGUgeygoY2xpZW50OiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvbk5ld0NsaWVudFxuICAgIGNvbnN0IGNsZWFudXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmIChvbk5ld0NsaWVudCkge1xuICAgICAgICB0aGlzLnNlcnZlcj8uZXZlbnRzLm9mZihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBTY291bmRyZWwgY2xpZW50XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBvbk5ld0NsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc09wZW5DbGllbnQoY2xpZW50KSkgcmV0dXJuXG4gICAgICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiByZWNlaXZlZCBuZXcgb3BlbiBjbGllbnRcIilcbiAgICAgICAgICByZXNvbHZlKGNsaWVudClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub24oXCJuZXdDbGllbnRcIiwgb25OZXdDbGllbnQpXG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIENTUyBzZWxlY3RvciBtYXRjaGVzIGFuIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBleGlzdHMoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5leGlzdHMoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHZpc2libGUgdGV4dCBmcm9tIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyB0ZXh0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGV4dChzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQgdGhhdCBoYXMgY2hpbGRyZW4gd2hpY2ggZmlsbHMgb3V0IHRoZSBlbGVtZW50IGFuZCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBjYXVzZWQgYSBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIENsaWNrcyBhbiBlbGVtZW50LCBhbGxvd2luZyBzZWxlY3RvciBhcmdzIHdoZW4gdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yIHdpdGhvdXQgd2FpdGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcmFjdHMgd2l0aCBhbiBlbGVtZW50IGJ5IGNhbGxpbmcgYSBtZXRob2Qgb24gaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgKiBSZXRyeWluZyBvbiBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IsIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsIG9yIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBJbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXIgVGhlIGVsZW1lbnQgb3IgYSBDU1Mgc2VsZWN0b3IgdG8gZmluZCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgbm8gZWxlbWVudCB0byBiZSBmb3VuZCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtXYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkud2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbm90aWZpY2F0aW9uIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIG5vdGlmaWNhdGlvbk1lc3NhZ2VzKCkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKFwiW2RhdGEtY2xhc3M9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11cIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBub3RpZmljYXRpb25NZXNzYWdlVGV4dHMucHVzaCh0ZXh0KVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25NZXNzYWdlVGV4dHNcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlY3RzIGEgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gYXBwZWFyIGFuZCB3YWl0cyBmb3IgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uTWVzc2FnZUFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vdGlmaWNhdGlvbk1lc3NhZ2UoZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7ZGlzbWlzcyA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXN0QXJncykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGFyZ3M6ICR7T2JqZWN0LmtleXMocmVzdEFyZ3MpLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcyA9IFtdXG4gICAgbGV0IGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRcbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnRcblxuICAgIGF3YWl0IHdhaXRGb3IoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11cIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuXG4gICAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcInJldHVybiBhcmd1bWVudHNbMF0udGV4dENvbnRlbnQ7XCIsIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50KSk/LnRyaW0oKSB8fCBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgICBpZiAoIWFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuaW5jbHVkZXMobm90aWZpY2F0aW9uTWVzc2FnZSkpIHtcbiAgICAgICAgICBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLnB1c2gobm90aWZpY2F0aW9uTWVzc2FnZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3RpZmljYXRpb25NZXNzYWdlID09IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZSkge1xuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgPSBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUNvdW50ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb3VudFwiKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aWZpY2F0aW9uIG1lc3NhZ2UgJHtleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2V9IHdhc24ndCBpbmNsdWRlZCBpbjogJHthbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH0pXG5cbiAgICBpZiAoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCAmJiBkaXNtaXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQsIFwiY2xpY2tcIikgLy8gRGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2VcbiAgICAgIGlmICghZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gaGF2ZSBhIGRhdGEtY291bnRcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihgW2RhdGEtdGVzdGlkPSdub3RpZmljYXRpb24tbWVzc2FnZSddW2RhdGEtY291bnQ9JyR7Zm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnR9J11gLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBkaXNtaXNzTm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvck5vU2VsZWN0b3IoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN5c3RlbSB0ZXN0IGhhcyBiZWVuIHN0YXJ0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1N0YXJ0ZWQoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzeXN0ZW0gdGVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjYWxsZWRcIilcbiAgICBjb25zdCBpc05hdGl2ZUhvc3QgPSBwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09PSBcIm5hdGl2ZVwiXG5cbiAgICBpZiAoaXNOYXRpdmVIb3N0KSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBcIm5hdGl2ZTovL1wiXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiVXNpbmcgbmF0aXZlIGFwcCBob3N0XCIpXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZXhwby1kZXYtc2VydmVyXCIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHt0aGlzLl9ob3N0fToke3RoaXMuX3BvcnR9YFxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVXNpbmcgZXhwby1kZXYtc2VydmVyIGF0ICR7dGhpcy5jdXJyZW50VXJsfWApXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZGlzdFwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0SG9zdCA9IHRoaXMuX2h0dHBDb25uZWN0SG9zdCA/PyB0aGlzLl9odHRwSG9zdFxuICAgICAgdGhpcy5jdXJyZW50VXJsID0gYGh0dHA6Ly8ke2Nvbm5lY3RIb3N0fToke3RoaXMuX2h0dHBQb3J0fWBcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgU3Bhd25pbmcgSFRUUCBzZXJ2ZXIgZm9yIGRpc3Qgb24gJHt0aGlzLl9odHRwSG9zdH06JHt0aGlzLl9odHRwUG9ydH1gKVxuICAgICAgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlciA9IG5ldyBTeXN0ZW1UZXN0SHR0cFNlcnZlcih7XG4gICAgICAgIGhvc3Q6IHRoaXMuX2h0dHBIb3N0LFxuICAgICAgICBwb3J0OiB0aGlzLl9odHRwUG9ydCxcbiAgICAgICAgZGVidWc6IHRoaXMuX2RlYnVnLFxuICAgICAgICBvbkVycm9yOiB0aGlzLm9uSHR0cFNlcnZlckVycm9yXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgSFRUUCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuc3RhcnQoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkNoZWNraW5nIEhUVFAgc2VydmVyIGhlYWx0aFwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5hc3NlcnRSZWFjaGFibGUoe3RpbWVvdXRNczogdGhpcy5nZXRUaW1lb3V0cygpfSlcbiAgICAgIHRoaXMuZGVidWdMb2coXCJIVFRQIHNlcnZlciBzdGFydGVkXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBzZXQgU1lTVEVNX1RFU1RfSE9TVCB0byAnZXhwby1kZXYtc2VydmVyJywgJ2Rpc3QnLCBvciAnbmF0aXZlJ1wiKVxuICAgIH1cblxuICAgIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNldEJhc2VVcmwodGhpcy5jdXJyZW50VXJsKVxuXG4gICAgLy8gU3RhcnQgdGhlIGNsaWVudCBXZWJTb2NrZXQgc2VydmVyIGJlZm9yZSB0aGUgZHJpdmVyIGZvciBuYXRpdmUgaG9zdHMsXG4gICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGFwcCBsYXVuY2hlcyBpbW1lZGlhdGVseSBvbiBkcml2ZXIgc3RhcnQgYW5kIGl0c1xuICAgIC8vIHVzZVN5c3RlbVRlc3RFeHBvIGhvb2sgY29ubmVjdHMgdG8gdGhlIFdlYlNvY2tldCBhcyBzb29uIGFzIGl0IHJlbmRlcnMuXG4gICAgLy8gSWYgdGhlIHNlcnZlciBpc24ndCBsaXN0ZW5pbmcgeWV0LCB0aGUgY29ubmVjdGlvbiBmYWlscyB3aXRoIG5vIHJldHJ5LlxuICAgIGlmIChpc05hdGl2ZUhvc3QpIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBXZWJTb2NrZXQgc2VydmVyIChiZWZvcmUgZHJpdmVyIGZvciBuYXRpdmUpXCIpXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2ViU29ja2V0U2VydmVyKClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJXZWJTb2NrZXQgc2VydmVyIHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgZHJpdmVyXCIpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc3RhcnQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJEcml2ZXIgc3RhcnRlZFwiKVxuXG4gICAgYXdhaXQgdGhpcy5zZXRUaW1lb3V0cygxMDAwMClcbiAgICB0aGlzLmRlYnVnTG9nKFwiVGltZW91dHMgc2V0IG9uIGRyaXZlclwiKVxuXG4gICAgaWYgKCFpc05hdGl2ZUhvc3QpIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVIb3N0KSB7XG4gICAgICAvLyBWaXNpdCB0aGUgcm9vdCBwYWdlIGFuZCB3YWl0IGZvciBFeHBvIHRvIGJlIGxvYWRlZCBhbmQgdGhlIGFwcCB0byBhcHBlYXJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJWaXNpdGluZyByb290IHBhdGhcIilcbiAgICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5nZXRSb290UGF0aCgpXG4gICAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHJvb3RQYXRoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVmlzaXRlZCByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyByb290IGVsZW1lbnQgYm9keSA+ICNyb290XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZChcImJvZHkgPiAjcm9vdFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCByb290IGVsZW1lbnQgYm9keSA+ICNyb290XCIpXG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZpbmRpbmcgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRChcInN5c3RlbVRlc3RpbmdDb21wb25lbnRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2UsIHRpbWVvdXQ6IDMwMDAwLCB2aXNpYmxlOiB0cnVlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgYW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJFcnJvciB3aGlsZSBmaW5kaW5nIHJvb3Qvc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIHJvb3Qvc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBsb29rdXAgZmFpbHVyZVwiKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IG51bGx9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBmb3IgbmF0aXZlIGFwcFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgbmF0aXZlIHN5c3RlbVRlc3RpbmdDb21wb25lbnQsIHRha2luZyBzY3JlZW5zaG90XCIpXG4gICAgICAgIGF3YWl0IHRoaXMudGFrZVNjcmVlbnNob3QoKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiU2NyZWVuc2hvdCBjYXB0dXJlZCBhZnRlciBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBsb29rdXAgZmFpbHVyZVwiKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGNsaWVudCB0byBjb25uZWN0XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldhaXRpbmcgZm9yIGNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGlvbiAob3BlbmluZylcIilcbiAgICB0aGlzLmRlYnVnTG9nKGBXUyBzdGF0ZTogJHt0aGlzLndzPy5yZWFkeVN0YXRlID8/IFwibm9uZVwifWApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIndhaXRGb3JDbGllbnRXZWJTb2NrZXRcIilcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJDbGllbnQgV2ViU29ja2V0IGNvbm5lY3RlZFwiKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcbiAgICB0aGlzLmRlYnVnTG9nKFwiTWFya2VkIHN5c3RlbSB0ZXN0IGFzIHN0YXJ0ZWRcIilcbiAgICBpZiAoIWlzTmF0aXZlSG9zdCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNldHRpbmcgYmFzZSBzZWxlY3RvciB0byBmb2N1c2VkIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgIHRoaXMuc2V0QmFzZVNlbGVjdG9yKFwiW2RhdGEtdGVzdGlkPSdzeXN0ZW1UZXN0aW5nQ29tcG9uZW50J11bZGF0YS1mb2N1c3NlZD0ndHJ1ZSddXCIpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQmFzZSBzZWxlY3RvciBzZXRcIilcbiAgICB9XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNvbXBsZXRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRSb290UGF0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcm9vdFBhdGggPz8gU3lzdGVtVGVzdC5yb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5fcm9vdFBhdGggPSByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFJvb3RQYXRoKCkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoU3lzdGVtVGVzdC5yb290UGF0aCwgXCJodHRwOi8vbG9jYWxob3N0XCIpXG4gICAgY29uc3QgYXBwZW5kUGFyYW0gPSAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIGtleSwgLyoqIEB0eXBlIHthbnl9ICovIHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VybEFyZ3MpIHtcbiAgICAgIGlmICh0aGlzLl91cmxBcmdzIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuX3VybEFyZ3MpIHtcbiAgICAgICAgICBhcHBlbmRQYXJhbShrZXksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl91cmxBcmdzKSkge1xuICAgICAgICAgIGFwcGVuZFBhcmFtKGtleSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKFwic3lzdGVtVGVzdENsaWVudFdzUG9ydFwiKSAmJiB0aGlzLl9jbGllbnRXc1BvcnQgIT09IDE5ODUpIHtcbiAgICAgIGFwcGVuZFBhcmFtKFwic3lzdGVtVGVzdENsaWVudFdzUG9ydFwiLCB0aGlzLl9jbGllbnRXc1BvcnQpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIpICYmIHRoaXMuX3Njb3VuZHJlbFBvcnQgIT09IDgwOTApIHtcbiAgICAgIGFwcGVuZFBhcmFtKFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIiwgdGhpcy5fc2NvdW5kcmVsUG9ydClcbiAgICB9XG5cbiAgICBjb25zdCByb290UGF0aCA9ICBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YFxuXG4gICAgdGhpcy5kZWJ1Z0xvZyhgYnVpbGRSb290UGF0aCByb290UGF0aDogJHtyb290UGF0aH1gKVxuXG4gICAgcmV0dXJuIHJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjbGllbnQgd2ViIHNvY2tldCB0byBjb25uZWN0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvckNsaWVudFdlYlNvY2tldCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5fY2xpZW50V3NDb25uZWN0VGltZW91dCwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgY2xpZW50IFdlYlNvY2tldCBjb25uZWN0aW9uXCJ9LCAoKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLndzKSB7XG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gcmVqZWN0XG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlID0gcmVzb2x2ZVxuICAgICAgfSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgd2ViIHNvY2tldCBzZXJ2ZXIgYW5kIHdhaXRzIGZvciBpdCB0byBiZSByZWFkeS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydFdlYlNvY2tldFNlcnZlcigpIHtcbiAgICB0aGlzLmNsaWVudFdzcyA9IG5ldyBXZWJTb2NrZXRTZXJ2ZXIoe3BvcnQ6IHRoaXMuX2NsaWVudFdzUG9ydH0pXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8qKiBAdHlwZSB7Tm9uTnVsbGFibGU8dHlwZW9mIHRoaXMuY2xpZW50V3NzPn0gKi8gKHRoaXMuY2xpZW50V3NzKS5vbmNlKFwibGlzdGVuaW5nXCIsIHJlc29sdmUpXG4gICAgfSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNvbm5lY3Rpb25cIiwgdGhpcy5vbldlYlNvY2tldENvbm5lY3Rpb24pXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJjbG9zZVwiLCB0aGlzLm9uV2ViU29ja2V0Q2xvc2UpXG4gICAgdGhpcy5jbGllbnRXc3Mub24oXCJlcnJvclwiLCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZGVidWdFcnJvcihlcnJvcilcblxuICAgICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpXG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgb24gY29tbWFuZCBjYWxsYmFja1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHt0eXBlOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59KTogUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBvbkNvbW1hbmQoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayA9IGNhbGxiYWNrXG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhIGNvbW1hbmQgcmVjZWl2ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge3tkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+fX0gYXJnc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgb25Db21tYW5kUmVjZWl2ZWQgPSBhc3luYyAoe2RhdGF9KSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IGRhdGEudHlwZVxuICAgIGxldCByZXN1bHRcblxuICAgIGlmICh0eXBlID09IFwiY29uc29sZS5lcnJvclwiKSB7XG4gICAgICBjb25zdCBzaG93TWVzc2FnZSA9ICF0aGlzLnNob3VsZElnbm9yZUVycm9yKGRhdGEpXG5cbiAgICAgIGlmIChzaG93TWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQnJvd3NlciBlcnJvclwiLCAuLi5kYXRhLnZhbHVlKVxuICAgICAgICBpZiAodGhpcy5fZmFpbE9uQ29uc29sZUVycm9yKSB7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiY29uc29sZS5sb2dcIikge1xuICAgICAgY29uc29sZS5sb2coXCJCcm93c2VyIGxvZ1wiLCAuLi5kYXRhLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcImVycm9yXCIgfHwgZGF0YS50eXBlID09IFwidW5oYW5kbGVkcmVqZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZGF0YSlcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9vbkNvbW1hbmRDYWxsYmFjayh7ZGF0YSwgdHlwZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYG9uV2ViU29ja2V0Q2xpZW50TWVzc2FnZSB1bmtub3duIGRhdGEgKHR5cGUgJHt0eXBlfSlgLCBkYXRhKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgbmV3IHdlYiBzb2NrZXQgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge1dlYlNvY2tldH0gd3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBvbldlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAod3MpID0+IHtcbiAgICB0aGlzLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gd3NcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLm9uT3BlbigpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcImVycm9yXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbkVycm9yXCIpKVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsIGRpZ2codGhpcywgXCJjb21tdW5pY2F0b3JcIiwgXCJvbk1lc3NhZ2VcIikpXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIG9uV2ViU29ja2V0Q2xvc2UgPSAoKSA9PiB7XG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmdldENvbW11bmljYXRvcigpLndzID0gbnVsbFxuXG4gICAgaWYgKHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QpIHtcbiAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QobmV3IEVycm9yKFwiQ2xpZW50IHdlYnNvY2tldCBjbG9zZWQgYmVmb3JlIGNvbm5lY3RpbmdcIikpXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gZXJyb3IgcmVwb3J0ZWQgZnJvbSB0aGUgYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGFcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBoYW5kbGVFcnJvcihkYXRhKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSkpIHJldHVyblxuXG4gICAgY29uc3QgZXJyb3IgPSB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG5cbiAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGRhdGEgRXJyb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge0Vycm9yfSBSZWdpc3RlcmVkIGVycm9yLlxuICAgKi9cbiAgcmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSkge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBCcm93c2VyIGVycm9yOiAke3RoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKX1gKVxuXG4gICAgaWYgKGRhdGEuYmFja3RyYWNlKSB7XG4gICAgICBlcnJvci5zdGFjayA9IGAke2Vycm9yLm1lc3NhZ2V9XFxuJHtkYXRhLmJhY2t0cmFjZX1cXG5cXG4ke2Vycm9yLnN0YWNrfWBcbiAgICB9XG5cbiAgICB0aGlzLl9icm93c2VyRXJyb3JzLnB1c2goZXJyb3IpXG5cbiAgICByZXR1cm4gZXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYnJvd3NlciBlcnJvciB3aGVuIGZhaWwtZmFzdCBpcyBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpIHtcbiAgICBpZiAoIXRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvcikgcmV0dXJuXG5cbiAgICBjb25zdCBicm93c2VyRXJyb3IgPSB0aGlzLl9icm93c2VyRXJyb3JzWzBdXG5cbiAgICBpZiAoYnJvd3NlckVycm9yKSB0aHJvdyBicm93c2VyRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyB0aGUgc3lzdGVtIHRlc3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcFNjb3VuZHJlbCgpXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jbG9zZVdlYlNvY2tldFNlcnZlcih0aGlzLmNsaWVudFdzcywgXCJjbGllbnQgV2ViU29ja2V0IHNlcnZlclwiKVxuICAgIGlmICh0aGlzLmRyaXZlckFkYXB0ZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuZHJpdmVyQWRhcHRlci5zdG9wKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIpIHtcbiAgICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLnN5c3RlbVRlc3RIdHRwU2VydmVyXG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgSFRUUCBzZXJ2ZXJcIn0sIGFzeW5jICgpID0+IGF3YWl0IGh0dHBTZXJ2ZXIuY2xvc2UoKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdGVhcnMgZG93biBhbmQgcmVzdGFydHMgdGhlIHN5c3RlbSB0ZXN0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHJlaW5pdGlhbGl6ZSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3AoKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlXG4gICAgdGhpcy5fYmFzZVNlbGVjdG9yID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jdXJyZW50VXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy5kcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlckFkYXB0ZXIgPSB0aGlzLmNyZWF0ZURyaXZlcih0aGlzLl9kcml2ZXJDb25maWcpXG4gICAgdGhpcy53cyA9IG51bGxcbiAgICB0aGlzLmNsaWVudFdzcyA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlcldlYlNvY2tldCA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9IHdzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsb3NlV2ViU29ja2V0U2VydmVyKHdzcywgbGFiZWwgPSBcIldlYlNvY2tldCBzZXJ2ZXJcIikge1xuICAgIGlmICghd3NzKSByZXR1cm5cblxuICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBjbG9zaW5nICR7bGFiZWx9YH0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZUNsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSB0ZXJtaW5hdGlvbiBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc2V0dGxlID0gKC8qKiBAdHlwZSB7KHZhbHVlOiBhbnkpID0+IHZvaWR9ICovIGNhbGxiYWNrLCAvKiogQHR5cGUge2FueX0gKi8gYXJnKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2FsbGJhY2soYXJnKVxuICAgICAgfVxuXG4gICAgICB3c3Mub25jZShcImNsb3NlXCIsICgpID0+IHNldHRsZShyZXNvbHZlLCB1bmRlZmluZWQpKVxuICAgICAgd3NzLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHNldHRsZShyZWplY3QsIGVycm9yKSlcbiAgICAgIGlmICh3c3MuY2xpZW50cyAmJiB3c3MuY2xpZW50cy5zaXplID4gMCkge1xuICAgICAgICB3c3MuY2xpZW50cy5mb3JFYWNoKHRlcm1pbmF0ZUNsaWVudClcbiAgICAgIH1cbiAgICAgIHdzcy5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSBzZXR0bGUocmVqZWN0LCBlcnJvcilcbiAgICAgICAgZWxzZSBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9KSlcbiAgfVxufVxuIl19
1073
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3lzdGVtLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3lzdGVtLXRlc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUE7QUFDOUIsT0FBTyxNQUFNLE1BQU0sNkNBQTZDLENBQUE7QUFDaEUsT0FBTyxlQUFlLE1BQU0sb0VBQW9FLENBQUE7QUFDaEcsT0FBTyxzQkFBc0IsTUFBTSwrQkFBK0IsQ0FBQTtBQUNsRSxPQUFPLG9CQUFvQixNQUFNLDhCQUE4QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sVUFBVSxDQUFBO0FBQ3RDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUE7QUFDbkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLElBQUksQ0FBQTtBQUNsQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFFbEMsTUFBTSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFDakQsTUFBTSxpQ0FBaUMsR0FBRyxHQUFHLENBQUE7QUFDN0MsTUFBTSwwQ0FBMEMsR0FBRyxNQUFNLENBQUE7QUFFekQsd0JBQXdCO0FBQ3hCLE1BQU0sVUFBVSxvQ0FBb0M7SUFDbEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFBO0FBQ3JJLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNIOztHQUVHO0FBQ0g7Ozs7R0FJRztBQUNIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNIOztHQUVHO0FBQ0g7OztHQUdHO0FBQ0g7OztHQUdHO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxzQ0FBc0MsQ0FBQyxPQUFPO0lBQ3JELE9BQU8sZ0VBQWdF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RyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUNuRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ3RDLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2xCLElBQUksS0FBSztvQkFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBOztvQkFDM0IsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUNqQyxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDTCxDQUFDOztBQXBsQ00sbUJBQVEsR0FBRyx3QkFBd0IsQUFBM0IsQ0FBMkI7ZUFEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuaW1wb3J0IFNlcnZlciBmcm9tIFwic2NvdW5kcmVsLXJlbW90ZS1ldmFsL2J1aWxkL3NlcnZlci9pbmRleC5qc1wiXG5pbXBvcnQgU2VydmVyV2ViU29ja2V0IGZyb20gXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvc2VydmVyL2Nvbm5lY3Rpb25zL3dlYi1zb2NrZXQvaW5kZXguanNcIlxuaW1wb3J0IFN5c3RlbVRlc3RDb21tdW5pY2F0b3IgZnJvbSBcIi4vc3lzdGVtLXRlc3QtY29tbXVuaWNhdG9yLmpzXCJcbmltcG9ydCBTeXN0ZW1UZXN0SHR0cFNlcnZlciBmcm9tIFwiLi9zeXN0ZW0tdGVzdC1odHRwLXNlcnZlci5qc1wiXG5pbXBvcnQge3dhaXQsIHdhaXRGb3J9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQge2Vuc3VyZUVycm9yfSBmcm9tIFwidHlwYW5pY1wiXG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSBcIndzXCJcbmltcG9ydCBCcm93c2VyIGZyb20gXCIuL2Jyb3dzZXIuanNcIlxuXG5jb25zdCBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDMwMDAwXG5jb25zdCBJTklUSUFMX1JPT1RfVklTSVRfUkVUUllfREVMQVlfTVMgPSAxMDBcbmNvbnN0IE5BVElWRV9DTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NUyA9IDEyMDAwMFxuXG4vKiogQHJldHVybnMge251bWJlcn0gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0Q2xpZW50V2ViU29ja2V0Q29ubmVjdFRpbWVvdXQoKSB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09PSBcIm5hdGl2ZVwiID8gTkFUSVZFX0NMSUVOVF9XRUJTT0NLRVRfQ09OTkVDVF9USU1FT1VUX01TIDogQ0xJRU5UX1dFQlNPQ0tFVF9DT05ORUNUX1RJTUVPVVRfTVNcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeXN0ZW1UZXN0QXJnc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSBIb3N0bmFtZSBmb3IgdGhlIGFwcCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIFBvcnQgZm9yIHRoZSBhcHAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodHRwSG9zdF0gSG9zdG5hbWUgZm9yIHRoZSBzdGF0aWMgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h0dHBQb3J0XSBQb3J0IGZvciB0aGUgc3RhdGljIEhUVFAgc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtodHRwQ29ubmVjdEhvc3RdIEhvc3RuYW1lIHVzZWQgYnkgdGhlIGRyaXZlciB0byByZWFjaCB0aGUgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkgeyhlcnJvcjogYW55KSA9PiBib29sZWFufSBbZXJyb3JGaWx0ZXJdIEZpbHRlciBmb3IgYnJvd3NlciBlcnJvcnMgKHJldHVybiBmYWxzZSB0byBpZ25vcmUpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbE9uQnJvd3NlckVycm9yXSBUaHJvdyByZWdpc3RlcmVkIGJyb3dzZXIgZXJyb3JzIGZyb20gZmluZGVyL2ludGVyYWN0IGhlbHBlcnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsT25Db25zb2xlRXJyb3JdIFRyZWF0IGJyb3dzZXIgY29uc29sZS5lcnJvciBjYWxscyBhcyByZWdpc3RlcmVkIGJyb3dzZXIgZXJyb3JzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGllbnRXc1BvcnRdIFBvcnQgZm9yIHRoZSBicm93c2VyLWNvbW1hbmQgV2ViU29ja2V0IHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpZW50V3NDb25uZWN0VGltZW91dF0gVGltZW91dCBmb3IgdGhlIGJyb3dzZXItY29tbWFuZCBXZWJTb2NrZXQgY2xpZW50IGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Njb3VuZHJlbFBvcnRdIFBvcnQgZm9yIHRoZSBTY291bmRyZWwgV2ViU29ja2V0IHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3VybEFyZ3NdIFF1ZXJ5IHBhcmFtcyBhcHBlbmRlZCB0byB0aGUgcm9vdCBwYXRoLlxuICogQHByb3BlcnR5IHtTeXN0ZW1UZXN0RHJpdmVyQ29uZmlnfSBbZHJpdmVyXSBEcml2ZXIgY29uZmlndXJhdGlvbi5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7U3lzdGVtVGVzdEFyZ3MgJiB7cmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlPzogYm9vbGVhbn19IFN5c3RlbVRlc3RSdW5BcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3lzdGVtVGVzdERyaXZlckNvbmZpZ1xuICogQHByb3BlcnR5IHtcInNlbGVuaXVtXCJ8XCJhcHBpdW1cIn0gW3R5cGVdIERyaXZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSBEcml2ZXItc3BlY2lmaWMgb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtcImFjdGlvbnNcIiB8IFwiaHVtYW5cIiB8IFwianNcIn0gW21ldGhvZF0gT3ZlcnJpZGUgdGhlIGNsaWNrIHBhdGguIGBcImFjdGlvbnNcImAgdXNlcyB0aGUgU2VsZW5pdW0gQWN0aW9ucyBBUEkgKHJlYWwgcG9pbnRlciBtb3ZlICsgY2xpY2spOyBgXCJodW1hblwiYCB1c2VzIG11bHRpcGxlIHBvaW50ZXIgbW92ZXMgYW5kIHBhdXNlcyBiZWZvcmUgY2xpY2tpbmc7IGBcImpzXCJgIGRpc3BhdGNoZXMgYGVsZW1lbnQuY2xpY2soKWAgdmlhIGBleGVjdXRlU2NyaXB0YCBpbnNpZGUgdGhlIHBhZ2UncyBKUyBjb250ZXh0IGFuZCBpcyBmb3IgZGlhZ25vc3RpY3Mgb25seSwgbm90IGNvbW1pdHRlZCBzdGFiaWxpemF0aW9uIGZpeGVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGlja09mZnNldFhdIFggb2Zmc2V0IGZvciBgYWN0aW9uc2AvYGh1bWFuYCBwb2ludGVyIGNsaWNrcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWNrT2Zmc2V0WV0gWSBvZmZzZXQgZm9yIGBhY3Rpb25zYC9gaHVtYW5gIHBvaW50ZXIgY2xpY2tzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHVtYW5TdGVwRGVsYXldIFBhdXNlIGR1cmF0aW9uIGluIG1zIGJldHdlZW4gaHVtYW4gcG9pbnRlciBtb3Zlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHVtYW5TdGVwc10gTnVtYmVyIG9mIGludGVybWVkaWF0ZSBwb2ludGVyIG1vdmVzIGJlZm9yZSB0aGUgZmluYWwgY2xpY2sgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc2Nyb2xsQ29udGFpbmVyVGVzdElEc10gTmF0aXZlIHRlc3QgSURzIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGFzIHNjcm9sbCBjb250YWluZXJzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdmlld3BvcnQgZ2VzdHVyZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0ZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59fSBJbnRlcmFjdEFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yTm9TZWxlY3RvckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmljYXRpb25NZXNzYWdlQXJnc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZGlzbWlzc10gV2hldGhlciB0byBkaXNtaXNzIHRoZSBub3RpZmljYXRpb24gYWZ0ZXIgaXQgYXBwZWFycy5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlQ2hyb21lUGFzc3dvcmRGaWVsZFdhcm5pbmcobWVzc2FnZSkge1xuICByZXR1cm4gLyg/Ol58XFxzLVxccylcXFtET01cXF0gUGFzc3dvcmQgZmllbGQgaXMgbm90IGNvbnRhaW5lZCBpbiBhIGZvcm06L2kudGVzdChtZXNzYWdlKVxufVxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIGFueT59ICovXG5jb25zdCBnbG9iYWxBbnkgPSBnbG9iYWxUaGlzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5c3RlbVRlc3QgZXh0ZW5kcyBCcm93c2VyIHtcbiAgc3RhdGljIHJvb3RQYXRoID0gXCIvYmxhbms/c3lzdGVtVGVzdD10cnVlXCJcblxuICAvKiogQHR5cGUge1N5c3RlbVRlc3RDb21tdW5pY2F0b3IgfCB1bmRlZmluZWR9ICovXG4gIGNvbW11bmljYXRvciA9IHVuZGVmaW5lZFxuXG4gIF9zdGFydGVkID0gZmFsc2VcbiAgX2NsaWVudFdzUG9ydCA9IDE5ODVcbiAgX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBDTElFTlRfV0VCU09DS0VUX0NPTk5FQ1RfVElNRU9VVF9NU1xuICBfaHR0cEhvc3QgPSBcImxvY2FsaG9zdFwiXG4gIF9odHRwUG9ydCA9IDE5ODRcbiAgX2ZhaWxPbkJyb3dzZXJFcnJvciA9IHRydWVcbiAgX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGZhbHNlXG4gIC8qKiBAdHlwZSB7KChlcnJvcjogYW55KSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZH0gKi9cbiAgX2Vycm9yRmlsdGVyID0gdW5kZWZpbmVkXG4gIC8qKiBAdHlwZSB7RXJyb3JbXX0gKi9cbiAgX2Jyb3dzZXJFcnJvcnMgPSBbXVxuICBfc2NvdW5kcmVsUG9ydCA9IDgwOTBcbiAgLyoqIEB0eXBlIHtudW1iZXJ9ICovXG4gIF9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSAwXG4gIC8qKiBAdHlwZSB7V2ViU29ja2V0U2VydmVyIHwgdW5kZWZpbmVkfSAqL1xuICBzY291bmRyZWxXc3MgPSB1bmRlZmluZWRcbiAgLyoqIEB0eXBlIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9ICovXG4gIGNsaWVudFdzcyA9IHVuZGVmaW5lZFxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSB0ZXN0IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7U3lzdGVtVGVzdEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7U3lzdGVtVGVzdH1cbiAgICovXG4gIHN0YXRpYyBjdXJyZW50KGFyZ3MgPSB7fSkge1xuICAgIGlmICghZ2xvYmFsQW55LnN5c3RlbVRlc3QpIHtcbiAgICAgIGdsb2JhbEFueS5zeXN0ZW1UZXN0ID0gbmV3IFN5c3RlbVRlc3QoYXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgZ2xvYmFsQW55LnN5c3RlbVRlc3QuYXBwbHlBcmdzKGFyZ3MpXG4gICAgfVxuXG4gICAgcmV0dXJuIGdsb2JhbEFueS5zeXN0ZW1UZXN0XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBtdXRhYmxlIG9wdGlvbnMgdG8gYW4gYWxyZWFkeS1ydW5uaW5nIHNpbmdsZXRvbiBTeXN0ZW1UZXN0LlxuICAgKiBAcGFyYW0ge1BhcnRpYWw8U3lzdGVtVGVzdEFyZ3M+fSBhcmdzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXBwbHlBcmdzKGFyZ3MgPSB7fSkge1xuICAgIGlmIChcImRlYnVnXCIgaW4gYXJncykgdGhpcy5fZGVidWcgPSBhcmdzLmRlYnVnID8/IGZhbHNlXG4gICAgaWYgKFwiZXJyb3JGaWx0ZXJcIiBpbiBhcmdzKSB0aGlzLl9lcnJvckZpbHRlciA9IGFyZ3MuZXJyb3JGaWx0ZXJcbiAgICBpZiAoXCJmYWlsT25Ccm93c2VyRXJyb3JcIiBpbiBhcmdzKSB0aGlzLl9mYWlsT25Ccm93c2VyRXJyb3IgPSBhcmdzLmZhaWxPbkJyb3dzZXJFcnJvciA/PyB0cnVlXG4gICAgaWYgKFwiZmFpbE9uQ29uc29sZUVycm9yXCIgaW4gYXJncykgdGhpcy5fZmFpbE9uQ29uc29sZUVycm9yID0gYXJncy5mYWlsT25Db25zb2xlRXJyb3IgPz8gZmFsc2VcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7U3lzdGVtVGVzdENvbW11bmljYXRvcn0gKi9cbiAgZ2V0Q29tbXVuaWNhdG9yKCkge1xuICAgIGlmICghdGhpcy5jb21tdW5pY2F0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbW11bmljYXRvciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21tdW5pY2F0b3JcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBhbiBlcnJvciBtZXNzYWdlIGlmIHBvc3NpYmxlIGZyb20gdGhlIHBheWxvYWQgc2VudCBmcm9tIHRoZSBicm93c2VyLlxuICAgKiBAcGFyYW0ge3ttZXNzYWdlPzogc3RyaW5nLCB2YWx1ZT86IGFueVtdfSB8IEVycm9yfSBkYXRhXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gICAqL1xuICBleHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpIHtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gZGF0YS5tZXNzYWdlXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiBkYXRhXG5cbiAgICBjb25zdCBmaXJzdFZhbHVlID0gQXJyYXkuaXNBcnJheShkYXRhPy52YWx1ZSkgPyBkYXRhLnZhbHVlWzBdIDogdW5kZWZpbmVkXG5cbiAgICBpZiAoZmlyc3RWYWx1ZSBpbnN0YW5jZW9mIEVycm9yICYmIHR5cGVvZiBmaXJzdFZhbHVlLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlLm1lc3NhZ2VcbiAgICBpZiAodHlwZW9mIGZpcnN0VmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdFZhbHVlXG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGJyb3dzZXIgZXJyb3Igc2hvdWxkIGJlIGlnbm9yZWQgYmFzZWQgb24gYnVpbHQtaW4gcnVsZXMgYW5kIGFuIG9wdGlvbmFsIGVycm9yIGZpbHRlci5cbiAgICogQHBhcmFtIHt7bWVzc2FnZT86IHN0cmluZywgdmFsdWU/OiBhbnlbXX19IGRhdGFcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzaG91bGRJZ25vcmVFcnJvcihkYXRhKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZXh0cmFjdEVycm9yTWVzc2FnZShkYXRhKVxuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MThcIikpIHJldHVybiB0cnVlXG4gICAgICBpZiAobWVzc2FnZS5pbmNsdWRlcyhcIk1pbmlmaWVkIFJlYWN0IGVycm9yICM0MTlcIikpIHJldHVybiB0cnVlXG4gICAgICBpZiAoc2hvdWxkSWdub3JlQ2hyb21lUGFzc3dvcmRGaWVsZFdhcm5pbmcobWVzc2FnZSkpIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2Vycm9yRmlsdGVyICYmIHRoaXMuX2Vycm9yRmlsdGVyKGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQG92ZXJsb2FkXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oU3lzdGVtVGVzdCk6IFByb21pc2U8dm9pZD59IGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIFJ1bnMgYSBzeXN0ZW0gdGVzdFxuICAgKiBAb3ZlcmxvYWRcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0UnVuQXJnc30gYXJnc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIC8qKlxuICAgKiBSdW5zIGEgc3lzdGVtIHRlc3RcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0UnVuQXJncyB8IGZ1bmN0aW9uKFN5c3RlbVRlc3QpOiBQcm9taXNlPHZvaWQ+fSBbYXJnc11cbiAgICogQHBhcmFtIHtmdW5jdGlvbihTeXN0ZW1UZXN0KTogUHJvbWlzZTx2b2lkPn0gW2NhbGxiYWNrXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyBydW4oYXJncywgY2FsbGJhY2spIHtcbiAgICBjb25zdCByZXNvbHZlZENhbGxiYWNrID0gdHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IGFyZ3MgOiBjYWxsYmFja1xuICAgIGNvbnN0IHtyZWluaXRpYWxpemVBZnRlckZhaWx1cmUgPSB0cnVlLCAuLi5zeXN0ZW1UZXN0QXJnc30gPSAvKiogQHR5cGUge1N5c3RlbVRlc3RSdW5BcmdzfSAqLyAodHlwZW9mIGFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IHt9IDogYXJncyB8fCB7fSlcbiAgICBjb25zdCBzeXN0ZW1UZXN0ID0gdGhpcy5jdXJyZW50KHN5c3RlbVRlc3RBcmdzKVxuXG4gICAgaWYgKCFyZXNvbHZlZENhbGxiYWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeXN0ZW1UZXN0LnJ1biByZXF1aXJlcyBhIGNhbGxiYWNrXCIpXG4gICAgfVxuXG4gICAgc3lzdGVtVGVzdC5fYnJvd3NlckVycm9ycyA9IFtdXG4gICAgc3lzdGVtVGVzdC5hcHBseUFyZ3Moe2ZhaWxPbkJyb3dzZXJFcnJvcjogdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yOiBmYWxzZSwgLi4uc3lzdGVtVGVzdEFyZ3N9KVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJlc2V0dGluZyBicm93c2VyIGNvb2tpZXMgYmVmb3JlIGluaXRpYWxpemVcIilcbiAgICBhd2FpdCBzeXN0ZW1UZXN0LmRlbGV0ZUFsbENvb2tpZXMoKVxuICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJCcm93c2VyIGNvb2tpZXMgY2xlYXJlZFwiKVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcImdldFJvb3RQYXRoXCIpXG4gICAgY29uc3Qgcm9vdFBhdGggPSBzeXN0ZW1UZXN0LmdldFJvb3RQYXRoKClcblxuICAgIGF3YWl0IHN5c3RlbVRlc3QucmVzZXRUb1Jvb3RQYXRoRm9yUnVuKHJvb3RQYXRoKVxuXG4gICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBzdGFydGVkIC0gc2VuZCBpbml0aWFsaXplXCIpXG4gICAgYXdhaXQgc3lzdGVtVGVzdC5pbml0aWFsaXplQnJvd3NlckNvbnRleHQoKVxuXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBydW5FcnJvciA9IHVuZGVmaW5lZFxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgdGVhcmRvd25FcnJvciA9IHVuZGVmaW5lZFxuXG4gICAgdHJ5IHtcbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJmaW5kQnlUZXN0SUQgYmxhbmtUZXh0XCIpXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LmZpbmRCeVRlc3RJRChcImJsYW5rVGV4dFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiRm91bmQgYmxhbmtUZXh0XCIpXG5cbiAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJyZXNvbHZlZENhbGxiYWNrXCIpXG4gICAgICBhd2FpdCByZXNvbHZlZENhbGxiYWNrKHN5c3RlbVRlc3QpXG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGNhbGxiYWNrIGNvbXBsZXRlZFwiKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKGBSdW4gZXJyb3IgY2F1Z2h0LCB0YWtpbmcgc2NyZWVuc2hvdDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWApXG4gICAgICBhd2FpdCBzeXN0ZW1UZXN0LnRha2VTY3JlZW5zaG90KClcblxuICAgICAgcnVuRXJyb3IgPSBlcnJvclxuICAgIH0gZmluYWxseSB7XG4gICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUnVuIGZpbmlzaGVkIC0gc2VuZCB0ZWFyZG93blwiKVxuICAgICAgY29uc3QgdGVhcmRvd25XcyA9IHN5c3RlbVRlc3QuZ2V0Q29tbXVuaWNhdG9yKCkud3NcbiAgICAgIC8vIFdlYlNvY2tldC5DTE9TSU5HICgyKSBhbmQgV2ViU29ja2V0LkNMT1NFRCAoMykgY2Fubm90IHJlY292ZXIsIHNvIHNraXAgdGVhcmRvd24uXG4gICAgICAvLyBPUEVOICgxKSBzZW5kcyBpbW1lZGlhdGVseS4gQ09OTkVDVElORyAoMCkgcXVldWVzIHRoZSBjb21tYW5kIGFuZCBmbHVzaGVzIG9uXG4gICAgICAvLyBvbk9wZW4g4oCUIHRoZSAxMHMgdGltZW91dCBiZWxvdyBjb3ZlcnMgdGhlIHdhaXQuXG4gICAgICBjb25zdCB3c0Nsb3NlZCA9ICF0ZWFyZG93bldzIHx8IHRlYXJkb3duV3MucmVhZHlTdGF0ZSA9PT0gMiB8fCB0ZWFyZG93bldzLnJlYWR5U3RhdGUgPT09IDNcblxuICAgICAgaWYgKHdzQ2xvc2VkKSB7XG4gICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJTa2lwcGluZyB0ZWFyZG93biDigJQgYnJvd3NlciB3ZWJzb2NrZXQgaXMgY2xvc2VkIChsaWtlbHkgYnkgbmF2aWdhdGlvbi9zaWduLW91dCBkdXJpbmcgdGhlIHRlc3QpXCIpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IDEwXzAwMCwgZXJyb3JNZXNzYWdlOiBcIlNlbmRpbmcgdGVhcmRvd24gdG8gdXNlU3lzdGVtVGVzdCgpIHRpbWVkIG91dFwifSwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgc3lzdGVtVGVzdC5nZXRDb21tdW5pY2F0b3IoKS5zZW5kQ29tbWFuZCh7dHlwZTogXCJ0ZWFyZG93blwifSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRlYXJkb3duRXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN5c3RlbVRlc3QuX2Jyb3dzZXJFcnJvcnMgPSBbXVxuICAgICAgc3lzdGVtVGVzdC5hcHBseUFyZ3Moe2Vycm9yRmlsdGVyOiB1bmRlZmluZWQsIGZhaWxPbkJyb3dzZXJFcnJvcjogdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yOiBmYWxzZX0pXG4gICAgfVxuXG4gICAgaWYgKHJ1bkVycm9yKSB7XG4gICAgICBpZiAodGVhcmRvd25FcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgdGVhcmRvd24gZmFpbGVkIGFmdGVyIHRlc3QgZmFpbHVyZVwiLCB0ZWFyZG93bkVycm9yKVxuICAgICAgfVxuXG4gICAgICBpZiAocmVpbml0aWFsaXplQWZ0ZXJGYWlsdXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3lzdGVtVGVzdC5kZWJ1Z0xvZyhcIlJ1biBmYWlsZWQgLSByZWluaXRpYWxpemUgU3lzdGVtVGVzdFwiKVxuICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QucmVpbml0aWFsaXplKClcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVpbml0aWFsaXplZCBTeXN0ZW1UZXN0IGFmdGVyIGZhaWxlZCBydW5cIilcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiU3lzdGVtIHRlc3QgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciB0ZXN0IGZhaWx1cmVcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgcnVuRXJyb3JcbiAgICB9XG5cbiAgICBpZiAodGVhcmRvd25FcnJvcikge1xuICAgICAgaWYgKHJlaW5pdGlhbGl6ZUFmdGVyRmFpbHVyZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5c3RlbVRlc3QuZGVidWdMb2coXCJUZWFyZG93biBmYWlsZWQgLSByZWluaXRpYWxpemUgU3lzdGVtVGVzdFwiKVxuICAgICAgICAgIGF3YWl0IHN5c3RlbVRlc3QucmVpbml0aWFsaXplKClcbiAgICAgICAgICBzeXN0ZW1UZXN0LmRlYnVnTG9nKFwiUmVpbml0aWFsaXplZCBTeXN0ZW1UZXN0IGFmdGVyIGZhaWxlZCB0ZWFyZG93blwiKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJTeXN0ZW0gdGVzdCByZWluaXRpYWxpemUgZmFpbGVkIGFmdGVyIHRlYXJkb3duIGZhaWx1cmVcIiwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgdGVhcmRvd25FcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGFwcCB0byB0aGUgcm9vdCB0ZXN0IHJvdXRlIGJlZm9yZSBlYWNoIHJ1bi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVzZXRUb1Jvb3RQYXRoRm9yUnVuKHJvb3RQYXRoKSB7XG4gICAgdGhpcy5kZWJ1Z0xvZyhgVmlzaXQgcm9vdFBhdGggd2l0aCBkaXNtaXNzVG86ICR7cm9vdFBhdGh9YClcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NUbyhyb290UGF0aClcbiAgICB0aGlzLmRlYnVnTG9nKGBEaXNtaXNzZWQgdG8gcm9vdCBwYXRoICR7cm9vdFBhdGh9YClcblxuICAgIGlmICghdGhpcy53cyB8fCB0aGlzLndzLnJlYWR5U3RhdGUgIT09IDEpIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJXZWJTb2NrZXQgbm90IGNvbm5lY3RlZCBhZnRlciBkaXNtaXNzVG8sIHdhaXRpbmcgZm9yIHJlY29ubmVjdGlvblwiKVxuICAgICAgdGhpcy53cyA9IG51bGxcbiAgICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSBudWxsXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXQoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWRcIilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlzaXRzIGEgcGF0aC4gTmF0aXZlIHVzZXMgdGhlIGluLWFwcCBoZWxwZXI7IHdlYiByZWxvYWRzIHRocm91Z2ggdGhlIGRyaXZlciBhbmQgcmVjb25uZWN0cyB0aGUgdGVzdCBicmlkZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9icm93c2VyLmpzXCIpLkJyb3dzZXJOYXZpZ2F0aW9uQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXQocGF0aCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0hPU1QgPT09IFwibmF0aXZlXCIpIHtcbiAgICAgIGF3YWl0IHN1cGVyLnZpc2l0KHBhdGgsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhd2FpdCB0aW1lb3V0KFxuICAgICAge3RpbWVvdXQ6IHRoaXMuZ2V0Q29tbWFuZFRpbWVvdXQoYXJncy50aW1lb3V0KSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSB2aXNpdGluZyBwYXRoOiAke3BhdGh9YH0sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMudmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKVxuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVCcm93c2VyQ29udGV4dCgpXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBpbml0aWFsaXplQnJvd3NlckNvbnRleHQoKSB7XG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogMTBfMDAwLCBlcnJvck1lc3NhZ2U6IFwiU2VuZGluZyBpbml0aWFsaXplIHRvIHVzZVN5c3RlbVRlc3QoKSB0aW1lZCBvdXRcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkuc2VuZENvbW1hbmQoe3R5cGU6IFwiaW5pdGlhbGl6ZVwifSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9hZHMgYSB3ZWIgcm91dGUgdGhyb3VnaCB0aGUgZHJpdmVyIGFuZCB3YWl0cyBmb3IgdGhlIGJyb3dzZXIgY29tbWFuZCB3ZWJzb2NrZXQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgdmlzaXRQYXRoV2l0aERyaXZlckFuZFJlY29ubmVjdChwYXRoKSB7XG4gICAgdGhpcy5pZ25vcmVFeGlzdGluZ1Njb3VuZHJlbENsaWVudHMoKVxuICAgIHRoaXMud3MgPSBudWxsXG4gICAgdGhpcy5nZXRDb21tdW5pY2F0b3IoKS53cyA9IG51bGxcbiAgICBhd2FpdCB0aGlzLmRyaXZlclZpc2l0KHRoaXMuYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSlcbiAgICB0aGlzLmRlYnVnTG9nKGBEcml2ZXIgdmlzaXRlZCBwYXRoICR7cGF0aH1gKVxuICAgIGF3YWl0IHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldCgpXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIkNsaWVudCB3ZWJzb2NrZXQgcmVjb25uZWN0ZWQgYWZ0ZXIgZHJpdmVyIG5hdmlnYXRpb25cIilcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgaWdub3JlRXhpc3RpbmdTY291bmRyZWxDbGllbnRzKCkge1xuICAgIGlmICghdGhpcy5zZXJ2ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNjb3VuZHJlbCBzZXJ2ZXIgaXMgbm90IHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnQgPSB0aGlzLnNlcnZlci5nZXRDbGllbnRzKCkubGVuZ3RoXG4gICAgdGhpcy5kZWJ1Z0xvZyhgSWdub3JpbmcgJHt0aGlzLl9pZ25vcmVkU2NvdW5kcmVsQ2xpZW50Q291bnR9IFNjb3VuZHJlbCBjbGllbnQocykgZnJvbSBwcmV2aW91cyBicm93c2VyIGNvbnRleHRzYClcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IFN5c3RlbVRlc3QgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtTeXN0ZW1UZXN0QXJnc30gW2FyZ3NdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2xpZW50V3NQb3J0ID0gMTk4NSwgY2xpZW50V3NDb25uZWN0VGltZW91dCwgaG9zdCA9IFwibG9jYWxob3N0XCIsIHBvcnQgPSA4MDgxLCBodHRwSG9zdCA9IFwibG9jYWxob3N0XCIsIGh0dHBQb3J0ID0gMTk4NCwgaHR0cENvbm5lY3RIb3N0LCBkZWJ1ZyA9IGZhbHNlLCBlcnJvckZpbHRlciwgZmFpbE9uQnJvd3NlckVycm9yID0gdHJ1ZSwgZmFpbE9uQ29uc29sZUVycm9yID0gZmFsc2UsIHNjb3VuZHJlbFBvcnQgPSA4MDkwLCB1cmxBcmdzLCBkcml2ZXIsIC4uLnJlc3RBcmdzfSA9IHtob3N0OiBcImxvY2FsaG9zdFwiLCBwb3J0OiA4MDgxLCBodHRwSG9zdDogXCJsb2NhbGhvc3RcIiwgaHR0cFBvcnQ6IDE5ODQsIGRlYnVnOiBmYWxzZX0pIHtcbiAgICBzdXBlcih7ZGVidWcsIGRyaXZlcn0pXG5cbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcblxuICAgIGlmIChyZXN0QXJnc0tleXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGFyZ3VtZW50czogJHtyZXN0QXJnc0tleXMuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgdGhpcy5faG9zdCA9IGhvc3RcbiAgICB0aGlzLl9wb3J0ID0gcG9ydFxuICAgIHRoaXMuX2NsaWVudFdzUG9ydCA9IGNsaWVudFdzUG9ydFxuICAgIHRoaXMuX2NsaWVudFdzQ29ubmVjdFRpbWVvdXQgPSBjbGllbnRXc0Nvbm5lY3RUaW1lb3V0ID8/IGRlZmF1bHRDbGllbnRXZWJTb2NrZXRDb25uZWN0VGltZW91dCgpXG4gICAgdGhpcy5faHR0cEhvc3QgPSBodHRwSG9zdFxuICAgIHRoaXMuX2h0dHBQb3J0ID0gaHR0cFBvcnRcbiAgICB0aGlzLl9odHRwQ29ubmVjdEhvc3QgPSBodHRwQ29ubmVjdEhvc3RcbiAgICB0aGlzLl9kZWJ1ZyA9IGRlYnVnXG4gICAgdGhpcy5fZXJyb3JGaWx0ZXIgPSBlcnJvckZpbHRlclxuICAgIHRoaXMuX2ZhaWxPbkJyb3dzZXJFcnJvciA9IGZhaWxPbkJyb3dzZXJFcnJvclxuICAgIHRoaXMuX2ZhaWxPbkNvbnNvbGVFcnJvciA9IGZhaWxPbkNvbnNvbGVFcnJvclxuICAgIHRoaXMuX3Njb3VuZHJlbFBvcnQgPSBzY291bmRyZWxQb3J0XG4gICAgdGhpcy5fdXJsQXJncyA9IHVybEFyZ3NcbiAgICB0aGlzLl9yb290UGF0aCA9IHRoaXMuYnVpbGRSb290UGF0aCgpXG5cbiAgICAvKiogQHR5cGUge1JlY29yZDxudW1iZXIsIG9iamVjdD59ICovXG4gICAgdGhpcy5fcmVzcG9uc2VzID0ge31cblxuICAgIHRoaXMuX3NlbmRDb3VudCA9IDBcbiAgICB0aGlzLnN0YXJ0U2NvdW5kcmVsKClcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBTY291bmRyZWwgc2VydmVyIHdoaWNoIHRoZSBicm93c2VyIGNvbm5lY3RzIHRvIGZvciByZW1vdGUgZXZhbHVhdGlvbiBpbiB0aGUgYnJvd3NlclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXJ0U2NvdW5kcmVsKCkge1xuICAgIGlmICh0aGlzLnNjb3VuZHJlbFdzcykgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBhbHJlYWR5IHN0YXJ0ZWRcIilcblxuICAgIHRoaXMuc2NvdW5kcmVsV3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogdGhpcy5fc2NvdW5kcmVsUG9ydH0pXG4gICAgdGhpcy5zZXJ2ZXJXZWJTb2NrZXQgPSBuZXcgU2VydmVyV2ViU29ja2V0KHRoaXMuc2NvdW5kcmVsV3NzKVxuICAgIHRoaXMuc2VydmVyID0gbmV3IFNlcnZlcih0aGlzLnNlcnZlcldlYlNvY2tldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3BTY291bmRyZWwoKSB7XG4gICAgaWYgKHRoaXMuc2VydmVyPy5jbG9zZSkge1xuICAgICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5nZXRUaW1lb3V0cygpLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTY291bmRyZWwgdG8gc3RvcFwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5zZXJ2ZXI+fSAqLyAodGhpcy5zZXJ2ZXIpLmNsb3NlKCkpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuY2xvc2VXZWJTb2NrZXRTZXJ2ZXIodGhpcy5zY291bmRyZWxXc3MsIFwiU2NvdW5kcmVsIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIFNjb3VuZHJlbCBjbGllbnQgKGJyb3dzZXIpIHRvIGNvbm5lY3QgYW5kIHJldHVybnMgaXQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdGltZW91dE1zXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzY291bmRyZWwtcmVtb3RlLWV2YWwvYnVpbGQvY2xpZW50L2luZGV4LmpzXCIpLmRlZmF1bHQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0U2NvdW5kcmVsQ2xpZW50KHRpbWVvdXRNcyA9IDEwMDAwKSB7XG4gICAgaWYgKCF0aGlzLnNlcnZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU2NvdW5kcmVsIHNlcnZlciBpcyBub3Qgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIHRoaXMuZGVidWdMb2coXCJnZXRTY291bmRyZWxDbGllbnQ6IHdhaXRpbmcgZm9yIGJyb3dzZXIgU2NvdW5kcmVsIGluaXRpYWxpemF0aW9uXCIpXG4gICAgYXdhaXQgdGltZW91dCh7dGltZW91dDogdGltZW91dE1zLCBlcnJvck1lc3NhZ2U6IFwiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFNjb3VuZHJlbCB0byBpbml0aWFsaXplXCJ9LCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmdldENvbW11bmljYXRvcigpLnNlbmRDb21tYW5kKHt0eXBlOiBcIndhaXRGb3JTY291bmRyZWxcIn0pXG4gICAgfSlcbiAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiBicm93c2VyIHJlcG9ydGVkIFNjb3VuZHJlbCBpbml0aWFsaXplZFwiKVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthbnl9IGNsaWVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnN0IGlzT3BlbkNsaWVudCA9IChjbGllbnQpID0+IGNsaWVudD8uYmFja2VuZD8ud3M/LnJlYWR5U3RhdGUgPT09IDFcblxuICAgIGNvbnN0IGV4aXN0aW5nQ2xpZW50cyA9IHRoaXMuc2VydmVyLmdldENsaWVudHMoKVxuICAgIGNvbnN0IGN1cnJlbnRDbGllbnRzID0gZXhpc3RpbmdDbGllbnRzLnNsaWNlKHRoaXMuX2lnbm9yZWRTY291bmRyZWxDbGllbnRDb3VudClcbiAgICBjb25zdCBvcGVuRXhpc3RpbmdDbGllbnRzID0gY3VycmVudENsaWVudHMuZmlsdGVyKGlzT3BlbkNsaWVudClcblxuICAgIGlmIChvcGVuRXhpc3RpbmdDbGllbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGVidWdMb2coYGdldFNjb3VuZHJlbENsaWVudDogdXNpbmcgZXhpc3Rpbmcgb3BlbiBjbGllbnQgKCR7b3BlbkV4aXN0aW5nQ2xpZW50cy5sZW5ndGh9IGF2YWlsYWJsZSlgKVxuICAgICAgcmV0dXJuIG9wZW5FeGlzdGluZ0NsaWVudHNbb3BlbkV4aXN0aW5nQ2xpZW50cy5sZW5ndGggLSAxXVxuICAgIH1cbiAgICB0aGlzLmRlYnVnTG9nKGBnZXRTY291bmRyZWxDbGllbnQ6IG5vIG9wZW4gY2FjaGVkIGNsaWVudHMsIHdhaXRpbmcgZm9yIG5ldyBjb25uZWN0aW9uIChjYWNoZWQgdG90YWw6ICR7ZXhpc3RpbmdDbGllbnRzLmxlbmd0aH0sIGlnbm9yZWQ6ICR7dGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50fSlgKVxuXG4gICAgaWYgKCF0aGlzLnNlcnZlci5ldmVudHM/Lm9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTY291bmRyZWwgc2VydmVyIGV2ZW50cyBhcmUgdW5hdmFpbGFibGVcIilcbiAgICB9XG5cbiAgICAvKiogQHR5cGUgeygoY2xpZW50OiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSAqL1xuICAgIGxldCBvbk5ld0NsaWVudFxuICAgIGNvbnN0IGNsZWFudXBMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgIGlmIChvbk5ld0NsaWVudCkge1xuICAgICAgICB0aGlzLnNlcnZlcj8uZXZlbnRzLm9mZihcIm5ld0NsaWVudFwiLCBvbk5ld0NsaWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRpbWVvdXRNcywgZXJyb3JNZXNzYWdlOiBcIlRpbWVkIG91dCB3YWl0aW5nIGZvciBTY291bmRyZWwgY2xpZW50XCJ9LCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBvbk5ld0NsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgICAgaWYgKCFpc09wZW5DbGllbnQoY2xpZW50KSkgcmV0dXJuXG4gICAgICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICAgICAgICB0aGlzLmRlYnVnTG9nKFwiZ2V0U2NvdW5kcmVsQ2xpZW50OiByZWNlaXZlZCBuZXcgb3BlbiBjbGllbnRcIilcbiAgICAgICAgICByZXNvbHZlKGNsaWVudClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VydmVyPy5ldmVudHMub24oXCJuZXdDbGllbnRcIiwgb25OZXdDbGllbnQpXG4gICAgICB9KSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYW51cExpc3RlbmVyKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIENTUyBzZWxlY3RvciBtYXRjaGVzIGFuIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBleGlzdHMoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5leGlzdHMoc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHZpc2libGUgdGV4dCBmcm9tIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59XG4gICAqL1xuICBhc3luYyB0ZXh0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkudGV4dChzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQgdGhhdCBoYXMgY2hpbGRyZW4gd2hpY2ggZmlsbHMgb3V0IHRoZSBlbGVtZW50IGFuZCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBjYXVzZWQgYSBFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgLyoqXG4gICAqIENsaWNrcyBhbiBlbGVtZW50LCBhbGxvd2luZyBzZWxlY3RvciBhcmdzIHdoZW4gdXNpbmcgYSBDU1Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsaWNrKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncylcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yIHdpdGhvdXQgd2FpdGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldERyaXZlckFkYXB0ZXIoKS5maW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzKVxuICAgIHRoaXMudGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcmFjdHMgd2l0aCBhbiBlbGVtZW50IGJ5IGNhbGxpbmcgYSBtZXRob2Qgb24gaXQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLlxuICAgKiBSZXRyeWluZyBvbiBFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3IsIEVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3IsIG9yIFN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fHN0cmluZ3x7c2VsZWN0b3I6IHN0cmluZ30gJiBJbnRlcmFjdEFyZ3N9IGVsZW1lbnRPcklkZW50aWZpZXIgVGhlIGVsZW1lbnQgb3IgYSBDU1Mgc2VsZWN0b3IgdG8gZmluZCB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwgb24gdGhlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7Li4uYW55fSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdChlbGVtZW50T3JJZGVudGlmaWVyLCBtZXRob2ROYW1lLCAuLi5hcmdzKSB7XG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLmludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVjdHMgbm8gZWxlbWVudCB0byBiZSBmb3VuZCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vRWxlbWVudChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROb1dhaXQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgICBmb3VuZCA9IHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgLy8gSWdub3JlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb3VuZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBub3QgdG8gZmluZDogJHtzZWxlY3Rvcn1gKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtXYWl0Rm9yTm9TZWxlY3RvckFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JOb1NlbGVjdG9yKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICB0aGlzLnRocm93UmVnaXN0ZXJlZEJyb3dzZXJFcnJvcigpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkud2FpdEZvck5vU2VsZWN0b3Ioc2VsZWN0b3IsIGFyZ3MpXG4gICAgdGhpcy50aHJvd1JlZ2lzdGVyZWRCcm93c2VyRXJyb3IoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgbm90aWZpY2F0aW9uIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIG5vdGlmaWNhdGlvbk1lc3NhZ2VzKCkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKFwiW2RhdGEtY2xhc3M9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11cIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VUZXh0cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBub3RpZmljYXRpb25NZXNzYWdlVGV4dHMucHVzaCh0ZXh0KVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25NZXNzYWdlVGV4dHNcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlY3RzIGEgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gYXBwZWFyIGFuZCB3YWl0cyBmb3IgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlXG4gICAqIEBwYXJhbSB7Tm90aWZpY2F0aW9uTWVzc2FnZUFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGV4cGVjdE5vdGlmaWNhdGlvbk1lc3NhZ2UoZXhwZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7ZGlzbWlzcyA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcblxuICAgIGlmIChPYmplY3Qua2V5cyhyZXN0QXJncykubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGFyZ3M6ICR7T2JqZWN0LmtleXMocmVzdEFyZ3MpLmpvaW4oXCIsIFwiKX1gKVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3QgYWxsRGV0ZWN0ZWROb3RpZmljYXRpb25NZXNzYWdlcyA9IFtdXG4gICAgbGV0IGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRcbiAgICBsZXQgZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnRcblxuICAgIGF3YWl0IHdhaXRGb3IoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS10ZXN0aWQ9J25vdGlmaWNhdGlvbi1tZXNzYWdlJ11cIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2V9KVxuXG4gICAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMuZ2V0RHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcInJldHVybiBhcmd1bWVudHNbMF0udGV4dENvbnRlbnQ7XCIsIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50KSk/LnRyaW0oKSB8fCBhd2FpdCBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgICBpZiAoIWFsbERldGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZXMuaW5jbHVkZXMobm90aWZpY2F0aW9uTWVzc2FnZSkpIHtcbiAgICAgICAgICBhbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLnB1c2gobm90aWZpY2F0aW9uTWVzc2FnZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub3RpZmljYXRpb25NZXNzYWdlID09IGV4cGVjdGVkTm90aWZpY2F0aW9uTWVzc2FnZSkge1xuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQgPSBub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudFxuICAgICAgICAgIGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUNvdW50ID0gYXdhaXQgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb3VudFwiKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90aWZpY2F0aW9uIG1lc3NhZ2UgJHtleHBlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2V9IHdhc24ndCBpbmNsdWRlZCBpbjogJHthbGxEZXRlY3RlZE5vdGlmaWNhdGlvbk1lc3NhZ2VzLmpvaW4oXCIsIFwiKX1gKVxuICAgIH0pXG5cbiAgICBpZiAoZm91bmROb3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCAmJiBkaXNtaXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLmludGVyYWN0KGZvdW5kTm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnQsIFwiY2xpY2tcIikgLy8gRGlzbWlzcyB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2VcbiAgICAgIGlmICghZm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbm90aWZpY2F0aW9uIG1lc3NhZ2UgdG8gaGF2ZSBhIGRhdGEtY291bnRcIilcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yTm9TZWxlY3RvcihgW2RhdGEtdGVzdGlkPSdub3RpZmljYXRpb24tbWVzc2FnZSddW2RhdGEtY291bnQ9JyR7Zm91bmROb3RpZmljYXRpb25NZXNzYWdlQ291bnR9J11gLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBkaXNtaXNzTm90aWZpY2F0aW9uTWVzc2FnZXMoKSB7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uTWVzc2FnZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG5cbiAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50IG9mIG5vdGlmaWNhdGlvbk1lc3NhZ2VFbGVtZW50cykge1xuICAgICAgYXdhaXQgdGhpcy5pbnRlcmFjdChub3RpZmljYXRpb25NZXNzYWdlRWxlbWVudCwgXCJjbGlja1wiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2FpdEZvck5vU2VsZWN0b3IoXCJbZGF0YS1jbGFzcz0nbm90aWZpY2F0aW9uLW1lc3NhZ2UnXVwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN5c3RlbSB0ZXN0IGhhcyBiZWVuIHN0YXJ0ZWRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBpc1N0YXJ0ZWQoKSB7IHJldHVybiB0aGlzLl9zdGFydGVkIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBzeXN0ZW0gdGVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRoaXMuZGVidWdMb2coXCJTdGFydCBjYWxsZWRcIilcbiAgICBjb25zdCBpc05hdGl2ZUhvc3QgPSBwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09PSBcIm5hdGl2ZVwiXG5cbiAgICBpZiAoaXNOYXRpdmVIb3N0KSB7XG4gICAgICB0aGlzLmN1cnJlbnRVcmwgPSBcIm5hdGl2ZTovL1wiXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiVXNpbmcgbmF0aXZlIGFwcCBob3N0XCIpXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZXhwby1kZXYtc2VydmVyXCIpIHtcbiAgICAgIHRoaXMuY3VycmVudFVybCA9IGBodHRwOi8vJHt0aGlzLl9ob3N0fToke3RoaXMuX3BvcnR9YFxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVXNpbmcgZXhwby1kZXYtc2VydmVyIGF0ICR7dGhpcy5jdXJyZW50VXJsfWApXG4gICAgfSBlbHNlIGlmIChwcm9jZXNzLmVudi5TWVNURU1fVEVTVF9IT1NUID09IFwiZGlzdFwiKSB7XG4gICAgICBjb25zdCBjb25uZWN0SG9zdCA9IHRoaXMuX2h0dHBDb25uZWN0SG9zdCA/PyB0aGlzLl9odHRwSG9zdFxuICAgICAgdGhpcy5jdXJyZW50VXJsID0gYGh0dHA6Ly8ke2Nvbm5lY3RIb3N0fToke3RoaXMuX2h0dHBQb3J0fWBcblxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgU3Bhd25pbmcgSFRUUCBzZXJ2ZXIgZm9yIGRpc3Qgb24gJHt0aGlzLl9odHRwSG9zdH06JHt0aGlzLl9odHRwUG9ydH1gKVxuICAgICAgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlciA9IG5ldyBTeXN0ZW1UZXN0SHR0cFNlcnZlcih7XG4gICAgICAgIGhvc3Q6IHRoaXMuX2h0dHBIb3N0LFxuICAgICAgICBwb3J0OiB0aGlzLl9odHRwUG9ydCxcbiAgICAgICAgZGVidWc6IHRoaXMuX2RlYnVnLFxuICAgICAgICBvbkVycm9yOiB0aGlzLm9uSHR0cFNlcnZlckVycm9yXG4gICAgICB9KVxuXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgSFRUUCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIuc3RhcnQoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkNoZWNraW5nIEhUVFAgc2VydmVyIGhlYWx0aFwiKVxuICAgICAgYXdhaXQgdGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlci5hc3NlcnRSZWFjaGFibGUoe3RpbWVvdXRNczogdGhpcy5nZXRUaW1lb3V0cygpfSlcbiAgICAgIHRoaXMuZGVidWdMb2coXCJIVFRQIHNlcnZlciBzdGFydGVkXCIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsZWFzZSBzZXQgU1lTVEVNX1RFU1RfSE9TVCB0byAnZXhwby1kZXYtc2VydmVyJywgJ2Rpc3QnLCBvciAnbmF0aXZlJ1wiKVxuICAgIH1cblxuICAgIHRoaXMuZ2V0RHJpdmVyQWRhcHRlcigpLnNldEJhc2VVcmwodGhpcy5jdXJyZW50VXJsKVxuXG4gICAgLy8gU3RhcnQgdGhlIGNsaWVudCBXZWJTb2NrZXQgc2VydmVyIGJlZm9yZSB0aGUgZHJpdmVyIGZvciBuYXRpdmUgaG9zdHMsXG4gICAgLy8gYmVjYXVzZSB0aGUgbmF0aXZlIGFwcCBsYXVuY2hlcyBpbW1lZGlhdGVseSBvbiBkcml2ZXIgc3RhcnQgYW5kIGl0c1xuICAgIC8vIHVzZVN5c3RlbVRlc3RFeHBvIGhvb2sgY29ubmVjdHMgdG8gdGhlIFdlYlNvY2tldCBhcyBzb29uIGFzIGl0IHJlbmRlcnMuXG4gICAgLy8gSWYgdGhlIHNlcnZlciBpc24ndCBsaXN0ZW5pbmcgeWV0LCB0aGUgY29ubmVjdGlvbiBmYWlscyB3aXRoIG5vIHJldHJ5LlxuICAgIGlmIChpc05hdGl2ZUhvc3QpIHtcbiAgICAgIHRoaXMuZGVidWdMb2coXCJTdGFydGluZyBXZWJTb2NrZXQgc2VydmVyIChiZWZvcmUgZHJpdmVyIGZvciBuYXRpdmUpXCIpXG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2ViU29ja2V0U2VydmVyKClcbiAgICAgIHRoaXMuZGVidWdMb2coXCJXZWJTb2NrZXQgc2VydmVyIHN0YXJ0ZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLmRlYnVnTG9nKFwiU3RhcnRpbmcgZHJpdmVyXCIpXG4gICAgYXdhaXQgdGhpcy5nZXREcml2ZXJBZGFwdGVyKCkuc3RhcnQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJEcml2ZXIgc3RhcnRlZFwiKVxuXG4gICAgYXdhaXQgdGhpcy5zZXRUaW1lb3V0cygxMDAwMClcbiAgICB0aGlzLmRlYnVnTG9nKFwiVGltZW91dHMgc2V0IG9uIGRyaXZlclwiKVxuXG4gICAgaWYgKCFpc05hdGl2ZUhvc3QpIHtcbiAgICAgIC8vIFdlYiBzb2NrZXQgc2VydmVyIHRvIGNvbW11bmljYXRlIHdpdGggYnJvd3NlclxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0aW5nIFdlYlNvY2tldCBzZXJ2ZXJcIilcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXZWJTb2NrZXRTZXJ2ZXIoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIldlYlNvY2tldCBzZXJ2ZXIgc3RhcnRlZFwiKVxuICAgIH1cblxuICAgIGlmICghaXNOYXRpdmVIb3N0KSB7XG4gICAgICAvLyBWaXNpdCB0aGUgcm9vdCBwYWdlIGFuZCB3YWl0IGZvciBFeHBvIHRvIGJlIGxvYWRlZCBhbmQgdGhlIGFwcCB0byBhcHBlYXJcbiAgICAgIHRoaXMuZGVidWdMb2coXCJWaXNpdGluZyByb290IHBhdGhcIilcbiAgICAgIGNvbnN0IHJvb3RQYXRoID0gdGhpcy5nZXRSb290UGF0aCgpXG4gICAgICBhd2FpdCB0aGlzLnZpc2l0SW5pdGlhbFJvb3RQYXRoKHJvb3RQYXRoKVxuICAgICAgdGhpcy5kZWJ1Z0xvZyhgVmlzaXRlZCByb290IHBhdGggJHtyb290UGF0aH1gKVxuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyByb290IGVsZW1lbnQgYm9keSA+ICNyb290XCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZChcImJvZHkgPiAjcm9vdFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZX0pXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJGb3VuZCByb290IGVsZW1lbnQgYm9keSA+ICNyb290XCIpXG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZpbmRpbmcgc3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiKVxuICAgICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRChcInN5c3RlbVRlc3RpbmdDb21wb25lbnRcIiwge3VzZUJhc2VTZWxlY3RvcjogZmFsc2UsIHRpbWVvdXQ6IDMwMDAwLCB2aXNpYmxlOiB0cnVlfSlcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkZvdW5kIHJvb3QgYW5kIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJFcnJvciB3aGlsZSBmaW5kaW5nIHJvb3Qvc3lzdGVtVGVzdGluZ0NvbXBvbmVudCwgdGFraW5nIHNjcmVlbnNob3RcIilcbiAgICAgICAgYXdhaXQgdGhpcy50YWtlU2NyZWVuc2hvdCgpXG4gICAgICAgIHRoaXMuZGVidWdMb2coXCJTY3JlZW5zaG90IGNhcHR1cmVkIGFmdGVyIHJvb3Qvc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBsb29rdXAgZmFpbHVyZVwiKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRmluZGluZyBzeXN0ZW1UZXN0aW5nQ29tcG9uZW50IGZvciBuYXRpdmUgYXBwXCIpXG4gICAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKFwic3lzdGVtVGVzdGluZ0NvbXBvbmVudFwiLCB7dXNlQmFzZVNlbGVjdG9yOiBmYWxzZSwgdGltZW91dDogMzAwMDAsIHZpc2libGU6IG51bGx9KVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiRm91bmQgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBmb3IgbmF0aXZlIGFwcFwiKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyhcIkVycm9yIHdoaWxlIGZpbmRpbmcgbmF0aXZlIHN5c3RlbVRlc3RpbmdDb21wb25lbnQsIHRha2luZyBzY3JlZW5zaG90XCIpXG4gICAgICAgIGF3YWl0IHRoaXMudGFrZVNjcmVlbnNob3QoKVxuICAgICAgICB0aGlzLmRlYnVnTG9nKFwiU2NyZWVuc2hvdCBjYXB0dXJlZCBhZnRlciBuYXRpdmUgc3lzdGVtVGVzdGluZ0NvbXBvbmVudCBsb29rdXAgZmFpbHVyZVwiKVxuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIGNsaWVudCB0byBjb25uZWN0XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIldhaXRpbmcgZm9yIGNsaWVudCBXZWJTb2NrZXQgY29ubmVjdGlvbiAob3BlbmluZylcIilcbiAgICB0aGlzLmRlYnVnTG9nKGBXUyBzdGF0ZTogJHt0aGlzLndzPy5yZWFkeVN0YXRlID8/IFwibm9uZVwifWApXG4gICAgdGhpcy5kZWJ1Z0xvZyhcIndhaXRGb3JDbGllbnRXZWJTb2NrZXRcIilcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXQoKVxuICAgIHRoaXMuZGVidWdMb2coXCJDbGllbnQgV2ViU29ja2V0IGNvbm5lY3RlZFwiKVxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcbiAgICB0aGlzLmRlYnVnTG9nKFwiTWFya2VkIHN5c3RlbSB0ZXN0IGFzIHN0YXJ0ZWRcIilcbiAgICBpZiAoIWlzTmF0aXZlSG9zdCkge1xuICAgICAgdGhpcy5kZWJ1Z0xvZyhcIlNldHRpbmcgYmFzZSBzZWxlY3RvciB0byBmb2N1c2VkIHN5c3RlbVRlc3RpbmdDb21wb25lbnRcIilcbiAgICAgIHRoaXMuc2V0QmFzZVNlbGVjdG9yKFwiW2RhdGEtdGVzdGlkPSdzeXN0ZW1UZXN0aW5nQ29tcG9uZW50J11bZGF0YS1mb2N1c3NlZD0ndHJ1ZSddXCIpXG4gICAgICB0aGlzLmRlYnVnTG9nKFwiQmFzZSBzZWxlY3RvciBzZXRcIilcbiAgICB9XG4gICAgdGhpcy5kZWJ1Z0xvZyhcIlN0YXJ0IGNvbXBsZXRlZFwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgYnJvd3NlciBkcml2ZXIgdG8gcmVhY2ggdGhlIHJvb3Qgcm91dGUgYWZ0ZXIgc3RhcnR1cC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoIEluaXRpYWwgYXBwIHJvdXRlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHZpc2l0SW5pdGlhbFJvb3RQYXRoKHJvb3RQYXRoKSB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgdGhpcy5nZXRUaW1lb3V0cygpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXJWaXNpdChyb290UGF0aClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCB2aXNpdEVycm9yID0gZW5zdXJlRXJyb3IoZXJyb3IsIFwiaW5pdGlhbCByb290IHBhdGggdmlzaXQgZXJyb3JcIilcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHZpc2l0RXJyb3IubWVzc2FnZVxuICAgICAgICBjb25zdCByZXRyeWFibGVOZXR3b3JrRXJyb3IgPSBtZXNzYWdlLmluY2x1ZGVzKFwibmV0OjpFUlJfQUREUkVTU19VTlJFQUNIQUJMRVwiKSB8fCBtZXNzYWdlLmluY2x1ZGVzKFwibmV0OjpFUlJfQ09OTkVDVElPTl9SRUZVU0VEXCIpXG5cbiAgICAgICAgaWYgKCFyZXRyeWFibGVOZXR3b3JrRXJyb3IgfHwgRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICAgIHRocm93IHZpc2l0RXJyb3JcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVidWdMb2coYEluaXRpYWwgcm9vdCBwYXRoIHZpc2l0IHdhaXRpbmcgZm9yIGRyaXZlciBuZXR3b3JrIHJlYWRpbmVzczogJHttZXNzYWdlfWApXG4gICAgICAgIGF3YWl0IHdhaXQoTWF0aC5taW4oSU5JVElBTF9ST09UX1ZJU0lUX1JFVFJZX0RFTEFZX01TLCBNYXRoLm1heCgwLCBkZWFkbGluZSAtIERhdGUubm93KCkpKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFJvb3RQYXRoKCkge1xuICAgIHJldHVybiB0aGlzLl9yb290UGF0aCA/PyBTeXN0ZW1UZXN0LnJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0Um9vdFBhdGgocm9vdFBhdGgpIHtcbiAgICB0aGlzLl9yb290UGF0aCA9IHJvb3RQYXRoXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGJ1aWxkUm9vdFBhdGgoKSB7XG4gICAgY29uc3Qgcm9vdFBhdGggPSB0aGlzLmJ1aWxkU3lzdGVtVGVzdFBhdGgoU3lzdGVtVGVzdC5yb290UGF0aClcblxuICAgIHRoaXMuZGVidWdMb2coYGJ1aWxkUm9vdFBhdGggcm9vdFBhdGg6ICR7cm9vdFBhdGh9YClcblxuICAgIHJldHVybiByb290UGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgc3lzdGVtLXRlc3QgcXVlcnkgcGFyYW1zIHRvIGEgcGF0aCB0aGF0IHdpbGwgcmVsb2FkIHRoZSB3ZWIgYXBwLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRTeXN0ZW1UZXN0UGF0aChwYXRoKSB7XG4gICAgY29uc3QgaXNBYnNvbHV0ZVVybCA9IC9eW2Etel0rOlxcL1xcLy9pLnRlc3QocGF0aClcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIFwiaHR0cDovL2xvY2FsaG9zdFwiKVxuICAgIGNvbnN0IGFwcGVuZFBhcmFtID0gKC8qKiBAdHlwZSB7c3RyaW5nfSAqLyBrZXksIC8qKiBAdHlwZSB7YW55fSAqLyB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHJldHVyblxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCBTdHJpbmcodmFsdWUpKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl91cmxBcmdzKSB7XG4gICAgICBpZiAodGhpcy5fdXJsQXJncyBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl91cmxBcmdzKSB7XG4gICAgICAgICAgYXBwZW5kUGFyYW0oa2V5LCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fdXJsQXJncykpIHtcbiAgICAgICAgICBhcHBlbmRQYXJhbShrZXksIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RcIikpIHtcbiAgICAgIGFwcGVuZFBhcmFtKFwic3lzdGVtVGVzdFwiLCBcInRydWVcIilcbiAgICB9XG5cbiAgICBpZiAoIXVybC5zZWFyY2hQYXJhbXMuaGFzKFwic3lzdGVtVGVzdENsaWVudFdzUG9ydFwiKSAmJiB0aGlzLl9jbGllbnRXc1BvcnQgIT09IDE5ODUpIHtcbiAgICAgIGFwcGVuZFBhcmFtKFwic3lzdGVtVGVzdENsaWVudFdzUG9ydFwiLCB0aGlzLl9jbGllbnRXc1BvcnQpXG4gICAgfVxuXG4gICAgaWYgKCF1cmwuc2VhcmNoUGFyYW1zLmhhcyhcInN5c3RlbVRlc3RTY291bmRyZWxQb3J0XCIpICYmIHRoaXMuX3Njb3VuZHJlbFBvcnQgIT09IDgwOTApIHtcbiAgICAgIGFwcGVuZFBhcmFtKFwic3lzdGVtVGVzdFNjb3VuZHJlbFBvcnRcIiwgdGhpcy5fc2NvdW5kcmVsUG9ydClcbiAgICB9XG5cbiAgICBpZiAoaXNBYnNvbHV0ZVVybCkgcmV0dXJuIHVybC5ocmVmXG5cbiAgICByZXR1cm4gYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWBcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGNsaWVudCB3ZWIgc29ja2V0IHRvIGNvbm5lY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yQ2xpZW50V2ViU29ja2V0KCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLl9jbGllbnRXc0Nvbm5lY3RUaW1lb3V0LCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBjbGllbnQgV2ViU29ja2V0IGNvbm5lY3Rpb25cIn0sICgpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHRoaXMud3MpIHtcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3QgPSByZWplY3RcbiAgICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSByZXNvbHZlXG4gICAgICB9KSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHRoZSB3ZWIgc29ja2V0IHNlcnZlciBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIHJlYWR5LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0V2ViU29ja2V0U2VydmVyKCkge1xuICAgIHRoaXMuY2xpZW50V3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogdGhpcy5fY2xpZW50V3NQb3J0fSlcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5jbGllbnRXc3M+fSAqLyAodGhpcy5jbGllbnRXc3MpLm9uY2UoXCJsaXN0ZW5pbmdcIiwgcmVzb2x2ZSlcbiAgICB9KVxuICAgIHRoaXMuY2xpZW50V3NzLm9uKFwiY29ubmVjdGlvblwiLCB0aGlzLm9uV2ViU29ja2V0Q29ubmVjdGlvbilcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImNsb3NlXCIsIHRoaXMub25XZWJTb2NrZXRDbG9zZSlcbiAgICB0aGlzLmNsaWVudFdzcy5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5kZWJ1Z0Vycm9yKGVycm9yKVxuXG4gICAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCkge1xuICAgICAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0KGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSlcbiAgICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZWplY3RcbiAgICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvbiBjb21tYW5kIGNhbGxiYWNrXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oe3R5cGU6IHN0cmluZywgZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pn0pOiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uQ29tbWFuZChjYWxsYmFjaykge1xuICAgIHRoaXMuX29uQ29tbWFuZENhbGxiYWNrID0gY2FsbGJhY2tcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGEgY29tbWFuZCByZWNlaXZlZCBmcm9tIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7e2RhdGE6IFJlY29yZDxzdHJpbmcsIGFueT59fSBhcmdzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAqL1xuICBvbkNvbW1hbmRSZWNlaXZlZCA9IGFzeW5jICh7ZGF0YX0pID0+IHtcbiAgICBjb25zdCB0eXBlID0gZGF0YS50eXBlXG4gICAgbGV0IHJlc3VsdFxuXG4gICAgaWYgKHR5cGUgPT0gXCJjb25zb2xlLmVycm9yXCIpIHtcbiAgICAgIGNvbnN0IHNob3dNZXNzYWdlID0gIXRoaXMuc2hvdWxkSWdub3JlRXJyb3IoZGF0YSlcblxuICAgICAgaWYgKHNob3dNZXNzYWdlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJCcm93c2VyIGVycm9yXCIsIC4uLmRhdGEudmFsdWUpXG4gICAgICAgIGlmICh0aGlzLl9mYWlsT25Db25zb2xlRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyQnJvd3NlckVycm9yKGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJjb25zb2xlLmxvZ1wiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkJyb3dzZXIgbG9nXCIsIC4uLmRhdGEudmFsdWUpXG4gICAgfSBlbHNlIGlmICh0eXBlID09IFwiZXJyb3JcIiB8fCBkYXRhLnR5cGUgPT0gXCJ1bmhhbmRsZWRyZWplY3Rpb25cIikge1xuICAgICAgdGhpcy5oYW5kbGVFcnJvcihkYXRhKVxuICAgIH0gZWxzZSBpZiAodGhpcy5fb25Db21tYW5kQ2FsbGJhY2spIHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX29uQ29tbWFuZENhbGxiYWNrKHtkYXRhLCB0eXBlfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihgb25XZWJTb2NrZXRDbGllbnRNZXNzYWdlIHVua25vd24gZGF0YSAodHlwZSAke3R5cGV9KWAsIGRhdGEpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYSBuZXcgd2ViIHNvY2tldCBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7V2ViU29ja2V0fSB3c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIG9uV2ViU29ja2V0Q29ubmVjdGlvbiA9IGFzeW5jICh3cykgPT4ge1xuICAgIHRoaXMud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSB3c1xuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkub25PcGVuKClcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLndzLm9uKFwiZXJyb3JcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uRXJyb3JcIikpXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy53cy5vbihcIm1lc3NhZ2VcIiwgZGlnZyh0aGlzLCBcImNvbW11bmljYXRvclwiLCBcIm9uTWVzc2FnZVwiKSlcblxuICAgIGlmICh0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVzb2x2ZSkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgZGVsZXRlIHRoaXMud2FpdEZvckNsaWVudFdlYlNvY2tldFByb21pc2VSZXNvbHZlXG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdFxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25XZWJTb2NrZXRDbG9zZSA9ICgpID0+IHtcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuZ2V0Q29tbXVuaWNhdG9yKCkud3MgPSBudWxsXG5cbiAgICBpZiAodGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdCkge1xuICAgICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlamVjdChuZXcgRXJyb3IoXCJDbGllbnQgd2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgY29ubmVjdGluZ1wiKSlcbiAgICAgIGRlbGV0ZSB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0XG4gICAgICBkZWxldGUgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBhbiBlcnJvciByZXBvcnRlZCBmcm9tIHRoZSBicm93c2VyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGhhbmRsZUVycm9yKGRhdGEpIHtcbiAgICBpZiAodGhpcy5zaG91bGRJZ25vcmVFcnJvcihkYXRhKSkgcmV0dXJuXG5cbiAgICBjb25zdCBlcnJvciA9IHRoaXMucmVnaXN0ZXJCcm93c2VyRXJyb3IoZGF0YSlcblxuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGFuIGVycm9yIHJlcG9ydGVkIGZyb20gdGhlIGJyb3dzZXIuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YSBFcnJvciBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7RXJyb3J9IFJlZ2lzdGVyZWQgZXJyb3IuXG4gICAqL1xuICByZWdpc3RlckJyb3dzZXJFcnJvcihkYXRhKSB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYEJyb3dzZXIgZXJyb3I6ICR7dGhpcy5leHRyYWN0RXJyb3JNZXNzYWdlKGRhdGEpfWApXG5cbiAgICBpZiAoZGF0YS5iYWNrdHJhY2UpIHtcbiAgICAgIGVycm9yLnN0YWNrID0gYCR7ZXJyb3IubWVzc2FnZX1cXG4ke2RhdGEuYmFja3RyYWNlfVxcblxcbiR7ZXJyb3Iuc3RhY2t9YFxuICAgIH1cblxuICAgIHRoaXMuX2Jyb3dzZXJFcnJvcnMucHVzaChlcnJvcilcblxuICAgIHJldHVybiBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBicm93c2VyIGVycm9yIHdoZW4gZmFpbC1mYXN0IGlzIGVuYWJsZWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgdGhyb3dSZWdpc3RlcmVkQnJvd3NlckVycm9yKCkge1xuICAgIGlmICghdGhpcy5fZmFpbE9uQnJvd3NlckVycm9yKSByZXR1cm5cblxuICAgIGNvbnN0IGJyb3dzZXJFcnJvciA9IHRoaXMuX2Jyb3dzZXJFcnJvcnNbMF1cblxuICAgIGlmIChicm93c2VyRXJyb3IpIHRocm93IGJyb3dzZXJFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBzeXN0ZW0gdGVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wU2NvdW5kcmVsKClcbiAgICBpZiAodGhpcy53cykge1xuICAgICAgdGhpcy53cy5jbG9zZSgpXG4gICAgICB0aGlzLndzID0gbnVsbFxuICAgIH1cbiAgICBhd2FpdCB0aGlzLmNsb3NlV2ViU29ja2V0U2VydmVyKHRoaXMuY2xpZW50V3NzLCBcImNsaWVudCBXZWJTb2NrZXQgc2VydmVyXCIpXG4gICAgaWYgKHRoaXMuZHJpdmVyQWRhcHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5kcml2ZXJBZGFwdGVyLnN0b3AoKVxuICAgIH1cbiAgICBpZiAodGhpcy5zeXN0ZW1UZXN0SHR0cFNlcnZlcikge1xuICAgICAgY29uc3QgaHR0cFNlcnZlciA9IHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXJcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBIVFRQIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgaHR0cFNlcnZlci5jbG9zZSgpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdWxseSB0ZWFycyBkb3duIGFuZCByZXN0YXJ0cyB0aGUgc3lzdGVtIHRlc3QgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVpbml0aWFsaXplKCkge1xuICAgIGF3YWl0IHRoaXMuc3RvcCgpXG5cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcbiAgICB0aGlzLl9iYXNlU2VsZWN0b3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLmN1cnJlbnRVcmwgPSB1bmRlZmluZWRcbiAgICB0aGlzLmRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuZHJpdmVyQWRhcHRlciA9IHRoaXMuY3JlYXRlRHJpdmVyKHRoaXMuX2RyaXZlckNvbmZpZylcbiAgICB0aGlzLndzID0gbnVsbFxuICAgIHRoaXMuY2xpZW50V3NzID0gdW5kZWZpbmVkXG4gICAgdGhpcy5zY291bmRyZWxXc3MgPSB1bmRlZmluZWRcbiAgICB0aGlzLnNlcnZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuc2VydmVyV2ViU29ja2V0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy5faWdub3JlZFNjb3VuZHJlbENsaWVudENvdW50ID0gMFxuICAgIHRoaXMuc3lzdGVtVGVzdEh0dHBTZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9odHRwU2VydmVyRXJyb3IgPSB1bmRlZmluZWRcbiAgICB0aGlzLndhaXRGb3JDbGllbnRXZWJTb2NrZXRQcm9taXNlUmVqZWN0ID0gdW5kZWZpbmVkXG4gICAgdGhpcy53YWl0Rm9yQ2xpZW50V2ViU29ja2V0UHJvbWlzZVJlc29sdmUgPSB1bmRlZmluZWRcbiAgICB0aGlzLmNvbW11bmljYXRvciA9IG5ldyBTeXN0ZW1UZXN0Q29tbXVuaWNhdG9yKHtvbkNvbW1hbmQ6IHRoaXMub25Db21tYW5kUmVjZWl2ZWR9KVxuICAgIHRoaXMuc2V0Q29tbXVuaWNhdG9yKHRoaXMuY29tbXVuaWNhdG9yKVxuXG4gICAgdGhpcy5zdGFydFNjb3VuZHJlbCgpXG4gICAgYXdhaXQgdGhpcy5zdGFydCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtXZWJTb2NrZXRTZXJ2ZXIgfCB1bmRlZmluZWR9IHdzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGNsb3NlV2ViU29ja2V0U2VydmVyKHdzcywgbGFiZWwgPSBcIldlYlNvY2tldCBzZXJ2ZXJcIikge1xuICAgIGlmICghd3NzKSByZXR1cm5cblxuICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBgdGltZW91dCB3aGlsZSBjbG9zaW5nICR7bGFiZWx9YH0sIGFzeW5jICgpID0+IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2VcbiAgICAgIGNvbnN0IHRlcm1pbmF0ZUNsaWVudCA9ICgvKiogQHR5cGUge2FueX0gKi8gY2xpZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xpZW50LnRlcm1pbmF0ZSgpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSB0ZXJtaW5hdGlvbiBlcnJvcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3Qgc2V0dGxlID0gKC8qKiBAdHlwZSB7KHZhbHVlOiBhbnkpID0+IHZvaWR9ICovIGNhbGxiYWNrLCAvKiogQHR5cGUge2FueX0gKi8gYXJnKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm5cbiAgICAgICAgc2V0dGxlZCA9IHRydWVcbiAgICAgICAgY2FsbGJhY2soYXJnKVxuICAgICAgfVxuXG4gICAgICB3c3Mub25jZShcImNsb3NlXCIsICgpID0+IHNldHRsZShyZXNvbHZlLCB1bmRlZmluZWQpKVxuICAgICAgd3NzLm9uY2UoXCJlcnJvclwiLCAoZXJyb3IpID0+IHNldHRsZShyZWplY3QsIGVycm9yKSlcbiAgICAgIGlmICh3c3MuY2xpZW50cyAmJiB3c3MuY2xpZW50cy5zaXplID4gMCkge1xuICAgICAgICB3c3MuY2xpZW50cy5mb3JFYWNoKHRlcm1pbmF0ZUNsaWVudClcbiAgICAgIH1cbiAgICAgIHdzcy5jbG9zZSgoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSBzZXR0bGUocmVqZWN0LCBlcnJvcilcbiAgICAgICAgZWxzZSBzZXR0bGUocmVzb2x2ZSwgdW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9KSlcbiAgfVxufVxuIl19