@microsoft/ocsdk 0.3.3 → 0.3.4-main.2ef485a

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
@@ -29,6 +29,8 @@ var _BrowserInfo = require("./Utils/BrowserInfo");
29
29
 
30
30
  var _Constants = _interopRequireDefault(require("./Common/Constants"));
31
31
 
32
+ var _endpointsCreators = require("./Utils/endpointsCreators");
33
+
32
34
  var _DeviceInfo = require("./Utils/DeviceInfo");
33
35
 
34
36
  var _Locales = _interopRequireDefault(require("./Common/Locales"));
@@ -55,6 +57,8 @@ var _CustomContextData = require("./Utils/CustomContextData");
55
57
 
56
58
  var _throwClientHTTPError = _interopRequireDefault(require("./Utils/throwClientHTTPError"));
57
59
 
60
+ var _SessionInitRetryHandler = _interopRequireDefault(require("./Utils/SessionInitRetryHandler"));
61
+
58
62
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
59
63
 
60
64
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -71,6 +75,8 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
71
75
 
72
76
  var SDK = /*#__PURE__*/function () {
73
77
  function SDK(omnichannelConfiguration) {
78
+ var _this = this;
79
+
74
80
  var configuration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SDK.defaultConfiguration;
75
81
  var logger = arguments.length > 2 ? arguments[2] : undefined;
76
82
  (0, _classCallCheck2["default"])(this, SDK);
@@ -78,6 +84,11 @@ var SDK = /*#__PURE__*/function () {
78
84
  this.configuration = configuration;
79
85
  this.logger = logger;
80
86
  (0, _defineProperty2["default"])(this, "liveChatVersion", void 0);
87
+ (0, _defineProperty2["default"])(this, "setAuthCodeNonce", function (headers) {
88
+ if (headers !== null && headers !== void 0 && headers.authcodenonce) {
89
+ _this.configuration.authCodeNonce = headers === null || headers === void 0 ? void 0 : headers.authcodenonce;
90
+ }
91
+ });
81
92
 
82
93
  // Sets to default configuration if passed configuration is empty or is not an object
83
94
  if (!Object.keys(this.configuration).length || (0, _typeof2["default"])(configuration) !== "object") {
@@ -131,7 +142,7 @@ var SDK = /*#__PURE__*/function () {
131
142
  _iterator.f();
132
143
  }
133
144
 
134
- this.liveChatVersion = _Enums.LiveChatVersion.V1;
145
+ this.liveChatVersion = _Enums.LiveChatVersion.V2;
135
146
  }
136
147
  /**
137
148
  * Fetches chat config.
@@ -192,7 +203,7 @@ var SDK = /*#__PURE__*/function () {
192
203
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
193
204
  data = response.data;
194
205
 
195
- if (data.LiveChatVersion && data.LiveChatVersion === _Enums.LiveChatVersion.V2) {
206
+ if (data.LiveChatVersion) {
196
207
  this.liveChatVersion = data.LiveChatVersion;
197
208
  }
198
209
 
@@ -230,7 +241,7 @@ var SDK = /*#__PURE__*/function () {
230
241
  value: function () {
231
242
  var _getLWIDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(requestId) {
232
243
  var _this$configuration$d2,
233
- _this = this;
244
+ _this2 = this;
234
245
 
235
246
  var getLWIDetailsOptionalParams,
236
247
  timer,
@@ -259,6 +270,7 @@ var SDK = /*#__PURE__*/function () {
259
270
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
260
271
  axiosInstance = _axios["default"].create();
261
272
  (0, _axiosRetry["default"])(axiosInstance, {
273
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
262
274
  retries: this.configuration.maxRequestRetriesOnFailure
263
275
  }); // Extract auth token and reconnect id from optional param
264
276
 
@@ -268,6 +280,7 @@ var SDK = /*#__PURE__*/function () {
268
280
  if (authenticatedUserToken) {
269
281
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
270
282
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
283
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
271
284
  } // Append reconnect id on the endpoint if vailable
272
285
 
273
286
 
@@ -286,7 +299,7 @@ var SDK = /*#__PURE__*/function () {
286
299
  };
287
300
  return _context3.abrupt("return", new Promise( /*#__PURE__*/function () {
288
301
  var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(resolve, reject) {
289
- var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
302
+ var response, elapsedTimeInMilliseconds, data, _headers, _elapsedTimeInMilliseconds;
290
303
 
291
304
  return _regenerator["default"].wrap(function _callee2$(_context2) {
292
305
  while (1) {
@@ -299,33 +312,35 @@ var SDK = /*#__PURE__*/function () {
299
312
  case 3:
300
313
  response = _context2.sent;
301
314
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
302
- data = response.data;
315
+ data = response.data, _headers = response.headers;
303
316
 
304
- _this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
317
+ _this2.setAuthCodeNonce(_headers);
318
+
319
+ _this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
305
320
 
306
321
  resolve(data);
307
- _context2.next = 16;
322
+ _context2.next = 17;
308
323
  break;
309
324
 
310
- case 10:
311
- _context2.prev = 10;
325
+ case 11:
326
+ _context2.prev = 11;
312
327
  _context2.t0 = _context2["catch"](0);
313
328
  _elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
314
329
 
315
- _this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds, requestPath, method, _context2.t0);
330
+ _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds, requestPath, method, _context2.t0);
316
331
 
317
332
  if (_context2.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
318
333
  (0, _throwClientHTTPError["default"])();
319
334
  }
320
335
 
321
- reject();
336
+ reject(_context2.t0);
322
337
 
323
- case 16:
338
+ case 17:
324
339
  case "end":
325
340
  return _context2.stop();
326
341
  }
327
342
  }
328
- }, _callee2, null, [[0, 10]]);
343
+ }, _callee2, null, [[0, 11]]);
329
344
  }));
330
345
 
331
346
  return function (_x3, _x4) {
@@ -358,7 +373,7 @@ var SDK = /*#__PURE__*/function () {
358
373
  value: function () {
359
374
  var _getChatToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(requestId) {
360
375
  var _this$configuration$d3,
361
- _this2 = this;
376
+ _this3 = this;
362
377
 
363
378
  var getChatTokenOptionalParams,
364
379
  currentRetryCount,
@@ -367,6 +382,7 @@ var SDK = /*#__PURE__*/function () {
367
382
  authenticatedUserToken,
368
383
  currentLiveChatVersion,
369
384
  headers,
385
+ endpoint,
370
386
  requestPath,
371
387
  queryParams,
372
388
  url,
@@ -398,22 +414,15 @@ var SDK = /*#__PURE__*/function () {
398
414
  }
399
415
 
400
416
  headers = _Constants["default"].defaultHeaders;
401
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
417
+ endpoint = (0, _endpointsCreators.createGetChatTokenEndpoint)(currentLiveChatVersion || this.liveChatVersion, authenticatedUserToken ? true : false);
402
418
 
403
- if (this.liveChatVersion === _Enums.LiveChatVersion.V2 || currentLiveChatVersion && currentLiveChatVersion === _Enums.LiveChatVersion.V2) {
404
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
405
-
406
- if (authenticatedUserToken) {
407
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
408
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
409
- }
410
- } else {
411
- if (authenticatedUserToken) {
412
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
413
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
414
- }
419
+ if (authenticatedUserToken) {
420
+ headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
421
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
415
422
  }
416
423
 
424
+ requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
425
+
417
426
  if (reconnectId) {
418
427
  requestPath += "/".concat(reconnectId);
419
428
  }
@@ -430,12 +439,13 @@ var SDK = /*#__PURE__*/function () {
430
439
  };
431
440
  axiosInstance = _axios["default"].create();
432
441
  (0, _axiosRetry["default"])(axiosInstance, {
442
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
433
443
  retries: this.configuration.maxRequestRetriesOnFailure,
434
444
  retryOn429: this.configuration.getChatTokenRetryOn429
435
445
  });
436
446
  return _context5.abrupt("return", new Promise( /*#__PURE__*/function () {
437
447
  var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(resolve, reject) {
438
- var getChatTokenError, response, elapsedTimeInMilliseconds, data, _response, _elapsedTimeInMilliseconds2;
448
+ var getChatTokenError, response, elapsedTimeInMilliseconds, data, _headers2, _response, _elapsedTimeInMilliseconds2;
439
449
 
440
450
  return _regenerator["default"].wrap(function _callee4$(_context4) {
441
451
  while (1) {
@@ -449,44 +459,47 @@ var SDK = /*#__PURE__*/function () {
449
459
  case 4:
450
460
  response = _context4.sent;
451
461
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
452
- data = response.data; // Resolves only if it contains chat token response which only happens on status 200
462
+ data = response.data, _headers2 = response.headers;
463
+
464
+ _this3.setAuthCodeNonce(_headers2); // Resolves only if it contains chat token response which only happens on status 200
465
+
453
466
 
454
467
  if (!data) {
455
- _context4.next = 12;
468
+ _context4.next = 13;
456
469
  break;
457
470
  }
458
471
 
459
472
  data.requestId = requestId;
460
473
 
461
- _this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
474
+ _this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
462
475
 
463
476
  resolve(data);
464
477
  return _context4.abrupt("return");
465
478
 
466
- case 12:
479
+ case 13:
467
480
  if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
468
- _context4.next = 15;
481
+ _context4.next = 16;
469
482
  break;
470
483
  }
471
484
 
472
485
  reject(response);
473
486
  return _context4.abrupt("return");
474
487
 
475
- case 15:
476
- _context4.next = 25;
488
+ case 16:
489
+ _context4.next = 26;
477
490
  break;
478
491
 
479
- case 17:
480
- _context4.prev = 17;
492
+ case 18:
493
+ _context4.prev = 18;
481
494
  _context4.t0 = _context4["catch"](1);
482
495
  _elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
483
496
 
484
- _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context4.t0);
497
+ _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context4.t0);
485
498
 
486
499
  getChatTokenError = _context4.t0; // Stop retry on 429
487
500
 
488
- if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this2.configuration.getChatTokenRetryOn429)) {
489
- _context4.next = 25;
501
+ if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this3.configuration.getChatTokenRetryOn429)) {
502
+ _context4.next = 26;
490
503
  break;
491
504
  }
492
505
 
@@ -494,36 +507,36 @@ var SDK = /*#__PURE__*/function () {
494
507
  reject(_context4.t0);
495
508
  return _context4.abrupt("return");
496
509
 
497
- case 25:
498
- if (!(currentRetryCount + 1 >= _this2.configuration.getChatTokenRetryCount)) {
499
- _context4.next = 28;
510
+ case 26:
511
+ if (!(currentRetryCount + 1 >= _this3.configuration.getChatTokenRetryCount)) {
512
+ _context4.next = 29;
500
513
  break;
501
514
  }
502
515
 
503
516
  if (getChatTokenError && getChatTokenError.code == _Constants["default"].axiosTimeoutErrorCode) {
504
517
  (0, _throwClientHTTPError["default"])();
505
518
  } else {
506
- reject(new Error("The retry for getchattoken has exceeded its max value of ".concat(_this2.configuration.getChatTokenRetryCount)));
519
+ reject(getChatTokenError);
507
520
  }
508
521
 
509
522
  return _context4.abrupt("return");
510
523
 
511
- case 28:
524
+ case 29:
512
525
  // Retries until it reaches its limit
513
526
  setTimeout(function () {
514
- _this2.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
527
+ _this3.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
515
528
  return resolve(response);
516
529
  })["catch"](function (error) {
517
530
  return reject(error);
518
531
  });
519
- }, _this2.configuration.getChatTokenTimeBetweenRetriesOnFailure);
532
+ }, _this3.configuration.getChatTokenTimeBetweenRetriesOnFailure);
520
533
 
521
- case 29:
534
+ case 30:
522
535
  case "end":
523
536
  return _context4.stop();
524
537
  }
525
538
  }
526
- }, _callee4, null, [[1, 17]]);
539
+ }, _callee4, null, [[1, 18]]);
527
540
  }));
528
541
 
529
542
  return function (_x6, _x7) {
@@ -531,7 +544,7 @@ var SDK = /*#__PURE__*/function () {
531
544
  };
532
545
  }()));
533
546
 
534
- case 20:
547
+ case 21:
535
548
  case "end":
536
549
  return _context5.stop();
537
550
  }
@@ -555,7 +568,7 @@ var SDK = /*#__PURE__*/function () {
555
568
  value: function () {
556
569
  var _getReconnectableChats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(reconnectableChatsParams) {
557
570
  var _this$configuration$d4,
558
- _this3 = this;
571
+ _this4 = this;
559
572
 
560
573
  var timer, authenticatedUserToken, requestPath, headers, url, method, options, axiosInstance, requestId;
561
574
  return _regenerator["default"].wrap(function _callee7$(_context7) {
@@ -568,6 +581,7 @@ var SDK = /*#__PURE__*/function () {
568
581
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetReconnectableChatsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(this.omnichannelConfiguration.orgId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
569
582
  headers = _Constants["default"].defaultHeaders;
570
583
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
584
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
571
585
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
572
586
  method = "GET";
573
587
  options = {
@@ -580,7 +594,7 @@ var SDK = /*#__PURE__*/function () {
580
594
  requestId = this.omnichannelConfiguration.orgId;
581
595
  return _context7.abrupt("return", new Promise( /*#__PURE__*/function () {
582
596
  var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(resolve, reject) {
583
- var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds3;
597
+ var response, elapsedTimeInMilliseconds, data, _headers3, _elapsedTimeInMilliseconds3;
584
598
 
585
599
  return _regenerator["default"].wrap(function _callee6$(_context6) {
586
600
  while (1) {
@@ -593,29 +607,32 @@ var SDK = /*#__PURE__*/function () {
593
607
  case 3:
594
608
  response = _context6.sent;
595
609
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
596
- data = response.data; // Resolves only if it contains reconnectable chats response which only happens on status 200
610
+ data = response.data, _headers3 = response.headers;
611
+
612
+ _this4.setAuthCodeNonce(_headers3); // Resolves only if it contains reconnectable chats response which only happens on status 200
613
+
597
614
 
598
615
  if (!data) {
599
- _context6.next = 10;
616
+ _context6.next = 11;
600
617
  break;
601
618
  }
602
619
 
603
- _this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
620
+ _this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
604
621
 
605
622
  resolve(data);
606
623
  return _context6.abrupt("return");
607
624
 
608
- case 10:
625
+ case 11:
609
626
  // No data found in the old sessions so returning null
610
627
  resolve();
611
628
  return _context6.abrupt("return");
612
629
 
613
- case 14:
614
- _context6.prev = 14;
630
+ case 15:
631
+ _context6.prev = 15;
615
632
  _context6.t0 = _context6["catch"](0);
616
633
  _elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
617
634
 
618
- _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context6.t0);
635
+ _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context6.t0);
619
636
 
620
637
  if (_context6.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
621
638
  (0, _throwClientHTTPError["default"])();
@@ -624,12 +641,12 @@ var SDK = /*#__PURE__*/function () {
624
641
  reject(_context6.t0);
625
642
  return _context6.abrupt("return");
626
643
 
627
- case 21:
644
+ case 22:
628
645
  case "end":
629
646
  return _context6.stop();
630
647
  }
631
648
  }
632
- }, _callee6, null, [[0, 14]]);
649
+ }, _callee6, null, [[0, 15]]);
633
650
  }));
634
651
 
635
652
  return function (_x9, _x10) {
@@ -637,7 +654,7 @@ var SDK = /*#__PURE__*/function () {
637
654
  };
638
655
  }()));
639
656
 
640
- case 12:
657
+ case 13:
641
658
  case "end":
642
659
  return _context7.stop();
643
660
  }
@@ -661,7 +678,7 @@ var SDK = /*#__PURE__*/function () {
661
678
  value: function () {
662
679
  var _getReconnectAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(reconnectId) {
663
680
  var _this$configuration$d5,
664
- _this4 = this;
681
+ _this5 = this;
665
682
 
666
683
  var timer, requestPath, headers, url, method, options, axiosInstance;
667
684
  return _regenerator["default"].wrap(function _callee9$(_context9) {
@@ -703,14 +720,14 @@ var SDK = /*#__PURE__*/function () {
703
720
  break;
704
721
  }
705
722
 
706
- _this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
723
+ _this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
707
724
 
708
725
  resolve(data);
709
726
  return _context8.abrupt("return");
710
727
 
711
728
  case 10:
712
729
  // No data found so returning null
713
- _this4.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
730
+ _this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
714
731
 
715
732
  resolve();
716
733
  return _context8.abrupt("return");
@@ -720,7 +737,7 @@ var SDK = /*#__PURE__*/function () {
720
737
  _context8.t0 = _context8["catch"](0);
721
738
  _elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
722
739
 
723
- _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context8.t0);
740
+ _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context8.t0);
724
741
 
725
742
  if (_context8.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
726
743
  (0, _throwClientHTTPError["default"])();
@@ -767,7 +784,7 @@ var SDK = /*#__PURE__*/function () {
767
784
  value: function () {
768
785
  var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
769
786
  var _this$configuration$d6,
770
- _this5 = this;
787
+ _this6 = this;
771
788
 
772
789
  var queueAvailabilityOptionalParams,
773
790
  timer,
@@ -794,6 +811,7 @@ var SDK = /*#__PURE__*/function () {
794
811
  requestPath = "/".concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
795
812
  axiosInstance = _axios["default"].create();
796
813
  (0, _axiosRetry["default"])(axiosInstance, {
814
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
797
815
  retries: this.configuration.maxRequestRetriesOnFailure
798
816
  });
799
817
  authenticatedUserToken = queueAvailabilityOptionalParams.authenticatedUserToken, initContext = queueAvailabilityOptionalParams.initContext, getContext = queueAvailabilityOptionalParams.getContext;
@@ -801,6 +819,7 @@ var SDK = /*#__PURE__*/function () {
801
819
 
802
820
  if (authenticatedUserToken) {
803
821
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
822
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
804
823
  }
805
824
 
806
825
  data = initContext || {};
@@ -863,7 +882,7 @@ var SDK = /*#__PURE__*/function () {
863
882
  };
864
883
  return _context11.abrupt("return", new Promise( /*#__PURE__*/function () {
865
884
  var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(resolve, reject) {
866
- var response, elapsedTimeInMilliseconds, _data, _elapsedTimeInMilliseconds5;
885
+ var response, elapsedTimeInMilliseconds, _data, _headers4, _elapsedTimeInMilliseconds5;
867
886
 
868
887
  return _regenerator["default"].wrap(function _callee10$(_context10) {
869
888
  while (1) {
@@ -876,23 +895,25 @@ var SDK = /*#__PURE__*/function () {
876
895
  case 3:
877
896
  response = _context10.sent;
878
897
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
879
- _data = response.data;
898
+ _data = response.data, _headers4 = response.headers;
899
+
900
+ _this6.setAuthCodeNonce(_headers4);
880
901
 
881
902
  if (_data) {
882
- _this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
903
+ _this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
883
904
 
884
905
  resolve(_data);
885
906
  }
886
907
 
887
- _context10.next = 15;
908
+ _context10.next = 16;
888
909
  break;
889
910
 
890
- case 9:
891
- _context10.prev = 9;
911
+ case 10:
912
+ _context10.prev = 10;
892
913
  _context10.t0 = _context10["catch"](0);
893
914
  _elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
894
915
 
895
- _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context10.t0);
916
+ _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context10.t0);
896
917
 
897
918
  if (_context10.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
898
919
  (0, _throwClientHTTPError["default"])();
@@ -900,12 +921,12 @@ var SDK = /*#__PURE__*/function () {
900
921
 
901
922
  reject(_context10.t0);
902
923
 
903
- case 15:
924
+ case 16:
904
925
  case "end":
905
926
  return _context10.stop();
906
927
  }
907
928
  }
908
- }, _callee10, null, [[0, 9]]);
929
+ }, _callee10, null, [[0, 10]]);
909
930
  }));
910
931
 
911
932
  return function (_x15, _x16) {
@@ -936,8 +957,9 @@ var SDK = /*#__PURE__*/function () {
936
957
  }, {
937
958
  key: "sessionInit",
938
959
  value: function () {
939
- var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
940
- var _this$configuration$d7;
960
+ var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(requestId) {
961
+ var _this$configuration$d7,
962
+ _this7 = this;
941
963
 
942
964
  var sessionInitOptionalParams,
943
965
  timer,
@@ -953,21 +975,19 @@ var SDK = /*#__PURE__*/function () {
953
975
  url,
954
976
  method,
955
977
  options,
956
- response,
957
- elapsedTimeInMilliseconds,
958
- _elapsedTimeInMilliseconds6,
959
- _args12 = arguments;
960
-
961
- return _regenerator["default"].wrap(function _callee12$(_context12) {
978
+ _args13 = arguments;
979
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
962
980
  while (1) {
963
- switch (_context12.prev = _context12.next) {
981
+ switch (_context13.prev = _context13.next) {
964
982
  case 0:
965
- sessionInitOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
983
+ sessionInitOptionalParams = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : {};
966
984
  timer = _Timer.Timer.TIMER();
967
985
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, "Session Init Started", requestId);
968
986
  axiosInstance = _axios["default"].create();
969
987
  (0, _axiosRetry["default"])(axiosInstance, {
970
- retries: this.configuration.maxRequestRetriesOnFailure
988
+ retries: this.configuration.maxRequestRetriesOnFailure,
989
+ shouldRetry: _SessionInitRetryHandler["default"],
990
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce]
971
991
  });
972
992
  reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
973
993
  headers = _Constants["default"].defaultHeaders;
@@ -976,6 +996,7 @@ var SDK = /*#__PURE__*/function () {
976
996
  if (authenticatedUserToken) {
977
997
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
978
998
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
999
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
979
1000
  }
980
1001
 
981
1002
  if (reconnectId) {
@@ -987,11 +1008,11 @@ var SDK = /*#__PURE__*/function () {
987
1008
  data = initContext || {};
988
1009
 
989
1010
  if (!(getContext && !window.document)) {
990
- _context12.next = 15;
1011
+ _context13.next = 15;
991
1012
  break;
992
1013
  }
993
1014
 
994
- return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1015
+ return _context13.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
995
1016
 
996
1017
  case 15:
997
1018
  if (getContext) {
@@ -1008,11 +1029,11 @@ var SDK = /*#__PURE__*/function () {
1008
1029
 
1009
1030
 
1010
1031
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
1011
- _context12.next = 19;
1032
+ _context13.next = 19;
1012
1033
  break;
1013
1034
  }
1014
1035
 
1015
- return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1036
+ return _context13.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1016
1037
 
1017
1038
  case 19:
1018
1039
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
@@ -1024,35 +1045,63 @@ var SDK = /*#__PURE__*/function () {
1024
1045
  url: url,
1025
1046
  timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.sessionInit
1026
1047
  };
1027
- _context12.prev = 22;
1028
- _context12.next = 25;
1029
- return axiosInstance(options);
1048
+ return _context13.abrupt("return", new Promise( /*#__PURE__*/function () {
1049
+ var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(resolve, reject) {
1050
+ var response, elapsedTimeInMilliseconds, _headers5, _elapsedTimeInMilliseconds6;
1030
1051
 
1031
- case 25:
1032
- response = _context12.sent;
1033
- elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1034
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
1035
- _context12.next = 36;
1036
- break;
1037
-
1038
- case 30:
1039
- _context12.prev = 30;
1040
- _context12.t0 = _context12["catch"](22);
1041
- _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1042
- this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context12.t0, data);
1043
-
1044
- if (_context12.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1045
- (0, _throwClientHTTPError["default"])();
1046
- }
1052
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
1053
+ while (1) {
1054
+ switch (_context12.prev = _context12.next) {
1055
+ case 0:
1056
+ _context12.prev = 0;
1057
+ _context12.next = 3;
1058
+ return axiosInstance(options);
1047
1059
 
1048
- throw _context12.t0;
1060
+ case 3:
1061
+ response = _context12.sent;
1062
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1063
+ _headers5 = response.headers;
1064
+
1065
+ _this7.setAuthCodeNonce(_headers5);
1066
+
1067
+ _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
1068
+
1069
+ resolve();
1070
+ _context12.next = 17;
1071
+ break;
1049
1072
 
1050
- case 36:
1073
+ case 11:
1074
+ _context12.prev = 11;
1075
+ _context12.t0 = _context12["catch"](0);
1076
+ _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1077
+
1078
+ _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context12.t0, data);
1079
+
1080
+ if (_context12.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1081
+ (0, _throwClientHTTPError["default"])();
1082
+ }
1083
+
1084
+ reject(_context12.t0);
1085
+
1086
+ case 17:
1087
+ case "end":
1088
+ return _context12.stop();
1089
+ }
1090
+ }
1091
+ }, _callee12, null, [[0, 11]]);
1092
+ }));
1093
+
1094
+ return function (_x18, _x19) {
1095
+ return _ref6.apply(this, arguments);
1096
+ };
1097
+ }()));
1098
+
1099
+ case 23:
1051
1100
  case "end":
1052
- return _context12.stop();
1101
+ return _context13.stop();
1053
1102
  }
1054
1103
  }
1055
- }, _callee12, this, [[22, 30]]);
1104
+ }, _callee13, this);
1056
1105
  }));
1057
1106
 
1058
1107
  function sessionInit(_x17) {
@@ -1070,9 +1119,9 @@ var SDK = /*#__PURE__*/function () {
1070
1119
  }, {
1071
1120
  key: "sessionClose",
1072
1121
  value: function () {
1073
- var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
1122
+ var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId) {
1074
1123
  var _this$configuration$d8,
1075
- _this6 = this;
1124
+ _this8 = this;
1076
1125
 
1077
1126
  var sessionCloseOptionalParams,
1078
1127
  timer,
@@ -1087,17 +1136,18 @@ var SDK = /*#__PURE__*/function () {
1087
1136
  url,
1088
1137
  method,
1089
1138
  options,
1090
- _args14 = arguments;
1091
- return _regenerator["default"].wrap(function _callee14$(_context14) {
1139
+ _args15 = arguments;
1140
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
1092
1141
  while (1) {
1093
- switch (_context14.prev = _context14.next) {
1142
+ switch (_context15.prev = _context15.next) {
1094
1143
  case 0:
1095
- sessionCloseOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
1144
+ sessionCloseOptionalParams = _args15.length > 1 && _args15[1] !== undefined ? _args15[1] : {};
1096
1145
  timer = _Timer.Timer.TIMER();
1097
1146
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESTARTED, "Session Close Started", requestId);
1098
1147
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1099
1148
  axiosInstance = _axios["default"].create();
1100
1149
  (0, _axiosRetry["default"])(axiosInstance, {
1150
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1101
1151
  retries: this.configuration.maxRequestRetriesOnFailure
1102
1152
  });
1103
1153
  authenticatedUserToken = sessionCloseOptionalParams.authenticatedUserToken, isReconnectChat = sessionCloseOptionalParams.isReconnectChat, isPersistentChat = sessionCloseOptionalParams.isPersistentChat, chatId = sessionCloseOptionalParams.chatId;
@@ -1109,6 +1159,7 @@ var SDK = /*#__PURE__*/function () {
1109
1159
  if (authenticatedUserToken) {
1110
1160
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1111
1161
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1162
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1112
1163
  }
1113
1164
 
1114
1165
  if (isReconnectChat) {
@@ -1128,63 +1179,67 @@ var SDK = /*#__PURE__*/function () {
1128
1179
  url: url,
1129
1180
  timeout: (_this$configuration$d8 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d8 !== void 0 ? _this$configuration$d8 : this.configuration.requestTimeoutConfig.sessionClose
1130
1181
  };
1131
- return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
1132
- var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
1133
- var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
1182
+ return _context15.abrupt("return", new Promise( /*#__PURE__*/function () {
1183
+ var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(resolve, reject) {
1184
+ var response, _headers6, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
1134
1185
 
1135
- return _regenerator["default"].wrap(function _callee13$(_context13) {
1186
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
1136
1187
  while (1) {
1137
- switch (_context13.prev = _context13.next) {
1188
+ switch (_context14.prev = _context14.next) {
1138
1189
  case 0:
1139
- _context13.prev = 0;
1140
- _context13.next = 3;
1190
+ _context14.prev = 0;
1191
+ _context14.next = 3;
1141
1192
  return axiosInstance(options);
1142
1193
 
1143
1194
  case 3:
1144
- response = _context13.sent;
1195
+ response = _context14.sent;
1196
+ _headers6 = response.headers;
1197
+
1198
+ _this8.setAuthCodeNonce(_headers6);
1199
+
1145
1200
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1146
1201
 
1147
- _this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1202
+ _this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1148
1203
 
1149
1204
  resolve();
1150
- _context13.next = 15;
1205
+ _context14.next = 17;
1151
1206
  break;
1152
1207
 
1153
- case 9:
1154
- _context13.prev = 9;
1155
- _context13.t0 = _context13["catch"](0);
1208
+ case 11:
1209
+ _context14.prev = 11;
1210
+ _context14.t0 = _context14["catch"](0);
1156
1211
  _elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
1157
1212
 
1158
- _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context13.t0);
1213
+ _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context14.t0);
1159
1214
 
1160
- if (_context13.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1215
+ if (_context14.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1161
1216
  (0, _throwClientHTTPError["default"])();
1162
1217
  }
1163
1218
 
1164
- reject();
1219
+ reject(_context14.t0);
1165
1220
 
1166
- case 15:
1221
+ case 17:
1167
1222
  case "end":
1168
- return _context13.stop();
1223
+ return _context14.stop();
1169
1224
  }
1170
1225
  }
1171
- }, _callee13, null, [[0, 9]]);
1226
+ }, _callee14, null, [[0, 11]]);
1172
1227
  }));
1173
1228
 
1174
- return function (_x19, _x20) {
1175
- return _ref6.apply(this, arguments);
1229
+ return function (_x21, _x22) {
1230
+ return _ref7.apply(this, arguments);
1176
1231
  };
1177
1232
  }()));
1178
1233
 
1179
1234
  case 17:
1180
1235
  case "end":
1181
- return _context14.stop();
1236
+ return _context15.stop();
1182
1237
  }
1183
1238
  }
1184
- }, _callee14, this);
1239
+ }, _callee15, this);
1185
1240
  }));
1186
1241
 
1187
- function sessionClose(_x18) {
1242
+ function sessionClose(_x20) {
1188
1243
  return _sessionClose.apply(this, arguments);
1189
1244
  }
1190
1245
 
@@ -1199,14 +1254,14 @@ var SDK = /*#__PURE__*/function () {
1199
1254
  }, {
1200
1255
  key: "validateAuthChatRecord",
1201
1256
  value: function () {
1202
- var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId, validateAuthChatRecordOptionalParams) {
1203
- var _this$configuration$d9;
1204
-
1205
- var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options, _response$data, response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds8;
1257
+ var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, validateAuthChatRecordOptionalParams) {
1258
+ var _this$configuration$d9,
1259
+ _this9 = this;
1206
1260
 
1207
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1261
+ var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options;
1262
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
1208
1263
  while (1) {
1209
- switch (_context15.prev = _context15.next) {
1264
+ switch (_context17.prev = _context17.next) {
1210
1265
  case 0:
1211
1266
  timer = _Timer.Timer.TIMER();
1212
1267
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSTARTED, "Validate Auth Chat Record Started", requestId);
@@ -1214,12 +1269,14 @@ var SDK = /*#__PURE__*/function () {
1214
1269
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatValidateAuthChatMapRecordPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1215
1270
  axiosInstance = _axios["default"].create();
1216
1271
  (0, _axiosRetry["default"])(axiosInstance, {
1272
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1217
1273
  retries: this.configuration.maxRequestRetriesOnFailure
1218
1274
  });
1219
1275
  headers = _Constants["default"].defaultHeaders;
1220
1276
 
1221
1277
  if (authenticatedUserToken) {
1222
1278
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1279
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1223
1280
  }
1224
1281
 
1225
1282
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
@@ -1230,59 +1287,79 @@ var SDK = /*#__PURE__*/function () {
1230
1287
  url: url,
1231
1288
  timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
1232
1289
  };
1233
- _context15.prev = 11;
1234
- _context15.next = 14;
1235
- return axiosInstance(options);
1290
+ return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
1291
+ var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
1292
+ var _response$data, response, _headers7, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds8;
1236
1293
 
1237
- case 14:
1238
- response = _context15.sent;
1239
- elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1294
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
1295
+ while (1) {
1296
+ switch (_context16.prev = _context16.next) {
1297
+ case 0:
1298
+ _context16.prev = 0;
1299
+ _context16.next = 3;
1300
+ return axiosInstance(options);
1240
1301
 
1241
- if (!(((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true)) {
1242
- _context15.next = 21;
1243
- break;
1244
- }
1302
+ case 3:
1303
+ response = _context16.sent;
1304
+ _headers7 = response.headers;
1245
1305
 
1246
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1247
- return _context15.abrupt("return", Promise.resolve(response.data));
1306
+ _this9.setAuthCodeNonce(_headers7);
1248
1307
 
1249
- case 21:
1250
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1251
- return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
1308
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1252
1309
 
1253
- case 23:
1254
- _context15.next = 35;
1255
- break;
1310
+ if (((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true) {
1311
+ _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1256
1312
 
1257
- case 25:
1258
- _context15.prev = 25;
1259
- _context15.t0 = _context15["catch"](11);
1260
- _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1261
- this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context15.t0);
1313
+ resolve(response.data);
1314
+ } else {
1315
+ _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1262
1316
 
1263
- if (_context15.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1264
- (0, _throwClientHTTPError["default"])();
1265
- }
1317
+ reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized"));
1318
+ }
1266
1319
 
1267
- if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
1268
- _context15.next = 34;
1269
- break;
1270
- }
1320
+ _context16.next = 16;
1321
+ break;
1322
+
1323
+ case 10:
1324
+ _context16.prev = 10;
1325
+ _context16.t0 = _context16["catch"](0);
1326
+ _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1271
1327
 
1272
- return _context15.abrupt("return", Promise.resolve({}));
1328
+ _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context16.t0);
1273
1329
 
1274
- case 34:
1275
- return _context15.abrupt("return", Promise.reject());
1330
+ if (_context16.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1331
+ (0, _throwClientHTTPError["default"])();
1332
+ }
1333
+
1334
+ if (_context16.t0.toString() === "Error: Request failed with status code 404") {
1335
+ // backward compatibility
1336
+ resolve({});
1337
+ } else {
1338
+ reject(_context16.t0);
1339
+ }
1276
1340
 
1277
- case 35:
1341
+ case 16:
1342
+ case "end":
1343
+ return _context16.stop();
1344
+ }
1345
+ }
1346
+ }, _callee16, null, [[0, 10]]);
1347
+ }));
1348
+
1349
+ return function (_x25, _x26) {
1350
+ return _ref8.apply(this, arguments);
1351
+ };
1352
+ }()));
1353
+
1354
+ case 12:
1278
1355
  case "end":
1279
- return _context15.stop();
1356
+ return _context17.stop();
1280
1357
  }
1281
1358
  }
1282
- }, _callee15, this, [[11, 25]]);
1359
+ }, _callee17, this);
1283
1360
  }));
1284
1361
 
1285
- function validateAuthChatRecord(_x21, _x22) {
1362
+ function validateAuthChatRecord(_x23, _x24) {
1286
1363
  return _validateAuthChatRecord.apply(this, arguments);
1287
1364
  }
1288
1365
 
@@ -1298,9 +1375,9 @@ var SDK = /*#__PURE__*/function () {
1298
1375
  }, {
1299
1376
  key: "submitPostChatResponse",
1300
1377
  value: function () {
1301
- var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, postChatResponse) {
1378
+ var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(requestId, postChatResponse) {
1302
1379
  var _this$configuration$d10,
1303
- _this7 = this;
1380
+ _this10 = this;
1304
1381
 
1305
1382
  var submitPostChatResponseOptionalParams,
1306
1383
  timer,
@@ -1311,17 +1388,18 @@ var SDK = /*#__PURE__*/function () {
1311
1388
  url,
1312
1389
  method,
1313
1390
  options,
1314
- _args17 = arguments;
1315
- return _regenerator["default"].wrap(function _callee17$(_context17) {
1391
+ _args19 = arguments;
1392
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
1316
1393
  while (1) {
1317
- switch (_context17.prev = _context17.next) {
1394
+ switch (_context19.prev = _context19.next) {
1318
1395
  case 0:
1319
- submitPostChatResponseOptionalParams = _args17.length > 2 && _args17[2] !== undefined ? _args17[2] : {};
1396
+ submitPostChatResponseOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
1320
1397
  timer = _Timer.Timer.TIMER();
1321
1398
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSTARTED, "Submit Post Chat Started", requestId);
1322
1399
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1323
1400
  axiosInstance = _axios["default"].create();
1324
1401
  (0, _axiosRetry["default"])(axiosInstance, {
1402
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1325
1403
  retries: this.configuration.maxRequestRetriesOnFailure
1326
1404
  });
1327
1405
  authenticatedUserToken = submitPostChatResponseOptionalParams.authenticatedUserToken;
@@ -1330,6 +1408,7 @@ var SDK = /*#__PURE__*/function () {
1330
1408
  if (authenticatedUserToken) {
1331
1409
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1332
1410
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1411
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1333
1412
  }
1334
1413
 
1335
1414
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
@@ -1341,63 +1420,67 @@ var SDK = /*#__PURE__*/function () {
1341
1420
  url: url,
1342
1421
  timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.submitPostChatResponse
1343
1422
  };
1344
- return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
1345
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
1346
- var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1423
+ return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
1424
+ var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
1425
+ var response, _headers8, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1347
1426
 
1348
- return _regenerator["default"].wrap(function _callee16$(_context16) {
1427
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
1349
1428
  while (1) {
1350
- switch (_context16.prev = _context16.next) {
1429
+ switch (_context18.prev = _context18.next) {
1351
1430
  case 0:
1352
- _context16.prev = 0;
1353
- _context16.next = 3;
1431
+ _context18.prev = 0;
1432
+ _context18.next = 3;
1354
1433
  return axiosInstance(options);
1355
1434
 
1356
1435
  case 3:
1357
- response = _context16.sent;
1436
+ response = _context18.sent;
1437
+ _headers8 = response.headers;
1438
+
1439
+ _this10.setAuthCodeNonce(_headers8);
1440
+
1358
1441
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1359
1442
 
1360
- _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1443
+ _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1361
1444
 
1362
1445
  resolve();
1363
- _context16.next = 15;
1446
+ _context18.next = 17;
1364
1447
  break;
1365
1448
 
1366
- case 9:
1367
- _context16.prev = 9;
1368
- _context16.t0 = _context16["catch"](0);
1449
+ case 11:
1450
+ _context18.prev = 11;
1451
+ _context18.t0 = _context18["catch"](0);
1369
1452
  _elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
1370
1453
 
1371
- _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context16.t0);
1454
+ _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context18.t0);
1372
1455
 
1373
- if (_context16.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1456
+ if (_context18.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1374
1457
  (0, _throwClientHTTPError["default"])();
1375
1458
  }
1376
1459
 
1377
- reject();
1460
+ reject(_context18.t0);
1378
1461
 
1379
- case 15:
1462
+ case 17:
1380
1463
  case "end":
1381
- return _context16.stop();
1464
+ return _context18.stop();
1382
1465
  }
1383
1466
  }
1384
- }, _callee16, null, [[0, 9]]);
1467
+ }, _callee18, null, [[0, 11]]);
1385
1468
  }));
1386
1469
 
1387
- return function (_x25, _x26) {
1388
- return _ref7.apply(this, arguments);
1470
+ return function (_x29, _x30) {
1471
+ return _ref9.apply(this, arguments);
1389
1472
  };
1390
1473
  }()));
1391
1474
 
1392
1475
  case 13:
1393
1476
  case "end":
1394
- return _context17.stop();
1477
+ return _context19.stop();
1395
1478
  }
1396
1479
  }
1397
- }, _callee17, this);
1480
+ }, _callee19, this);
1398
1481
  }));
1399
1482
 
1400
- function submitPostChatResponse(_x23, _x24) {
1483
+ function submitPostChatResponse(_x27, _x28) {
1401
1484
  return _submitPostChatResponse.apply(this, arguments);
1402
1485
  }
1403
1486
 
@@ -1413,9 +1496,9 @@ var SDK = /*#__PURE__*/function () {
1413
1496
  }, {
1414
1497
  key: "getSurveyInviteLink",
1415
1498
  value: function () {
1416
- var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(surveyOwnerId, surveyInviteAPIRequestBody) {
1499
+ var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(surveyOwnerId, surveyInviteAPIRequestBody) {
1417
1500
  var _this$configuration$d11,
1418
- _this8 = this;
1501
+ _this11 = this;
1419
1502
 
1420
1503
  var getsurveyInviteLinkOptionalParams,
1421
1504
  timer,
@@ -1427,12 +1510,12 @@ var SDK = /*#__PURE__*/function () {
1427
1510
  url,
1428
1511
  method,
1429
1512
  options,
1430
- _args19 = arguments;
1431
- return _regenerator["default"].wrap(function _callee19$(_context19) {
1513
+ _args21 = arguments;
1514
+ return _regenerator["default"].wrap(function _callee21$(_context21) {
1432
1515
  while (1) {
1433
- switch (_context19.prev = _context19.next) {
1516
+ switch (_context21.prev = _context21.next) {
1434
1517
  case 0:
1435
- getsurveyInviteLinkOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
1518
+ getsurveyInviteLinkOptionalParams = _args21.length > 2 && _args21[2] !== undefined ? _args21[2] : {};
1436
1519
  timer = _Timer.Timer.TIMER();
1437
1520
 
1438
1521
  if (this.logger) {
@@ -1444,6 +1527,7 @@ var SDK = /*#__PURE__*/function () {
1444
1527
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
1445
1528
  axiosInstance = _axios["default"].create();
1446
1529
  (0, _axiosRetry["default"])(axiosInstance, {
1530
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1447
1531
  retries: this.configuration.maxRequestRetriesOnFailure
1448
1532
  });
1449
1533
  authenticatedUserToken = getsurveyInviteLinkOptionalParams.authenticatedUserToken, requestId = getsurveyInviteLinkOptionalParams.requestId;
@@ -1452,6 +1536,7 @@ var SDK = /*#__PURE__*/function () {
1452
1536
  if (authenticatedUserToken) {
1453
1537
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
1454
1538
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1539
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1455
1540
  headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1456
1541
  }
1457
1542
 
@@ -1468,64 +1553,67 @@ var SDK = /*#__PURE__*/function () {
1468
1553
  url: url,
1469
1554
  timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
1470
1555
  };
1471
- return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
1472
- var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
1473
- var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1556
+ return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
1557
+ var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
1558
+ var response, data, _headers9, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1474
1559
 
1475
- return _regenerator["default"].wrap(function _callee18$(_context18) {
1560
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
1476
1561
  while (1) {
1477
- switch (_context18.prev = _context18.next) {
1562
+ switch (_context20.prev = _context20.next) {
1478
1563
  case 0:
1479
- _context18.prev = 0;
1480
- _context18.next = 3;
1564
+ _context20.prev = 0;
1565
+ _context20.next = 3;
1481
1566
  return axiosInstance(options);
1482
1567
 
1483
1568
  case 3:
1484
- response = _context18.sent;
1485
- data = response.data;
1569
+ response = _context20.sent;
1570
+ data = response.data, _headers9 = response.headers;
1571
+
1572
+ _this11.setAuthCodeNonce(_headers9);
1573
+
1486
1574
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1487
1575
 
1488
- _this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1576
+ _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1489
1577
 
1490
1578
  resolve(data);
1491
- _context18.next = 16;
1579
+ _context20.next = 17;
1492
1580
  break;
1493
1581
 
1494
- case 10:
1495
- _context18.prev = 10;
1496
- _context18.t0 = _context18["catch"](0);
1582
+ case 11:
1583
+ _context20.prev = 11;
1584
+ _context20.t0 = _context20["catch"](0);
1497
1585
  _elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
1498
1586
 
1499
- _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context18.t0);
1587
+ _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context20.t0);
1500
1588
 
1501
- if (_context18.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1589
+ if (_context20.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1502
1590
  (0, _throwClientHTTPError["default"])();
1503
1591
  }
1504
1592
 
1505
- reject();
1593
+ reject(_context20.t0);
1506
1594
 
1507
- case 16:
1595
+ case 17:
1508
1596
  case "end":
1509
- return _context18.stop();
1597
+ return _context20.stop();
1510
1598
  }
1511
1599
  }
1512
- }, _callee18, null, [[0, 10]]);
1600
+ }, _callee20, null, [[0, 11]]);
1513
1601
  }));
1514
1602
 
1515
- return function (_x29, _x30) {
1516
- return _ref8.apply(this, arguments);
1603
+ return function (_x33, _x34) {
1604
+ return _ref10.apply(this, arguments);
1517
1605
  };
1518
1606
  }()));
1519
1607
 
1520
1608
  case 14:
1521
1609
  case "end":
1522
- return _context19.stop();
1610
+ return _context21.stop();
1523
1611
  }
1524
1612
  }
1525
- }, _callee19, this);
1613
+ }, _callee21, this);
1526
1614
  }));
1527
1615
 
1528
- function getSurveyInviteLink(_x27, _x28) {
1616
+ function getSurveyInviteLink(_x31, _x32) {
1529
1617
  return _getSurveyInviteLink.apply(this, arguments);
1530
1618
  }
1531
1619
 
@@ -1542,9 +1630,9 @@ var SDK = /*#__PURE__*/function () {
1542
1630
  }, {
1543
1631
  key: "getChatTranscripts",
1544
1632
  value: function () {
1545
- var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, chatId, token) {
1633
+ var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, chatId, token) {
1546
1634
  var _this$configuration$d12,
1547
- _this9 = this;
1635
+ _this12 = this;
1548
1636
 
1549
1637
  var getChatTranscriptsOptionalParams,
1550
1638
  timer,
@@ -1556,17 +1644,18 @@ var SDK = /*#__PURE__*/function () {
1556
1644
  url,
1557
1645
  method,
1558
1646
  options,
1559
- _args21 = arguments;
1560
- return _regenerator["default"].wrap(function _callee21$(_context21) {
1647
+ _args23 = arguments;
1648
+ return _regenerator["default"].wrap(function _callee23$(_context23) {
1561
1649
  while (1) {
1562
- switch (_context21.prev = _context21.next) {
1650
+ switch (_context23.prev = _context23.next) {
1563
1651
  case 0:
1564
- getChatTranscriptsOptionalParams = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
1652
+ getChatTranscriptsOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
1565
1653
  timer = _Timer.Timer.TIMER();
1566
1654
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSTARTED, "Get Chat Transcript Started", requestId);
1567
1655
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1568
1656
  axiosInstance = _axios["default"].create();
1569
1657
  (0, _axiosRetry["default"])(axiosInstance, {
1658
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1570
1659
  retries: this.configuration.maxRequestRetriesOnFailure
1571
1660
  });
1572
1661
  authenticatedUserToken = getChatTranscriptsOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTranscriptsOptionalParams.currentLiveChatVersion;
@@ -1579,9 +1668,13 @@ var SDK = /*#__PURE__*/function () {
1579
1668
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1580
1669
 
1581
1670
  if (authenticatedUserToken) {
1671
+ headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1672
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1582
1673
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1583
1674
  }
1584
1675
  } else if (authenticatedUserToken) {
1676
+ headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1677
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1585
1678
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1586
1679
  }
1587
1680
 
@@ -1593,64 +1686,66 @@ var SDK = /*#__PURE__*/function () {
1593
1686
  url: url,
1594
1687
  timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getChatTranscripts
1595
1688
  };
1596
- return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
1597
- var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
1598
- var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
1689
+ return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
1690
+ var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
1691
+ var response, elapsedTimeInMilliseconds, data, _headers10, _elapsedTimeInMilliseconds11;
1599
1692
 
1600
- return _regenerator["default"].wrap(function _callee20$(_context20) {
1693
+ return _regenerator["default"].wrap(function _callee22$(_context22) {
1601
1694
  while (1) {
1602
- switch (_context20.prev = _context20.next) {
1695
+ switch (_context22.prev = _context22.next) {
1603
1696
  case 0:
1604
- _context20.prev = 0;
1605
- _context20.next = 3;
1697
+ _context22.prev = 0;
1698
+ _context22.next = 3;
1606
1699
  return axiosInstance(options);
1607
1700
 
1608
1701
  case 3:
1609
- response = _context20.sent;
1702
+ response = _context22.sent;
1610
1703
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1611
- data = response.data;
1704
+ data = response.data, _headers10 = response.headers;
1705
+
1706
+ _this12.setAuthCodeNonce(_headers10);
1612
1707
 
1613
- _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1708
+ _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1614
1709
 
1615
1710
  resolve(data);
1616
- _context20.next = 16;
1711
+ _context22.next = 17;
1617
1712
  break;
1618
1713
 
1619
- case 10:
1620
- _context20.prev = 10;
1621
- _context20.t0 = _context20["catch"](0);
1714
+ case 11:
1715
+ _context22.prev = 11;
1716
+ _context22.t0 = _context22["catch"](0);
1622
1717
  _elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
1623
1718
 
1624
- _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context20.t0);
1719
+ _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context22.t0);
1625
1720
 
1626
- if (_context20.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1721
+ if (_context22.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1627
1722
  (0, _throwClientHTTPError["default"])();
1628
1723
  }
1629
1724
 
1630
- reject(_context20.t0);
1725
+ reject(_context22.t0);
1631
1726
 
1632
- case 16:
1727
+ case 17:
1633
1728
  case "end":
1634
- return _context20.stop();
1729
+ return _context22.stop();
1635
1730
  }
1636
1731
  }
1637
- }, _callee20, null, [[0, 10]]);
1732
+ }, _callee22, null, [[0, 11]]);
1638
1733
  }));
1639
1734
 
1640
- return function (_x34, _x35) {
1641
- return _ref9.apply(this, arguments);
1735
+ return function (_x38, _x39) {
1736
+ return _ref11.apply(this, arguments);
1642
1737
  };
1643
1738
  }()));
1644
1739
 
1645
1740
  case 16:
1646
1741
  case "end":
1647
- return _context21.stop();
1742
+ return _context23.stop();
1648
1743
  }
1649
1744
  }
1650
- }, _callee21, this);
1745
+ }, _callee23, this);
1651
1746
  }));
1652
1747
 
1653
- function getChatTranscripts(_x31, _x32, _x33) {
1748
+ function getChatTranscripts(_x35, _x36, _x37) {
1654
1749
  return _getChatTranscripts.apply(this, arguments);
1655
1750
  }
1656
1751
 
@@ -1667,9 +1762,9 @@ var SDK = /*#__PURE__*/function () {
1667
1762
  }, {
1668
1763
  key: "emailTranscript",
1669
1764
  value: function () {
1670
- var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, token, emailRequestBody) {
1765
+ var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId, token, emailRequestBody) {
1671
1766
  var _this$configuration$d13,
1672
- _this10 = this;
1767
+ _this13 = this;
1673
1768
 
1674
1769
  var emailTranscriptOptionalParams,
1675
1770
  timer,
@@ -1680,17 +1775,18 @@ var SDK = /*#__PURE__*/function () {
1680
1775
  url,
1681
1776
  method,
1682
1777
  options,
1683
- _args23 = arguments;
1684
- return _regenerator["default"].wrap(function _callee23$(_context23) {
1778
+ _args25 = arguments;
1779
+ return _regenerator["default"].wrap(function _callee25$(_context25) {
1685
1780
  while (1) {
1686
- switch (_context23.prev = _context23.next) {
1781
+ switch (_context25.prev = _context25.next) {
1687
1782
  case 0:
1688
- emailTranscriptOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
1783
+ emailTranscriptOptionalParams = _args25.length > 3 && _args25[3] !== undefined ? _args25[3] : {};
1689
1784
  timer = _Timer.Timer.TIMER();
1690
1785
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSTARTED, "Email Transcript Started", requestId);
1691
1786
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1692
1787
  axiosInstance = _axios["default"].create();
1693
1788
  (0, _axiosRetry["default"])(axiosInstance, {
1789
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1694
1790
  retries: this.configuration.maxRequestRetriesOnFailure
1695
1791
  });
1696
1792
  authenticatedUserToken = emailTranscriptOptionalParams.authenticatedUserToken;
@@ -1700,6 +1796,8 @@ var SDK = /*#__PURE__*/function () {
1700
1796
  headers[_OmnichannelHTTPHeaders["default"].authorization] = token;
1701
1797
 
1702
1798
  if (authenticatedUserToken) {
1799
+ headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1800
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1703
1801
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1704
1802
  }
1705
1803
 
@@ -1712,63 +1810,67 @@ var SDK = /*#__PURE__*/function () {
1712
1810
  url: url,
1713
1811
  timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.emailTranscript
1714
1812
  };
1715
- return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
1716
- var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
1717
- var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1813
+ return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
1814
+ var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
1815
+ var response, _headers11, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1718
1816
 
1719
- return _regenerator["default"].wrap(function _callee22$(_context22) {
1817
+ return _regenerator["default"].wrap(function _callee24$(_context24) {
1720
1818
  while (1) {
1721
- switch (_context22.prev = _context22.next) {
1819
+ switch (_context24.prev = _context24.next) {
1722
1820
  case 0:
1723
- _context22.prev = 0;
1724
- _context22.next = 3;
1821
+ _context24.prev = 0;
1822
+ _context24.next = 3;
1725
1823
  return axiosInstance(options);
1726
1824
 
1727
1825
  case 3:
1728
- response = _context22.sent;
1826
+ response = _context24.sent;
1827
+ _headers11 = response.headers;
1828
+
1829
+ _this13.setAuthCodeNonce(_headers11);
1830
+
1729
1831
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1730
1832
 
1731
- _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1833
+ _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1732
1834
 
1733
1835
  resolve();
1734
- _context22.next = 15;
1836
+ _context24.next = 17;
1735
1837
  break;
1736
1838
 
1737
- case 9:
1738
- _context22.prev = 9;
1739
- _context22.t0 = _context22["catch"](0);
1839
+ case 11:
1840
+ _context24.prev = 11;
1841
+ _context24.t0 = _context24["catch"](0);
1740
1842
  _elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
1741
1843
 
1742
- _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context22.t0);
1844
+ _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context24.t0);
1743
1845
 
1744
- if (_context22.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1846
+ if (_context24.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1745
1847
  (0, _throwClientHTTPError["default"])();
1746
1848
  }
1747
1849
 
1748
- reject();
1850
+ reject(_context24.t0);
1749
1851
 
1750
- case 15:
1852
+ case 17:
1751
1853
  case "end":
1752
- return _context22.stop();
1854
+ return _context24.stop();
1753
1855
  }
1754
1856
  }
1755
- }, _callee22, null, [[0, 9]]);
1857
+ }, _callee24, null, [[0, 11]]);
1756
1858
  }));
1757
1859
 
1758
- return function (_x39, _x40) {
1759
- return _ref10.apply(this, arguments);
1860
+ return function (_x43, _x44) {
1861
+ return _ref12.apply(this, arguments);
1760
1862
  };
1761
1863
  }()));
1762
1864
 
1763
1865
  case 16:
1764
1866
  case "end":
1765
- return _context23.stop();
1867
+ return _context25.stop();
1766
1868
  }
1767
1869
  }
1768
- }, _callee23, this);
1870
+ }, _callee25, this);
1769
1871
  }));
1770
1872
 
1771
- function emailTranscript(_x36, _x37, _x38) {
1873
+ function emailTranscript(_x40, _x41, _x42) {
1772
1874
  return _emailTranscript.apply(this, arguments);
1773
1875
  }
1774
1876
 
@@ -1782,14 +1884,14 @@ var SDK = /*#__PURE__*/function () {
1782
1884
  }, {
1783
1885
  key: "fetchDataMaskingInfo",
1784
1886
  value: function () {
1785
- var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId) {
1887
+ var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId) {
1786
1888
  var _this$configuration$d14,
1787
- _this11 = this;
1889
+ _this14 = this;
1788
1890
 
1789
1891
  var timer, requestPath, axiosInstance, headers, url, method, options;
1790
- return _regenerator["default"].wrap(function _callee25$(_context25) {
1892
+ return _regenerator["default"].wrap(function _callee27$(_context27) {
1791
1893
  while (1) {
1792
- switch (_context25.prev = _context25.next) {
1894
+ switch (_context27.prev = _context27.next) {
1793
1895
  case 0:
1794
1896
  timer = _Timer.Timer.TIMER();
1795
1897
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSTARTED, "Fetch Data Masking Started", requestId);
@@ -1814,64 +1916,64 @@ var SDK = /*#__PURE__*/function () {
1814
1916
  url: url,
1815
1917
  timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
1816
1918
  };
1817
- return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
1818
- var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
1919
+ return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
1920
+ var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
1819
1921
  var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
1820
1922
 
1821
- return _regenerator["default"].wrap(function _callee24$(_context24) {
1923
+ return _regenerator["default"].wrap(function _callee26$(_context26) {
1822
1924
  while (1) {
1823
- switch (_context24.prev = _context24.next) {
1925
+ switch (_context26.prev = _context26.next) {
1824
1926
  case 0:
1825
- _context24.prev = 0;
1826
- _context24.next = 3;
1927
+ _context26.prev = 0;
1928
+ _context26.next = 3;
1827
1929
  return axiosInstance(options);
1828
1930
 
1829
1931
  case 3:
1830
- response = _context24.sent;
1932
+ response = _context26.sent;
1831
1933
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1832
1934
  data = response.data;
1833
1935
 
1834
- _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1936
+ _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1835
1937
 
1836
1938
  resolve(data);
1837
- _context24.next = 16;
1939
+ _context26.next = 16;
1838
1940
  break;
1839
1941
 
1840
1942
  case 10:
1841
- _context24.prev = 10;
1842
- _context24.t0 = _context24["catch"](0);
1943
+ _context26.prev = 10;
1944
+ _context26.t0 = _context26["catch"](0);
1843
1945
  _elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
1844
1946
 
1845
- _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context24.t0);
1947
+ _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context26.t0);
1846
1948
 
1847
- if (_context24.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1949
+ if (_context26.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1848
1950
  (0, _throwClientHTTPError["default"])();
1849
1951
  }
1850
1952
 
1851
- reject();
1953
+ reject(_context26.t0);
1852
1954
 
1853
1955
  case 16:
1854
1956
  case "end":
1855
- return _context24.stop();
1957
+ return _context26.stop();
1856
1958
  }
1857
1959
  }
1858
- }, _callee24, null, [[0, 10]]);
1960
+ }, _callee26, null, [[0, 10]]);
1859
1961
  }));
1860
1962
 
1861
- return function (_x42, _x43) {
1862
- return _ref11.apply(this, arguments);
1963
+ return function (_x46, _x47) {
1964
+ return _ref13.apply(this, arguments);
1863
1965
  };
1864
1966
  }()));
1865
1967
 
1866
1968
  case 13:
1867
1969
  case "end":
1868
- return _context25.stop();
1970
+ return _context27.stop();
1869
1971
  }
1870
1972
  }
1871
- }, _callee25, this);
1973
+ }, _callee27, this);
1872
1974
  }));
1873
1975
 
1874
- function fetchDataMaskingInfo(_x41) {
1976
+ function fetchDataMaskingInfo(_x45) {
1875
1977
  return _fetchDataMaskingInfo.apply(this, arguments);
1876
1978
  }
1877
1979
 
@@ -1887,8 +1989,9 @@ var SDK = /*#__PURE__*/function () {
1887
1989
  }, {
1888
1990
  key: "makeSecondaryChannelEventRequest",
1889
1991
  value: function () {
1890
- var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, secondaryChannelEventRequestBody) {
1891
- var _this$configuration$d15;
1992
+ var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, secondaryChannelEventRequestBody) {
1993
+ var _this$configuration$d15,
1994
+ _this15 = this;
1892
1995
 
1893
1996
  var secondaryChannelEventOptionalParams,
1894
1997
  timer,
@@ -1899,21 +2002,18 @@ var SDK = /*#__PURE__*/function () {
1899
2002
  url,
1900
2003
  method,
1901
2004
  options,
1902
- response,
1903
- elapsedTimeInMilliseconds,
1904
- _elapsedTimeInMilliseconds14,
1905
- _args26 = arguments;
1906
-
1907
- return _regenerator["default"].wrap(function _callee26$(_context26) {
2005
+ _args29 = arguments;
2006
+ return _regenerator["default"].wrap(function _callee29$(_context29) {
1908
2007
  while (1) {
1909
- switch (_context26.prev = _context26.next) {
2008
+ switch (_context29.prev = _context29.next) {
1910
2009
  case 0:
1911
- secondaryChannelEventOptionalParams = _args26.length > 2 && _args26[2] !== undefined ? _args26[2] : {};
2010
+ secondaryChannelEventOptionalParams = _args29.length > 2 && _args29[2] !== undefined ? _args29[2] : {};
1912
2011
  timer = _Timer.Timer.TIMER();
1913
2012
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSTARTED, "Secondary Channel Event Request Started", requestId);
1914
2013
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1915
2014
  axiosInstance = _axios["default"].create();
1916
2015
  (0, _axiosRetry["default"])(axiosInstance, {
2016
+ headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
1917
2017
  retries: this.configuration.maxRequestRetriesOnFailure
1918
2018
  });
1919
2019
  authenticatedUserToken = secondaryChannelEventOptionalParams.authenticatedUserToken;
@@ -1922,6 +2022,7 @@ var SDK = /*#__PURE__*/function () {
1922
2022
 
1923
2023
  if (authenticatedUserToken) {
1924
2024
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
2025
+ headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1925
2026
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1926
2027
  }
1927
2028
 
@@ -1935,38 +2036,67 @@ var SDK = /*#__PURE__*/function () {
1935
2036
  url: url,
1936
2037
  timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
1937
2038
  };
1938
- _context26.prev = 14;
1939
- _context26.next = 17;
1940
- return axiosInstance(options);
2039
+ return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
2040
+ var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
2041
+ var response, _headers12, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds14;
1941
2042
 
1942
- case 17:
1943
- response = _context26.sent;
1944
- elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1945
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1946
- _context26.next = 28;
1947
- break;
1948
-
1949
- case 22:
1950
- _context26.prev = 22;
1951
- _context26.t0 = _context26["catch"](14);
1952
- _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
1953
- this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context26.t0);
1954
-
1955
- if (_context26.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1956
- (0, _throwClientHTTPError["default"])();
1957
- }
2043
+ return _regenerator["default"].wrap(function _callee28$(_context28) {
2044
+ while (1) {
2045
+ switch (_context28.prev = _context28.next) {
2046
+ case 0:
2047
+ _context28.prev = 0;
2048
+ _context28.next = 3;
2049
+ return axiosInstance(options);
2050
+
2051
+ case 3:
2052
+ response = _context28.sent;
2053
+ _headers12 = response.headers;
2054
+
2055
+ _this15.setAuthCodeNonce(_headers12);
2056
+
2057
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2058
+
2059
+ _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2060
+
2061
+ resolve();
2062
+ _context28.next = 17;
2063
+ break;
2064
+
2065
+ case 11:
2066
+ _context28.prev = 11;
2067
+ _context28.t0 = _context28["catch"](0);
2068
+ _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
2069
+
2070
+ _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context28.t0);
2071
+
2072
+ if (_context28.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
2073
+ (0, _throwClientHTTPError["default"])();
2074
+ }
2075
+
2076
+ reject(_context28.t0);
2077
+
2078
+ case 17:
2079
+ case "end":
2080
+ return _context28.stop();
2081
+ }
2082
+ }
2083
+ }, _callee28, null, [[0, 11]]);
2084
+ }));
1958
2085
 
1959
- throw _context26.t0;
2086
+ return function (_x50, _x51) {
2087
+ return _ref14.apply(this, arguments);
2088
+ };
2089
+ }()));
1960
2090
 
1961
- case 28:
2091
+ case 15:
1962
2092
  case "end":
1963
- return _context26.stop();
2093
+ return _context29.stop();
1964
2094
  }
1965
2095
  }
1966
- }, _callee26, this, [[14, 22]]);
2096
+ }, _callee29, this);
1967
2097
  }));
1968
2098
 
1969
- function makeSecondaryChannelEventRequest(_x44, _x45) {
2099
+ function makeSecondaryChannelEventRequest(_x48, _x49) {
1970
2100
  return _makeSecondaryChannelEventRequest.apply(this, arguments);
1971
2101
  }
1972
2102
 
@@ -1979,9 +2109,9 @@ var SDK = /*#__PURE__*/function () {
1979
2109
  }, {
1980
2110
  key: "sendTypingIndicator",
1981
2111
  value: function () {
1982
- var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId, currentLiveChatVersion) {
2112
+ var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId, currentLiveChatVersion) {
1983
2113
  var _this$configuration$d16,
1984
- _this12 = this;
2114
+ _this16 = this;
1985
2115
 
1986
2116
  var sendTypingIndicatorOptionalParams,
1987
2117
  timer,
@@ -1992,26 +2122,26 @@ var SDK = /*#__PURE__*/function () {
1992
2122
  url,
1993
2123
  method,
1994
2124
  options,
1995
- _args28 = arguments;
1996
- return _regenerator["default"].wrap(function _callee28$(_context28) {
2125
+ _args31 = arguments;
2126
+ return _regenerator["default"].wrap(function _callee31$(_context31) {
1997
2127
  while (1) {
1998
- switch (_context28.prev = _context28.next) {
2128
+ switch (_context31.prev = _context31.next) {
1999
2129
  case 0:
2000
- sendTypingIndicatorOptionalParams = _args28.length > 2 && _args28[2] !== undefined ? _args28[2] : {};
2130
+ sendTypingIndicatorOptionalParams = _args31.length > 2 && _args31[2] !== undefined ? _args31[2] : {};
2001
2131
 
2002
2132
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2003
- _context28.next = 3;
2133
+ _context31.next = 3;
2004
2134
  break;
2005
2135
  }
2006
2136
 
2007
- return _context28.abrupt("return", Promise.resolve());
2137
+ return _context31.abrupt("return", Promise.resolve());
2008
2138
 
2009
2139
  case 3:
2010
2140
  timer = _Timer.Timer.TIMER();
2011
2141
  customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
2012
2142
 
2013
2143
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2014
- _context28.next = 7;
2144
+ _context31.next = 7;
2015
2145
  break;
2016
2146
  }
2017
2147
 
@@ -2035,63 +2165,63 @@ var SDK = /*#__PURE__*/function () {
2035
2165
  url: url,
2036
2166
  timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.sendTypingIndicator
2037
2167
  };
2038
- return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
2039
- var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
2168
+ return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
2169
+ var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
2040
2170
  var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds15;
2041
2171
 
2042
- return _regenerator["default"].wrap(function _callee27$(_context27) {
2172
+ return _regenerator["default"].wrap(function _callee30$(_context30) {
2043
2173
  while (1) {
2044
- switch (_context27.prev = _context27.next) {
2174
+ switch (_context30.prev = _context30.next) {
2045
2175
  case 0:
2046
- _context27.prev = 0;
2047
- _context27.next = 3;
2176
+ _context30.prev = 0;
2177
+ _context30.next = 3;
2048
2178
  return axiosInstance(options);
2049
2179
 
2050
2180
  case 3:
2051
- response = _context27.sent;
2181
+ response = _context30.sent;
2052
2182
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2053
2183
 
2054
- _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2184
+ _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2055
2185
 
2056
2186
  resolve();
2057
- _context27.next = 15;
2187
+ _context30.next = 15;
2058
2188
  break;
2059
2189
 
2060
2190
  case 9:
2061
- _context27.prev = 9;
2062
- _context27.t0 = _context27["catch"](0);
2191
+ _context30.prev = 9;
2192
+ _context30.t0 = _context30["catch"](0);
2063
2193
  _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2064
2194
 
2065
- _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context27.t0);
2195
+ _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context30.t0);
2066
2196
 
2067
- if (_context27.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
2197
+ if (_context30.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
2068
2198
  (0, _throwClientHTTPError["default"])();
2069
2199
  }
2070
2200
 
2071
- reject(_context27.t0);
2201
+ reject(_context30.t0);
2072
2202
 
2073
2203
  case 15:
2074
2204
  case "end":
2075
- return _context27.stop();
2205
+ return _context30.stop();
2076
2206
  }
2077
2207
  }
2078
- }, _callee27, null, [[0, 9]]);
2208
+ }, _callee30, null, [[0, 9]]);
2079
2209
  }));
2080
2210
 
2081
- return function (_x48, _x49) {
2082
- return _ref12.apply(this, arguments);
2211
+ return function (_x54, _x55) {
2212
+ return _ref15.apply(this, arguments);
2083
2213
  };
2084
2214
  }()));
2085
2215
 
2086
2216
  case 16:
2087
2217
  case "end":
2088
- return _context28.stop();
2218
+ return _context31.stop();
2089
2219
  }
2090
2220
  }
2091
- }, _callee28, this);
2221
+ }, _callee31, this);
2092
2222
  }));
2093
2223
 
2094
- function sendTypingIndicator(_x46, _x47) {
2224
+ function sendTypingIndicator(_x52, _x53) {
2095
2225
  return _sendTypingIndicator.apply(this, arguments);
2096
2226
  }
2097
2227
 
@@ -2099,13 +2229,13 @@ var SDK = /*#__PURE__*/function () {
2099
2229
  }()
2100
2230
  /**
2101
2231
  * Helper function for logging.
2102
- *
2232
+ *
2103
2233
  * @param logLevel Log level for logging.
2104
2234
  * @param telemetryEventType Telemetry event type in which event will be logged.
2105
2235
  * @param description Description of the event.
2106
2236
  * @param requestId Request ID
2107
2237
  * @param response Response
2108
- * @param elapsedTimeInMilliseconds Elapsed time in ms
2238
+ * @param elapsedTimeInMilliseconds Elapsed time in ms
2109
2239
  * @param requestPath Request path
2110
2240
  * @param method Method
2111
2241
  * @param error Error
@@ -2155,7 +2285,8 @@ var SDK = /*#__PURE__*/function () {
2155
2285
  RequestPayload: sanitizedRequestPayload
2156
2286
  };
2157
2287
  this.logger.log(logLevel, telemetryEventType, customData, description);
2158
- }
2288
+ } // eslint-disable-next-line @typescript-eslint/no-explicit-any
2289
+
2159
2290
  }]);
2160
2291
  return SDK;
2161
2292
  }();
@@ -2163,23 +2294,24 @@ var SDK = /*#__PURE__*/function () {
2163
2294
  exports["default"] = SDK;
2164
2295
  (0, _defineProperty2["default"])(SDK, "defaultRequestTimeoutConfig", {
2165
2296
  getChatConfig: 30000,
2166
- getLWIDetails: 5000,
2167
- getChatToken: 10000,
2168
- sessionInit: 5000,
2169
- sessionClose: 10000,
2170
- getReconnectableChats: 5000,
2171
- getReconnectAvailability: 5000,
2172
- submitPostChatResponse: 10000,
2173
- getSurveyInviteLink: 10000,
2297
+ getLWIDetails: 15000,
2298
+ getChatToken: 15000,
2299
+ sessionInit: 15000,
2300
+ sessionClose: 15000,
2301
+ getReconnectableChats: 15000,
2302
+ getReconnectAvailability: 15000,
2303
+ submitPostChatResponse: 15000,
2304
+ getSurveyInviteLink: 15000,
2174
2305
  getChatTranscripts: 30000,
2175
2306
  emailTranscript: 5000,
2176
- fetchDataMaskingInfo: 1000,
2177
- makeSecondaryChannelEventRequest: 5000,
2178
- getAgentAvailability: 5000,
2307
+ fetchDataMaskingInfo: 5000,
2308
+ makeSecondaryChannelEventRequest: 15000,
2309
+ getAgentAvailability: 15000,
2179
2310
  sendTypingIndicator: 5000,
2180
- validateAuthChatRecordTimeout: 5000
2311
+ validateAuthChatRecordTimeout: 15000
2181
2312
  });
2182
2313
  (0, _defineProperty2["default"])(SDK, "defaultConfiguration", {
2314
+ authCodeNonce: (0, _uuid.uuidv4)().substring(0, 8),
2183
2315
  getChatTokenRetryCount: 10,
2184
2316
  getChatTokenTimeBetweenRetriesOnFailure: 10000,
2185
2317
  getChatTokenRetryOn429: false,
@@ -2187,4 +2319,4 @@ exports["default"] = SDK;
2187
2319
  defaultRequestTimeout: undefined,
2188
2320
  requestTimeoutConfig: SDK.defaultRequestTimeoutConfig
2189
2321
  });
2190
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiaGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsImdldENoYXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIlYyIiwiR0VUQ0hBVENPTkZJR1NVQ0NFU1MiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsImdldExXSURldGFpbHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkVSUk9SIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwidW5kZWZpbmVkIiwiY29kZSIsImF4aW9zVGltZW91dEVycm9yQ29kZSIsImdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiY3VycmVudFJldHJ5Q291bnQiLCJjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIiwiR0VUQ0hBVFRPS0VOU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aCIsIkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aCIsInF1ZXJ5UGFyYW1zIiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5FcnJvciIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsInNldFRpbWVvdXQiLCJ0aGVuIiwiZXJyb3IiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFMiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJzZXNzaW9uSW5pdCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsImdldFN1cnZleUludml0ZUxpbmsiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztJ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QWEsRUFBRSxLQURrRDtBQUVqRWdCLEVBQUFBLGFBQWEsRUFBRSxJQUZrRDtBQUdqRW1CLEVBQUFBLFlBQVksRUFBRSxLQUhtRDtBQUlqRW1FLEVBQUFBLFdBQVcsRUFBRSxJQUpvRDtBQUtqRVUsRUFBQUEsWUFBWSxFQUFFLEtBTG1EO0FBTWpFNUQsRUFBQUEscUJBQXFCLEVBQUUsSUFOMEM7QUFPakVHLEVBQUFBLHdCQUF3QixFQUFFLElBUHVDO0FBUWpFd0UsRUFBQUEsc0JBQXNCLEVBQUUsS0FSeUM7QUFTakVZLEVBQUFBLG1CQUFtQixFQUFFLEtBVDRDO0FBVWpFWSxFQUFBQSxrQkFBa0IsRUFBRSxLQVY2QztBQVdqRVEsRUFBQUEsZUFBZSxFQUFFLElBWGdEO0FBWWpFSyxFQUFBQSxvQkFBb0IsRUFBRSxJQVoyQztBQWFqRVMsRUFBQUEsZ0NBQWdDLEVBQUUsSUFiK0I7QUFjakU5RSxFQUFBQSxvQkFBb0IsRUFBRSxJQWQyQztBQWVqRW9GLEVBQUFBLG1CQUFtQixFQUFFLElBZjRDO0FBZ0JqRTdELEVBQUFBLDZCQUE2QixFQUFFO0FBaEJrQyxDO2lDQURoRHhLLEcsMEJBb0JzQztBQUN2RDhGLEVBQUFBLHNCQUFzQixFQUFFLEVBRCtCO0FBRXZESSxFQUFBQSx1Q0FBdUMsRUFBRSxLQUZjO0FBR3ZEWCxFQUFBQSxzQkFBc0IsRUFBRSxLQUgrQjtBQUl2RDVDLEVBQUFBLDBCQUEwQixFQUFFLENBSjJCO0FBS3ZESyxFQUFBQSxxQkFBcUIsRUFBRXlCLFNBTGdDO0FBTXZEeEIsRUFBQUEsb0JBQW9CLEVBQUVqRCxHQUFHLENBQUM4UDtBQU42QixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IgZnJvbSBcIi4vVXRpbHMvdGhyb3dDbGllbnRIVFRQRXJyb3JcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDEwMDAwLFxuICAgIHNlc3Npb25Jbml0OiA1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTAwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiA1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxMDAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxMDAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogMTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiA1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogZmFsc2UsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDMsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWdcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbiAmJiBkYXRhLkxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cbiAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgIH1cbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VTUywgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBMV0kgRGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMV0lEZXRhaWxzKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICByZXF1ZXN0UGF0aCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGdldENoYXRUb2tlbkVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcblxuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGdldENoYXRUb2tlbkVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgLy8gU3RvcCByZXRyeSBvbiA0MjlcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgPT09IENvbnN0YW50cy50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlICYmICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJldHVybi9yZWplY3QgdG8gcmVjdXJzaXZlbHkgcmV0cnkgb24gZmFpbHVyZXMgdXAgdG8gY2hhdCB0b2tlbiByZXRyeSBjb3VudCBsaW1pdFxuICAgICAgfVxuXG4gICAgICAvLyBCYXNlIGNhc2VcbiAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCArIDEgPj0gdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnQpIHtcbiAgICAgICAgaWYgKGdldENoYXRUb2tlbkVycm9yICYmIGdldENoYXRUb2tlbkVycm9yLmNvZGUgPT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSByZXRyeSBmb3IgZ2V0Y2hhdHRva2VuIGhhcyBleGNlZWRlZCBpdHMgbWF4IHZhbHVlIG9mICR7dGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnR9YCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyB1bnRpbCBpdCByZWFjaGVzIGl0cyBsaW1pdFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZCwgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMsIGN1cnJlbnRSZXRyeUNvdW50ICsgMSkudGhlbigocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpKS5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgfSwgdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvbm5lY3RBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJjdXN0b21Db250ZXh0XCI6IHRlbXBBcnIgfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHsgXCJwb3J0YWxjb250YWN0aWRcIjogZGF0YS5wb3J0YWxjb250YWN0aWQgfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgc2Vzc2lvbiB0byBvbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25Jbml0KHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1RBUlRFRCwgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklUU1VDQ0VFREVELCBcIlNlc3Npb24gSW5pdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCBkYXRhKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVEZBSUxFRCwgXCJTZXNzaW9uIEluaXQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgZGF0YSk7XG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCwgXCJTZXNzaW9uIENsb3NlIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9O1xuXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiRW1haWwgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgcmVxdWVzdFBhdGggKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlbmRUeXBpbmdJbmRpY2F0b3JcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICogXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zIFxuICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggUmVxdWVzdCBwYXRoXG4gICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhXG4gICAqL1xuICBwcml2YXRlIGxvZ1dpdGhMb2dnZXIobG9nTGV2ZWw6IExvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGU6IE9DU0RLVGVsZW1ldHJ5RXZlbnQsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZywgcmVzcG9uc2U/OiBBeGlvc1Jlc3BvbnNlPGFueT4sIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM/OiBudW1iZXIsIHJlcXVlc3RQYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgcmVxdWVzdFBheWxvYWQ/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgUmVnaW9uOiByZXNwb25zZT8uZGF0YS5SZWdpb24sXG4gICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2U/LmhlYWRlcnNbQ29uc3RhbnRzLnRyYW5zYWN0aW9uaWRdLFxuICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvcixcbiAgICAgIFJlcXVlc3RQYXlsb2FkOiBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5sb2dnZXIubG9nKGxvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGUsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgfVxufVxuIl19
2322
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwiZ2V0Q2hhdENvbmZpZyIsInJlc3BvbnNlIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIm1pbGxpU2Vjb25kc0VsYXBzZWQiLCJkYXRhIiwiR0VUQ0hBVENPTkZJR1NVQ0NFU1MiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImhlYWRlck92ZXJ3cml0ZXMiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwiYXV0aGVudGljYXRlZFVzZXJUb2tlbiIsInJlY29ubmVjdElkIiwiZGVmYXVsdEhlYWRlcnMiLCJMaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsIm9wdGlvbnMiLCJnZXRMV0lEZXRhaWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJ1bmRlZmluZWQiLCJjb2RlIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiZW5kcG9pbnQiLCJxdWVyeVBhcmFtcyIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuRXJyb3IiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwidG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiV0FSTiIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsInNob3VsZFJldHJ5Iiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInNlc3Npb25Jbml0IiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlIiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsImxvZyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsImVtYWlsUmVxdWVzdEJvZHkiLCJlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsInNlbmRUeXBpbmdJbmRpY2F0b3IiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsImxvZ0xldmVsIiwidGVsZW1ldHJ5RXZlbnRUeXBlIiwiZGVzY3JpcHRpb24iLCJyZXF1ZXN0UGF5bG9hZCIsIkxvZ2dpbmdTYW5pdGl6ZXIiLCJzdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyIsInNhbml0aXplZFJlcXVlc3RQYXlsb2FkIiwic3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyIsInByZUNoYXRSZXNwb25zZSIsInN0cmlwUHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBHZW9sb2NhdGlvbiIsImN1c3RvbURhdGEiLCJSZXF1ZXN0SWQiLCJSZWdpb24iLCJFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwiVHJhbnNhY3Rpb25JZCIsInRyYW5zYWN0aW9uaWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJFeGNlcHRpb25EZXRhaWxzIiwiUmVxdWVzdFBheWxvYWQiLCJzdWJzdHJpbmciLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRXFCQSxHO0FBZ0NuQixlQUEyQkMsd0JBQTNCLEVBQW1MO0FBQUE7O0FBQUEsUUFBM0ZDLGFBQTJGLHVFQUF4REYsR0FBRyxDQUFDRyxvQkFBb0Q7QUFBQSxRQUF0QkMsTUFBc0I7QUFBQTtBQUFBLFNBQXhKSCx3QkFBd0osR0FBeEpBLHdCQUF3SjtBQUFBLFNBQTNGQyxhQUEyRixHQUEzRkEsYUFBMkY7QUFBQSxTQUF0QkUsTUFBc0IsR0FBdEJBLE1BQXNCO0FBQUE7QUFBQSwrREEya0N4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNKLGFBQUwsQ0FBbUJLLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENBQUVDLGFBQTVDO0FBQ0Q7QUFDRixLQS9rQ2tMOztBQUNqTDtBQUNBLFFBQUksQ0FBQ0UsTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS1AsYUFBakIsRUFBZ0NRLE1BQWpDLElBQTJDLHlCQUFRUixhQUFSLE1BQTJCLFFBQTFFLEVBQW9GO0FBQ2xGLFdBQUtBLGFBQUwsR0FBcUJGLEdBQUcsQ0FBQ0csb0JBQXpCO0FBQ0QsS0FKZ0wsQ0FNakw7OztBQUNBLG9DQUFrQkssTUFBTSxDQUFDQyxJQUFQLENBQVlULEdBQUcsQ0FBQ0csb0JBQWhCLENBQWxCLGtDQUF5RDtBQUFwRCxVQUFNUSxHQUFHLG1CQUFUOztBQUNILFVBQUksQ0FBQyxLQUFLVCxhQUFMLENBQW1CVSxjQUFuQixDQUFrQ0QsR0FBbEMsQ0FBTCxFQUE2QztBQUFFO0FBQzdDLGFBQUtULGFBQUwsV0FBc0JTLEdBQXRCLEtBQStCWCxHQUFHLENBQUNHLG9CQUFKLFdBQTRCUSxHQUE1QixFQUEvQjtBQUNEO0FBQ0YsS0FYZ0wsQ0Fhakw7OztBQUNBLHNDQUFrQkgsTUFBTSxDQUFDQyxJQUFQLENBQVlULEdBQUcsQ0FBQ0csb0JBQUosQ0FBeUIsc0JBQXpCLENBQVosQ0FBbEIscUNBQWlGO0FBQTVFLFVBQU1RLElBQUcscUJBQVQ7O0FBQ0gsVUFBSSxDQUFDLEtBQUtULGFBQUwsQ0FBbUIsc0JBQW5CLEVBQTJDVSxjQUEzQyxDQUEwREQsSUFBMUQsQ0FBTCxFQUFxRTtBQUFFO0FBQ3JFLGFBQUtULGFBQUwsQ0FBbUIsc0JBQW5CLFlBQThDUyxJQUE5QyxLQUF1RFgsR0FBRyxDQUFDRyxvQkFBSixDQUF5QixzQkFBekIsWUFBb0RRLElBQXBELEVBQXZEO0FBQ0Q7QUFDRixLQWxCZ0wsQ0FvQmpMOzs7QUFDQSxRQUFRRSxTQUFSLEdBQXNCWix3QkFBdEIsQ0FBUVksU0FBUjs7QUFDQSxRQUFJLENBQUNMLE1BQU0sQ0FBQ00sTUFBUCxDQUFjQyxnQkFBZCxFQUF5QkMsUUFBekIsQ0FBa0NILFNBQWxDLENBQUwsRUFBZ0U7QUFDOUQsWUFBTSxJQUFJSSxLQUFKLHFCQUFOO0FBQ0QsS0F4QmdMLENBMEJqTDs7O0FBQ0EsUUFBTUMseUNBQXlDLEdBQUdWLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZUix3QkFBWixDQUFsRDs7QUEzQmlMLCtDQTRCL0prQixzQkFBVUMsMENBNUJxSjtBQUFBOztBQUFBO0FBNEJqTCwwREFBd0U7QUFBQSxZQUE3RFQsS0FBNkQ7O0FBQ3RFLFlBQUksQ0FBQ08seUNBQXlDLENBQUNGLFFBQTFDLENBQW1ETCxLQUFuRCxDQUFMLEVBQThEO0FBQzVELGdCQUFNLElBQUlNLEtBQUosb0JBQXNCTixLQUF0QixtQ0FBTjtBQUNEO0FBQ0Y7QUFoQ2dMO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBa0NqTCxTQUFLVSxlQUFMLEdBQXVCQyx1QkFBZ0JDLEVBQXZDO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7Ozs7O3lHQUNFLGlCQUEyQkMsU0FBM0I7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOENDLGdCQUFBQSxXQUE5QywyREFBNEQsS0FBNUQ7QUFDUUMsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JDLGFBQXRELEVBQXFFLHlCQUFyRSxFQUFnR1QsU0FBaEc7O0FBQ0Esb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUtVLGdCQUFBQSxXQVBSLGNBTzBCQyxpQ0FBcUJDLGtCQVAvQyxjQU9xRSxLQUFLbkMsd0JBQUwsQ0FBOEJvQyxLQVBuRyxjQU80RyxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQVAxSSx3QkFPZ0tkLFNBUGhLLHdCQU91TCxLQUFLdkIsd0JBQUwsQ0FBOEJZLFNBUHJOO0FBUVEwQixnQkFBQUEsTUFSUixHQVFpQixLQVJqQjtBQVNRQyxnQkFBQUEsR0FUUixhQVNpQixLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxNQVQvQyxTQVN3RFAsV0FUeEQ7QUFVUVEsZ0JBQUFBLGFBVlIsR0FVd0JDLGtCQUFNQyxNQUFOLEVBVnhCO0FBV0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLM0MsYUFBTCxDQUFtQjRDO0FBQTlCLGlCQUExQjtBQUVJekMsZ0JBQUFBLE9BYk4sR0FhZ0IsRUFiaEI7O0FBY0Usb0JBQUlvQixXQUFKLEVBQWlCO0FBQ2ZwQixrQkFBQUEsT0FBTyxtQ0FBUWMsc0JBQVU0QixrQkFBbEIsR0FBeUMxQyxPQUF6QyxDQUFQO0FBQ0Q7O0FBaEJIO0FBQUEsdUJBaUJ5QnFDLGFBQWEsQ0FBQ00sR0FBZCxDQUFrQlIsR0FBbEIsRUFBdUI7QUFDNUNuQyxrQkFBQUEsT0FBTyxFQUFQQSxPQUQ0QztBQUU1QzRDLGtCQUFBQSxPQUFPLDJCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLHlFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q0M7QUFGakQsaUJBQXZCLENBakJ6Qjs7QUFBQTtBQWlCUUMsZ0JBQUFBLFFBakJSO0FBcUJRQyxnQkFBQUEseUJBckJSLEdBcUJvQzVCLEtBQUssQ0FBQzZCLG1CQXJCMUM7QUFzQlVDLGdCQUFBQSxJQXRCVixHQXNCbUJILFFBdEJuQixDQXNCVUcsSUF0QlY7O0FBd0JFLG9CQUFJQSxJQUFJLENBQUNsQyxlQUFULEVBQTBCO0FBQ3hCLHVCQUFLRCxlQUFMLEdBQXVCbUMsSUFBSSxDQUFDbEMsZUFBNUI7QUFDRDs7QUFFRGtDLGdCQUFBQSxJQUFJLENBQUNuRCxPQUFMLEdBQWUsRUFBZjs7QUFDQSxvQkFBSWdELFFBQVEsQ0FBQ2hELE9BQVQsSUFBb0JnRCxRQUFRLENBQUNoRCxPQUFULENBQWlCLE1BQWpCLENBQXhCLEVBQWtEO0FBQ2hEbUQsa0JBQUFBLElBQUksQ0FBQ25ELE9BQUwsQ0FBYSxNQUFiLElBQXVCZ0QsUUFBUSxDQUFDaEQsT0FBVCxDQUFpQixNQUFqQixDQUF2QjtBQUNEOztBQUNELHFCQUFLd0IsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J5QixvQkFBdEQsRUFBNEUsMkJBQTVFLEVBQXlHakMsU0FBekcsRUFBb0g2QixRQUFwSCxFQUE4SEMseUJBQTlILEVBQ0VwQixXQURGLEVBQ2VLLE1BRGY7QUFoQ0YsaURBbUNTaUIsSUFuQ1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFzQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7eUdBQ0Usa0JBQTJCaEMsU0FBM0I7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4Q2tDLGdCQUFBQSwyQkFBOUMsOERBQTBHLEVBQTFHO0FBQ1FoQyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjJCLG1CQUF0RCxFQUEyRSx5QkFBM0UsRUFBc0duQyxTQUF0Rzs7QUFFQSxvQkFBSSxDQUFDQSxTQUFMLEVBQWdCO0FBQ2RBLGtCQUFBQSxTQUFTLEdBQUcsbUJBQVo7QUFDRCxpQkFOSCxDQVFFOzs7QUFDSVUsZ0JBQUFBLFdBVE4sY0FTd0JDLGlDQUFxQnlCLCtCQVQ3QyxjQVNnRixLQUFLM0Qsd0JBQUwsQ0FBOEJvQyxLQVQ5RyxjQVN1SCxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQVRySixjQVNpS2QsU0FUaks7QUFVUWtCLGdCQUFBQSxhQVZSLEdBVXdCQyxrQkFBTUMsTUFBTixFQVZ4QjtBQVdFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVtQixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQ0MsbUNBQXVCdkQsYUFBeEIsQ0FBcEI7QUFBNERzQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUszQyxhQUFMLENBQW1CNEM7QUFBeEYsaUJBQTFCLEVBWEYsQ0FhRTs7QUFDUWlCLGdCQUFBQSxzQkFkVixHQWNrREwsMkJBZGxELENBY1VLLHNCQWRWLEVBY2tDQyxXQWRsQyxHQWNrRE4sMkJBZGxELENBY2tDTSxXQWRsQztBQWVRM0QsZ0JBQUFBLE9BZlIsR0FlNkJjLHNCQUFVOEMsY0FmdkMsRUFpQkU7O0FBQ0Esb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCN0Isa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCK0IsbUNBQTVCLGNBQW1FLEtBQUtqRSx3QkFBTCxDQUE4Qm9DLEtBQWpHLGNBQTBHLEtBQUtwQyx3QkFBTCxDQUE4QnFDLFFBQXhJLGNBQW9KZCxTQUFwSixDQUFYO0FBQ0FuQixrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCQyxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0ExRCxrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdkQsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNELGlCQXRCSCxDQXdCRTs7O0FBQ0Esb0JBQUl5RCxXQUFKLEVBQWlCO0FBQ2Y5QixrQkFBQUEsV0FBVyxlQUFROEIsV0FBUixDQUFYO0FBQ0Q7O0FBQ0Q5QixnQkFBQUEsV0FBVyx5QkFBa0IsS0FBS2pDLHdCQUFMLENBQThCWSxTQUFoRCxDQUFYO0FBRU0yQixnQkFBQUEsR0E5QlIsYUE4QmlCLEtBQUt2Qyx3QkFBTCxDQUE4QndDLE1BOUIvQyxTQThCd0RQLFdBOUJ4RDtBQStCUUssZ0JBQUFBLE1BL0JSLEdBK0JpQixLQS9CakI7QUFnQ1E0QixnQkFBQUEsT0FoQ1IsR0FnQ3NDO0FBQ2xDOUQsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDJFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q2lCO0FBSjNELGlCQWhDdEM7QUFBQSxrREF1Q1MsSUFBSUMsT0FBSjtBQUFBLDJHQUFZLGtCQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRN0IsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUZCw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSURuRCxRQUpDLEdBSVdnRCxRQUpYLENBSURoRCxPQUpDOztBQUtmLDRCQUFBLE1BQUksQ0FBQ21FLGdCQUFMLENBQXNCbkUsUUFBdEI7O0FBRUEsNEJBQUEsTUFBSSxDQUFDd0IsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J5QyxxQkFBdEQsRUFBNkUsMkJBQTdFLEVBQTBHakQsU0FBMUcsRUFBcUg2QixRQUFySCxFQUErSEMseUJBQS9ILEVBQTBKcEIsV0FBMUosRUFBdUtLLE1BQXZLOztBQUNBK0IsNEJBQUFBLE9BQU8sQ0FBQ2QsSUFBRCxDQUFQO0FBUmU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFVVEYsNEJBQUFBLDBCQVZTLEdBVW1CNUIsS0FBSyxDQUFDNkIsbUJBVnpCOztBQVdmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0IyQyxrQkFBdkQsRUFBMkUsd0JBQTNFLEVBQXFHbkQsU0FBckcsRUFBZ0hvRCxTQUFoSCxFQUEySHRCLDBCQUEzSCxFQUFzSnBCLFdBQXRKLEVBQW1LSyxNQUFuSzs7QUFDQSxnQ0FBSSxhQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sY0FBTjs7QUFmZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF2Q1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUEyREE7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7d0dBQ0Usa0JBQTBCL0MsU0FBMUI7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDdUQsZ0JBQUFBLDBCQUE3Qyw4REFBdUcsRUFBdkc7QUFBMkdDLGdCQUFBQSxpQkFBM0csOERBQXVJLENBQXZJO0FBQTZLO0FBQ3JLdEQsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFVW9DLGdCQUFBQSxXQUZWLEdBRTBFZSwwQkFGMUUsQ0FFVWYsV0FGVixFQUV1QkQsc0JBRnZCLEdBRTBFZ0IsMEJBRjFFLENBRXVCaEIsc0JBRnZCLEVBRStDa0Isc0JBRi9DLEdBRTBFRiwwQkFGMUUsQ0FFK0NFLHNCQUYvQztBQUdFLHFCQUFLcEQsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JrRCxtQkFBdEQsRUFBMkUsd0JBQTNFLEVBQXFHMUQsU0FBckc7O0FBSEYsc0JBS013RCxpQkFBaUIsR0FBRyxDQUwxQjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxzQkFNVSxJQUFJL0QsS0FBSiw2QkFOVjs7QUFBQTtBQVNFLG9CQUFJLENBQUNPLFNBQUwsRUFBZ0I7QUFDZEEsa0JBQUFBLFNBQVMsR0FBRyxtQkFBWjtBQUNEOztBQUVLbkIsZ0JBQUFBLE9BYlIsR0FhNkJjLHNCQUFVOEMsY0FidkM7QUFlUWtCLGdCQUFBQSxRQWZSLEdBZW1CLG1EQUEyQkYsc0JBQXNCLElBQXVCLEtBQUs1RCxlQUE3RSxFQUE4RjBDLHNCQUFzQixHQUFHLElBQUgsR0FBVSxLQUE5SCxDQWZuQjs7QUFpQkUsb0JBQUlBLHNCQUFKLEVBQTRCO0FBQzFCMUQsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QkMsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QnZELGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDRDs7QUFFRzJCLGdCQUFBQSxXQXRCTixjQXNCd0JpRCxRQXRCeEIsY0FzQm9DLEtBQUtsRix3QkFBTCxDQUE4Qm9DLEtBdEJsRSxjQXNCMkUsS0FBS3BDLHdCQUFMLENBQThCcUMsUUF0QnpHLGNBc0JxSGQsU0F0QnJIOztBQXdCRSxvQkFBSXdDLFdBQUosRUFBaUI7QUFDZjlCLGtCQUFBQSxXQUFXLGVBQVE4QixXQUFSLENBQVg7QUFDRDs7QUFFS29CLGdCQUFBQSxXQTVCUix1QkE0Qm1DLEtBQUtuRix3QkFBTCxDQUE4QlksU0E1QmpFO0FBNkJFcUIsZ0JBQUFBLFdBQVcsZUFBUWtELFdBQVIsQ0FBWDtBQUVNNUMsZ0JBQUFBLEdBL0JSLGFBK0JpQixLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxNQS9CL0MsU0ErQndEUCxXQS9CeEQ7QUFnQ1FLLGdCQUFBQSxNQWhDUixHQWdDaUIsS0FoQ2pCO0FBaUNRNEIsZ0JBQUFBLE9BakNSLEdBaUNzQztBQUNsQzlELGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDa0Msa0JBQUFBLE1BQU0sRUFBTkEsTUFGa0M7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSGtDO0FBSWxDUyxrQkFBQUEsT0FBTyw0QkFBRSxLQUFLL0MsYUFBTCxDQUFtQmdELHFCQUFyQiwyRUFBOEMsS0FBS2hELGFBQUwsQ0FBbUJpRCxvQkFBbkIsQ0FBd0NrQztBQUozRCxpQkFqQ3RDO0FBd0NRM0MsZ0JBQUFBLGFBeENSLEdBd0N3QkMsa0JBQU1DLE1BQU4sRUF4Q3hCO0FBeUNFLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVtQixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQ0MsbUNBQXVCdkQsYUFBeEIsQ0FBcEI7QUFBNERzQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUszQyxhQUFMLENBQW1CNEMsMEJBQXhGO0FBQW9Id0Msa0JBQUFBLFVBQVUsRUFBRSxLQUFLcEYsYUFBTCxDQUFtQnFGO0FBQW5KLGlCQUExQjtBQXpDRixrREEyQ1MsSUFBSWxCLE9BQUo7QUFBQSw0R0FBWSxrQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNiaUIsNEJBQUFBLGlCQURhLEdBQ09aLFNBRFA7QUFBQTtBQUFBO0FBQUEsbUNBR1FsQyxhQUFhLENBQUN5QixPQUFELENBSHJCOztBQUFBO0FBR1RkLDRCQUFBQSxRQUhTO0FBSVRDLDRCQUFBQSx5QkFKUyxHQUltQjVCLEtBQUssQ0FBQzZCLG1CQUp6QjtBQUtQQyw0QkFBQUEsSUFMTyxHQUtXSCxRQUxYLENBS1BHLElBTE8sRUFLRG5ELFNBTEMsR0FLV2dELFFBTFgsQ0FLRGhELE9BTEM7O0FBTWYsNEJBQUEsTUFBSSxDQUFDbUUsZ0JBQUwsQ0FBc0JuRSxTQUF0QixFQU5lLENBUWY7OztBQVJlLGlDQVNYbUQsSUFUVztBQUFBO0FBQUE7QUFBQTs7QUFVYkEsNEJBQUFBLElBQUksQ0FBQ2hDLFNBQUwsR0FBaUJBLFNBQWpCOztBQUVBLDRCQUFBLE1BQUksQ0FBQ0ssYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J5RCxxQkFBdEQsRUFBNkUsMEJBQTdFLEVBQXlHakUsU0FBekcsRUFBb0g2QixRQUFwSCxFQUE4SEMseUJBQTlILEVBQXlKcEIsV0FBekosRUFBc0tLLE1BQXRLOztBQUVBK0IsNEJBQUFBLE9BQU8sQ0FBQ2QsSUFBRCxDQUFQO0FBZGE7O0FBQUE7QUFBQSxrQ0FtQlhRLFdBQVcsSUFBSVgsUUFBUSxDQUFDcUMsTUFBVCxLQUFvQnZFLHNCQUFVd0UsbUJBbkJsQztBQUFBO0FBQUE7QUFBQTs7QUFvQmJwQiw0QkFBQUEsTUFBTSxDQUFDbEIsUUFBRCxDQUFOO0FBcEJhOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUF5QlRDLDRCQUFBQSwyQkF6QlMsR0F5Qm1CNUIsS0FBSyxDQUFDNkIsbUJBekJ6Qjs7QUEwQmYsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVM0QyxLQUE1QixFQUFtQzFDLDJCQUFvQjRELGtCQUF2RCxFQUEyRSx1QkFBM0UsRUFBb0dwRSxTQUFwRyxFQUErR29ELFNBQS9HLEVBQTBIdEIsMkJBQTFILEVBQXFKcEIsV0FBckosRUFBa0tLLE1BQWxLOztBQUNBaUQsNEJBQUFBLGlCQUFpQixlQUFqQixDQTNCZSxDQTZCZjs7QUE3QmUsa0NBOEJYLDJCQUFlbkMsUUFBZix3REFBeUJxQyxNQUF6QixNQUFvQ3ZFLHNCQUFVMEUseUJBQTlDLElBQTJFLENBQUMsTUFBSSxDQUFDM0YsYUFBTCxDQUFtQnFGLHNCQTlCcEY7QUFBQTtBQUFBO0FBQUE7O0FBOEI4RztBQUMzSGhCLDRCQUFBQSxNQUFNLGNBQU47QUEvQmE7O0FBQUE7QUFBQSxrQ0F1Q2JTLGlCQUFpQixHQUFHLENBQXBCLElBQXlCLE1BQUksQ0FBQzlFLGFBQUwsQ0FBbUI0RixzQkF2Qy9CO0FBQUE7QUFBQTtBQUFBOztBQXdDZixnQ0FBSU4saUJBQWlCLElBQUlBLGlCQUFpQixDQUFDWCxJQUFsQixJQUEwQjFELHNCQUFVMkQscUJBQTdELEVBQW9GO0FBQ2xGO0FBQ0QsNkJBRkQsTUFFTztBQUNMUCw4QkFBQUEsTUFBTSxDQUFDaUIsaUJBQUQsQ0FBTjtBQUNEOztBQTVDYzs7QUFBQTtBQWdEakI7QUFDQU8sNEJBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2YsOEJBQUEsTUFBSSxDQUFDVixZQUFMLENBQWtCN0QsU0FBbEIsRUFBNkJ1RCwwQkFBN0IsRUFBeURDLGlCQUFpQixHQUFHLENBQTdFLEVBQWdGZ0IsSUFBaEYsQ0FBcUYsVUFBQzNDLFFBQUQ7QUFBQSx1Q0FBY2lCLE9BQU8sQ0FBQ2pCLFFBQUQsQ0FBckI7QUFBQSwrQkFBckYsV0FBNEgsVUFBQzRDLEtBQUQ7QUFBQSx1Q0FBVzFCLE1BQU0sQ0FBQzBCLEtBQUQsQ0FBakI7QUFBQSwrQkFBNUg7QUFDRCw2QkFGUyxFQUVQLE1BQUksQ0FBQy9GLGFBQUwsQ0FBbUJnRyx1Q0FGWixDQUFWOztBQWpEaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBM0NUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBa0dBO0FBQ0Y7QUFDQTtBQUNBOzs7OztpSEFDRSxrQkFBbUNDLHdCQUFuQztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRekUsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFVW1DLGdCQUFBQSxzQkFGVixHQUVxQ29DLHdCQUZyQyxDQUVVcEMsc0JBRlY7QUFHRSxxQkFBS2xDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cb0UscUJBQXRELEVBQTZFLGdDQUE3RTtBQUVNbEUsZ0JBQUFBLFdBTFIsY0FLMEJDLGlDQUFxQmtFLGlDQUwvQyxjQUtvRixLQUFLcEcsd0JBQUwsQ0FBOEJvQyxLQUxsSCxjQUsySCxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUx6SixjQUtxSyxLQUFLckMsd0JBQUwsQ0FBOEJvQyxLQUxuTSx3QkFLc04sS0FBS3BDLHdCQUFMLENBQThCWSxTQUxwUDtBQU1RUixnQkFBQUEsT0FOUixHQU02QmMsc0JBQVU4QyxjQU52QztBQU9FNUQsZ0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QkMsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBMUQsZ0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QnZELGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFFTWlDLGdCQUFBQSxHQVZSLGFBVWlCLEtBQUt2Qyx3QkFBTCxDQUE4QndDLE1BVi9DLFNBVXdEUCxXQVZ4RDtBQVdRSyxnQkFBQUEsTUFYUixHQVdpQixLQVhqQjtBQVlRNEIsZ0JBQUFBLE9BWlIsR0FZc0M7QUFDbEM5RCxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ2tDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1Msa0JBQUFBLE9BQU8sNEJBQUUsS0FBSy9DLGFBQUwsQ0FBbUJnRCxxQkFBckIsMkVBQThDLEtBQUtoRCxhQUFMLENBQW1CaUQsb0JBQW5CLENBQXdDbUQ7QUFKM0QsaUJBWnRDO0FBbUJRNUQsZ0JBQUFBLGFBbkJSLEdBbUJ3QkMsa0JBQU1DLE1BQU4sRUFuQnhCO0FBcUJRcEIsZ0JBQUFBLFNBckJSLEdBcUJvQixLQUFLdkIsd0JBQUwsQ0FBOEJvQyxLQXJCbEQ7QUFBQSxrREF1QlMsSUFBSWdDLE9BQUo7QUFBQSw0R0FBWSxrQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CNUIsS0FBSyxDQUFDNkIsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSVdILFFBSlgsQ0FJUEcsSUFKTyxFQUlEbkQsU0FKQyxHQUlXZ0QsUUFKWCxDQUlEaEQsT0FKQzs7QUFLZiw0QkFBQSxNQUFJLENBQUNtRSxnQkFBTCxDQUFzQm5FLFNBQXRCLEVBTGUsQ0FPZjs7O0FBUGUsaUNBUVhtRCxJQVJXO0FBQUE7QUFBQTtBQUFBOztBQVNiLDRCQUFBLE1BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cb0UscUJBQXRELEVBQTZFLDREQUE3RSxFQUEySTVFLFNBQTNJLEVBQXNKNkIsUUFBdEosRUFBZ0tDLHlCQUFoSyxFQUEyTHBCLFdBQTNMLEVBQXdNSyxNQUF4TTs7QUFFQStCLDRCQUFBQSxPQUFPLENBQUNkLElBQUQsQ0FBUDtBQVhhOztBQUFBO0FBY2Y7QUFDQWMsNEJBQUFBLE9BQU87QUFmUTs7QUFBQTtBQUFBO0FBQUE7QUFrQlRoQiw0QkFBQUEsMkJBbEJTLEdBa0JtQjVCLEtBQUssQ0FBQzZCLG1CQWxCekI7O0FBbUJmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0JvRSxxQkFBdkQsRUFBOEUsZ0NBQTlFLEVBQWdINUUsU0FBaEgsRUFBMkhvRCxTQUEzSCxFQUFzSXRCLDJCQUF0SSxFQUFpS3BCLFdBQWpLLEVBQThLSyxNQUE5Szs7QUFDQSxnQ0FBSSxhQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sY0FBTjtBQXZCZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF2QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFvREE7QUFDRjtBQUNBO0FBQ0E7Ozs7O29IQUNFLGtCQUFzQ1AsV0FBdEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUXRDLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CdUUsd0JBQXRELEVBQWdGLHdDQUFoRjtBQUVNckUsZ0JBQUFBLFdBSlIsY0FJMEJDLGlDQUFxQnFFLGlDQUovQyxjQUlvRixLQUFLdkcsd0JBQUwsQ0FBOEJvQyxLQUpsSCxjQUkySCxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUp6SixjQUlxSzBCLFdBSnJLO0FBS1EzRCxnQkFBQUEsT0FMUixHQUs2QmMsc0JBQVU4QyxjQUx2QztBQU1RekIsZ0JBQUFBLEdBTlIsYUFNaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUFOL0MsU0FNd0RQLFdBTnhEO0FBT1FLLGdCQUFBQSxNQVBSLEdBT2lCLEtBUGpCO0FBUVE0QixnQkFBQUEsT0FSUixHQVFzQztBQUNsQzlELGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDa0Msa0JBQUFBLE1BQU0sRUFBTkEsTUFGa0M7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSGtDO0FBSWxDUyxrQkFBQUEsT0FBTyw0QkFBRSxLQUFLL0MsYUFBTCxDQUFtQmdELHFCQUFyQiwyRUFBOEMsS0FBS2hELGFBQUwsQ0FBbUJpRCxvQkFBbkIsQ0FBd0NzRDtBQUozRCxpQkFSdEM7QUFlUS9ELGdCQUFBQSxhQWZSLEdBZXdCQyxrQkFBTUMsTUFBTixFQWZ4QjtBQUFBLGtEQWdCUyxJQUFJeUIsT0FBSjtBQUFBLDRHQUFZLGtCQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRN0IsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUZCw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPOztBQUFBLGlDQUtYQSxJQUxXO0FBQUE7QUFBQTtBQUFBOztBQU1iLDRCQUFBLE1BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CdUUsd0JBQXRELEVBQWdGLHNDQUFoRixFQUF3SDNCLFNBQXhILEVBQW1JdkIsUUFBbkksRUFBNklDLHlCQUE3SSxFQUF3S3BCLFdBQXhLLEVBQXFMSyxNQUFyTDs7QUFFQStCLDRCQUFBQSxPQUFPLENBQUNkLElBQUQsQ0FBUDtBQVJhOztBQUFBO0FBV2Y7QUFDQSw0QkFBQSxNQUFJLENBQUMzQixhQUFMLENBQW1CQyxtQkFBUzRFLElBQTVCLEVBQWtDMUUsMkJBQW9CdUUsd0JBQXRELEVBQWdGLHVEQUFoRixFQUF5STNCLFNBQXpJLEVBQW9KdkIsUUFBcEosRUFBOEpDLHlCQUE5SixFQUF5THBCLFdBQXpMLEVBQXNNSyxNQUF0TTs7QUFFQStCLDRCQUFBQSxPQUFPO0FBZFE7O0FBQUE7QUFBQTtBQUFBO0FBaUJUaEIsNEJBQUFBLDJCQWpCUyxHQWlCbUI1QixLQUFLLENBQUM2QixtQkFqQnpCOztBQWtCZiw0QkFBQSxNQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBUzRDLEtBQTVCLEVBQW1DMUMsMkJBQW9CdUUsd0JBQXZELEVBQWlGLG1DQUFqRixFQUFzSDNCLFNBQXRILEVBQWlJQSxTQUFqSSxFQUE0SXRCLDJCQUE1SSxFQUF1S3BCLFdBQXZLLEVBQW9MSyxNQUFwTDs7QUFDQSxnQ0FBSSxhQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sY0FBTjtBQXRCZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFoQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE0Q0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0hBQ0UsbUJBQWtDL0MsU0FBbEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFEbUYsZ0JBQUFBLCtCQUFyRCxpRUFBNEgsRUFBNUg7QUFDUWpGLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEUsMkJBQXRELEVBQW1GLGdDQUFuRixFQUFxSHBGLFNBQXJIO0FBRU1VLGdCQUFBQSxXQUpSLGNBSTBCQyxpQ0FBcUIwRSx3QkFKL0MsY0FJMkUsS0FBSzVHLHdCQUFMLENBQThCb0MsS0FKekcsY0FJa0gsS0FBS3BDLHdCQUFMLENBQThCcUMsUUFKaEosY0FJNEpkLFNBSjVKO0FBS1FrQixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFNRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFbUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUNDLG1DQUF1QnZELGFBQXhCLENBQXBCO0FBQTREc0Msa0JBQUFBLE9BQU8sRUFBRSxLQUFLM0MsYUFBTCxDQUFtQjRDO0FBQXhGLGlCQUExQjtBQUVRaUIsZ0JBQUFBLHNCQVJWLEdBUThENEMsK0JBUjlELENBUVU1QyxzQkFSVixFQVFrQytDLFdBUmxDLEdBUThESCwrQkFSOUQsQ0FRa0NHLFdBUmxDLEVBUStDQyxVQVIvQyxHQVE4REosK0JBUjlELENBUStDSSxVQVIvQztBQVVRMUcsZ0JBQUFBLE9BVlIsR0FVNkJjLHNCQUFVOEMsY0FWdkM7O0FBWUUsb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCMUQsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QkMsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QnZELGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDRDs7QUFFS2lELGdCQUFBQSxJQWpCUixHQWlCNEJzRCxXQUFXLElBQUksRUFqQjNDO0FBbUJRRSxnQkFBQUEsT0FuQlIsR0FtQmtCO0FBQ2QsMkJBQVMsS0FBSy9HLHdCQUFMLENBQThCb0MsS0FEekI7QUFFZCw4QkFBWSxLQUFLcEMsd0JBQUwsQ0FBOEJxQztBQUY1QixpQkFuQmxCOztBQXdCRSxvQkFBSWtCLElBQUksSUFBSUEsSUFBSSxDQUFDeUQsaUJBQWpCLEVBQW9DO0FBQzVCQyxrQkFBQUEsT0FENEIsR0FDbEJDLHFDQUFrQkMsSUFBbEIsQ0FBdUI1RCxJQUFJLENBQUN5RCxpQkFBNUIsQ0FEa0I7QUFFbEN6RyxrQkFBQUEsTUFBTSxDQUFDNkcsTUFBUCxDQUFjTCxPQUFkLEVBQXVCO0FBQUUscUNBQWlCRTtBQUFuQixtQkFBdkI7QUFDRDs7QUFFRCxvQkFBSTFELElBQUksQ0FBQzhELGVBQVQsRUFBMEI7QUFDeEI5RyxrQkFBQUEsTUFBTSxDQUFDNkcsTUFBUCxDQUFjTCxPQUFkLEVBQXVCO0FBQUUsdUNBQW1CeEQsSUFBSSxDQUFDOEQ7QUFBMUIsbUJBQXZCO0FBQ0Q7O0FBRUQ5RCxnQkFBQUEsSUFBSSxDQUFDK0QsUUFBTCxHQUFnQkMsSUFBSSxDQUFDQyxVQUFMLENBQWdCLFFBQWhCLEVBQTBCQyxNQUExQixDQUFpQ0MsSUFBSSxDQUFDQyxTQUFMLENBQWVaLE9BQWYsQ0FBakMsRUFBMERhLE1BQTFELENBQWlFLEtBQWpFLEVBQXdFQyxRQUF4RSxFQUFoQjs7QUFqQ0Ysc0JBbUNNZixVQUFVLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ0MsUUFuQzVCO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQW9DVzNELE9BQU8sQ0FBQ0UsTUFBUixDQUFlLElBQUl0RCxLQUFKLGdEQUFmLENBcENYOztBQUFBO0FBdUNFLG9CQUFJOEYsVUFBSixFQUFnQjtBQUNkdkQsa0JBQUFBLElBQUksQ0FBQ3lFLE9BQUwsR0FBZUMseUJBQVlDLGNBQVosRUFBZjtBQUNBM0Usa0JBQUFBLElBQUksQ0FBQzRFLE1BQUwsR0FBY0MsdUJBQVdDLGFBQVgsRUFBZDtBQUNBOUUsa0JBQUFBLElBQUksQ0FBQytFLFNBQUwsR0FBaUJSLE1BQU0sQ0FBQ1MsUUFBUCxDQUFnQkMsSUFBakM7QUFDQWpGLGtCQUFBQSxJQUFJLENBQUNrRixFQUFMLEdBQVVDLGVBQU9DLFNBQVAsRUFBVjtBQUNEOztBQUVELG9CQUFJLENBQUNwRixJQUFJLENBQUNxRixNQUFWLEVBQWtCO0FBQ2hCckYsa0JBQUFBLElBQUksQ0FBQ3FGLE1BQUwsR0FBYzFILHNCQUFVMkgsYUFBeEI7QUFDRCxpQkFoREgsQ0FrREU7OztBQWxERixzQkFtRE10RixJQUFJLENBQUNxRixNQUFMLElBQWUsQ0FBQ0Usb0JBQVFDLGdCQUFSLENBQXlCaEksUUFBekIsQ0FBa0N3QyxJQUFJLENBQUNxRixNQUF2QyxDQW5EdEI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBb0RXeEUsT0FBTyxDQUFDRSxNQUFSLENBQWUsSUFBSXRELEtBQUosZ0NBQWtDdUMsSUFBSSxDQUFDcUYsTUFBdkMsT0FBZixDQXBEWDs7QUFBQTtBQXVEUXJHLGdCQUFBQSxHQXZEUixhQXVEaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUF2RC9DLFNBdUR3RFAsV0F2RHhEO0FBd0RRSyxnQkFBQUEsTUF4RFIsR0F3RGlCLE1BeERqQjtBQTBEUTRCLGdCQUFBQSxPQTFEUixHQTBEc0M7QUFDbENYLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDbkQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDJFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3QzhGO0FBTDNELGlCQTFEdEM7QUFBQSxtREFrRVMsSUFBSTVFLE9BQUo7QUFBQSw0R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CNUIsS0FBSyxDQUFDNkIsbUJBSHpCO0FBSVBDLDRCQUFBQSxLQUpPLEdBSVdILFFBSlgsQ0FJUEcsSUFKTyxFQUlEbkQsU0FKQyxHQUlXZ0QsUUFKWCxDQUlEaEQsT0FKQzs7QUFLZiw0QkFBQSxNQUFJLENBQUNtRSxnQkFBTCxDQUFzQm5FLFNBQXRCOztBQUVBLGdDQUFJbUQsS0FBSixFQUFVO0FBQ1IsOEJBQUEsTUFBSSxDQUFDM0IsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JrSCw2QkFBdEQsRUFBcUYsa0NBQXJGLEVBQXlIMUgsU0FBekgsRUFBb0k2QixRQUFwSSxFQUE4SUMseUJBQTlJLEVBQXlLcEIsV0FBekssRUFBc0xLLE1BQXRMOztBQUVBK0IsOEJBQUFBLE9BQU8sQ0FBQ2QsS0FBRCxDQUFQO0FBQ0Q7O0FBWGM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVEYsNEJBQUFBLDJCQWJTLEdBYW1CNUIsS0FBSyxDQUFDNkIsbUJBYnpCOztBQWNmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0JtSCwwQkFBdkQsRUFBbUYsK0JBQW5GLEVBQW9IM0gsU0FBcEgsRUFBK0hvRCxTQUEvSCxFQUEwSXRCLDJCQUExSSxFQUFxS3BCLFdBQXJLLEVBQWtMSyxNQUFsTDs7QUFDQSxnQ0FBSSxjQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sZUFBTjs7QUFsQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBbEVUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBeUZBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O3VHQUNFLG1CQUF5Qi9DLFNBQXpCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE0QzRILGdCQUFBQSx5QkFBNUMsaUVBQW9HLEVBQXBHO0FBQ1ExSCxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnFILGtCQUF0RCxFQUEwRSxzQkFBMUUsRUFBa0c3SCxTQUFsRztBQUNNa0IsZ0JBQUFBLGFBSFIsR0FHd0JDLGtCQUFNQyxNQUFOLEVBSHhCO0FBS0UsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJHLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzNDLGFBQUwsQ0FBbUI0QywwQkFESjtBQUV4QndHLGtCQUFBQSxXQUFXLEVBQUVDLG1DQUZXO0FBR3hCMUYsa0JBQUFBLGdCQUFnQixFQUFFLENBQUNDLG1DQUF1QnZELGFBQXhCO0FBSE0saUJBQTFCO0FBTVF5RCxnQkFBQUEsV0FYVixHQVcyRW9GLHlCQVgzRSxDQVdVcEYsV0FYVixFQVd1QkQsc0JBWHZCLEdBVzJFcUYseUJBWDNFLENBV3VCckYsc0JBWHZCLEVBVytDK0MsV0FYL0MsR0FXMkVzQyx5QkFYM0UsQ0FXK0N0QyxXQVgvQyxFQVc0REMsVUFYNUQsR0FXMkVxQyx5QkFYM0UsQ0FXNERyQyxVQVg1RDtBQVlRMUcsZ0JBQUFBLE9BWlIsR0FZNkJjLHNCQUFVOEMsY0FadkM7QUFhTS9CLGdCQUFBQSxXQWJOLGNBYXdCQyxpQ0FBcUJxSCx1QkFiN0MsY0Fhd0UsS0FBS3ZKLHdCQUFMLENBQThCb0MsS0FidEcsY0FhK0csS0FBS3BDLHdCQUFMLENBQThCcUMsUUFiN0ksY0FheUpkLFNBYnpKOztBQWNFLG9CQUFJdUMsc0JBQUosRUFBNEI7QUFDMUI3QixrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUJzSCwyQkFBNUIsY0FBMkQsS0FBS3hKLHdCQUFMLENBQThCb0MsS0FBekYsY0FBa0csS0FBS3BDLHdCQUFMLENBQThCcUMsUUFBaEksY0FBNElkLFNBQTVJLENBQVg7QUFDQW5CLGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJDLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ2RCxhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUQsb0JBQUl5RCxXQUFKLEVBQWlCO0FBQ2Y5QixrQkFBQUEsV0FBVyxlQUFROEIsV0FBUixDQUFYO0FBQ0Q7O0FBRUtvQixnQkFBQUEsV0F4QlIsdUJBd0JtQyxLQUFLbkYsd0JBQUwsQ0FBOEJZLFNBeEJqRTtBQXlCRXFCLGdCQUFBQSxXQUFXLGVBQVFrRCxXQUFSLENBQVg7QUFDTTVCLGdCQUFBQSxJQTFCUixHQTBCNEJzRCxXQUFXLElBQUksRUExQjNDOztBQUFBLHNCQTRCTUMsVUFBVSxJQUFJLENBQUNnQixNQUFNLENBQUNDLFFBNUI1QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREE2QlczRCxPQUFPLENBQUNFLE1BQVIsQ0FBZSxJQUFJdEQsS0FBSixnREFBZixDQTdCWDs7QUFBQTtBQStCRSxvQkFBSThGLFVBQUosRUFBZ0I7QUFDZHZELGtCQUFBQSxJQUFJLENBQUN5RSxPQUFMLEdBQWVDLHlCQUFZQyxjQUFaLEVBQWY7QUFDQTNFLGtCQUFBQSxJQUFJLENBQUM0RSxNQUFMLEdBQWNDLHVCQUFXQyxhQUFYLEVBQWQ7QUFDQTlFLGtCQUFBQSxJQUFJLENBQUMrRSxTQUFMLEdBQWlCUixNQUFNLENBQUNTLFFBQVAsQ0FBZ0JDLElBQWpDO0FBQ0FqRixrQkFBQUEsSUFBSSxDQUFDa0YsRUFBTCxHQUFVQyxlQUFPQyxTQUFQLEVBQVY7QUFDRCxpQkFwQ0gsQ0FzQ0U7OztBQUNBLG9CQUFJLENBQUNwRixJQUFJLENBQUNxRixNQUFWLEVBQWtCO0FBQ2hCckYsa0JBQUFBLElBQUksQ0FBQ3FGLE1BQUwsR0FBYzFILHNCQUFVMkgsYUFBeEI7QUFDRCxpQkF6Q0gsQ0EyQ0U7OztBQTNDRixzQkE0Q010RixJQUFJLENBQUNxRixNQUFMLElBQWUsQ0FBQ0Usb0JBQVFDLGdCQUFSLENBQXlCaEksUUFBekIsQ0FBa0N3QyxJQUFJLENBQUNxRixNQUF2QyxDQTVDdEI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBNkNXeEUsT0FBTyxDQUFDRSxNQUFSLENBQWUsSUFBSXRELEtBQUosZ0NBQWtDdUMsSUFBSSxDQUFDcUYsTUFBdkMsT0FBZixDQTdDWDs7QUFBQTtBQWdEUXJHLGdCQUFBQSxHQWhEUixhQWdEaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUFoRC9DLFNBZ0R3RFAsV0FoRHhEO0FBaURRSyxnQkFBQUEsTUFqRFIsR0FpRGlCLE1BakRqQjtBQWtEUTRCLGdCQUFBQSxPQWxEUixHQWtEc0M7QUFDbENYLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDbkQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDJFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q3VHO0FBTDNELGlCQWxEdEM7QUFBQSxtREEwRFMsSUFBSXJGLE9BQUo7QUFBQSw0R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CNUIsS0FBSyxDQUFDNkIsbUJBSHpCO0FBSVBsRCw0QkFBQUEsU0FKTyxHQUlLZ0QsUUFKTCxDQUlQaEQsT0FKTzs7QUFLZiw0QkFBQSxNQUFJLENBQUNtRSxnQkFBTCxDQUFzQm5FLFNBQXRCOztBQUVBLDRCQUFBLE1BQUksQ0FBQ3dCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CMkgsb0JBQXRELEVBQTRFLHdCQUE1RSxFQUFzR25JLFNBQXRHLEVBQWlINkIsUUFBakgsRUFBMkhDLHlCQUEzSCxFQUFzSnBCLFdBQXRKLEVBQW1LSyxNQUFuSyxFQUEyS3FDLFNBQTNLLEVBQXNMcEIsSUFBdEw7O0FBQ0FjLDRCQUFBQSxPQUFPO0FBUlE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFVVGhCLDRCQUFBQSwyQkFWUyxHQVVtQjVCLEtBQUssQ0FBQzZCLG1CQVZ6Qjs7QUFXZiw0QkFBQSxNQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBUzRDLEtBQTVCLEVBQW1DMUMsMkJBQW9CNEgsaUJBQXZELEVBQTBFLHFCQUExRSxFQUFpR3BJLFNBQWpHLEVBQTRHb0QsU0FBNUcsRUFBdUh0QiwyQkFBdkgsRUFBa0pwQixXQUFsSixFQUErSkssTUFBL0osaUJBQThLaUIsSUFBOUs7O0FBQ0EsZ0NBQUksY0FBTXFCLElBQU4sS0FBZTFELHNCQUFVMkQscUJBQTdCLEVBQW9EO0FBQ2xEO0FBQ0Q7O0FBQ0RQLDRCQUFBQSxNQUFNLGVBQU47O0FBZmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBMURUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBOEVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O3dHQUNFLG1CQUEwQi9DLFNBQTFCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkNxSSxnQkFBQUEsMEJBQTdDLGlFQUF1RyxFQUF2RztBQUNRbkksZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I4SCxtQkFBdEQsRUFBMkUsdUJBQTNFLEVBQW9HdEksU0FBcEc7QUFFSVUsZ0JBQUFBLFdBSk4sY0FJd0JDLGlDQUFxQjRILHdCQUo3QyxjQUl5RSxLQUFLOUosd0JBQUwsQ0FBOEJvQyxLQUp2RyxjQUlnSCxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUo5SSxjQUkwSmQsU0FKMUosd0JBSWlMLEtBQUt2Qix3QkFBTCxDQUE4QlksU0FKL007QUFLUTZCLGdCQUFBQSxhQUxSLEdBS3dCQyxrQkFBTUMsTUFBTixFQUx4QjtBQU1FLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVtQixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQ0MsbUNBQXVCdkQsYUFBeEIsQ0FBcEI7QUFBNERzQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUszQyxhQUFMLENBQW1CNEM7QUFBeEYsaUJBQTFCO0FBRVFpQixnQkFBQUEsc0JBUlYsR0FRZ0Y4RiwwQkFSaEYsQ0FRVTlGLHNCQVJWLEVBUWtDaUcsZUFSbEMsR0FRZ0ZILDBCQVJoRixDQVFrQ0csZUFSbEMsRUFRbURDLGdCQVJuRCxHQVFnRkosMEJBUmhGLENBUW1ESSxnQkFSbkQsRUFRcUVDLE1BUnJFLEdBUWdGTCwwQkFSaEYsQ0FRcUVLLE1BUnJFO0FBVVE3SixnQkFBQUEsT0FWUixHQVU2QmMsc0JBQVU4QyxjQVZ2QztBQVdRVCxnQkFBQUEsSUFYUixHQVdvQixFQVhwQixFQVd3Qjs7QUFDdEJBLGdCQUFBQSxJQUFJLENBQUMwRyxNQUFMLEdBQWNBLE1BQWQ7O0FBRUEsb0JBQUluRyxzQkFBSixFQUE0QjtBQUMxQjdCLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQmdJLDRCQUE1QixjQUE0RCxLQUFLbEssd0JBQUwsQ0FBOEJvQyxLQUExRixjQUFtRyxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUFqSSxjQUE2SWQsU0FBN0ksd0JBQW9LLEtBQUt2Qix3QkFBTCxDQUE4QlksU0FBbE0sQ0FBWDtBQUNBUixrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCQyxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0ExRCxrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdkQsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNEOztBQUVELG9CQUFJeUosZUFBSixFQUFxQjtBQUNuQjlILGtCQUFBQSxXQUFXLDJCQUFYO0FBQ0Q7O0FBRUQsb0JBQUkrSCxnQkFBSixFQUFzQjtBQUNwQi9ILGtCQUFBQSxXQUFXLDRCQUFYO0FBQ0Q7O0FBRUtNLGdCQUFBQSxHQTVCUixhQTRCaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUE1Qi9DLFNBNEJ3RFAsV0E1QnhEO0FBNkJRSyxnQkFBQUEsTUE3QlIsR0E2QmlCLE1BN0JqQjtBQThCUTRCLGdCQUFBQSxPQTlCUixHQThCc0M7QUFDbENYLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDbkQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDJFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q2lIO0FBTDNELGlCQTlCdEM7QUFBQSxtREFzQ1MsSUFBSS9GLE9BQUo7QUFBQSw0R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHUGhELDRCQUFBQSxTQUhPLEdBR0tnRCxRQUhMLENBR1BoRCxPQUhPOztBQUlmLDRCQUFBLE1BQUksQ0FBQ21FLGdCQUFMLENBQXNCbkUsU0FBdEI7O0FBRU1pRCw0QkFBQUEseUJBTlMsR0FNbUI1QixLQUFLLENBQUM2QixtQkFOekI7O0FBT2YsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JxSSxxQkFBdEQsRUFBNkUseUJBQTdFLEVBQXdHN0ksU0FBeEcsRUFBbUg2QixRQUFuSCxFQUE2SEMseUJBQTdILEVBQXdKcEIsV0FBeEosRUFBcUtLLE1BQXJLOztBQUVBK0IsNEJBQUFBLE9BQU87QUFUUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVdUaEIsNEJBQUFBLDJCQVhTLEdBV21CNUIsS0FBSyxDQUFDNkIsbUJBWHpCOztBQVlmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0JzSSxrQkFBdkQsRUFBMkUsc0JBQTNFLEVBQW1HOUksU0FBbkcsRUFBOEdvRCxTQUE5RyxFQUF5SHRCLDJCQUF6SCxFQUFvSnBCLFdBQXBKLEVBQWlLSyxNQUFqSzs7QUFDQSxnQ0FBSSxjQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sZUFBTjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBdENUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBMkRBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O2tIQUNFLG1CQUFvQy9DLFNBQXBDLEVBQXVEK0ksb0NBQXZEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1E3SSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQndJLDZCQUF0RCxFQUFxRixtQ0FBckYsRUFBMEhoSixTQUExSDtBQUVRdUMsZ0JBQUFBLHNCQUpWLEdBSTZDd0csb0NBSjdDLENBSVV4RyxzQkFKVixFQUlrQ21HLE1BSmxDLEdBSTZDSyxvQ0FKN0MsQ0FJa0NMLE1BSmxDO0FBS1FoSSxnQkFBQUEsV0FMUixjQUswQkMsaUNBQXFCc0kscUNBTC9DLGNBS3dGLEtBQUt4Syx3QkFBTCxDQUE4Qm9DLEtBTHRILGNBSytILEtBQUtwQyx3QkFBTCxDQUE4QnFDLFFBTDdKLGNBS3lLNEgsTUFMekssY0FLbUwxSSxTQUxuTCx3QkFLME0sS0FBS3ZCLHdCQUFMLENBQThCWSxTQUx4TztBQU1RNkIsZ0JBQUFBLGFBTlIsR0FNd0JDLGtCQUFNQyxNQUFOLEVBTnhCO0FBT0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRW1CLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDQyxtQ0FBdUJ2RCxhQUF4QixDQUFwQjtBQUE0RHNDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzNDLGFBQUwsQ0FBbUI0QztBQUF4RixpQkFBMUI7QUFDTXpDLGdCQUFBQSxPQVJSLEdBUTZCYyxzQkFBVThDLGNBUnZDOztBQVNFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQjFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJDLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ2RCxhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUtpQyxnQkFBQUEsR0FkUixhQWNpQixLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxNQWQvQyxTQWN3RFAsV0FkeEQ7QUFlUUssZ0JBQUFBLE1BZlIsR0FlaUIsS0FmakI7QUFnQlE0QixnQkFBQUEsT0FoQlIsR0FnQnNDO0FBQ2xDOUQsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDJFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q3VIO0FBSjNELGlCQWhCdEM7QUFBQSxtREF1QlMsSUFBSXJHLE9BQUo7QUFBQSw0R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHUGhELDRCQUFBQSxTQUhPLEdBR0tnRCxRQUhMLENBR1BoRCxPQUhPOztBQUlmLDRCQUFBLE1BQUksQ0FBQ21FLGdCQUFMLENBQXNCbkUsU0FBdEI7O0FBRU1pRCw0QkFBQUEseUJBTlMsR0FNbUI1QixLQUFLLENBQUM2QixtQkFOekI7O0FBT2YsZ0NBQUksbUJBQUFGLFFBQVEsQ0FBQ0csSUFBVCxrRUFBZW1ILGFBQWYsTUFBaUMsSUFBckMsRUFBMkM7QUFDekMsOEJBQUEsTUFBSSxDQUFDOUksYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I0SSwrQkFBdEQsRUFBdUYscUNBQXZGLEVBQThIcEosU0FBOUgsRUFBeUk2QixRQUF6SSxFQUFtSkMseUJBQW5KLEVBQThLcEIsV0FBOUssRUFBMkxLLE1BQTNMOztBQUVBK0IsOEJBQUFBLE9BQU8sQ0FBQ2pCLFFBQVEsQ0FBQ0csSUFBVixDQUFQO0FBQ0QsNkJBSkQsTUFJTztBQUNMLDhCQUFBLE1BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNkksNEJBQXRELEVBQW9GLG9GQUFwRixFQUEwS3JKLFNBQTFLLEVBQXFMNkIsUUFBckwsRUFBK0xDLHlCQUEvTCxFQUEwTnBCLFdBQTFOLEVBQXVPSyxNQUF2Tzs7QUFFQWdDLDhCQUFBQSxNQUFNLENBQUMsSUFBSXRELEtBQUosQ0FBVSxvRkFBVixDQUFELENBQU47QUFDRDs7QUFmYztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWlCVHFDLDRCQUFBQSwyQkFqQlMsR0FpQm1CNUIsS0FBSyxDQUFDNkIsbUJBakJ6Qjs7QUFtQmYsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVM0QyxLQUE1QixFQUFtQzFDLDJCQUFvQjZJLDRCQUF2RCxFQUFxRixrQ0FBckYsRUFBeUhySixTQUF6SCxFQUFvSW9ELFNBQXBJLEVBQStJdEIsMkJBQS9JLEVBQTBLcEIsV0FBMUssRUFBdUxLLE1BQXZMOztBQUVBLGdDQUFJLGNBQU1zQyxJQUFOLEtBQWUxRCxzQkFBVTJELHFCQUE3QixFQUFvRDtBQUNsRDtBQUNEOztBQUVELGdDQUFJLGNBQU1nRCxRQUFOLE9BQXFCLDRDQUF6QixFQUF1RTtBQUFFO0FBQ3ZFeEQsOEJBQUFBLE9BQU8sQ0FBQyxFQUFELENBQVA7QUFDRCw2QkFGRCxNQUVPO0FBQ0xDLDhCQUFBQSxNQUFNLGVBQU47QUFDRDs7QUE3QmM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBdkJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBeURBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7a0hBQ0UsbUJBQW9DL0MsU0FBcEMsRUFBdURzSixnQkFBdkQ7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUZDLGdCQUFBQSxvQ0FBakYsaUVBQStKLEVBQS9KO0FBQ1FySixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQmdKLHFCQUF0RCxFQUE2RSwwQkFBN0UsRUFBeUd4SixTQUF6RztBQUVJVSxnQkFBQUEsV0FKTixjQUl3QkMsaUNBQXFCOEksMEJBSjdDLGNBSTJFLEtBQUtoTCx3QkFBTCxDQUE4Qm9DLEtBSnpHLGNBSWtILEtBQUtwQyx3QkFBTCxDQUE4QnFDLFFBSmhKLGNBSTRKZCxTQUo1Six3QkFJbUwsS0FBS3ZCLHdCQUFMLENBQThCWSxTQUpqTjtBQUtRNkIsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBTUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRW1CLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDQyxtQ0FBdUJ2RCxhQUF4QixDQUFwQjtBQUE0RHNDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzNDLGFBQUwsQ0FBbUI0QztBQUF4RixpQkFBMUI7QUFFUWlCLGdCQUFBQSxzQkFSVixHQVFxQ2dILG9DQVJyQyxDQVFVaEgsc0JBUlY7QUFVUTFELGdCQUFBQSxPQVZSLEdBVTZCYyxzQkFBVThDLGNBVnZDOztBQVlFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQjdCLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQitJLDhCQUE1QixjQUE4RCxLQUFLakwsd0JBQUwsQ0FBOEJvQyxLQUE1RixjQUFxRyxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUFuSSxjQUErSWQsU0FBL0ksd0JBQXNLLEtBQUt2Qix3QkFBTCxDQUE4QlksU0FBcE0sQ0FBWDtBQUNBUixrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCQyxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0ExRCxrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdkQsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNEOztBQUVLaUMsZ0JBQUFBLEdBbEJSLGFBa0JpQixLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxNQWxCL0MsU0FrQndEUCxXQWxCeEQ7QUFtQlFLLGdCQUFBQSxNQW5CUixHQW1CaUIsTUFuQmpCO0FBb0JRNEIsZ0JBQUFBLE9BcEJSLEdBb0JzQztBQUNsQ1gsa0JBQUFBLElBQUksRUFBRW1FLElBQUksQ0FBQ0MsU0FBTCxDQUFla0QsZ0JBQWYsQ0FENEI7QUFFbEN6SyxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ2tDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1Msa0JBQUFBLE9BQU8sNkJBQUUsS0FBSy9DLGFBQUwsQ0FBbUJnRCxxQkFBckIsNkVBQThDLEtBQUtoRCxhQUFMLENBQW1CaUQsb0JBQW5CLENBQXdDZ0k7QUFMM0QsaUJBcEJ0QztBQUFBLG1EQTRCUyxJQUFJOUcsT0FBSjtBQUFBLDRHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRN0IsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUZCw0QkFBQUEsUUFGUztBQUdQaEQsNEJBQUFBLFNBSE8sR0FHS2dELFFBSEwsQ0FHUGhELE9BSE87O0FBSWYsNEJBQUEsT0FBSSxDQUFDbUUsZ0JBQUwsQ0FBc0JuRSxTQUF0Qjs7QUFFTWlELDRCQUFBQSx5QkFOUyxHQU1tQjVCLEtBQUssQ0FBQzZCLG1CQU56Qjs7QUFPZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQm9KLHVCQUF0RCxFQUErRSw0QkFBL0UsRUFBNkc1SixTQUE3RyxFQUF3SDZCLFFBQXhILEVBQWtJQyx5QkFBbEksRUFBNkpwQixXQUE3SixFQUEwS0ssTUFBMUs7O0FBRUErQiw0QkFBQUEsT0FBTztBQVRRO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBV1RoQiw0QkFBQUEsMkJBWFMsR0FXbUI1QixLQUFLLENBQUM2QixtQkFYekI7O0FBWWYsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVM0QyxLQUE1QixFQUFtQzFDLDJCQUFvQnFKLG9CQUF2RCxFQUE2RSx5QkFBN0UsRUFBd0c3SixTQUF4RyxFQUFtSG9ELFNBQW5ILEVBQThIdEIsMkJBQTlILEVBQXlKcEIsV0FBekosRUFBc0tLLE1BQXRLOztBQUNBLGdDQUFJLGNBQU1zQyxJQUFOLEtBQWUxRCxzQkFBVTJELHFCQUE3QixFQUFvRDtBQUNsRDtBQUNEOztBQUNEUCw0QkFBQUEsTUFBTSxlQUFOOztBQWhCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkE1QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFpREE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsrR0FDRSxtQkFBaUMrRyxhQUFqQyxFQUF3REMsMEJBQXhEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEZDLGdCQUFBQSxpQ0FBNUYsaUVBQW9LLEVBQXBLO0FBQ1E5SixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLeEIsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlxTCxHQUFaLENBQWdCM0osbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQjBKLDBCQUR0QixFQUVFO0FBQUVDLG9CQUFBQSxhQUFhLEVBQUVMO0FBQWpCLG1CQUZGLEVBR0UsZ0NBSEY7QUFJRDs7QUFDR3BKLGdCQUFBQSxXQVJOLGNBUXdCQyxpQ0FBcUJ5SiwrQkFSN0MsY0FRZ0YsS0FBSzNMLHdCQUFMLENBQThCb0MsS0FSOUcsY0FRdUhpSixhQVJ2SDtBQVNRNUksZ0JBQUFBLGFBVFIsR0FTd0JDLGtCQUFNQyxNQUFOLEVBVHhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRW1CLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDQyxtQ0FBdUJ2RCxhQUF4QixDQUFwQjtBQUE0RHNDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzNDLGFBQUwsQ0FBbUI0QztBQUF4RixpQkFBMUI7QUFFUWlCLGdCQUFBQSxzQkFaVixHQVlnRHlILGlDQVpoRCxDQVlVekgsc0JBWlYsRUFZa0N2QyxTQVpsQyxHQVlnRGdLLGlDQVpoRCxDQVlrQ2hLLFNBWmxDO0FBY1FuQixnQkFBQUEsT0FkUixHQWM2QmMsc0JBQVU4QyxjQWR2Qzs7QUFnQkUsb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCN0Isa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCMEosbUNBQTVCLGNBQW1FLEtBQUs1TCx3QkFBTCxDQUE4Qm9DLEtBQWpHLGNBQTBHaUosYUFBMUcsQ0FBWDtBQUNBakwsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QkMsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBMUQsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QnZELGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDQUYsa0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QmdJLFdBQXhCLENBQVAsR0FBOEMsS0FBSzdMLHdCQUFMLENBQThCcUMsUUFBNUU7QUFDRDs7QUFFRCxvQkFBSWQsU0FBSixFQUFlO0FBQ2JuQixrQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdEMsU0FBeEIsQ0FBUCxHQUE0Q0EsU0FBNUM7QUFDRDs7QUFFS2dCLGdCQUFBQSxHQTNCUixhQTJCaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUEzQi9DLFNBMkJ3RFAsV0EzQnhEO0FBNEJRSyxnQkFBQUEsTUE1QlIsR0E0QmlCLE1BNUJqQjtBQTZCUTRCLGdCQUFBQSxPQTdCUixHQTZCc0M7QUFDbENYLGtCQUFBQSxJQUFJLEVBQUVtRSxJQUFJLENBQUNDLFNBQUwsQ0FBZTJELDBCQUFmLENBRDRCO0FBRWxDbEwsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDZFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3QzRJO0FBTDNELGlCQTdCdEM7QUFBQSxtREFxQ1MsSUFBSTFILE9BQUo7QUFBQSw2R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHUEcsNEJBQUFBLElBSE8sR0FHV0gsUUFIWCxDQUdQRyxJQUhPLEVBR0RuRCxTQUhDLEdBR1dnRCxRQUhYLENBR0RoRCxPQUhDOztBQUlmLDRCQUFBLE9BQUksQ0FBQ21FLGdCQUFMLENBQXNCbkUsU0FBdEI7O0FBRU1pRCw0QkFBQUEseUJBTlMsR0FNbUI1QixLQUFLLENBQUM2QixtQkFOekI7O0FBT2YsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JnSyw0QkFBdEQsRUFBb0Ysa0NBQXBGLEVBQXdIeEssU0FBeEgsRUFBbUk2QixRQUFuSSxFQUE2SUMseUJBQTdJLEVBQXdLcEIsV0FBeEssRUFBcUxLLE1BQXJMOztBQUVBK0IsNEJBQUFBLE9BQU8sQ0FBQ2QsSUFBRCxDQUFQO0FBVGU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFXVEYsNEJBQUFBLDRCQVhTLEdBV21CNUIsS0FBSyxDQUFDNkIsbUJBWHpCOztBQVlmLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0JpSyx5QkFBdkQsRUFBa0YsK0JBQWxGLEVBQW1IekssU0FBbkgsRUFBOEhvRCxTQUE5SCxFQUF5SXRCLDRCQUF6SSxFQUFvS3BCLFdBQXBLLEVBQWlMSyxNQUFqTDs7QUFDQSxnQ0FBSSxjQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sZUFBTjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBckNUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBMERBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs4R0FDRSxtQkFBZ0MvQyxTQUFoQyxFQUFtRDBJLE1BQW5ELEVBQW1FZ0MsS0FBbkU7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrRkMsZ0JBQUFBLGdDQUFsRixpRUFBd0osRUFBeEo7QUFDUXpLLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cb0ssd0JBQXRELEVBQWdGLDZCQUFoRixFQUErRzVLLFNBQS9HO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUJrSyw2QkFKN0MsY0FJOEVuQyxNQUo5RSxjQUl3RjFJLFNBSnhGLHdCQUkrRyxLQUFLdkIsd0JBQUwsQ0FBOEJZLFNBSjdJO0FBS1E2QixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFNRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFbUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUNDLG1DQUF1QnZELGFBQXhCLENBQXBCO0FBQTREc0Msa0JBQUFBLE9BQU8sRUFBRSxLQUFLM0MsYUFBTCxDQUFtQjRDO0FBQXhGLGlCQUExQjtBQUVRaUIsZ0JBQUFBLHNCQVJWLEdBUTZEb0ksZ0NBUjdELENBUVVwSSxzQkFSVixFQVFrQ2tCLHNCQVJsQyxHQVE2RGtILGdDQVI3RCxDQVFrQ2xILHNCQVJsQztBQVVRNUUsZ0JBQUFBLE9BVlIsR0FVNkJjLHNCQUFVOEMsY0FWdkM7QUFXRTVELGdCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ3SSxjQUF4QixDQUFQLEdBQWlELEtBQUtyTSx3QkFBTCxDQUE4Qm9DLEtBQS9FO0FBQ0FoQyxnQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCZ0ksV0FBeEIsQ0FBUCxHQUE4QyxLQUFLN0wsd0JBQUwsQ0FBOEJxQyxRQUE1RTtBQUNBakMsZ0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QnlJLGFBQXhCLENBQVAsR0FBZ0RMLEtBQWhEOztBQUVBLG9CQUFJLEtBQUs3SyxlQUFMLEtBQXlCQyx1QkFBZ0JDLEVBQXpDLElBQWdEMEQsc0JBQXNCLElBQUlBLHNCQUFzQixLQUFLM0QsdUJBQWdCQyxFQUF6SCxFQUE4SDtBQUM1SFcsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCcUssK0JBQTVCLGNBQStEdEMsTUFBL0QsY0FBeUUxSSxTQUF6RSx3QkFBZ0csS0FBS3ZCLHdCQUFMLENBQThCWSxTQUE5SCxDQUFYOztBQUNBLHNCQUFJa0Qsc0JBQUosRUFBNEI7QUFDMUIxRCxvQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCQyxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0ExRCxvQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdkQsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBMkIsb0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCc0ssbUNBQTVCLGNBQW1FdkMsTUFBbkUsY0FBNkUxSSxTQUE3RSx3QkFBb0csS0FBS3ZCLHdCQUFMLENBQThCWSxTQUFsSSxDQUFYO0FBQ0Q7QUFDRixpQkFQRCxNQVFLLElBQUlrRCxzQkFBSixFQUE0QjtBQUMvQjFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJDLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ2RCxhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0EyQixrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUJ1SyxpQ0FBNUIsY0FBaUV4QyxNQUFqRSxjQUEyRTFJLFNBQTNFLHdCQUFrRyxLQUFLdkIsd0JBQUwsQ0FBOEJZLFNBQWhJLENBQVg7QUFDRDs7QUFFSzJCLGdCQUFBQSxHQTdCUixhQTZCaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUE3Qi9DLFNBNkJ3RFAsV0E3QnhEO0FBOEJRSyxnQkFBQUEsTUE5QlIsR0E4QmlCLEtBOUJqQjtBQStCUTRCLGdCQUFBQSxPQS9CUixHQStCc0M7QUFDbEM5RCxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ2tDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1Msa0JBQUFBLE9BQU8sNkJBQUUsS0FBSy9DLGFBQUwsQ0FBbUJnRCxxQkFBckIsNkVBQThDLEtBQUtoRCxhQUFMLENBQW1CaUQsb0JBQW5CLENBQXdDd0o7QUFKM0QsaUJBL0J0QztBQUFBLG1EQXNDUyxJQUFJdEksT0FBSjtBQUFBLDZHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRN0IsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUZCw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSURuRCxVQUpDLEdBSVdnRCxRQUpYLENBSURoRCxPQUpDOztBQUtmLDRCQUFBLE9BQUksQ0FBQ21FLGdCQUFMLENBQXNCbkUsVUFBdEI7O0FBRUEsNEJBQUEsT0FBSSxDQUFDd0IsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I0SywwQkFBdEQsRUFBa0YsK0JBQWxGLEVBQW1IcEwsU0FBbkgsRUFBOEg2QixRQUE5SCxFQUF3SUMseUJBQXhJLEVBQW1LcEIsV0FBbkssRUFBZ0xLLE1BQWhMOztBQUVBK0IsNEJBQUFBLE9BQU8sQ0FBQ2QsSUFBRCxDQUFQO0FBVGU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFXVEYsNEJBQUFBLDRCQVhTLEdBV21CNUIsS0FBSyxDQUFDNkIsbUJBWHpCOztBQVlmLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0I2Syx1QkFBdkQsRUFBZ0YsNEJBQWhGLEVBQThHckwsU0FBOUcsRUFBeUhvRCxTQUF6SCxFQUFvSXRCLDRCQUFwSSxFQUErSnBCLFdBQS9KLEVBQTRLSyxNQUE1Szs7QUFDQSxnQ0FBSSxjQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sZUFBTjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBdENUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBMkRBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsyR0FDRSxtQkFBNkIvQyxTQUE3QixFQUFnRDBLLEtBQWhELEVBQStEWSxnQkFBL0Q7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBeUZDLGdCQUFBQSw2QkFBekYsaUVBQXlKLEVBQXpKO0FBQ1FyTCxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQmdMLHNCQUF0RCxFQUE4RSwwQkFBOUUsRUFBMEd4TCxTQUExRztBQUVJVSxnQkFBQUEsV0FKTixjQUl3QkMsaUNBQXFCOEssa0NBSjdDLGNBSW1GekwsU0FKbkYsd0JBSTBHLEtBQUt2Qix3QkFBTCxDQUE4QlksU0FKeEk7QUFLUTZCLGdCQUFBQSxhQUxSLEdBS3dCQyxrQkFBTUMsTUFBTixFQUx4QjtBQU1FLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVtQixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQ0MsbUNBQXVCdkQsYUFBeEIsQ0FBcEI7QUFBNERzQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUszQyxhQUFMLENBQW1CNEM7QUFBeEYsaUJBQTFCO0FBRVFpQixnQkFBQUEsc0JBUlYsR0FRcUNnSiw2QkFSckMsQ0FRVWhKLHNCQVJWO0FBVVExRCxnQkFBQUEsT0FWUixHQVU2QmMsc0JBQVU4QyxjQVZ2QztBQVdFNUQsZ0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QndJLGNBQXhCLENBQVAsR0FBaUQsS0FBS3JNLHdCQUFMLENBQThCb0MsS0FBL0U7QUFDQWhDLGdCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJnSSxXQUF4QixDQUFQLEdBQThDLEtBQUs3TCx3QkFBTCxDQUE4QnFDLFFBQTVFO0FBQ0FqQyxnQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCeUksYUFBeEIsQ0FBUCxHQUFnREwsS0FBaEQ7O0FBRUEsb0JBQUluSSxzQkFBSixFQUE0QjtBQUMxQjFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJDLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ2RCxhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0EyQixrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUIrSyxzQ0FBNUIsY0FBc0UxTCxTQUF0RSx3QkFBNkYsS0FBS3ZCLHdCQUFMLENBQThCWSxTQUEzSCxDQUFYO0FBQ0Q7O0FBRUsyQixnQkFBQUEsR0FyQlIsYUFxQmlCLEtBQUt2Qyx3QkFBTCxDQUE4QndDLE1BckIvQyxTQXFCd0RQLFdBckJ4RDtBQXNCUUssZ0JBQUFBLE1BdEJSLEdBc0JpQixNQXRCakI7QUF1QlE0QixnQkFBQUEsT0F2QlIsR0F1QnNDO0FBQ2xDWCxrQkFBQUEsSUFBSSxFQUFFbUUsSUFBSSxDQUFDQyxTQUFMLENBQWVrRixnQkFBZixDQUQ0QjtBQUVsQ3pNLGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDa0Msa0JBQUFBLE1BQU0sRUFBTkEsTUFIa0M7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSmtDO0FBS2xDUyxrQkFBQUEsT0FBTyw2QkFBRSxLQUFLL0MsYUFBTCxDQUFtQmdELHFCQUFyQiw2RUFBOEMsS0FBS2hELGFBQUwsQ0FBbUJpRCxvQkFBbkIsQ0FBd0NnSztBQUwzRCxpQkF2QnRDO0FBQUEsbURBK0JTLElBQUk5SSxPQUFKO0FBQUEsNkdBQVksbUJBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE3QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRkLDRCQUFBQSxRQUZTO0FBR1BoRCw0QkFBQUEsVUFITyxHQUdLZ0QsUUFITCxDQUdQaEQsT0FITzs7QUFJZiw0QkFBQSxPQUFJLENBQUNtRSxnQkFBTCxDQUFzQm5FLFVBQXRCOztBQUVNaUQsNEJBQUFBLHlCQU5TLEdBTW1CNUIsS0FBSyxDQUFDNkIsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cb0wsd0JBQXRELEVBQWdGLDRCQUFoRixFQUE4RzVMLFNBQTlHLEVBQXlINkIsUUFBekgsRUFBbUlDLHlCQUFuSSxFQUE4SnBCLFdBQTlKLEVBQTJLSyxNQUEzSzs7QUFFQStCLDRCQUFBQSxPQUFPO0FBVFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFXVGhCLDRCQUFBQSw0QkFYUyxHQVdtQjVCLEtBQUssQ0FBQzZCLG1CQVh6Qjs7QUFZZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBUzRDLEtBQTVCLEVBQW1DMUMsMkJBQW9CcUwscUJBQXZELEVBQThFLHlCQUE5RSxFQUF5RzdMLFNBQXpHLEVBQW9Ib0QsU0FBcEgsRUFBK0h0Qiw0QkFBL0gsRUFBMEpwQixXQUExSixFQUF1S0ssTUFBdks7O0FBQ0EsZ0NBQUksY0FBTXNDLElBQU4sS0FBZTFELHNCQUFVMkQscUJBQTdCLEVBQW9EO0FBQ2xEO0FBQ0Q7O0FBQ0RQLDRCQUFBQSxNQUFNLGVBQU47O0FBaEJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQS9CVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQW9EQTtBQUNGO0FBQ0E7QUFDQTs7Ozs7Z0hBQ0UsbUJBQWtDL0MsU0FBbEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUUsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JzTCx1QkFBdEQsRUFBK0UsNEJBQS9FLEVBQTZHOUwsU0FBN0c7O0FBQ0Esb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUtVLGdCQUFBQSxXQVBSLGNBTzBCQyxpQ0FBcUJvTCxnQ0FQL0MsY0FPbUYsS0FBS3ROLHdCQUFMLENBQThCb0MsS0FQakg7QUFRUUssZ0JBQUFBLGFBUlIsR0FRd0JDLGtCQUFNQyxNQUFOLEVBUnhCO0FBU0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLM0MsYUFBTCxDQUFtQjRDO0FBQTlCLGlCQUExQjtBQUVNekMsZ0JBQUFBLE9BWFIsR0FXNkJjLHNCQUFVOEMsY0FYdkM7QUFZRTVELGdCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ3SSxjQUF4QixDQUFQLEdBQWlELEtBQUtyTSx3QkFBTCxDQUE4Qm9DLEtBQS9FO0FBQ0FoQyxnQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCdEMsU0FBeEIsQ0FBUCxHQUE0Q0EsU0FBNUM7QUFFTWdCLGdCQUFBQSxHQWZSLGFBZWlCLEtBQUt2Qyx3QkFBTCxDQUE4QndDLE1BZi9DLFNBZXdEUCxXQWZ4RDtBQWdCUUssZ0JBQUFBLE1BaEJSLEdBZ0JpQixLQWhCakI7QUFpQlE0QixnQkFBQUEsT0FqQlIsR0FpQnNDO0FBQ2xDOUQsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENrQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUsvQyxhQUFMLENBQW1CZ0QscUJBQXJCLDZFQUE4QyxLQUFLaEQsYUFBTCxDQUFtQmlELG9CQUFuQixDQUF3Q3FLO0FBSjNELGlCQWpCdEM7QUFBQSxtREF3QlMsSUFBSW5KLE9BQUo7QUFBQSw2R0FBWSxtQkFBT0MsT0FBUCxFQUFnQkMsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUTdCLGFBQWEsQ0FBQ3lCLE9BQUQsQ0FGckI7O0FBQUE7QUFFVGQsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CNUIsS0FBSyxDQUFDNkIsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSUVILFFBSkYsQ0FJUEcsSUFKTzs7QUFLZiw0QkFBQSxPQUFJLENBQUMzQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnlMLHlCQUF0RCxFQUFpRiw4QkFBakYsRUFBaUhqTSxTQUFqSCxFQUE0SDZCLFFBQTVILEVBQXNJQyx5QkFBdEksRUFBaUtwQixXQUFqSyxFQUE4S0ssTUFBOUs7O0FBRUErQiw0QkFBQUEsT0FBTyxDQUFDZCxJQUFELENBQVA7QUFQZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVNURiw0QkFBQUEsNEJBVFMsR0FTbUI1QixLQUFLLENBQUM2QixtQkFUekI7O0FBVWYsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVM0QyxLQUE1QixFQUFtQzFDLDJCQUFvQjBMLHNCQUF2RCxFQUErRSwyQkFBL0UsRUFBNEdsTSxTQUE1RyxFQUF1SG9ELFNBQXZILEVBQWtJdEIsNEJBQWxJLEVBQTZKcEIsV0FBN0osRUFBMEtLLE1BQTFLOztBQUNBLGdDQUFJLGNBQU1zQyxJQUFOLEtBQWUxRCxzQkFBVTJELHFCQUE3QixFQUFvRDtBQUNsRDtBQUNEOztBQUNEUCw0QkFBQUEsTUFBTSxlQUFOOztBQWRlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXhCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTJDQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzRIQUNFLG1CQUE4Qy9DLFNBQTlDLEVBQWlFbU0sZ0NBQWpFO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTJHQyxnQkFBQUEsbUNBQTNHLGlFQUF1TCxFQUF2TDtBQUNRbE0sZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I2TCxtQ0FBdEQsRUFBMkYseUNBQTNGLEVBQXNJck0sU0FBdEk7QUFFSVUsZ0JBQUFBLFdBSk4sY0FJd0JDLGlDQUFxQjJMLGlDQUo3QyxjQUlrRixLQUFLN04sd0JBQUwsQ0FBOEJvQyxLQUpoSCxjQUl5SCxLQUFLcEMsd0JBQUwsQ0FBOEJxQyxRQUp2SixjQUltS2QsU0FKbks7QUFLUWtCLGdCQUFBQSxhQUxSLEdBS3dCQyxrQkFBTUMsTUFBTixFQUx4QjtBQU1FLDRDQUFXRixhQUFYLEVBQTBCO0FBQUVtQixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQ0MsbUNBQXVCdkQsYUFBeEIsQ0FBcEI7QUFBNERzQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUszQyxhQUFMLENBQW1CNEM7QUFBeEYsaUJBQTFCO0FBRVFpQixnQkFBQUEsc0JBUlYsR0FRcUM2SixtQ0FSckMsQ0FRVTdKLHNCQVJWO0FBVVExRCxnQkFBQUEsT0FWUixHQVU2QmMsc0JBQVU4QyxjQVZ2QztBQVdFNUQsZ0JBQUFBLE9BQU8sQ0FBQ3lELG1DQUF1QndJLGNBQXhCLENBQVAsR0FBaUQsS0FBS3JNLHdCQUFMLENBQThCb0MsS0FBL0U7O0FBRUEsb0JBQUkwQixzQkFBSixFQUE0QjtBQUMxQjFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJDLHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQTFELGtCQUFBQSxPQUFPLENBQUN5RCxtQ0FBdUJ2RCxhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0EyQixrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUI0TCxxQ0FBNUIsY0FBcUUsS0FBSzlOLHdCQUFMLENBQThCb0MsS0FBbkcsY0FBNEcsS0FBS3BDLHdCQUFMLENBQThCcUMsUUFBMUksY0FBc0pkLFNBQXRKLENBQVg7QUFDRDs7QUFFRFUsZ0JBQUFBLFdBQVcsSUFBSSxnQkFBZ0JmLHNCQUFVNk0sZ0JBQXpDO0FBRU14TCxnQkFBQUEsR0FyQlIsYUFxQmlCLEtBQUt2Qyx3QkFBTCxDQUE4QndDLE1BckIvQyxTQXFCd0RQLFdBckJ4RDtBQXNCUUssZ0JBQUFBLE1BdEJSLEdBc0JpQixNQXRCakI7QUF1QlE0QixnQkFBQUEsT0F2QlIsR0F1QnNDO0FBQ2xDWCxrQkFBQUEsSUFBSSxFQUFFbUUsSUFBSSxDQUFDQyxTQUFMLENBQWUrRixnQ0FBZixDQUQ0QjtBQUVsQ3ROLGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDa0Msa0JBQUFBLE1BQU0sRUFBTkEsTUFIa0M7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSmtDO0FBS2xDUyxrQkFBQUEsT0FBTyw2QkFBRSxLQUFLL0MsYUFBTCxDQUFtQmdELHFCQUFyQiw2RUFBOEMsS0FBS2hELGFBQUwsQ0FBbUJpRCxvQkFBbkIsQ0FBd0M4SztBQUwzRCxpQkF2QnRDO0FBQUEsbURBK0JTLElBQUk1SixPQUFKO0FBQUEsNkdBQVksbUJBQU9DLE9BQVAsRUFBZ0JDLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVE3QixhQUFhLENBQUN5QixPQUFELENBRnJCOztBQUFBO0FBRVRkLDRCQUFBQSxRQUZTO0FBR1BoRCw0QkFBQUEsVUFITyxHQUdLZ0QsUUFITCxDQUdQaEQsT0FITzs7QUFJZiw0QkFBQSxPQUFJLENBQUNtRSxnQkFBTCxDQUFzQm5FLFVBQXRCOztBQUVNaUQsNEJBQUFBLHlCQU5TLEdBTW1CNUIsS0FBSyxDQUFDNkIsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Ca00scUNBQXRELEVBQTZGLDJDQUE3RixFQUEwSTFNLFNBQTFJLEVBQXFKNkIsUUFBckosRUFBK0pDLHlCQUEvSixFQUEwTHBCLFdBQTFMLEVBQXVNSyxNQUF2TTs7QUFDQStCLDRCQUFBQSxPQUFPO0FBUlE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFVVGhCLDRCQUFBQSw0QkFWUyxHQVVtQjVCLEtBQUssQ0FBQzZCLG1CQVZ6Qjs7QUFXZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBUzRDLEtBQTVCLEVBQW1DMUMsMkJBQW9CbU0sa0NBQXZELEVBQTJGLHdDQUEzRixFQUFxSTNNLFNBQXJJLEVBQWdKb0QsU0FBaEosRUFBMkp0Qiw0QkFBM0osRUFBc0xwQixXQUF0TCxFQUFtTUssTUFBbk07O0FBQ0EsZ0NBQUksY0FBTXNDLElBQU4sS0FBZTFELHNCQUFVMkQscUJBQTdCLEVBQW9EO0FBQ2xEO0FBQ0Q7O0FBQ0RQLDRCQUFBQSxNQUFNLGVBQU47O0FBZmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBL0JUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBbURBO0FBQ0Y7QUFDQTs7Ozs7K0dBQ0UsbUJBQWlDL0MsU0FBakMsRUFBb0R5RCxzQkFBcEQ7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBb0ZtSixnQkFBQUEsaUNBQXBGLGlFQUE0SixFQUE1Sjs7QUFBQSxzQkFFTSxDQUFDbkosc0JBQUQsSUFBMkJBLHNCQUFzQixLQUFLM0QsdUJBQWdCQyxFQUY1RTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREFHVzhDLE9BQU8sQ0FBQ0MsT0FBUixFQUhYOztBQUFBO0FBS1E1QyxnQkFBQUEsS0FMUixHQUtnQkMsYUFBTUMsS0FBTixFQUxoQjtBQU1VeU0sZ0JBQUFBLG1CQU5WLEdBTWtDRCxpQ0FObEMsQ0FNVUMsbUJBTlY7O0FBQUEsc0JBT00sQ0FBQ3BKLHNCQUFELElBQTJCQSxzQkFBc0IsS0FBSzNELHVCQUFnQkMsRUFQNUU7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBT3dGLElBQUlOLEtBQUosQ0FBVSwwQ0FBVixDQVB4Rjs7QUFBQTtBQVFRaUIsZ0JBQUFBLFdBUlIsY0FRMEJDLGlDQUFxQm1NLHVCQVIvQyxjQVEwRTlNLFNBUjFFO0FBU1FrQixnQkFBQUEsYUFUUixHQVN3QkMsa0JBQU1DLE1BQU4sRUFUeEI7QUFXUXZDLGdCQUFBQSxPQVhSLEdBVzZCYyxzQkFBVThDLGNBWHZDO0FBWUU1RCxnQkFBQUEsT0FBTyxDQUFDeUQsbUNBQXVCd0ksY0FBeEIsQ0FBUCxHQUFpRCxLQUFLck0sd0JBQUwsQ0FBOEJvQyxLQUEvRTs7QUFDQSxvQkFBSWdNLG1CQUFKLEVBQXlCO0FBQ3ZCaE8sa0JBQUFBLE9BQU8sQ0FBQ2Msc0JBQVVrTixtQkFBWCxDQUFQLEdBQXlDQSxtQkFBekM7QUFDRDs7QUFFSzdMLGdCQUFBQSxHQWpCUixhQWlCaUIsS0FBS3ZDLHdCQUFMLENBQThCd0MsTUFqQi9DLFNBaUJ3RFAsV0FqQnhEO0FBa0JRSyxnQkFBQUEsTUFsQlIsR0FrQmlCLE1BbEJqQjtBQW1CUTRCLGdCQUFBQSxPQW5CUixHQW1Cc0M7QUFDbEM5RCxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ2tDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1Msa0JBQUFBLE9BQU8sNkJBQUUsS0FBSy9DLGFBQUwsQ0FBbUJnRCxxQkFBckIsNkVBQThDLEtBQUtoRCxhQUFMLENBQW1CaUQsb0JBQW5CLENBQXdDb0w7QUFKM0QsaUJBbkJ0QztBQUFBLG1EQTBCUyxJQUFJbEssT0FBSjtBQUFBLDZHQUFZLG1CQUFPQyxPQUFQLEVBQWdCQyxNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRN0IsYUFBYSxDQUFDeUIsT0FBRCxDQUZyQjs7QUFBQTtBQUVUZCw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7O0FBSWYsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J3TSw0QkFBdEQsRUFBb0YsaUNBQXBGLEVBQXVIaE4sU0FBdkgsRUFBa0k2QixRQUFsSSxFQUE0SUMseUJBQTVJLEVBQXVLcEIsV0FBdkssRUFBb0xLLE1BQXBMOztBQUVBK0IsNEJBQUFBLE9BQU87QUFOUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVFUaEIsNEJBQUFBLDRCQVJTLEdBUW1CNUIsS0FBSyxDQUFDNkIsbUJBUnpCOztBQVVmLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTNEMsS0FBNUIsRUFBbUMxQywyQkFBb0J5TSx5QkFBdkQsRUFBa0YsOEJBQWxGLEVBQWtIak4sU0FBbEgsRUFBNkhvRCxTQUE3SCxFQUF3SXRCLDRCQUF4SSxFQUFtS3BCLFdBQW5LLEVBQWdMSyxNQUFoTDs7QUFFQSxnQ0FBSSxjQUFNc0MsSUFBTixLQUFlMUQsc0JBQVUyRCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRFAsNEJBQUFBLE1BQU0sZUFBTjs7QUFmZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkExQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE4Q0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztXQUNFLHVCQUFzQm1LLFFBQXRCLEVBQTBDQyxrQkFBMUMsRUFBbUZDLFdBQW5GLEVBQXdHcE4sU0FBeEcsRUFBNEg2QixRQUE1SCxFQUEySkMseUJBQTNKLEVBQStMcEIsV0FBL0wsRUFBcU5LLE1BQXJOLEVBQXNPMEQsS0FBdE8sRUFBdVA0SSxjQUF2UCxFQUFtUjtBQUFBOztBQUFFO0FBQ25SLFVBQUksQ0FBQyxLQUFLek8sTUFBVixFQUFrQjtBQUNoQjtBQUNEOztBQUNELFVBQUk2RixLQUFKLEVBQVc7QUFDVDZJLDJDQUFpQkMsNkJBQWpCLENBQStDOUksS0FBL0M7QUFDRDs7QUFFRCxVQUFJK0ksdUJBQXVCLEdBQUdwSyxTQUE5Qjs7QUFDQSxVQUFJaUssY0FBSixFQUFvQjtBQUNsQkcsUUFBQUEsdUJBQXVCLHFCQUFRSCxjQUFSLENBQXZCOztBQUNBLFlBQUlHLHVCQUF1QixDQUFDL0gsaUJBQTVCLEVBQStDO0FBQzdDNkgsNkNBQWlCRyw0QkFBakIsQ0FBOENELHVCQUF1QixDQUFDL0gsaUJBQXRFO0FBQ0Q7O0FBQ0QsWUFBSStILHVCQUF1QixDQUFDRSxlQUE1QixFQUE2QztBQUMzQ0osNkNBQWlCSyxvQkFBakIsQ0FBc0NILHVCQUF1QixDQUFDRSxlQUE5RDtBQUNEOztBQUNESiwyQ0FBaUJNLGdCQUFqQixDQUFrQ0osdUJBQWxDO0FBQ0Q7O0FBRUQsVUFBTUssVUFBVSxHQUFHO0FBQ2pCQyxRQUFBQSxTQUFTLEVBQUU5TixTQURNO0FBRWpCK04sUUFBQUEsTUFBTSxFQUFFbE0sUUFBRixhQUFFQSxRQUFGLHVCQUFFQSxRQUFRLENBQUVHLElBQVYsQ0FBZStMLE1BRk47QUFHakJDLFFBQUFBLHlCQUF5QixFQUFFbE0seUJBSFY7QUFJakJtTSxRQUFBQSxhQUFhLEVBQUVwTSxRQUFGLGFBQUVBLFFBQUYsdUJBQUVBLFFBQVEsQ0FBRWhELE9BQVYsQ0FBa0JjLHNCQUFVdU8sYUFBNUIsQ0FKRTtBQUtqQkMsUUFBQUEsV0FBVyxFQUFFek4sV0FMSTtBQU1qQjBOLFFBQUFBLGFBQWEsRUFBRXJOLE1BTkU7QUFPakJzTixRQUFBQSxrQkFBa0IsRUFBRXhNLFFBQVEsR0FBR0EsUUFBUSxDQUFDcUMsTUFBWixHQUFxQk8sS0FBSyxpQkFBSUEsS0FBRCxDQUFlNUMsUUFBbEIsK0NBQUcsV0FBeUJxQyxNQUE1QixHQUFxQ2QsU0FQMUU7QUFPcUY7QUFDdEdrTCxRQUFBQSxnQkFBZ0IsRUFBRTdKLEtBUkQ7QUFTakI4SixRQUFBQSxjQUFjLEVBQUVmO0FBVEMsT0FBbkI7QUFXQSxXQUFLNU8sTUFBTCxDQUFZcUwsR0FBWixDQUFnQmlELFFBQWhCLEVBQTBCQyxrQkFBMUIsRUFBOENVLFVBQTlDLEVBQTBEVCxXQUExRDtBQUNELEssQ0FFRDs7Ozs7OztpQ0ExbUNtQjVPLEcsaUNBQ2dEO0FBQ2pFb0QsRUFBQUEsYUFBYSxFQUFFLEtBRGtEO0FBRWpFZ0IsRUFBQUEsYUFBYSxFQUFFLEtBRmtEO0FBR2pFaUIsRUFBQUEsWUFBWSxFQUFFLEtBSG1EO0FBSWpFcUUsRUFBQUEsV0FBVyxFQUFFLEtBSm9EO0FBS2pFVSxFQUFBQSxZQUFZLEVBQUUsS0FMbUQ7QUFNakU5RCxFQUFBQSxxQkFBcUIsRUFBRSxLQU4wQztBQU9qRUcsRUFBQUEsd0JBQXdCLEVBQUUsS0FQdUM7QUFRakUwRSxFQUFBQSxzQkFBc0IsRUFBRSxLQVJ5QztBQVNqRVksRUFBQUEsbUJBQW1CLEVBQUUsS0FUNEM7QUFVakVZLEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFUSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVLLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFUyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRWhGLEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFc0YsRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEMUssRywwQkFvQnNDO0FBQ3ZETyxFQUFBQSxhQUFhLEVBQUUsb0JBQVN5UCxTQUFULENBQW1CLENBQW5CLEVBQXNCLENBQXRCLENBRHdDO0FBRXZEbEssRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRJLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkRYLEVBQUFBLHNCQUFzQixFQUFFLEtBSitCO0FBS3ZEekMsRUFBQUEsMEJBQTBCLEVBQUUsQ0FMMkI7QUFNdkRJLEVBQUFBLHFCQUFxQixFQUFFMEIsU0FOZ0M7QUFPdkR6QixFQUFBQSxvQkFBb0IsRUFBRW5ELEdBQUcsQ0FBQ2lRO0FBUDZCLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbm5lbElkLCBMaXZlQ2hhdFZlcnNpb24gfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9DU0RLVGVsZW1ldHJ5RXZlbnQgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IGF4aW9zUmV0cnkgZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeVwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VGltZW91dENvbmZpZyB9IGZyb20gXCIuL0NvbW1vbi9SZXF1ZXN0VGltZW91dENvbmZpZ1wiO1xuaW1wb3J0IHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvciBmcm9tIFwiLi9VdGlscy90aHJvd0NsaWVudEhUVFBFcnJvclwiO1xuaW1wb3J0IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIGZyb20gXCIuL1V0aWxzL1Nlc3Npb25Jbml0UmV0cnlIYW5kbGVyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWc6IFJlcXVlc3RUaW1lb3V0Q29uZmlnID0ge1xuICAgIGdldENoYXRDb25maWc6IDMwMDAwLFxuICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDE1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiAxNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogZmFsc2UsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDMsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWdcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cblxuICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgfVxuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIHJlcXVlc3RQYXRoICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1RBUlRFRCwgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSk7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5IH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBnZXRDaGF0VG9rZW5FcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcblxuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGdldENoYXRUb2tlbkVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgLy8gU3RvcCByZXRyeSBvbiA0MjlcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgPT09IENvbnN0YW50cy50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlICYmICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJldHVybi9yZWplY3QgdG8gcmVjdXJzaXZlbHkgcmV0cnkgb24gZmFpbHVyZXMgdXAgdG8gY2hhdCB0b2tlbiByZXRyeSBjb3VudCBsaW1pdFxuICAgICAgfVxuXG4gICAgICAvLyBCYXNlIGNhc2VcbiAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCArIDEgPj0gdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnQpIHtcbiAgICAgICAgaWYgKGdldENoYXRUb2tlbkVycm9yICYmIGdldENoYXRUb2tlbkVycm9yLmNvZGUgPT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChnZXRDaGF0VG9rZW5FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLldBUk4sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkIH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIsXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG59XG4iXX0=