@microsoft/ocsdk 0.5.18 → 0.5.19-main.bee1915

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/SDK.js CHANGED
@@ -2148,6 +2148,161 @@ var SDK = /*#__PURE__*/function () {
2148
2148
 
2149
2149
  return getChatTranscripts;
2150
2150
  }()
2151
+ /**
2152
+ * Get persistent chat history for authenticated users.
2153
+ * @param requestId RequestId of the omnichannel session (Optional).
2154
+ * @param getPersistentChatHistoryOptionalParams Optional parameters for get persistent chat history.
2155
+ */
2156
+
2157
+ }, {
2158
+ key: "getPersistentChatHistory",
2159
+ value: function () {
2160
+ var _getPersistentChatHistory = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId) {
2161
+ var _this$configuration$d15,
2162
+ _this13 = this;
2163
+
2164
+ var getPersistentChatHistoryOptionalParams,
2165
+ timer,
2166
+ authenticatedUserToken,
2167
+ pageSize,
2168
+ pageToken,
2169
+ errorMessage,
2170
+ requestPath,
2171
+ axiosInstance,
2172
+ requestHeaders,
2173
+ params,
2174
+ url,
2175
+ method,
2176
+ options,
2177
+ _args27 = arguments;
2178
+ return _regenerator["default"].wrap(function _callee27$(_context27) {
2179
+ while (1) {
2180
+ switch (_context27.prev = _context27.next) {
2181
+ case 0:
2182
+ getPersistentChatHistoryOptionalParams = _args27.length > 1 && _args27[1] !== undefined ? _args27[1] : {};
2183
+ timer = _Timer.Timer.TIMER();
2184
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYSTARTED, "Get Persistent Chat History Started", requestId);
2185
+
2186
+ if (!requestId) {
2187
+ requestId = (0, _uuid.uuidv4)();
2188
+ }
2189
+
2190
+ authenticatedUserToken = getPersistentChatHistoryOptionalParams.authenticatedUserToken, pageSize = getPersistentChatHistoryOptionalParams.pageSize, pageToken = getPersistentChatHistoryOptionalParams.pageToken;
2191
+
2192
+ if (authenticatedUserToken) {
2193
+ _context27.next = 9;
2194
+ break;
2195
+ }
2196
+
2197
+ errorMessage = "Authenticated user token is required for persistent chat history";
2198
+ this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYFAILED, "Get Persistent Chat History failed - Missing authenticated user token", requestId);
2199
+ return _context27.abrupt("return", Promise.reject(new Error(errorMessage)));
2200
+
2201
+ case 9:
2202
+ requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetPersistentChatHistoryPath, "/").concat(this.omnichannelConfiguration.orgId, "/widgetapp/").concat(this.omnichannelConfiguration.widgetId, "/conversation/history");
2203
+ axiosInstance = _axios["default"].create();
2204
+ (0, _axiosRetryHandler["default"])(axiosInstance, {
2205
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
2206
+ retries: this.configuration.maxRequestRetriesOnFailure,
2207
+ waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getPersistentChatHistory
2208
+ });
2209
+ requestHeaders = _Constants["default"].defaultHeaders;
2210
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
2211
+ requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
2212
+
2213
+ if (pageToken) {
2214
+ requestHeaders[_OmnichannelHTTPHeaders["default"].pageToken] = pageToken;
2215
+ }
2216
+
2217
+ this.addDefaultHeaders(requestId, requestHeaders);
2218
+ params = {};
2219
+
2220
+ if (pageSize) {
2221
+ params.pageSize = pageSize.toString();
2222
+ }
2223
+
2224
+ url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2225
+ method = "GET";
2226
+ options = {
2227
+ headers: requestHeaders,
2228
+ method: method,
2229
+ url: url,
2230
+ params: params,
2231
+ timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.getPersistentChatHistory
2232
+ };
2233
+ return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
2234
+ var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
2235
+ var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime15, _elapsedTimeInMilliseconds15;
2236
+
2237
+ return _regenerator["default"].wrap(function _callee26$(_context26) {
2238
+ while (1) {
2239
+ switch (_context26.prev = _context26.next) {
2240
+ case 0:
2241
+ backendTimer = _Timer.Timer.TIMER();
2242
+ _context26.prev = 1;
2243
+ _context26.next = 4;
2244
+ return axiosInstance(options);
2245
+
2246
+ case 4:
2247
+ response = _context26.sent;
2248
+ httpRequestResponseTime = backendTimer.milliSecondsElapsed;
2249
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2250
+ data = response.data, headers = response.headers;
2251
+
2252
+ _this13.setAuthCodeNonce(headers);
2253
+
2254
+ _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYSUCCEEDED, "Get Persistent Chat History succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2255
+
2256
+ resolve(data);
2257
+ _context26.next = 22;
2258
+ break;
2259
+
2260
+ case 13:
2261
+ _context26.prev = 13;
2262
+ _context26.t0 = _context26["catch"](1);
2263
+ _httpRequestResponseTime15 = backendTimer.milliSecondsElapsed;
2264
+ _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2265
+
2266
+ _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYFAILED, "Get Persistent Chat History failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context26.t0, undefined, requestHeaders, _httpRequestResponseTime15);
2267
+
2268
+ if (!(0, _isExpectedAxiosError["default"])(_context26.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2269
+ _context26.next = 21;
2270
+ break;
2271
+ }
2272
+
2273
+ reject(new Error(_this13.HTTPTimeOutErrorMessage));
2274
+ return _context26.abrupt("return");
2275
+
2276
+ case 21:
2277
+ reject(_context26.t0);
2278
+
2279
+ case 22:
2280
+ case "end":
2281
+ return _context26.stop();
2282
+ }
2283
+ }
2284
+ }, _callee26, null, [[1, 13]]);
2285
+ }));
2286
+
2287
+ return function (_x42, _x43) {
2288
+ return _ref12.apply(this, arguments);
2289
+ };
2290
+ }()));
2291
+
2292
+ case 23:
2293
+ case "end":
2294
+ return _context27.stop();
2295
+ }
2296
+ }
2297
+ }, _callee27, this);
2298
+ }));
2299
+
2300
+ function getPersistentChatHistory(_x41) {
2301
+ return _getPersistentChatHistory.apply(this, arguments);
2302
+ }
2303
+
2304
+ return getPersistentChatHistory;
2305
+ }()
2151
2306
  /**
2152
2307
  * Email transcript to customer.
2153
2308
  * @param requestId RequestId of the omnichannel session.
@@ -2159,9 +2314,9 @@ var SDK = /*#__PURE__*/function () {
2159
2314
  }, {
2160
2315
  key: "emailTranscript",
2161
2316
  value: function () {
2162
- var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId, token, emailRequestBody) {
2163
- var _this$configuration$d15,
2164
- _this13 = this;
2317
+ var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, token, emailRequestBody) {
2318
+ var _this$configuration$d16,
2319
+ _this14 = this;
2165
2320
 
2166
2321
  var emailTranscriptOptionalParams,
2167
2322
  timer,
@@ -2172,12 +2327,12 @@ var SDK = /*#__PURE__*/function () {
2172
2327
  url,
2173
2328
  method,
2174
2329
  options,
2175
- _args27 = arguments;
2176
- return _regenerator["default"].wrap(function _callee27$(_context27) {
2330
+ _args29 = arguments;
2331
+ return _regenerator["default"].wrap(function _callee29$(_context29) {
2177
2332
  while (1) {
2178
- switch (_context27.prev = _context27.next) {
2333
+ switch (_context29.prev = _context29.next) {
2179
2334
  case 0:
2180
- emailTranscriptOptionalParams = _args27.length > 3 && _args27[3] !== undefined ? _args27[3] : {};
2335
+ emailTranscriptOptionalParams = _args29.length > 3 && _args29[3] !== undefined ? _args29[3] : {};
2181
2336
  timer = _Timer.Timer.TIMER();
2182
2337
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSTARTED, "Email Transcript Started", requestId);
2183
2338
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
@@ -2207,72 +2362,72 @@ var SDK = /*#__PURE__*/function () {
2207
2362
  headers: requestHeaders,
2208
2363
  method: method,
2209
2364
  url: url,
2210
- timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.emailTranscript
2365
+ timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.emailTranscript
2211
2366
  };
2212
- return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
2213
- var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
2214
- var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime15, _elapsedTimeInMilliseconds15;
2367
+ return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
2368
+ var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
2369
+ var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime16, _elapsedTimeInMilliseconds16;
2215
2370
 
2216
- return _regenerator["default"].wrap(function _callee26$(_context26) {
2371
+ return _regenerator["default"].wrap(function _callee28$(_context28) {
2217
2372
  while (1) {
2218
- switch (_context26.prev = _context26.next) {
2373
+ switch (_context28.prev = _context28.next) {
2219
2374
  case 0:
2220
2375
  backendTimer = _Timer.Timer.TIMER();
2221
- _context26.prev = 1;
2222
- _context26.next = 4;
2376
+ _context28.prev = 1;
2377
+ _context28.next = 4;
2223
2378
  return axiosInstance(options);
2224
2379
 
2225
2380
  case 4:
2226
- response = _context26.sent;
2381
+ response = _context28.sent;
2227
2382
  httpRequestResponseTime = backendTimer.milliSecondsElapsed;
2228
2383
  headers = response.headers;
2229
2384
 
2230
- _this13.setAuthCodeNonce(headers);
2385
+ _this14.setAuthCodeNonce(headers);
2231
2386
 
2232
2387
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2233
2388
 
2234
- _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2389
+ _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2235
2390
 
2236
2391
  resolve();
2237
- _context26.next = 20;
2392
+ _context28.next = 20;
2238
2393
  break;
2239
2394
 
2240
2395
  case 13:
2241
- _context26.prev = 13;
2242
- _context26.t0 = _context26["catch"](1);
2243
- _httpRequestResponseTime15 = backendTimer.milliSecondsElapsed;
2244
- _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2396
+ _context28.prev = 13;
2397
+ _context28.t0 = _context28["catch"](1);
2398
+ _httpRequestResponseTime16 = backendTimer.milliSecondsElapsed;
2399
+ _elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
2245
2400
 
2246
- _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context26.t0, undefined, requestHeaders, _httpRequestResponseTime15);
2401
+ _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context28.t0, undefined, requestHeaders, _httpRequestResponseTime16);
2247
2402
 
2248
- if ((0, _isExpectedAxiosError["default"])(_context26.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2249
- reject(new Error(_this13.HTTPTimeOutErrorMessage));
2403
+ if ((0, _isExpectedAxiosError["default"])(_context28.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2404
+ reject(new Error(_this14.HTTPTimeOutErrorMessage));
2250
2405
  }
2251
2406
 
2252
- reject(_context26.t0);
2407
+ reject(_context28.t0);
2253
2408
 
2254
2409
  case 20:
2255
2410
  case "end":
2256
- return _context26.stop();
2411
+ return _context28.stop();
2257
2412
  }
2258
2413
  }
2259
- }, _callee26, null, [[1, 13]]);
2414
+ }, _callee28, null, [[1, 13]]);
2260
2415
  }));
2261
2416
 
2262
- return function (_x44, _x45) {
2263
- return _ref12.apply(this, arguments);
2417
+ return function (_x47, _x48) {
2418
+ return _ref13.apply(this, arguments);
2264
2419
  };
2265
2420
  }()));
2266
2421
 
2267
2422
  case 17:
2268
2423
  case "end":
2269
- return _context27.stop();
2424
+ return _context29.stop();
2270
2425
  }
2271
2426
  }
2272
- }, _callee27, this);
2427
+ }, _callee29, this);
2273
2428
  }));
2274
2429
 
2275
- function emailTranscript(_x41, _x42, _x43) {
2430
+ function emailTranscript(_x44, _x45, _x46) {
2276
2431
  return _emailTranscript.apply(this, arguments);
2277
2432
  }
2278
2433
 
@@ -2286,14 +2441,14 @@ var SDK = /*#__PURE__*/function () {
2286
2441
  }, {
2287
2442
  key: "fetchDataMaskingInfo",
2288
2443
  value: function () {
2289
- var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId) {
2290
- var _this$configuration$d16,
2291
- _this14 = this;
2444
+ var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId) {
2445
+ var _this$configuration$d17,
2446
+ _this15 = this;
2292
2447
 
2293
2448
  var timer, requestPath, axiosInstance, requestHeaders, url, method, options;
2294
- return _regenerator["default"].wrap(function _callee29$(_context29) {
2449
+ return _regenerator["default"].wrap(function _callee31$(_context31) {
2295
2450
  while (1) {
2296
- switch (_context29.prev = _context29.next) {
2451
+ switch (_context31.prev = _context31.next) {
2297
2452
  case 0:
2298
2453
  timer = _Timer.Timer.TIMER();
2299
2454
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSTARTED, "Fetch Data Masking Started", requestId);
@@ -2318,69 +2473,69 @@ var SDK = /*#__PURE__*/function () {
2318
2473
  headers: requestHeaders,
2319
2474
  method: method,
2320
2475
  url: url,
2321
- timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
2476
+ timeout: (_this$configuration$d17 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d17 !== void 0 ? _this$configuration$d17 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
2322
2477
  };
2323
- return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
2324
- var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
2325
- var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime16, _elapsedTimeInMilliseconds16;
2478
+ return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
2479
+ var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
2480
+ var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime17, _elapsedTimeInMilliseconds17;
2326
2481
 
2327
- return _regenerator["default"].wrap(function _callee28$(_context28) {
2482
+ return _regenerator["default"].wrap(function _callee30$(_context30) {
2328
2483
  while (1) {
2329
- switch (_context28.prev = _context28.next) {
2484
+ switch (_context30.prev = _context30.next) {
2330
2485
  case 0:
2331
2486
  backendTimer = _Timer.Timer.TIMER();
2332
- _context28.prev = 1;
2333
- _context28.next = 4;
2487
+ _context30.prev = 1;
2488
+ _context30.next = 4;
2334
2489
  return axiosInstance(options);
2335
2490
 
2336
2491
  case 4:
2337
- response = _context28.sent;
2492
+ response = _context30.sent;
2338
2493
  httpRequestResponseTime = backendTimer.milliSecondsElapsed;
2339
2494
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2340
2495
  data = response.data;
2341
2496
 
2342
- _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2497
+ _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2343
2498
 
2344
2499
  resolve(data);
2345
- _context28.next = 19;
2500
+ _context30.next = 19;
2346
2501
  break;
2347
2502
 
2348
2503
  case 12:
2349
- _context28.prev = 12;
2350
- _context28.t0 = _context28["catch"](1);
2351
- _httpRequestResponseTime16 = backendTimer.milliSecondsElapsed;
2352
- _elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
2504
+ _context30.prev = 12;
2505
+ _context30.t0 = _context30["catch"](1);
2506
+ _httpRequestResponseTime17 = backendTimer.milliSecondsElapsed;
2507
+ _elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
2353
2508
 
2354
- _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context28.t0, undefined, requestHeaders, _httpRequestResponseTime16);
2509
+ _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context30.t0, undefined, requestHeaders, _httpRequestResponseTime17);
2355
2510
 
2356
- if ((0, _isExpectedAxiosError["default"])(_context28.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2357
- reject(new Error(_this14.HTTPTimeOutErrorMessage));
2511
+ if ((0, _isExpectedAxiosError["default"])(_context30.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2512
+ reject(new Error(_this15.HTTPTimeOutErrorMessage));
2358
2513
  }
2359
2514
 
2360
- reject(_context28.t0);
2515
+ reject(_context30.t0);
2361
2516
 
2362
2517
  case 19:
2363
2518
  case "end":
2364
- return _context28.stop();
2519
+ return _context30.stop();
2365
2520
  }
2366
2521
  }
2367
- }, _callee28, null, [[1, 12]]);
2522
+ }, _callee30, null, [[1, 12]]);
2368
2523
  }));
2369
2524
 
2370
- return function (_x47, _x48) {
2371
- return _ref13.apply(this, arguments);
2525
+ return function (_x50, _x51) {
2526
+ return _ref14.apply(this, arguments);
2372
2527
  };
2373
2528
  }()));
2374
2529
 
2375
2530
  case 14:
2376
2531
  case "end":
2377
- return _context29.stop();
2532
+ return _context31.stop();
2378
2533
  }
2379
2534
  }
2380
- }, _callee29, this);
2535
+ }, _callee31, this);
2381
2536
  }));
2382
2537
 
2383
- function fetchDataMaskingInfo(_x46) {
2538
+ function fetchDataMaskingInfo(_x49) {
2384
2539
  return _fetchDataMaskingInfo.apply(this, arguments);
2385
2540
  }
2386
2541
 
@@ -2396,9 +2551,9 @@ var SDK = /*#__PURE__*/function () {
2396
2551
  }, {
2397
2552
  key: "makeSecondaryChannelEventRequest",
2398
2553
  value: function () {
2399
- var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId, secondaryChannelEventRequestBody) {
2400
- var _this$configuration$d17,
2401
- _this15 = this;
2554
+ var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee33(requestId, secondaryChannelEventRequestBody) {
2555
+ var _this$configuration$d18,
2556
+ _this16 = this;
2402
2557
 
2403
2558
  var secondaryChannelEventOptionalParams,
2404
2559
  timer,
@@ -2409,12 +2564,12 @@ var SDK = /*#__PURE__*/function () {
2409
2564
  url,
2410
2565
  method,
2411
2566
  options,
2412
- _args31 = arguments;
2413
- return _regenerator["default"].wrap(function _callee31$(_context31) {
2567
+ _args33 = arguments;
2568
+ return _regenerator["default"].wrap(function _callee33$(_context33) {
2414
2569
  while (1) {
2415
- switch (_context31.prev = _context31.next) {
2570
+ switch (_context33.prev = _context33.next) {
2416
2571
  case 0:
2417
- secondaryChannelEventOptionalParams = _args31.length > 2 && _args31[2] !== undefined ? _args31[2] : {};
2572
+ secondaryChannelEventOptionalParams = _args33.length > 2 && _args33[2] !== undefined ? _args33[2] : {};
2418
2573
  timer = _Timer.Timer.TIMER();
2419
2574
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSTARTED, "Secondary Channel Event Request Started", requestId);
2420
2575
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
@@ -2443,72 +2598,72 @@ var SDK = /*#__PURE__*/function () {
2443
2598
  headers: requestHeaders,
2444
2599
  method: method,
2445
2600
  url: url,
2446
- timeout: (_this$configuration$d17 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d17 !== void 0 ? _this$configuration$d17 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
2601
+ timeout: (_this$configuration$d18 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d18 !== void 0 ? _this$configuration$d18 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
2447
2602
  };
2448
- return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
2449
- var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
2450
- var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime17, _elapsedTimeInMilliseconds17;
2603
+ return _context33.abrupt("return", new Promise( /*#__PURE__*/function () {
2604
+ var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee32(resolve, reject) {
2605
+ var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime18, _elapsedTimeInMilliseconds18;
2451
2606
 
2452
- return _regenerator["default"].wrap(function _callee30$(_context30) {
2607
+ return _regenerator["default"].wrap(function _callee32$(_context32) {
2453
2608
  while (1) {
2454
- switch (_context30.prev = _context30.next) {
2609
+ switch (_context32.prev = _context32.next) {
2455
2610
  case 0:
2456
2611
  backendTimer = _Timer.Timer.TIMER();
2457
- _context30.prev = 1;
2458
- _context30.next = 4;
2612
+ _context32.prev = 1;
2613
+ _context32.next = 4;
2459
2614
  return axiosInstance(options);
2460
2615
 
2461
2616
  case 4:
2462
- response = _context30.sent;
2617
+ response = _context32.sent;
2463
2618
  httpRequestResponseTime = backendTimer.milliSecondsElapsed;
2464
2619
  headers = response.headers;
2465
2620
 
2466
- _this15.setAuthCodeNonce(headers);
2621
+ _this16.setAuthCodeNonce(headers);
2467
2622
 
2468
2623
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2469
2624
 
2470
- _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2625
+ _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2471
2626
 
2472
2627
  resolve();
2473
- _context30.next = 20;
2628
+ _context32.next = 20;
2474
2629
  break;
2475
2630
 
2476
2631
  case 13:
2477
- _context30.prev = 13;
2478
- _context30.t0 = _context30["catch"](1);
2479
- _httpRequestResponseTime17 = backendTimer.milliSecondsElapsed;
2480
- _elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
2632
+ _context32.prev = 13;
2633
+ _context32.t0 = _context32["catch"](1);
2634
+ _httpRequestResponseTime18 = backendTimer.milliSecondsElapsed;
2635
+ _elapsedTimeInMilliseconds18 = timer.milliSecondsElapsed;
2481
2636
 
2482
- _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context30.t0, undefined, requestHeaders, _httpRequestResponseTime17);
2637
+ _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds18, requestPath, method, _context32.t0, undefined, requestHeaders, _httpRequestResponseTime18);
2483
2638
 
2484
- if ((0, _isExpectedAxiosError["default"])(_context30.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2485
- reject(new Error(_this15.HTTPTimeOutErrorMessage));
2639
+ if ((0, _isExpectedAxiosError["default"])(_context32.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2640
+ reject(new Error(_this16.HTTPTimeOutErrorMessage));
2486
2641
  }
2487
2642
 
2488
- reject(_context30.t0);
2643
+ reject(_context32.t0);
2489
2644
 
2490
2645
  case 20:
2491
2646
  case "end":
2492
- return _context30.stop();
2647
+ return _context32.stop();
2493
2648
  }
2494
2649
  }
2495
- }, _callee30, null, [[1, 13]]);
2650
+ }, _callee32, null, [[1, 13]]);
2496
2651
  }));
2497
2652
 
2498
- return function (_x51, _x52) {
2499
- return _ref14.apply(this, arguments);
2653
+ return function (_x54, _x55) {
2654
+ return _ref15.apply(this, arguments);
2500
2655
  };
2501
2656
  }()));
2502
2657
 
2503
2658
  case 16:
2504
2659
  case "end":
2505
- return _context31.stop();
2660
+ return _context33.stop();
2506
2661
  }
2507
2662
  }
2508
- }, _callee31, this);
2663
+ }, _callee33, this);
2509
2664
  }));
2510
2665
 
2511
- function makeSecondaryChannelEventRequest(_x49, _x50) {
2666
+ function makeSecondaryChannelEventRequest(_x52, _x53) {
2512
2667
  return _makeSecondaryChannelEventRequest.apply(this, arguments);
2513
2668
  }
2514
2669
 
@@ -2521,9 +2676,9 @@ var SDK = /*#__PURE__*/function () {
2521
2676
  }, {
2522
2677
  key: "sendTypingIndicator",
2523
2678
  value: function () {
2524
- var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee33(requestId, currentLiveChatVersion) {
2525
- var _this$configuration$d18,
2526
- _this16 = this;
2679
+ var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee35(requestId, currentLiveChatVersion) {
2680
+ var _this$configuration$d19,
2681
+ _this17 = this;
2527
2682
 
2528
2683
  var sendTypingIndicatorOptionalParams,
2529
2684
  timer,
@@ -2534,26 +2689,26 @@ var SDK = /*#__PURE__*/function () {
2534
2689
  url,
2535
2690
  method,
2536
2691
  options,
2537
- _args33 = arguments;
2538
- return _regenerator["default"].wrap(function _callee33$(_context33) {
2692
+ _args35 = arguments;
2693
+ return _regenerator["default"].wrap(function _callee35$(_context35) {
2539
2694
  while (1) {
2540
- switch (_context33.prev = _context33.next) {
2695
+ switch (_context35.prev = _context35.next) {
2541
2696
  case 0:
2542
- sendTypingIndicatorOptionalParams = _args33.length > 2 && _args33[2] !== undefined ? _args33[2] : {};
2697
+ sendTypingIndicatorOptionalParams = _args35.length > 2 && _args35[2] !== undefined ? _args35[2] : {};
2543
2698
 
2544
2699
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2545
- _context33.next = 3;
2700
+ _context35.next = 3;
2546
2701
  break;
2547
2702
  }
2548
2703
 
2549
- return _context33.abrupt("return", Promise.resolve());
2704
+ return _context35.abrupt("return", Promise.resolve());
2550
2705
 
2551
2706
  case 3:
2552
2707
  timer = _Timer.Timer.TIMER();
2553
2708
  customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
2554
2709
 
2555
2710
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2556
- _context33.next = 7;
2711
+ _context35.next = 7;
2557
2712
  break;
2558
2713
  }
2559
2714
 
@@ -2576,68 +2731,68 @@ var SDK = /*#__PURE__*/function () {
2576
2731
  headers: requestHeaders,
2577
2732
  method: method,
2578
2733
  url: url,
2579
- timeout: (_this$configuration$d18 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d18 !== void 0 ? _this$configuration$d18 : this.configuration.requestTimeoutConfig.sendTypingIndicator
2734
+ timeout: (_this$configuration$d19 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d19 !== void 0 ? _this$configuration$d19 : this.configuration.requestTimeoutConfig.sendTypingIndicator
2580
2735
  };
2581
- return _context33.abrupt("return", new Promise( /*#__PURE__*/function () {
2582
- var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee32(resolve, reject) {
2583
- var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _httpRequestResponseTime18, _elapsedTimeInMilliseconds18;
2736
+ return _context35.abrupt("return", new Promise( /*#__PURE__*/function () {
2737
+ var _ref16 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee34(resolve, reject) {
2738
+ var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _httpRequestResponseTime19, _elapsedTimeInMilliseconds19;
2584
2739
 
2585
- return _regenerator["default"].wrap(function _callee32$(_context32) {
2740
+ return _regenerator["default"].wrap(function _callee34$(_context34) {
2586
2741
  while (1) {
2587
- switch (_context32.prev = _context32.next) {
2742
+ switch (_context34.prev = _context34.next) {
2588
2743
  case 0:
2589
2744
  backendTimer = _Timer.Timer.TIMER();
2590
- _context32.prev = 1;
2591
- _context32.next = 4;
2745
+ _context34.prev = 1;
2746
+ _context34.next = 4;
2592
2747
  return axiosInstance(options);
2593
2748
 
2594
2749
  case 4:
2595
- response = _context32.sent;
2750
+ response = _context34.sent;
2596
2751
  httpRequestResponseTime = backendTimer.milliSecondsElapsed;
2597
2752
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2598
2753
 
2599
- _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2754
+ _this17.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
2600
2755
 
2601
2756
  resolve();
2602
- _context32.next = 18;
2757
+ _context34.next = 18;
2603
2758
  break;
2604
2759
 
2605
2760
  case 11:
2606
- _context32.prev = 11;
2607
- _context32.t0 = _context32["catch"](1);
2608
- _httpRequestResponseTime18 = backendTimer.milliSecondsElapsed;
2609
- _elapsedTimeInMilliseconds18 = timer.milliSecondsElapsed;
2761
+ _context34.prev = 11;
2762
+ _context34.t0 = _context34["catch"](1);
2763
+ _httpRequestResponseTime19 = backendTimer.milliSecondsElapsed;
2764
+ _elapsedTimeInMilliseconds19 = timer.milliSecondsElapsed;
2610
2765
 
2611
- _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds18, requestPath, method, _context32.t0, undefined, requestHeaders, _httpRequestResponseTime18);
2766
+ _this17.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds19, requestPath, method, _context34.t0, undefined, requestHeaders, _httpRequestResponseTime19);
2612
2767
 
2613
- if ((0, _isExpectedAxiosError["default"])(_context32.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2614
- reject(new Error(_this16.HTTPTimeOutErrorMessage));
2768
+ if ((0, _isExpectedAxiosError["default"])(_context34.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2769
+ reject(new Error(_this17.HTTPTimeOutErrorMessage));
2615
2770
  }
2616
2771
 
2617
- reject(_context32.t0);
2772
+ reject(_context34.t0);
2618
2773
 
2619
2774
  case 18:
2620
2775
  case "end":
2621
- return _context32.stop();
2776
+ return _context34.stop();
2622
2777
  }
2623
2778
  }
2624
- }, _callee32, null, [[1, 11]]);
2779
+ }, _callee34, null, [[1, 11]]);
2625
2780
  }));
2626
2781
 
2627
- return function (_x55, _x56) {
2628
- return _ref15.apply(this, arguments);
2782
+ return function (_x58, _x59) {
2783
+ return _ref16.apply(this, arguments);
2629
2784
  };
2630
2785
  }()));
2631
2786
 
2632
2787
  case 17:
2633
2788
  case "end":
2634
- return _context33.stop();
2789
+ return _context35.stop();
2635
2790
  }
2636
2791
  }
2637
- }, _callee33, this);
2792
+ }, _callee35, this);
2638
2793
  }));
2639
2794
 
2640
- function sendTypingIndicator(_x53, _x54) {
2795
+ function sendTypingIndicator(_x56, _x57) {
2641
2796
  return _sendTypingIndicator.apply(this, arguments);
2642
2797
  }
2643
2798
 
@@ -2733,6 +2888,7 @@ var SDK = /*#__PURE__*/function () {
2733
2888
  ResponseStatusCode: response ? response.status : error ? (_response = error.response) === null || _response === void 0 ? void 0 : _response.status : undefined,
2734
2889
  // eslint-disable-line @typescript-eslint/no-explicit-any
2735
2890
  ExceptionDetails: error ? ((_response2 = error.response) === null || _response2 === void 0 ? void 0 : _response2.data) || error : undefined,
2891
+ // eslint-disable-line @typescript-eslint/no-explicit-any
2736
2892
  RequestPayload: sanitizedRequestPayload,
2737
2893
  RequestHeaders: sanitizedRequestHeaders,
2738
2894
  ResponseErrorcode: error ? (_response3 = error.response) === null || _response3 === void 0 ? void 0 : (_response3$headers = _response3.headers) === null || _response3$headers === void 0 ? void 0 : _response3$headers.errorcode : undefined,
@@ -2771,7 +2927,8 @@ exports["default"] = SDK;
2771
2927
  makeSecondaryChannelEventRequest: 15000,
2772
2928
  getAgentAvailability: 15000,
2773
2929
  sendTypingIndicator: 5000,
2774
- validateAuthChatRecordTimeout: 15000
2930
+ validateAuthChatRecordTimeout: 15000,
2931
+ getPersistentChatHistory: 15000
2775
2932
  });
2776
2933
  (0, _defineProperty2["default"])(SDK, "defaultConfiguration", {
2777
2934
  authCodeNonce: (0, _uuid.uuidv4)().substring(0, 8),
@@ -2785,4 +2942,4 @@ exports["default"] = SDK;
2785
2942
  waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs,
2786
2943
  ocUserAgent: []
2787
2944
  });
2788
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiY29ycmVsYXRpb25JZCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImNoYW5uZWxJZCIsInZhbHVlcyIsIkNoYW5uZWxJZCIsImluY2x1ZGVzIiwiRXJyb3IiLCJjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIkNvbnN0YW50cyIsInJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVxdWVzdEhlYWRlcnMiLCJiYWNrZW5kVGltZXIiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJyZXNwb25zZSIsImh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJkYXRhIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsInVuZGVmaW5lZCIsIkVSUk9SIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsImJ5cGFzc0NhY2hlIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJhZGREZWZhdWx0SGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsIkdFVENIQVRDT05GSUdTVUNDRUVERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsImdldExXSURldGFpbHMiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwic2hvdWxkVXNlU2lnUXVlcnlQYXJhbSIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsInNpZyIsIm9wdGlvbnMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsIkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiR0VUQ0hBVFRPS0VOU1RBUlRFRCIsImVuZHBvaW50IiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVEIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwib3B0aW9uYWxQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiV0FSTiIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRCIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b1N0cmluZyIsIkhleCIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5IiwiZXJyb3IiLCJiYXNlUGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwic2V0UmVxdWVzdElkSGVhZGVyIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsIkNSRUFURVNFU1NJT05TVEFSVEVEIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxpdmVDaGF0Q29ubmVjdG9yUGF0aCIsIkNSRUFURVNFU1NJT05TVUNDRUVERUQiLCJDUkVBVEVTRVNTSU9ORkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJjb2RlIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyIsImF1dGhUb2tlbkRldGFpbHMiLCJzdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyIsImF0b2IiLCJwYXlsb2FkIiwic3BsaXQiLCJqc29uRGF0YSIsInBhcnNlIiwibHdpQ29udGV4dHMiLCJzdWIiLCJleHAiLCJsd2lDb250ZXh0c0RhdGEiLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIkh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiVHJhbnNhY3Rpb25JZCIsInRyYW5zYWN0aW9uaWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJFeGNlcHRpb25EZXRhaWxzIiwiUmVxdWVzdFBheWxvYWQiLCJSZXF1ZXN0SGVhZGVycyIsIlJlc3BvbnNlRXJyb3Jjb2RlIiwiZXJyb3Jjb2RlIiwiQXV0aFRva2VuRGV0YWlscyIsInNldFNlc3Npb25JZEhlYWRlciIsInNldENvcnJlbGF0aW9uSWRJbkhlYWRlciIsInN1YnN0cmluZyIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUF1Q25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQTs7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxnRkFIdEpDLGdCQUFTQywwQkFHNkksZUFIOUdELGdCQUFTRSw2QkFHcUc7QUFBQSwrREEyNkN4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNQLGFBQUwsQ0FBbUJRLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENBQUVDLGFBQTVDO0FBQ0Q7QUFDRixLQS82Q2tMO0FBQUEsaUVBdzdDdEosVUFBQ0UsU0FBRCxFQUFnQ0gsT0FBaEMsRUFBaUQ7QUFDNUUsVUFBSUcsU0FBSixFQUFlO0FBQ2JILFFBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCQyxXQUF4QixDQUFQLEdBQThDRixTQUE5QztBQUNEO0FBQ0YsS0E1N0NrTDtBQUFBLGlFQTg3Q3RKLFVBQUNHLFNBQUQsRUFBZ0NOLE9BQWhDLEVBQXVEO0FBQ2xG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IExpdmVDaGF0VmVyc2lvbiwgT0NTREtUZWxlbWV0cnlFdmVudCwgU0RLRXJyb3IgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCBheGlvc1JldHJ5SGFuZGxlciwgeyBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCB9IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlIYW5kbGVyXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBIZXggZnJvbSBcImNyeXB0by1qcy9lbmMtaGV4XCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgU0hBMjU2IGZyb20gXCJjcnlwdG8tanMvc2hhMjU2XCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCB7IGFkZE9jVXNlckFnZW50SGVhZGVyIH0gZnJvbSBcIi4vVXRpbHMvaHR0cEhlYWRlcnNVdGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMTIwMDAwLFxuICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDE1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiAxNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcbiAgSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UgPSBgJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZX06ICR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2V9YDtcblxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub2NVc2VyQWdlbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ub2NVc2VyQWdlbnQ7XG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMQ1cgRkNTIERldGFpbHMgb2YgdGhlIE9yZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMY3dGY3NEZXRhaWxzKCk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN0YXJ0ZWRcIiwgXCJcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MY3dGY3NEZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTRkFJTEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgZmFpbGVkXCIsIFwiXCIsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICByZXF1ZXN0SGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldExXSURldGFpbHMsXG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBtdWx0aUJvdCA9IChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKT8gdHJ1ZTogZmFsc2U7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSwgbXVsdGlCb3QpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBcbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuICAgIGlmIChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXNbJ01zLU9jLUJvdC1BcHBsaWNhdGlvbi1JZCddID0gTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgcGFyYW1zLnJlZnJlc2hUb2tlbiA9ICd0cnVlJ1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiAoY3VycmVudFJldHJ5Q291bnQgPiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUpID8gY3VycmVudFJldHJ5Q291bnQgOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgY29uc3QgcmVxdWVzdElkID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zPy5yZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgLy9kYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcbiAgICBkYXRhLmNhY2hlS2V5ID0gU0hBMjU2KEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS50b1N0cmluZyhIZXgpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKidcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBjb25zdCByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcihlcnJvciwgcmV0cnlPbjQyOSksXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgPyBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGg7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkICYmIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDb252ZXJzYXRpb24ocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNUQVJURUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgY29uc3QgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIoZXJyb3IsIHJldHJ5T240MjkpLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cbiAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvclBhdGg7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0QXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L2NvbnZlcnNhdGlvbmA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBkYXRhLnJlY29ubmVjdElkID0gcmVjb25uZWN0SWQ7XG4gICAgfVxuXG4gICAgZGF0YS5jaGFubmVsSWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQ7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBjaGVjayBpZiBkYXRhIGlzIGVtcHR5LCBpZiBzbywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVUNDRUVERUQsIFwiQ3JlYXRlIGNvdmVyc2F0aW9uIGNhbGwgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9ORkFJTEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgXG4gICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55LCByZXF1ZXN0SGVhZGVycz86IGFueSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU/OiBudW1iZXIpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgIGxldCBhdXRoVG9rZW5EZXRhaWxzOiBhbnkgPSB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB7IC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdEhlYWRlcnNTZW5zaXRpdmVQcm9wZXJ0aWVzKHNhbml0aXplZFJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0pIHtcbiAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuYXRvYikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl07XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5hdG9iKHBheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHMgPSBqc29uRGF0YVtcImx3aWNvbnRleHRzXCJdO1xuICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgc3ViOiBqc29uRGF0YVtcInN1YlwiXSxcbiAgICAgICAgICAgICAgZXhwOiBqc29uRGF0YVtcImV4cFwiXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGx3aUNvbnRleHRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGx3aUNvbnRleHRzRGF0YSA9IEpTT04ucGFyc2UobHdpQ29udGV4dHMpO1xuICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMobHdpQ29udGV4dHNEYXRhKTtcbiAgICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscy5sd2lDb250ZXh0cyA9IGx3aUNvbnRleHRzRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBIdHRwUmVxdWVzdFJlc3BvbnNlVGltZTogaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmRhdGEgfHwgZXJyb3IgOiB1bmRlZmluZWQsIFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgUmVzcG9uc2VFcnJvcmNvZGU6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmhlYWRlcnM/LmVycm9yY29kZSA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBBdXRoVG9rZW5EZXRhaWxzOiBhdXRoVG9rZW5EZXRhaWxzXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCk6IHZvaWQge1xuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0Q29ycmVsYXRpb25JZEluSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRTZXNzaW9uSWRIZWFkZXIgPSAoc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZXF1ZXN0SWRIZWFkZXIgPSAocmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IFN0cmluZ01hcCkgPT4ge1xuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29ycmVsYXRpb25JZEluSGVhZGVyID0gKGNvcnJlbGF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogU3RyaW5nTWFwKSA9PiB7XG4gICAgaWYgKGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5jb3JyZWxhdGlvbklkXSA9IGNvcnJlbGF0aW9uSWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
2945
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiU0RLRXJyb3IiLCJDbGllbnRIVFRQVGltZW91dEVycm9yTmFtZSIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwicmVxdWVzdElkIiwiY29ycmVsYXRpb25JZCIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImNoYW5uZWxJZCIsInZhbHVlcyIsIkNoYW5uZWxJZCIsImluY2x1ZGVzIiwiRXJyb3IiLCJjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIkNvbnN0YW50cyIsInJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVxdWVzdEhlYWRlcnMiLCJiYWNrZW5kVGltZXIiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJyZXNwb25zZSIsImh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJkYXRhIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsInVuZGVmaW5lZCIsIkVSUk9SIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsImJ5cGFzc0NhY2hlIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJhZGREZWZhdWx0SGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsIkdFVENIQVRDT05GSUdTVUNDRUVERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsImdldExXSURldGFpbHMiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwic2hvdWxkVXNlU2lnUXVlcnlQYXJhbSIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsInNpZyIsIm9wdGlvbnMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsIkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiR0VUQ0hBVFRPS0VOU1RBUlRFRCIsImVuZHBvaW50IiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVEIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwib3B0aW9uYWxQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiV0FSTiIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWUZBSUxFRCIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0b1N0cmluZyIsIkhleCIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5IiwiZXJyb3IiLCJiYXNlUGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwic2V0UmVxdWVzdElkSGVhZGVyIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsIkNSRUFURVNFU1NJT05TVEFSVEVEIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxpdmVDaGF0Q29ubmVjdG9yUGF0aCIsIkNSRUFURVNFU1NJT05TVUNDRUVERUQiLCJDUkVBVEVTRVNTSU9ORkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJjb2RlIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcyIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQiLCJwYWdlU2l6ZSIsInBhZ2VUb2tlbiIsImVycm9yTWVzc2FnZSIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCIsIkxpdmVDaGF0QXV0aEdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVBhdGgiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkiLCJHRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllTVUNDRUVERUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyIsImF1dGhUb2tlbkRldGFpbHMiLCJzdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyIsImF0b2IiLCJwYXlsb2FkIiwic3BsaXQiLCJqc29uRGF0YSIsInBhcnNlIiwibHdpQ29udGV4dHMiLCJzdWIiLCJleHAiLCJsd2lDb250ZXh0c0RhdGEiLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIkh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiVHJhbnNhY3Rpb25JZCIsInRyYW5zYWN0aW9uaWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJFeGNlcHRpb25EZXRhaWxzIiwiUmVxdWVzdFBheWxvYWQiLCJSZXF1ZXN0SGVhZGVycyIsIlJlc3BvbnNlRXJyb3Jjb2RlIiwiZXJyb3Jjb2RlIiwiQXV0aFRva2VuRGV0YWlscyIsInNldFNlc3Npb25JZEhlYWRlciIsInNldENvcnJlbGF0aW9uSWRJbkhlYWRlciIsInN1YnN0cmluZyIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFxQkE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBTUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7SUFFcUJBLEc7QUF3Q25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQTs7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTtBQUFBO0FBQUE7QUFBQSxnRkFIdEpDLGdCQUFTQywwQkFHNkksZUFIOUdELGdCQUFTRSw2QkFHcUc7QUFBQSwrREE2L0N4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNQLGFBQUwsQ0FBbUJRLGFBQW5CLEdBQW1D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RWlGLEVBQUFBLHNCQUFzQixFQUFFLEtBUnlDO0FBU2pFVyxFQUFBQSxtQkFBbUIsRUFBRSxLQVQ0QztBQVVqRVMsRUFBQUEsa0JBQWtCLEVBQUUsS0FWNkM7QUFXakVxQixFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVNLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFTyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRWhJLEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFd0ksRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFdEUsRUFBQUEsNkJBQTZCLEVBQUUsS0FoQmtDO0FBaUJqRTJDLEVBQUFBLHdCQUF3QixFQUFFO0FBakJ1QyxDO2lDQURoRGxQLEcsMEJBcUJzQztBQUN2RFUsRUFBQUEsYUFBYSxFQUFFLG9CQUFTK1MsU0FBVCxDQUFtQixDQUFuQixFQUFzQixDQUF0QixDQUR3QztBQUV2REMsRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRDLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkQ1TSxFQUFBQSxzQkFBc0IsRUFBRSxJQUorQjtBQUt2RDNELEVBQUFBLDBCQUEwQixFQUFFLENBTDJCO0FBTXZEUSxFQUFBQSxxQkFBcUIsRUFBRVEsU0FOZ0M7QUFPdkRQLEVBQUFBLG9CQUFvQixFQUFFN0QsR0FBRyxDQUFDNFQsMkJBUDZCO0FBUXZEak8sRUFBQUEsaUNBQWlDLEVBQUUsS0FSb0I7QUFTdkRyQyxFQUFBQSw0QkFBNEIsRUFBRXVRLDREQVR5QjtBQVV2RGhTLEVBQUFBLFdBQVcsRUFBRTtBQVYwQyxDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50LCBTREtFcnJvciB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IGF4aW9zUmV0cnlIYW5kbGVyLCB7IGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kIH0gZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeUhhbmRsZXJcIjtcblxuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IEhleCBmcm9tIFwiY3J5cHRvLWpzL2VuYy1oZXhcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0QXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0QXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyIGZyb20gXCIuL0ludGVyZmFjZXMvT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlclwiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCBTSEEyNTYgZnJvbSBcImNyeXB0by1qcy9zaGEyNTZcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IHsgYWRkT2NVc2VyQWdlbnRIZWFkZXIgfSBmcm9tIFwiLi9VdGlscy9odHRwSGVhZGVyc1V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgaXNFeHBlY3RlZEF4aW9zRXJyb3IgZnJvbSBcIi4vVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3JcIjtcbmltcG9ydCBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciBmcm9tIFwiLi9VdGlscy9TZXNzaW9uSW5pdFJldHJ5SGFuZGxlclwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0IHsgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MgfSBmcm9tIFwiLi9VdGlscy93YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnOiBSZXF1ZXN0VGltZW91dENvbmZpZyA9IHtcbiAgICBnZXRDaGF0Q29uZmlnOiAxMjAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMCxcbiAgICBnZXRQZXJzaXN0ZW50Q2hhdEhpc3Rvcnk6IDE1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGF1dGhDb2RlTm9uY2U6IHV1aWR2NCgpLnN1YnN0cmluZygwLCA4KSxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeUNvdW50OiAxMCxcbiAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IHRydWUsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDUsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWcsXG4gICAgdXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtOiBmYWxzZSxcbiAgICB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnOiB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyxcbiAgICBvY1VzZXJBZ2VudDogW11cbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICBvY1VzZXJBZ2VudDogc3RyaW5nW107XG4gIEhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlID0gYCR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck5hbWV9OiAke1NES0Vycm9yLkNsaWVudEhUVFBUaW1lb3V0RXJyb3JNZXNzYWdlfWA7XG5cblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9jVXNlckFnZW50ID0gdGhpcy5jb25maWd1cmF0aW9uLm9jVXNlckFnZW50O1xuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYyO1xuICB9XG5cblxuICAvKipcbiAgICogRmV0Y2hlcyBMQ1cgRkNTIERldGFpbHMgb2YgdGhlIE9yZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMY3dGY3NEZXRhaWxzKCk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTU1RBUlRFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN0YXJ0ZWRcIiwgXCJcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MY3dGY3NEZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0ge307XG4gICAgYWRkT2NVc2VyQWdlbnRIZWFkZXIodGhpcy5vY1VzZXJBZ2VudCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICAgIH0pO1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMQ1dGQ1NERVRBSUxTRkFJTEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgZmFpbGVkXCIsIFwiXCIsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgfSk7XG5cbiAgICBsZXQgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICByZXF1ZXN0SGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgIH1cblxuICAgICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgICB9XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldExXSURldGFpbHMsXG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4sIE1zT2NCb3RBcHBsaWNhdGlvbklkIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBtdWx0aUJvdCA9IChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKT8gdHJ1ZTogZmFsc2U7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSwgbXVsdGlCb3QpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBcbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuICAgIGlmIChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXNbJ01zLU9jLUJvdC1BcHBsaWNhdGlvbi1JZCddID0gTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgcGFyYW1zLnJlZnJlc2hUb2tlbiA9ICd0cnVlJ1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiAoY3VycmVudFJldHJ5Q291bnQgPiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUpID8gY3VycmVudFJldHJ5Q291bnQgOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG4gICAgY29uc3QgcmVxdWVzdElkID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zPy5yZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgb3B0aW9uYWxQYXJhbXM/LnJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgLy9kYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcbiAgICBkYXRhLmNhY2hlS2V5ID0gU0hBMjU2KEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS50b1N0cmluZyhIZXgpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKidcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBjb25zdCByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcihlcnJvciwgcmV0cnlPbjQyOSksXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgPyBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGg7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG5cbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkICYmIHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVDb252ZXJzYXRpb24ocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNUQVJURUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgY29uc3QgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIoZXJyb3IsIHJldHJ5T240MjkpLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cbiAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvclBhdGg7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0QXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L2NvbnZlcnNhdGlvbmA7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikgeyAgICAgXG4gICAgICBPYmplY3QuYXNzaWduKHJlcXVlc3RIZWFkZXJzLCB7XG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dOiBhdXRoZW50aWNhdGVkVXNlclRva2VuLFxuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXTogdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIHRoaXMuc2V0UmVxdWVzdElkSGVhZGVyKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBkYXRhLnJlY29ubmVjdElkID0gcmVjb25uZWN0SWQ7XG4gICAgfVxuXG4gICAgZGF0YS5jaGFubmVsSWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWQ7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBjaGVjayBpZiBkYXRhIGlzIGVtcHR5LCBpZiBzbywgdGhlbiB0aHJvdyBhbiBlcnJvclxuICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVUNDRUVERUQsIFwiQ3JlYXRlIGNvdmVyc2F0aW9uIGNhbGwgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9ORkFJTEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgXG4gICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcblxuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcnNpc3RlbnQgY2hhdCBoaXN0b3J5IGZvciBhdXRoZW50aWNhdGVkIHVzZXJzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IHBlcnNpc3RlbnQgY2hhdCBoaXN0b3J5LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeShyZXF1ZXN0SWQ/OiBzdHJpbmcsIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zOiBJR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBwYWdlU2l6ZSwgcGFnZVRva2VuIH0gPSBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlPcHRpb25hbFBhcmFtcztcblxuICAgIGlmICghYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gXCJBdXRoZW50aWNhdGVkIHVzZXIgdG9rZW4gaXMgcmVxdWlyZWQgZm9yIHBlcnNpc3RlbnQgY2hhdCBoaXN0b3J5XCI7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZRkFJTEVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBmYWlsZWQgLSBNaXNzaW5nIGF1dGhlbnRpY2F0ZWQgdXNlciB0b2tlblwiLCByZXF1ZXN0SWQpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS93aWRnZXRhcHAvJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vY29udmVyc2F0aW9uL2hpc3RvcnlgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuXG4gICAgaWYgKHBhZ2VUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5wYWdlVG9rZW5dID0gcGFnZVRva2VuO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7fTtcbiAgICBcbiAgICBpZiAocGFnZVNpemUpIHtcbiAgICAgIHBhcmFtcy5wYWdlU2l6ZSA9IHBhZ2VTaXplLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNVQ0NFRURFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3Rvcnkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllGQUlMRUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELCBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgcmVxdWVzdFBhdGggKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gbG9nTGV2ZWwgTG9nIGxldmVsIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gdGVsZW1ldHJ5RXZlbnRUeXBlIFRlbGVtZXRyeSBldmVudCB0eXBlIGluIHdoaWNoIGV2ZW50IHdpbGwgYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlXG4gICAqIEBwYXJhbSBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIEVsYXBzZWQgdGltZSBpbiBtc1xuICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggUmVxdWVzdCBwYXRoXG4gICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhXG4gICAqL1xuICBwcml2YXRlIGxvZ1dpdGhMb2dnZXIobG9nTGV2ZWw6IExvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGU6IE9DU0RLVGVsZW1ldHJ5RXZlbnQsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZywgcmVzcG9uc2U/OiBBeGlvc1Jlc3BvbnNlPGFueT4sIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM/OiBudW1iZXIsIHJlcXVlc3RQYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgcmVxdWVzdFBheWxvYWQ/OiBhbnksIHJlcXVlc3RIZWFkZXJzPzogYW55LCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZT86IG51bWJlcik6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGF1dGhUb2tlbkRldGFpbHM6IGFueSA9IHVuZGVmaW5lZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKHJlcXVlc3RIZWFkZXJzKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyA9IHsgLi4ucmVxdWVzdEhlYWRlcnMgfTtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMoc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgICBpZiAocmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSkge1xuICAgICAgICBpZiAod2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5hdG9iKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTtcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB0b2tlbi5zcGxpdChcIi5cIilbMV07XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gd2luZG93LmF0b2IocGF5bG9hZCk7XG4gICAgICAgICAgICBjb25zdCBqc29uRGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgICBjb25zdCBsd2lDb250ZXh0cyA9IGpzb25EYXRhW1wibHdpY29udGV4dHNcIl07XG4gICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzID0ge1xuICAgICAgICAgICAgICBzdWI6IGpzb25EYXRhW1wic3ViXCJdLFxuICAgICAgICAgICAgICBleHA6IGpzb25EYXRhW1wiZXhwXCJdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAobHdpQ29udGV4dHMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHNEYXRhID0gSlNPTi5wYXJzZShsd2lDb250ZXh0cyk7XG4gICAgICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhsd2lDb250ZXh0c0RhdGEpO1xuICAgICAgICAgICAgICBhdXRoVG9rZW5EZXRhaWxzLmx3aUNvbnRleHRzID0gbHdpQ29udGV4dHNEYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lbXB0eVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIEh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lOiBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgXG4gICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5kYXRhIHx8IGVycm9yIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIFJlcXVlc3RQYXlsb2FkOiBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCxcbiAgICAgIFJlcXVlc3RIZWFkZXJzOiBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyxcbiAgICAgIFJlc3BvbnNlRXJyb3Jjb2RlOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5oZWFkZXJzPy5lcnJvcmNvZGUgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgQXV0aFRva2VuRGV0YWlsczogYXV0aFRva2VuRGV0YWlsc1xuICAgIH07XG4gICAgdGhpcy5sb2dnZXIubG9nKGxvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGUsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0QXV0aENvZGVOb25jZSA9IChoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoaGVhZGVycz8uYXV0aGNvZGVub25jZSkge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UgPSBoZWFkZXJzPy5hdXRoY29kZW5vbmNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXApOiB2b2lkIHtcbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldENvcnJlbGF0aW9uSWRJbkhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0U2Vzc2lvbklkSGVhZGVyID0gKHNlc3Npb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWRdID0gc2Vzc2lvbklkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVxdWVzdElkSGVhZGVyID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBTdHJpbmdNYXApID0+IHtcbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENvcnJlbGF0aW9uSWRJbkhlYWRlciA9IChjb3JyZWxhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IFN0cmluZ01hcCkgPT4ge1xuICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuY29ycmVsYXRpb25JZF0gPSBjb3JyZWxhdGlvbklkO1xuICAgIH1cbiAgfVxufVxuIl19