@microsoft/ocsdk 0.4.3-main.22ebdb9 → 0.4.3-main.a9aebd3

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
@@ -86,11 +86,17 @@ var SDK = /*#__PURE__*/function () {
86
86
  this.configuration = configuration;
87
87
  this.logger = logger;
88
88
  (0, _defineProperty2["default"])(this, "liveChatVersion", void 0);
89
+ (0, _defineProperty2["default"])(this, "sessionId", void 0);
89
90
  (0, _defineProperty2["default"])(this, "setAuthCodeNonce", function (headers) {
90
91
  if (headers !== null && headers !== void 0 && headers.authcodenonce) {
91
92
  _this.configuration.authCodeNonce = headers === null || headers === void 0 ? void 0 : headers.authcodenonce;
92
93
  }
93
94
  });
95
+ (0, _defineProperty2["default"])(this, "setSessionIdHeader", function (sessionId, headers) {
96
+ if (sessionId) {
97
+ headers[_OmnichannelHTTPHeaders["default"].ocSessionId] = sessionId;
98
+ }
99
+ });
94
100
 
95
101
  // Sets to default configuration if passed configuration is empty or is not an object
96
102
  if (!Object.keys(this.configuration).length || (0, _typeof2["default"])(configuration) !== "object") {
@@ -261,6 +267,7 @@ var SDK = /*#__PURE__*/function () {
261
267
  authenticatedUserToken,
262
268
  reconnectId,
263
269
  headers,
270
+ params,
264
271
  url,
265
272
  method,
266
273
  options,
@@ -292,20 +299,34 @@ var SDK = /*#__PURE__*/function () {
292
299
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
293
300
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
294
301
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
295
- } // Append reconnect id on the endpoint if vailable
302
+ }
303
+
304
+ this.setSessionIdHeader(this.sessionId, headers);
305
+
306
+ if (!this.configuration.useUnauthReconnectIdSigQueryParam) {
307
+ // Append reconnect id on the endpoint if vailable
308
+ if (reconnectId) {
309
+ requestPath += "/".concat(reconnectId);
310
+ }
311
+ }
296
312
 
313
+ params = {
314
+ channelId: this.omnichannelConfiguration.channelId
315
+ };
297
316
 
298
- if (reconnectId) {
299
- requestPath += "/".concat(reconnectId);
317
+ if (this.configuration.useUnauthReconnectIdSigQueryParam) {
318
+ if (reconnectId) {
319
+ params.sig = reconnectId;
320
+ }
300
321
  }
301
322
 
302
- requestPath += "?channelId=".concat(this.omnichannelConfiguration.channelId);
303
323
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
304
324
  method = "GET";
305
325
  options = {
306
326
  headers: headers,
307
327
  method: method,
308
328
  url: url,
329
+ params: params,
309
330
  timeout: (_this$configuration$d2 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d2 !== void 0 ? _this$configuration$d2 : this.configuration.requestTimeoutConfig.getLWIDetails
310
331
  };
311
332
  return _context3.abrupt("return", new Promise( /*#__PURE__*/function () {
@@ -359,7 +380,7 @@ var SDK = /*#__PURE__*/function () {
359
380
  };
360
381
  }()));
361
382
 
362
- case 16:
383
+ case 18:
363
384
  case "end":
364
385
  return _context3.stop();
365
386
  }
@@ -396,7 +417,7 @@ var SDK = /*#__PURE__*/function () {
396
417
  headers,
397
418
  endpoint,
398
419
  requestPath,
399
- queryParams,
420
+ params,
400
421
  url,
401
422
  method,
402
423
  options,
@@ -435,23 +456,33 @@ var SDK = /*#__PURE__*/function () {
435
456
 
436
457
  requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
437
458
 
438
- if (reconnectId) {
439
- requestPath += "/".concat(reconnectId);
459
+ if (!this.configuration.useUnauthReconnectIdSigQueryParam) {
460
+ if (reconnectId) {
461
+ requestPath += "/".concat(reconnectId);
462
+ }
440
463
  }
441
464
 
442
- queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
465
+ params = {
466
+ channelId: this.omnichannelConfiguration.channelId
467
+ };
443
468
 
444
469
  if (refreshToken) {
445
- queryParams += "&refreshToken=true";
470
+ params.refreshToken = 'true';
471
+ }
472
+
473
+ if (this.configuration.useUnauthReconnectIdSigQueryParam) {
474
+ if (reconnectId) {
475
+ params.sig = reconnectId;
476
+ }
446
477
  }
447
478
 
448
- requestPath += "?".concat(queryParams);
449
479
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
450
480
  method = "GET";
451
481
  options = {
452
482
  headers: headers,
453
483
  method: method,
454
484
  url: url,
485
+ params: params,
455
486
  timeout: (_this$configuration$d3 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d3 !== void 0 ? _this$configuration$d3 : this.configuration.requestTimeoutConfig.getChatToken
456
487
  };
457
488
  axiosInstance = _axios["default"].create();
@@ -479,11 +510,17 @@ var SDK = /*#__PURE__*/function () {
479
510
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
480
511
  data = response.data, _headers2 = response.headers;
481
512
 
482
- _this3.setAuthCodeNonce(_headers2); // Resolves only if it contains chat token response which only happens on status 200
513
+ _this3.setAuthCodeNonce(_headers2);
514
+
515
+ if (_headers2) {
516
+ if (_headers2[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()]) {
517
+ _this3.sessionId = _headers2[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()];
518
+ }
519
+ } // Resolves only if it contains chat token response which only happens on status 200
483
520
 
484
521
 
485
522
  if (!data) {
486
- _context4.next = 13;
523
+ _context4.next = 14;
487
524
  break;
488
525
  }
489
526
 
@@ -494,21 +531,21 @@ var SDK = /*#__PURE__*/function () {
494
531
  resolve(data);
495
532
  return _context4.abrupt("return");
496
533
 
497
- case 13:
534
+ case 14:
498
535
  if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
499
- _context4.next = 16;
536
+ _context4.next = 17;
500
537
  break;
501
538
  }
502
539
 
503
540
  reject(response);
504
541
  return _context4.abrupt("return");
505
542
 
506
- case 16:
507
- _context4.next = 26;
543
+ case 17:
544
+ _context4.next = 27;
508
545
  break;
509
546
 
510
- case 18:
511
- _context4.prev = 18;
547
+ case 19:
548
+ _context4.prev = 19;
512
549
  _context4.t0 = _context4["catch"](1);
513
550
  _elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
514
551
 
@@ -517,7 +554,7 @@ var SDK = /*#__PURE__*/function () {
517
554
  getChatTokenError = _context4.t0; // Stop retry on 429
518
555
 
519
556
  if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this3.configuration.getChatTokenRetryOn429)) {
520
- _context4.next = 26;
557
+ _context4.next = 27;
521
558
  break;
522
559
  }
523
560
 
@@ -525,9 +562,9 @@ var SDK = /*#__PURE__*/function () {
525
562
  reject(_context4.t0);
526
563
  return _context4.abrupt("return");
527
564
 
528
- case 26:
565
+ case 27:
529
566
  if (!(currentRetryCount + 1 >= _this3.configuration.getChatTokenRetryCount)) {
530
- _context4.next = 29;
567
+ _context4.next = 30;
531
568
  break;
532
569
  }
533
570
 
@@ -539,7 +576,7 @@ var SDK = /*#__PURE__*/function () {
539
576
 
540
577
  return _context4.abrupt("return");
541
578
 
542
- case 29:
579
+ case 30:
543
580
  // Retries until it reaches its limit
544
581
  setTimeout(function () {
545
582
  _this3.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
@@ -549,12 +586,12 @@ var SDK = /*#__PURE__*/function () {
549
586
  });
550
587
  }, _this3.configuration.getChatTokenTimeBetweenRetriesOnFailure);
551
588
 
552
- case 30:
589
+ case 31:
553
590
  case "end":
554
591
  return _context4.stop();
555
592
  }
556
593
  }
557
- }, _callee4, null, [[1, 18]]);
594
+ }, _callee4, null, [[1, 19]]);
558
595
  }));
559
596
 
560
597
  return function (_x6, _x7) {
@@ -600,6 +637,7 @@ var SDK = /*#__PURE__*/function () {
600
637
  headers = _Constants["default"].defaultHeaders;
601
638
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
602
639
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
640
+ this.setSessionIdHeader(this.sessionId, headers);
603
641
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
604
642
  method = "GET";
605
643
  options = {
@@ -672,7 +710,7 @@ var SDK = /*#__PURE__*/function () {
672
710
  };
673
711
  }()));
674
712
 
675
- case 13:
713
+ case 14:
676
714
  case "end":
677
715
  return _context7.stop();
678
716
  }
@@ -707,6 +745,7 @@ var SDK = /*#__PURE__*/function () {
707
745
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnectable availability Started");
708
746
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatReconnectAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(reconnectId);
709
747
  headers = _Constants["default"].defaultHeaders;
748
+ this.setSessionIdHeader(this.sessionId, headers);
710
749
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
711
750
  method = "GET";
712
751
  options = {
@@ -777,7 +816,7 @@ var SDK = /*#__PURE__*/function () {
777
816
  };
778
817
  }()));
779
818
 
780
- case 9:
819
+ case 10:
781
820
  case "end":
782
821
  return _context9.stop();
783
822
  }
@@ -840,6 +879,7 @@ var SDK = /*#__PURE__*/function () {
840
879
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
841
880
  }
842
881
 
882
+ this.setSessionIdHeader(this.sessionId, headers);
843
883
  data = initContext || {};
844
884
  cachObj = {
845
885
  "orgId": this.omnichannelConfiguration.orgId,
@@ -862,13 +902,13 @@ var SDK = /*#__PURE__*/function () {
862
902
  data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
863
903
 
864
904
  if (!(getContext && !window.document)) {
865
- _context11.next = 16;
905
+ _context11.next = 17;
866
906
  break;
867
907
  }
868
908
 
869
909
  return _context11.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
870
910
 
871
- case 16:
911
+ case 17:
872
912
  if (getContext) {
873
913
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
874
914
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -882,13 +922,13 @@ var SDK = /*#__PURE__*/function () {
882
922
 
883
923
 
884
924
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
885
- _context11.next = 20;
925
+ _context11.next = 21;
886
926
  break;
887
927
  }
888
928
 
889
929
  return _context11.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
890
930
 
891
- case 20:
931
+ case 21:
892
932
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
893
933
  method = "POST";
894
934
  options = {
@@ -952,7 +992,7 @@ var SDK = /*#__PURE__*/function () {
952
992
  };
953
993
  }()));
954
994
 
955
- case 24:
995
+ case 25:
956
996
  case "end":
957
997
  return _context11.stop();
958
998
  }
@@ -988,7 +1028,7 @@ var SDK = /*#__PURE__*/function () {
988
1028
  getContext,
989
1029
  headers,
990
1030
  requestPath,
991
- queryParams,
1031
+ params,
992
1032
  data,
993
1033
  url,
994
1034
  method,
@@ -1017,22 +1057,34 @@ var SDK = /*#__PURE__*/function () {
1017
1057
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1018
1058
  }
1019
1059
 
1020
- if (reconnectId) {
1021
- requestPath += "/".concat(reconnectId);
1060
+ this.setSessionIdHeader(this.sessionId, headers);
1061
+
1062
+ if (!this.configuration.useUnauthReconnectIdSigQueryParam) {
1063
+ if (reconnectId) {
1064
+ requestPath += "/".concat(reconnectId);
1065
+ }
1066
+ }
1067
+
1068
+ params = {
1069
+ channelId: this.omnichannelConfiguration.channelId
1070
+ };
1071
+
1072
+ if (this.configuration.useUnauthReconnectIdSigQueryParam) {
1073
+ if (reconnectId) {
1074
+ params.sig = reconnectId;
1075
+ }
1022
1076
  }
1023
1077
 
1024
- queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
1025
- requestPath += "?".concat(queryParams);
1026
1078
  data = initContext || {};
1027
1079
 
1028
1080
  if (!(getContext && !window.document)) {
1029
- _context13.next = 15;
1081
+ _context13.next = 16;
1030
1082
  break;
1031
1083
  }
1032
1084
 
1033
1085
  return _context13.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1034
1086
 
1035
- case 15:
1087
+ case 16:
1036
1088
  if (getContext) {
1037
1089
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
1038
1090
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -1047,13 +1099,13 @@ var SDK = /*#__PURE__*/function () {
1047
1099
 
1048
1100
 
1049
1101
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
1050
- _context13.next = 19;
1102
+ _context13.next = 20;
1051
1103
  break;
1052
1104
  }
1053
1105
 
1054
1106
  return _context13.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1055
1107
 
1056
- case 19:
1108
+ case 20:
1057
1109
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1058
1110
  method = "POST";
1059
1111
  options = {
@@ -1061,6 +1113,7 @@ var SDK = /*#__PURE__*/function () {
1061
1113
  headers: headers,
1062
1114
  method: method,
1063
1115
  url: url,
1116
+ params: params,
1064
1117
  timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.sessionInit
1065
1118
  };
1066
1119
  return _context13.abrupt("return", new Promise( /*#__PURE__*/function () {
@@ -1114,7 +1167,7 @@ var SDK = /*#__PURE__*/function () {
1114
1167
  };
1115
1168
  }()));
1116
1169
 
1117
- case 23:
1170
+ case 24:
1118
1171
  case "end":
1119
1172
  return _context13.stop();
1120
1173
  }
@@ -1180,6 +1233,8 @@ var SDK = /*#__PURE__*/function () {
1180
1233
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1181
1234
  }
1182
1235
 
1236
+ this.setSessionIdHeader(this.sessionId, headers);
1237
+
1183
1238
  if (isReconnectChat) {
1184
1239
  requestPath += "&isReconnectChat=true";
1185
1240
  }
@@ -1250,7 +1305,7 @@ var SDK = /*#__PURE__*/function () {
1250
1305
  };
1251
1306
  }()));
1252
1307
 
1253
- case 17:
1308
+ case 18:
1254
1309
  case "end":
1255
1310
  return _context15.stop();
1256
1311
  }
@@ -1298,6 +1353,7 @@ var SDK = /*#__PURE__*/function () {
1298
1353
  headers[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
1299
1354
  }
1300
1355
 
1356
+ this.setSessionIdHeader(this.sessionId, headers);
1301
1357
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1302
1358
  method = "GET";
1303
1359
  options = {
@@ -1371,7 +1427,7 @@ var SDK = /*#__PURE__*/function () {
1371
1427
  };
1372
1428
  }()));
1373
1429
 
1374
- case 12:
1430
+ case 13:
1375
1431
  case "end":
1376
1432
  return _context17.stop();
1377
1433
  }
@@ -1560,6 +1616,8 @@ var SDK = /*#__PURE__*/function () {
1560
1616
  headers[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
1561
1617
  }
1562
1618
 
1619
+ this.setSessionIdHeader(this.sessionId, headers);
1620
+
1563
1621
  if (requestId) {
1564
1622
  headers[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
1565
1623
  }
@@ -1625,7 +1683,7 @@ var SDK = /*#__PURE__*/function () {
1625
1683
  };
1626
1684
  }()));
1627
1685
 
1628
- case 14:
1686
+ case 15:
1629
1687
  case "end":
1630
1688
  return _context21.stop();
1631
1689
  }
@@ -1698,6 +1756,7 @@ var SDK = /*#__PURE__*/function () {
1698
1756
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1699
1757
  }
1700
1758
 
1759
+ this.setSessionIdHeader(this.sessionId, headers);
1701
1760
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1702
1761
  method = "GET";
1703
1762
  options = {
@@ -1757,7 +1816,7 @@ var SDK = /*#__PURE__*/function () {
1757
1816
  };
1758
1817
  }()));
1759
1818
 
1760
- case 16:
1819
+ case 17:
1761
1820
  case "end":
1762
1821
  return _context23.stop();
1763
1822
  }
@@ -1821,6 +1880,7 @@ var SDK = /*#__PURE__*/function () {
1821
1880
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
1822
1881
  }
1823
1882
 
1883
+ this.setSessionIdHeader(this.sessionId, headers);
1824
1884
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1825
1885
  method = "POST";
1826
1886
  options = {
@@ -1882,7 +1942,7 @@ var SDK = /*#__PURE__*/function () {
1882
1942
  };
1883
1943
  }()));
1884
1944
 
1885
- case 16:
1945
+ case 17:
1886
1946
  case "end":
1887
1947
  return _context25.stop();
1888
1948
  }
@@ -1928,6 +1988,7 @@ var SDK = /*#__PURE__*/function () {
1928
1988
  headers = _Constants["default"].defaultHeaders;
1929
1989
  headers[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
1930
1990
  headers[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
1991
+ this.setSessionIdHeader(this.sessionId, headers);
1931
1992
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1932
1993
  method = "GET";
1933
1994
  options = {
@@ -1985,7 +2046,7 @@ var SDK = /*#__PURE__*/function () {
1985
2046
  };
1986
2047
  }()));
1987
2048
 
1988
- case 13:
2049
+ case 14:
1989
2050
  case "end":
1990
2051
  return _context27.stop();
1991
2052
  }
@@ -2046,6 +2107,7 @@ var SDK = /*#__PURE__*/function () {
2046
2107
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
2047
2108
  }
2048
2109
 
2110
+ this.setSessionIdHeader(this.sessionId, headers);
2049
2111
  requestPath += "?channelId=" + _Constants["default"].defaultChannelId;
2050
2112
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2051
2113
  method = "POST";
@@ -2108,7 +2170,7 @@ var SDK = /*#__PURE__*/function () {
2108
2170
  };
2109
2171
  }()));
2110
2172
 
2111
- case 15:
2173
+ case 16:
2112
2174
  case "end":
2113
2175
  return _context29.stop();
2114
2176
  }
@@ -2177,6 +2239,7 @@ var SDK = /*#__PURE__*/function () {
2177
2239
  headers[_Constants["default"].customerDisplayName] = customerDisplayName;
2178
2240
  }
2179
2241
 
2242
+ this.setSessionIdHeader(this.sessionId, headers);
2180
2243
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
2181
2244
  method = "POST";
2182
2245
  options = {
@@ -2233,7 +2296,7 @@ var SDK = /*#__PURE__*/function () {
2233
2296
  };
2234
2297
  }()));
2235
2298
 
2236
- case 16:
2299
+ case 17:
2237
2300
  case "end":
2238
2301
  return _context31.stop();
2239
2302
  }
@@ -2337,6 +2400,7 @@ exports["default"] = SDK;
2337
2400
  getChatTokenRetryOn429: false,
2338
2401
  maxRequestRetriesOnFailure: 3,
2339
2402
  defaultRequestTimeout: undefined,
2340
- requestTimeoutConfig: SDK.defaultRequestTimeoutConfig
2403
+ requestTimeoutConfig: SDK.defaultRequestTimeoutConfig,
2404
+ useUnauthReconnectIdSigQueryParam: false
2341
2405
  });
2342
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJHRVRDSEFUQ09ORklHU1VDQ0VERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwidW5kZWZpbmVkIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsIk9tbmljaGFubmVsSFRUUEhlYWRlcnMiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwib3B0aW9ucyIsImdldExXSURldGFpbHMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkVSUk9SIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiZW5kcG9pbnQiLCJxdWVyeVBhcmFtcyIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuRXJyb3IiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwidG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJjb2RlIiwic2V0VGltZW91dCIsInRoZW4iLCJlcnJvciIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUUyIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsImdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsImdldEFnZW50QXZhaWxhYmlsaXR5IiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzaG91bGRSZXRyeSIsInNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJzZXNzaW9uSW5pdCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsImdldFN1cnZleUludml0ZUxpbmsiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwic3Vic3RyaW5nIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFD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cUJBQXFCLEVBQUUsS0FOMEM7QUFPakVHLEVBQUFBLHdCQUF3QixFQUFFLEtBUHVDO0FBUWpFMEUsRUFBQUEsc0JBQXNCLEVBQUUsS0FSeUM7QUFTakVZLEVBQUFBLG1CQUFtQixFQUFFLEtBVDRDO0FBVWpFWSxFQUFBQSxrQkFBa0IsRUFBRSxLQVY2QztBQVdqRVEsRUFBQUEsZUFBZSxFQUFFLElBWGdEO0FBWWpFSyxFQUFBQSxvQkFBb0IsRUFBRSxJQVoyQztBQWFqRVMsRUFBQUEsZ0NBQWdDLEVBQUUsS0FiK0I7QUFjakVoRixFQUFBQSxvQkFBb0IsRUFBRSxLQWQyQztBQWVqRXNGLEVBQUFBLG1CQUFtQixFQUFFLElBZjRDO0FBZ0JqRTdELEVBQUFBLDZCQUE2QixFQUFFO0FBaEJrQyxDO2lDQURoRDVLLEcsMEJBb0JzQztBQUN2RE8sRUFBQUEsYUFBYSxFQUFFLG9CQUFTMlAsU0FBVCxDQUFtQixDQUFuQixFQUFzQixDQUF0QixDQUR3QztBQUV2RG5LLEVBQUFBLHNCQUFzQixFQUFFLEVBRitCO0FBR3ZESyxFQUFBQSx1Q0FBdUMsRUFBRSxLQUhjO0FBSXZEWixFQUFBQSxzQkFBc0IsRUFBRSxLQUorQjtBQUt2RDFDLEVBQUFBLDBCQUEwQixFQUFFLENBTDJCO0FBTXZESSxFQUFBQSxxQkFBcUIsRUFBRVMsU0FOZ0M7QUFPdkRSLEVBQUFBLG9CQUFvQixFQUFFbkQsR0FBRyxDQUFDbVE7QUFQNkIsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yIGZyb20gXCIuL1V0aWxzL3Rocm93Q2xpZW50SFRUUEVycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCBpc0V4cGVjdGVkQXhpb3NFcnJvciBmcm9tIFwiLi9VdGlscy9pc0V4cGVjdGVkQXhpb3NFcnJvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnOiBSZXF1ZXN0VGltZW91dENvbmZpZyA9IHtcbiAgICBnZXRDaGF0Q29uZmlnOiAzMDAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiAxNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDE1MDAwLFxuICAgIHNlc3Npb25Jbml0OiAxNTAwMCxcbiAgICBzZXNzaW9uQ2xvc2U6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxNTAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxNTAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogNTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTUwMDAsXG4gICAgZ2V0QWdlbnRBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDE1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGF1dGhDb2RlTm9uY2U6IHV1aWR2NCgpLnN1YnN0cmluZygwLCA4KSxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeUNvdW50OiAxMCxcbiAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IGZhbHNlLFxuICAgIG1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlOiAzLFxuICAgIGRlZmF1bHRSZXF1ZXN0VGltZW91dDogdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RUaW1lb3V0Q29uZmlnOiBTREsuZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb21uaWNoYW5uZWxDb25maWd1cmF0aW9uOiBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uLCBwcml2YXRlIGNvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uLCBwcml2YXRlIGxvZ2dlcj86IE9DU0RLTG9nZ2VyKSB7XG4gICAgLy8gU2V0cyB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgcGFzc2VkIGNvbmZpZ3VyYXRpb24gaXMgZW1wdHkgb3IgaXMgbm90IGFuIG9iamVjdFxuICAgIGlmICghT2JqZWN0LmtleXModGhpcy5jb25maWd1cmF0aW9uKS5sZW5ndGggfHwgdHlwZW9mIChjb25maWd1cmF0aW9uKSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIFNESyBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGluZGl2aWR1YWwgZW5kcG9pbnRUaW1lb3V0IGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFubmVsSWRcbiAgICBjb25zdCB7IGNoYW5uZWxJZCB9ID0gb21uaWNoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhDaGFubmVsSWQpLmluY2x1ZGVzKGNoYW5uZWxJZCBhcyBDaGFubmVsSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhbm5lbElkYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgT0MgY29uZmlnXG4gICAgY29uc3QgY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENvbnN0YW50cy5yZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICghY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gT21uaWNoYW5uZWxDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGU1RBUlRFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbmZpZ1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9P3JlcXVlc3RJZD0ke3JlcXVlc3RJZH0mY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbikge1xuICAgICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRURFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRkFJTEVELCBcIkdldCBDaGF0IGNvbmZpZyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBMV0kgRGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMV0lEZXRhaWxzKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIC8vIEV4dHJhY3QgYXV0aCB0b2tlbiBhbmQgcmVjb25uZWN0IGlkIGZyb20gb3B0aW9uYWwgcGFyYW1cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlY29ubmVjdElkIH0gPSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgLy8gdXBkYXRlZCBhdXRoIGVuZHBvaW50IGZvciBhdXRoZW50aWNhdGVkIGNoYXRzIGFuZCBhZGQgYXV0aCB0b2tlbiBpbiBoZWFkZXJcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICByZXF1ZXN0UGF0aCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlKTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBsZXQgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBxdWVyeVBhcmFtcyArPSBgJnJlZnJlc2hUb2tlbj10cnVlYDtcbiAgICB9XG5cbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGxldCBnZXRDaGF0VG9rZW5FcnJvcjphbnkgPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG5cbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsIFwiR2V0IENoYXQgVG9rZW4gc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBnZXRDaGF0VG9rZW5FcnJvciA9IGVycm9yO1xuXG4gICAgICAgIC8vIFN0b3AgcmV0cnkgb24gNDI5XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzID09PSBDb25zdGFudHMudG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByZXR1cm4vcmVqZWN0IHRvIHJlY3Vyc2l2ZWx5IHJldHJ5IG9uIGZhaWx1cmVzIHVwIHRvIGNoYXQgdG9rZW4gcmV0cnkgY291bnQgbGltaXRcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIGlmIChnZXRDaGF0VG9rZW5FcnJvciAmJiBnZXRDaGF0VG9rZW5FcnJvci5jb2RlID09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZ2V0Q2hhdFRva2VuRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyB1bnRpbCBpdCByZWFjaGVzIGl0cyBsaW1pdFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZCwgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMsIGN1cnJlbnRSZXRyeUNvdW50ICsgMSkudGhlbigocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpKS5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgfSwgdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIsXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yIDogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yIDogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNUQVJURUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiRW1haWwgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgcmVxdWVzdFBhdGggKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gbG9nTGV2ZWwgTG9nIGxldmVsIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gdGVsZW1ldHJ5RXZlbnRUeXBlIFRlbGVtZXRyeSBldmVudCB0eXBlIGluIHdoaWNoIGV2ZW50IHdpbGwgYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlXG4gICAqIEBwYXJhbSBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIEVsYXBzZWQgdGltZSBpbiBtc1xuICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggUmVxdWVzdCBwYXRoXG4gICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhXG4gICAqL1xuICBwcml2YXRlIGxvZ1dpdGhMb2dnZXIobG9nTGV2ZWw6IExvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGU6IE9DU0RLVGVsZW1ldHJ5RXZlbnQsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZywgcmVzcG9uc2U/OiBBeGlvc1Jlc3BvbnNlPGFueT4sIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM/OiBudW1iZXIsIHJlcXVlc3RQYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgcmVxdWVzdFBheWxvYWQ/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgUmVnaW9uOiByZXNwb25zZT8uZGF0YS5SZWdpb24sXG4gICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2U/LmhlYWRlcnNbQ29uc3RhbnRzLnRyYW5zYWN0aW9uaWRdLFxuICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBFeGNlcHRpb25EZXRhaWxzOiBlcnJvcixcbiAgICAgIFJlcXVlc3RQYXlsb2FkOiBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZFxuICAgIH07XG4gICAgdGhpcy5sb2dnZXIubG9nKGxvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGUsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0QXV0aENvZGVOb25jZSA9IChoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoaGVhZGVycz8uYXV0aGNvZGVub25jZSkge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UgPSBoZWFkZXJzPy5hdXRoY29kZW5vbmNlO1xuICAgIH1cbiAgfVxufVxuIl19
2406
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJnZXQiLCJ0aW1lb3V0IiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0IiwicmVxdWVzdFRpbWVvdXRDb25maWciLCJnZXRDaGF0Q29uZmlnIiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJHRVRDSEFUQ09ORklHU1VDQ0VERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwidW5kZWZpbmVkIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJzZXRTZXNzaW9uSWRIZWFkZXIiLCJ1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0iLCJwYXJhbXMiLCJzaWciLCJvcHRpb25zIiwiZ2V0TFdJRGV0YWlscyIsInJlc29sdmUiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyIsImN1cnJlbnRSZXRyeUNvdW50IiwiY3VycmVudExpdmVDaGF0VmVyc2lvbiIsInJlZnJlc2hUb2tlbiIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuRXJyb3IiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImNvZGUiLCJzZXRUaW1lb3V0IiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiV0FSTiIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsInNob3VsZFJldHJ5Iiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInNlc3Npb25Jbml0IiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlIiwiU1VCTUlUUE9TVENIQVRTVUNDRUVERUQiLCJTVUJNSVRQT1NUQ0hBVEZBSUxFRCIsInN1cnZleU93bmVySWQiLCJzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSIsImdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyIsImxvZyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsImVtYWlsUmVxdWVzdEJvZHkiLCJlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJGRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVEIiwiRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCIsInNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5Iiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsInNlbmRUeXBpbmdJbmRpY2F0b3IiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsImxvZ0xldmVsIiwidGVsZW1ldHJ5RXZlbnRUeXBlIiwiZGVzY3JpcHRpb24iLCJyZXF1ZXN0UGF5bG9hZCIsIkxvZ2dpbmdTYW5pdGl6ZXIiLCJzdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyIsInNhbml0aXplZFJlcXVlc3RQYXlsb2FkIiwic3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyIsInByZUNoYXRSZXNwb25zZSIsInN0cmlwUHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBHZW9sb2NhdGlvbiIsImN1c3RvbURhdGEiLCJSZXF1ZXN0SWQiLCJSZWdpb24iLCJFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwiVHJhbnNhY3Rpb25JZCIsInRyYW5zYWN0aW9uaWQiLCJSZXF1ZXN0UGF0aCIsIlJlcXVlc3RNZXRob2QiLCJSZXNwb25zZVN0YXR1c0NvZGUiLCJFeGNlcHRpb25EZXRhaWxzIiwiUmVxdWVzdFBheWxvYWQiLCJzdWJzdHJpbmciLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBR3FCQSxHO0FBa0NuQixlQUEyQkMsd0JBQTNCLEVBQW1MO0FBQUE7O0FBQUEsUUFBM0ZDLGFBQTJGLHVFQUF4REYsR0FBRyxDQUFDRyxvQkFBb0Q7QUFBQSxRQUF0QkMsTUFBc0I7QUFBQTtBQUFBLFNBQXhKSCx3QkFBd0osR0FBeEpBLHdCQUF3SjtBQUFBLFNBQTNGQyxhQUEyRixHQUEzRkEsYUFBMkY7QUFBQSxTQUF0QkUsTUFBc0IsR0FBdEJBLE1BQXNCO0FBQUE7QUFBQTtBQUFBLCtEQXNxQ3hKLFVBQUNDLE9BQUQsRUFBa0I7QUFDM0MsVUFBSUEsT0FBSixhQUFJQSxPQUFKLGVBQUlBLE9BQU8sQ0FBRUMsYUFBYixFQUE0QjtBQUMxQixRQUFBLEtBQUksQ0FBQ0osYUFBTCxDQUFtQkssYUFBbkIsR0FBbUNGLE9BQW5DLGFBQW1DQSxPQUFuQyx1QkFBbUNBLE9BQU8sQ0FBRUMsYUFBNUM7QUFDRDtBQUNGLEtBMXFDa0w7QUFBQSxpRUE2cUN0SixVQUFDRSxTQUFELEVBQWdDSCxPQUFoQyxFQUFpRDtBQUM1RSxVQUFJRyxTQUFKLEVBQWU7QUFDYkgsUUFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJDLFdBQXhCLENBQVAsR0FBOENGLFNBQTlDO0FBQ0Q7QUFDRixLQWpyQ2tMOztBQUNqTDtBQUNBLFFBQUksQ0FBQ0csTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS1YsYUFBakIsRUFBZ0NXLE1BQWpDLElBQTJDLHlCQUFRWCxhQUFSLE1BQTJCLFFBQTFFLEVBQW9GO0FBQ2xGLFdBQUtBLGFBQUwsR0FBcUJGLEdBQUcsQ0FBQ0csb0JBQXpCO0FBQ0QsS0FKZ0wsQ0FNakw7OztBQUNBLG9DQUFrQlEsTUFBTSxDQUFDQyxJQUFQLENBQVlaLEdBQUcsQ0FBQ0csb0JBQWhCLENBQWxCLGtDQUF5RDtBQUFwRCxVQUFNVyxHQUFHLG1CQUFUOztBQUNILFVBQUksQ0FBQyxLQUFLWixhQUFMLENBQW1CYSxjQUFuQixDQUFrQ0QsR0FBbEMsQ0FBTCxFQUE2QztBQUFFO0FBQzdDLGFBQUtaLGFBQUwsV0FBc0JZLEdBQXRCLEtBQStCZCxHQUFHLENBQUNHLG9CQUFKLFdBQTRCVyxHQUE1QixFQUEvQjtBQUNEO0FBQ0YsS0FYZ0wsQ0Fhakw7OztBQUNBLHNDQUFrQkgsTUFBTSxDQUFDQyxJQUFQLENBQVlaLEdBQUcsQ0FBQ0csb0JBQUosQ0FBeUIsc0JBQXpCLENBQVosQ0FBbEIscUNBQWlGO0FBQTVFLFVBQU1XLElBQUcscUJBQVQ7O0FBQ0gsVUFBSSxDQUFDLEtBQUtaLGFBQUwsQ0FBbUIsc0JBQW5CLEVBQTJDYSxjQUEzQyxDQUEwREQsSUFBMUQsQ0FBTCxFQUFxRTtBQUFFO0FBQ3JFLGFBQUtaLGFBQUwsQ0FBbUIsc0JBQW5CLFlBQThDWSxJQUE5QyxLQUF1RGQsR0FBRyxDQUFDRyxvQkFBSixDQUF5QixzQkFBekIsWUFBb0RXLElBQXBELEVBQXZEO0FBQ0Q7QUFDRixLQWxCZ0wsQ0FvQmpMOzs7QUFDQSxRQUFRRSxTQUFSLEdBQXNCZix3QkFBdEIsQ0FBUWUsU0FBUjs7QUFDQSxRQUFJLENBQUNMLE1BQU0sQ0FBQ00sTUFBUCxDQUFjQyxnQkFBZCxFQUF5QkMsUUFBekIsQ0FBa0NILFNBQWxDLENBQUwsRUFBZ0U7QUFDOUQsWUFBTSxJQUFJSSxLQUFKLHFCQUFOO0FBQ0QsS0F4QmdMLENBMEJqTDs7O0FBQ0EsUUFBTUMseUNBQXlDLEdBQUdWLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZWCx3QkFBWixDQUFsRDs7QUEzQmlMLCtDQTRCL0pxQixzQkFBVUMsMENBNUJxSjtBQUFBOztBQUFBO0FBNEJqTCwwREFBd0U7QUFBQSxZQUE3RFQsS0FBNkQ7O0FBQ3RFLFlBQUksQ0FBQ08seUNBQXlDLENBQUNGLFFBQTFDLENBQW1ETCxLQUFuRCxDQUFMLEVBQThEO0FBQzVELGdCQUFNLElBQUlNLEtBQUosb0JBQXNCTixLQUF0QixtQ0FBTjtBQUNEO0FBQ0Y7QUFoQ2dMO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBa0NqTCxTQUFLVSxlQUFMLEdBQXVCQyx1QkFBZ0JDLEVBQXZDO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7Ozs7O3lHQUNFLGlCQUEyQkMsU0FBM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4Q0MsZ0JBQUFBLFdBQTlDLDJEQUE0RCxLQUE1RDtBQUNRQyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQkMscUJBQXRELEVBQTZFLHlCQUE3RSxFQUF3R1QsU0FBeEc7O0FBQ0Esb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUtVLGdCQUFBQSxXQVBSLGNBTzBCQyxpQ0FBcUJDLGtCQVAvQyxjQU9xRSxLQUFLdEMsd0JBQUwsQ0FBOEJ1QyxLQVBuRyxjQU80RyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQVAxSSx3QkFPZ0tkLFNBUGhLLHdCQU91TCxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBUHJOO0FBUVEwQixnQkFBQUEsTUFSUixHQVFpQixLQVJqQjtBQVNRQyxnQkFBQUEsR0FUUixhQVNpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQVQvQyxTQVN3RFAsV0FUeEQ7QUFVUVEsZ0JBQUFBLGFBVlIsR0FVd0JDLGtCQUFNQyxNQUFOLEVBVnhCO0FBV0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRUcsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDO0FBQTlCLGlCQUExQjtBQUVJNUMsZ0JBQUFBLE9BYk4sR0FhZ0IsRUFiaEI7O0FBY0Usb0JBQUl1QixXQUFKLEVBQWlCO0FBQ2Z2QixrQkFBQUEsT0FBTyxtQ0FBUWlCLHNCQUFVNEIsa0JBQWxCLEdBQXlDN0MsT0FBekMsQ0FBUDtBQUNEOztBQWhCSDtBQUFBO0FBQUEsdUJBbUIyQndDLGFBQWEsQ0FBQ00sR0FBZCxDQUFrQlIsR0FBbEIsRUFBdUI7QUFDNUN0QyxrQkFBQUEsT0FBTyxFQUFQQSxPQUQ0QztBQUU1QytDLGtCQUFBQSxPQUFPLDJCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLHlFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q0M7QUFGakQsaUJBQXZCLENBbkIzQjs7QUFBQTtBQW1CVUMsZ0JBQUFBLFFBbkJWO0FBdUJVQyxnQkFBQUEseUJBdkJWLEdBdUJzQzVCLEtBQUssQ0FBQzZCLG1CQXZCNUM7QUF3QllDLGdCQUFBQSxJQXhCWixHQXdCcUJILFFBeEJyQixDQXdCWUcsSUF4Qlo7O0FBMEJJLG9CQUFJQSxJQUFJLENBQUNsQyxlQUFULEVBQTBCO0FBQ3hCLHVCQUFLRCxlQUFMLEdBQXVCbUMsSUFBSSxDQUFDbEMsZUFBNUI7QUFDRDs7QUFFRGtDLGdCQUFBQSxJQUFJLENBQUN0RCxPQUFMLEdBQWUsRUFBZjs7QUFDQSxvQkFBSW1ELFFBQVEsQ0FBQ25ELE9BQVQsSUFBb0JtRCxRQUFRLENBQUNuRCxPQUFULENBQWlCLE1BQWpCLENBQXhCLEVBQWtEO0FBQ2hEc0Qsa0JBQUFBLElBQUksQ0FBQ3RELE9BQUwsQ0FBYSxNQUFiLElBQXVCbUQsUUFBUSxDQUFDbkQsT0FBVCxDQUFpQixNQUFqQixDQUF2QjtBQUNEOztBQUNELHFCQUFLMkIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J5QixxQkFBdEQsRUFBNkUsMkJBQTdFLEVBQTBHakMsU0FBMUcsRUFBcUg2QixRQUFySCxFQUErSEMseUJBQS9ILEVBQ0VwQixXQURGLEVBQ2VLLE1BRGY7QUFsQ0osaURBcUNXaUIsSUFyQ1g7O0FBQUE7QUFBQTtBQUFBO0FBdUNVRixnQkFBQUEsMEJBdkNWLEdBdUNzQzVCLEtBQUssQ0FBQzZCLG1CQXZDNUM7QUF3Q0kscUJBQUsxQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjBCLG1CQUF0RCxFQUEyRSx3QkFBM0UsRUFBcUdsQyxTQUFyRyxFQUFnSG1DLFNBQWhILEVBQTJITCwwQkFBM0gsRUFDRXBCLFdBREYsRUFDZUssTUFEZjtBQXhDSixpREEwQ1dxQixPQUFPLENBQUNDLE1BQVIsYUExQ1g7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE4Q0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7eUdBQ0Usa0JBQTJCckMsU0FBM0I7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQThDc0MsZ0JBQUFBLDJCQUE5Qyw4REFBMEcsRUFBMUc7QUFDUXBDLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CK0IsbUJBQXRELEVBQTJFLHlCQUEzRSxFQUFzR3ZDLFNBQXRHOztBQUVBLG9CQUFJLENBQUNBLFNBQUwsRUFBZ0I7QUFDZEEsa0JBQUFBLFNBQVMsR0FBRyxtQkFBWjtBQUNELGlCQU5ILENBUUU7OztBQUNJVSxnQkFBQUEsV0FUTixjQVN3QkMsaUNBQXFCNkIsK0JBVDdDLGNBU2dGLEtBQUtsRSx3QkFBTCxDQUE4QnVDLEtBVDlHLGNBU3VILEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBVHJKLGNBU2lLZCxTQVRqSztBQVVRa0IsZ0JBQUFBLGFBVlIsR0FVd0JDLGtCQUFNQyxNQUFOLEVBVnhCO0FBV0UsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQztBQUF4RixpQkFBMUIsRUFYRixDQWFFOztBQUNRb0IsZ0JBQUFBLHNCQWRWLEdBY2tESiwyQkFkbEQsQ0FjVUksc0JBZFYsRUFja0NDLFdBZGxDLEdBY2tETCwyQkFkbEQsQ0Fja0NLLFdBZGxDO0FBZVFqRSxnQkFBQUEsT0FmUixHQWU2QmlCLHNCQUFVaUQsY0FmdkMsRUFpQkU7O0FBQ0Esb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCaEMsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCa0MsbUNBQTVCLGNBQW1FLEtBQUt2RSx3QkFBTCxDQUE4QnVDLEtBQWpHLGNBQTBHLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBQXhJLGNBQW9KZCxTQUFwSixDQUFYO0FBQ0F0QixrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUI0RCxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0FoRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJGLGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDRDs7QUFFRCxxQkFBS2tFLGtCQUFMLENBQXdCLEtBQUtqRSxTQUE3QixFQUF3Q0gsT0FBeEM7O0FBRUEsb0JBQUksQ0FBQyxLQUFLSCxhQUFMLENBQW1Cd0UsaUNBQXhCLEVBQTJEO0FBQ3pEO0FBQ0Esc0JBQUlKLFdBQUosRUFBaUI7QUFDZmpDLG9CQUFBQSxXQUFXLGVBQVFpQyxXQUFSLENBQVg7QUFDRDtBQUNGOztBQUVLSyxnQkFBQUEsTUFqQ1IsR0FpQzRDO0FBQ3hDM0Qsa0JBQUFBLFNBQVMsRUFBRSxLQUFLZix3QkFBTCxDQUE4QmU7QUFERCxpQkFqQzVDOztBQXFDRSxvQkFBSSxLQUFLZCxhQUFMLENBQW1Cd0UsaUNBQXZCLEVBQTBEO0FBQ3hELHNCQUFJSixXQUFKLEVBQWlCO0FBQ2ZLLG9CQUFBQSxNQUFNLENBQUNDLEdBQVAsR0FBYU4sV0FBYjtBQUNEO0FBQ0Y7O0FBRUszQixnQkFBQUEsR0EzQ1IsYUEyQ2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BM0MvQyxTQTJDd0RQLFdBM0N4RDtBQTRDUUssZ0JBQUFBLE1BNUNSLEdBNENpQixLQTVDakI7QUE2Q1FtQyxnQkFBQUEsT0E3Q1IsR0E2Q3NDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENnQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUprQztBQUtsQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q3dCO0FBTDNELGlCQTdDdEM7QUFBQSxrREFxRFMsSUFBSWYsT0FBSjtBQUFBLDJHQUFZLGtCQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUW5CLGFBQWEsQ0FBQ2dDLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHJCLDRCQUFBQSxRQUZTO0FBR1RDLDRCQUFBQSx5QkFIUyxHQUdtQjVCLEtBQUssQ0FBQzZCLG1CQUh6QjtBQUlQQyw0QkFBQUEsSUFKTyxHQUlXSCxRQUpYLENBSVBHLElBSk8sRUFJRHRELFFBSkMsR0FJV21ELFFBSlgsQ0FJRG5ELE9BSkM7O0FBS2YsNEJBQUEsTUFBSSxDQUFDMkUsZ0JBQUwsQ0FBc0IzRSxRQUF0Qjs7QUFFQSw0QkFBQSxNQUFJLENBQUMyQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjhDLHFCQUF0RCxFQUE2RSwyQkFBN0UsRUFBMEd0RCxTQUExRyxFQUFxSDZCLFFBQXJILEVBQStIQyx5QkFBL0gsRUFBMEpwQixXQUExSixFQUF1S0ssTUFBdks7O0FBQ0FxQyw0QkFBQUEsT0FBTyxDQUFDcEIsSUFBRCxDQUFQO0FBUmU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFXVEYsNEJBQUFBLDJCQVhTLEdBV21CNUIsS0FBSyxDQUFDNkIsbUJBWHpCOztBQVlmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0JnRCxrQkFBdkQsRUFBMkUsd0JBQTNFLEVBQXFHeEQsU0FBckcsRUFBZ0htQyxTQUFoSCxFQUEySEwsMkJBQTNILEVBQXNKcEIsV0FBdEosRUFBbUtLLE1BQW5LOztBQUNBLGdDQUFJLG9EQUE0QnBCLHNCQUFVOEQscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGNBQU47O0FBaEJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXJEVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQXlFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt3R0FDRSxrQkFBMEJyQyxTQUExQjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE2QzBELGdCQUFBQSwwQkFBN0MsOERBQXVHLEVBQXZHO0FBQTJHQyxnQkFBQUEsaUJBQTNHLDhEQUF1SSxDQUF2STtBQUE2SztBQUNyS3pELGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRVV1QyxnQkFBQUEsV0FGVixHQUV3RmUsMEJBRnhGLENBRVVmLFdBRlYsRUFFdUJELHNCQUZ2QixHQUV3RmdCLDBCQUZ4RixDQUV1QmhCLHNCQUZ2QixFQUUrQ2tCLHNCQUYvQyxHQUV3RkYsMEJBRnhGLENBRStDRSxzQkFGL0MsRUFFdUVDLFlBRnZFLEdBRXdGSCwwQkFGeEYsQ0FFdUVHLFlBRnZFO0FBR0UscUJBQUt4RCxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnNELG1CQUF0RCxFQUEyRSx3QkFBM0UsRUFBcUc5RCxTQUFyRzs7QUFIRixzQkFLTTJELGlCQUFpQixHQUFHLENBTDFCO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNCQU1VLElBQUlsRSxLQUFKLDZCQU5WOztBQUFBO0FBU0Usb0JBQUksQ0FBQ08sU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUt0QixnQkFBQUEsT0FiUixHQWE2QmlCLHNCQUFVaUQsY0FidkM7QUFlUW1CLGdCQUFBQSxRQWZSLEdBZW1CLG1EQUEyQkgsc0JBQXNCLElBQXVCLEtBQUsvRCxlQUE3RSxFQUE4RjZDLHNCQUFzQixHQUFHLElBQUgsR0FBVSxLQUE5SCxDQWZuQjs7QUFpQkUsb0JBQUlBLHNCQUFKLEVBQTRCO0FBQzFCaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUc4QixnQkFBQUEsV0F0Qk4sY0FzQndCcUQsUUF0QnhCLGNBc0JvQyxLQUFLekYsd0JBQUwsQ0FBOEJ1QyxLQXRCbEUsY0FzQjJFLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBdEJ6RyxjQXNCcUhkLFNBdEJySDs7QUF3QkUsb0JBQUksQ0FBQyxLQUFLekIsYUFBTCxDQUFtQndFLGlDQUF4QixFQUEyRDtBQUN6RCxzQkFBSUosV0FBSixFQUFpQjtBQUNmakMsb0JBQUFBLFdBQVcsZUFBUWlDLFdBQVIsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUtLLGdCQUFBQSxNQTlCUixHQThCNEM7QUFDeEMzRCxrQkFBQUEsU0FBUyxFQUFFLEtBQUtmLHdCQUFMLENBQThCZTtBQURELGlCQTlCNUM7O0FBa0NFLG9CQUFJd0UsWUFBSixFQUFrQjtBQUNoQmIsa0JBQUFBLE1BQU0sQ0FBQ2EsWUFBUCxHQUFzQixNQUF0QjtBQUNEOztBQUVELG9CQUFJLEtBQUt0RixhQUFMLENBQW1Cd0UsaUNBQXZCLEVBQTBEO0FBQ3hELHNCQUFJSixXQUFKLEVBQWlCO0FBQ2ZLLG9CQUFBQSxNQUFNLENBQUNDLEdBQVAsR0FBYU4sV0FBYjtBQUNEO0FBQ0Y7O0FBRUszQixnQkFBQUEsR0E1Q1IsYUE0Q2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BNUMvQyxTQTRDd0RQLFdBNUN4RDtBQTZDUUssZ0JBQUFBLE1BN0NSLEdBNkNpQixLQTdDakI7QUE4Q1FtQyxnQkFBQUEsT0E5Q1IsR0E4Q3NDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENnQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUprQztBQUtsQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q3FDO0FBTDNELGlCQTlDdEM7QUFzRFE5QyxnQkFBQUEsYUF0RFIsR0FzRHdCQyxrQkFBTUMsTUFBTixFQXREeEI7QUF1REUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFBeEY7QUFBb0gyQyxrQkFBQUEsVUFBVSxFQUFFLEtBQUsxRixhQUFMLENBQW1CMkY7QUFBbkosaUJBQTFCO0FBdkRGLGtEQXlEUyxJQUFJOUIsT0FBSjtBQUFBLDRHQUFZLGtCQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNqQjtBQUNJOEIsNEJBQUFBLGlCQUZhLEdBRVdoQyxTQUZYO0FBQUE7QUFBQTtBQUFBLG1DQUlRakIsYUFBYSxDQUFDZ0MsT0FBRCxDQUpyQjs7QUFBQTtBQUlUckIsNEJBQUFBLFFBSlM7QUFLVEMsNEJBQUFBLHlCQUxTLEdBS21CNUIsS0FBSyxDQUFDNkIsbUJBTHpCO0FBTVBDLDRCQUFBQSxJQU5PLEdBTVdILFFBTlgsQ0FNUEcsSUFOTyxFQU1EdEQsU0FOQyxHQU1XbUQsUUFOWCxDQU1EbkQsT0FOQzs7QUFPZiw0QkFBQSxNQUFJLENBQUMyRSxnQkFBTCxDQUFzQjNFLFNBQXRCOztBQUVBLGdDQUFJQSxTQUFKLEVBQWE7QUFDWCxrQ0FBSUEsU0FBTyxDQUFDSSxtQ0FBdUJDLFdBQXZCLENBQW1DcUYsV0FBbkMsRUFBRCxDQUFYLEVBQStEO0FBQzdELGdDQUFBLE1BQUksQ0FBQ3ZGLFNBQUwsR0FBaUJILFNBQU8sQ0FBQ0ksbUNBQXVCQyxXQUF2QixDQUFtQ3FGLFdBQW5DLEVBQUQsQ0FBeEI7QUFDRDtBQUNGLDZCQWJjLENBZWY7OztBQWZlLGlDQWdCWHBDLElBaEJXO0FBQUE7QUFBQTtBQUFBOztBQWlCYkEsNEJBQUFBLElBQUksQ0FBQ2hDLFNBQUwsR0FBaUJBLFNBQWpCOztBQUVBLDRCQUFBLE1BQUksQ0FBQ0ssYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I2RCxxQkFBdEQsRUFBNkUsMEJBQTdFLEVBQXlHckUsU0FBekcsRUFBb0g2QixRQUFwSCxFQUE4SEMseUJBQTlILEVBQXlKcEIsV0FBekosRUFBc0tLLE1BQXRLOztBQUVBcUMsNEJBQUFBLE9BQU8sQ0FBQ3BCLElBQUQsQ0FBUDtBQXJCYTs7QUFBQTtBQUFBLGtDQTBCWFcsV0FBVyxJQUFJZCxRQUFRLENBQUN5QyxNQUFULEtBQW9CM0Usc0JBQVU0RSxtQkExQmxDO0FBQUE7QUFBQTtBQUFBOztBQTJCYmxDLDRCQUFBQSxNQUFNLENBQUNSLFFBQUQsQ0FBTjtBQTNCYTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBZ0NUQyw0QkFBQUEsMkJBaENTLEdBZ0NtQjVCLEtBQUssQ0FBQzZCLG1CQWhDekI7O0FBaUNmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0JnRSxrQkFBdkQsRUFBMkUsdUJBQTNFLEVBQW9HeEUsU0FBcEcsRUFBK0dtQyxTQUEvRyxFQUEwSEwsMkJBQTFILEVBQXFKcEIsV0FBckosRUFBa0tLLE1BQWxLOztBQUNBb0QsNEJBQUFBLGlCQUFpQixlQUFqQixDQWxDZSxDQW9DZjs7QUFwQ2Usa0NBcUNYLDJCQUFldEMsUUFBZix3REFBeUJ5QyxNQUF6QixNQUFvQzNFLHNCQUFVOEUseUJBQTlDLElBQTJFLENBQUMsTUFBSSxDQUFDbEcsYUFBTCxDQUFtQjJGLHNCQXJDcEY7QUFBQTtBQUFBO0FBQUE7O0FBcUM4RztBQUMzSDdCLDRCQUFBQSxNQUFNLGNBQU47QUF0Q2E7O0FBQUE7QUFBQSxrQ0E4Q2JzQixpQkFBaUIsR0FBRyxDQUFwQixJQUF5QixNQUFJLENBQUNwRixhQUFMLENBQW1CbUcsc0JBOUMvQjtBQUFBO0FBQUE7QUFBQTs7QUErQ2YsZ0NBQUlQLGlCQUFpQixJQUFJQSxpQkFBaUIsQ0FBQ1EsSUFBbEIsSUFBMEJoRixzQkFBVThELHFCQUE3RCxFQUFvRjtBQUNsRjtBQUNELDZCQUZELE1BRU87QUFDTHBCLDhCQUFBQSxNQUFNLENBQUM4QixpQkFBRCxDQUFOO0FBQ0Q7O0FBbkRjOztBQUFBO0FBdURqQjtBQUNBUyw0QkFBQUEsVUFBVSxDQUFDLFlBQU07QUFDZiw4QkFBQSxNQUFJLENBQUNaLFlBQUwsQ0FBa0JoRSxTQUFsQixFQUE2QjBELDBCQUE3QixFQUF5REMsaUJBQWlCLEdBQUcsQ0FBN0UsRUFBZ0ZrQixJQUFoRixDQUFxRixVQUFDaEQsUUFBRDtBQUFBLHVDQUFjdUIsT0FBTyxDQUFDdkIsUUFBRCxDQUFyQjtBQUFBLCtCQUFyRixXQUE0SCxVQUFDaUQsS0FBRDtBQUFBLHVDQUFXekMsTUFBTSxDQUFDeUMsS0FBRCxDQUFqQjtBQUFBLCtCQUE1SDtBQUNELDZCQUZTLEVBRVAsTUFBSSxDQUFDdkcsYUFBTCxDQUFtQndHLHVDQUZaLENBQVY7O0FBeERpQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF6RFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUF1SEE7QUFDRjtBQUNBO0FBQ0E7Ozs7O2lIQUNFLGtCQUFtQ0Msd0JBQW5DO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1E5RSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVVc0MsZ0JBQUFBLHNCQUZWLEdBRXFDc0Msd0JBRnJDLENBRVV0QyxzQkFGVjtBQUdFLHFCQUFLckMsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0J5RSxxQkFBdEQsRUFBNkUsZ0NBQTdFO0FBRU12RSxnQkFBQUEsV0FMUixjQUswQkMsaUNBQXFCdUUsaUNBTC9DLGNBS29GLEtBQUs1Ryx3QkFBTCxDQUE4QnVDLEtBTGxILGNBSzJILEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBTHpKLGNBS3FLLEtBQUt4Qyx3QkFBTCxDQUE4QnVDLEtBTG5NLHdCQUtzTixLQUFLdkMsd0JBQUwsQ0FBOEJlLFNBTHBQO0FBTVFYLGdCQUFBQSxPQU5SLEdBTTZCaUIsc0JBQVVpRCxjQU52QztBQU9FbEUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBRUEscUJBQUtrRSxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0FaUixhQVlpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQVovQyxTQVl3RFAsV0FaeEQ7QUFhUUssZ0JBQUFBLE1BYlIsR0FhaUIsS0FiakI7QUFjUW1DLGdCQUFBQSxPQWRSLEdBY3NDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q3dEO0FBSjNELGlCQWR0QztBQXFCUWpFLGdCQUFBQSxhQXJCUixHQXFCd0JDLGtCQUFNQyxNQUFOLEVBckJ4QjtBQXVCUXBCLGdCQUFBQSxTQXZCUixHQXVCb0IsS0FBSzFCLHdCQUFMLENBQThCdUMsS0F2QmxEO0FBQUEsa0RBeUJTLElBQUl1QixPQUFKO0FBQUEsNEdBQVksa0JBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRbkIsYUFBYSxDQUFDZ0MsT0FBRCxDQUZyQjs7QUFBQTtBQUVUckIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21CNUIsS0FBSyxDQUFDNkIsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSVdILFFBSlgsQ0FJUEcsSUFKTyxFQUlEdEQsU0FKQyxHQUlXbUQsUUFKWCxDQUlEbkQsT0FKQzs7QUFLZiw0QkFBQSxNQUFJLENBQUMyRSxnQkFBTCxDQUFzQjNFLFNBQXRCLEVBTGUsQ0FPZjs7O0FBUGUsaUNBUVhzRCxJQVJXO0FBQUE7QUFBQTtBQUFBOztBQVNiLDRCQUFBLE1BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CeUUscUJBQXRELEVBQTZFLDREQUE3RSxFQUEySWpGLFNBQTNJLEVBQXNKNkIsUUFBdEosRUFBZ0tDLHlCQUFoSyxFQUEyTHBCLFdBQTNMLEVBQXdNSyxNQUF4TTs7QUFFQXFDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFYYTs7QUFBQTtBQWNmO0FBQ0FvQiw0QkFBQUEsT0FBTztBQWZROztBQUFBO0FBQUE7QUFBQTtBQWtCVHRCLDRCQUFBQSwyQkFsQlMsR0FrQm1CNUIsS0FBSyxDQUFDNkIsbUJBbEJ6Qjs7QUFtQmYsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNpRCxLQUE1QixFQUFtQy9DLDJCQUFvQnlFLHFCQUF2RCxFQUE4RSxnQ0FBOUUsRUFBZ0hqRixTQUFoSCxFQUEySG1DLFNBQTNILEVBQXNJTCwyQkFBdEksRUFBaUtwQixXQUFqSyxFQUE4S0ssTUFBOUs7O0FBQ0EsZ0NBQUksb0RBQTRCcEIsc0JBQVU4RCxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sY0FBTjtBQXZCZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF6QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFzREE7QUFDRjtBQUNBO0FBQ0E7Ozs7O29IQUNFLGtCQUFzQ00sV0FBdEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUXpDLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEUsd0JBQXRELEVBQWdGLHdDQUFoRjtBQUVNMUUsZ0JBQUFBLFdBSlIsY0FJMEJDLGlDQUFxQjBFLGlDQUovQyxjQUlvRixLQUFLL0csd0JBQUwsQ0FBOEJ1QyxLQUpsSCxjQUkySCxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUp6SixjQUlxSzZCLFdBSnJLO0FBS1FqRSxnQkFBQUEsT0FMUixHQUs2QmlCLHNCQUFVaUQsY0FMdkM7QUFPRSxxQkFBS0Usa0JBQUwsQ0FBd0IsS0FBS2pFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNc0MsZ0JBQUFBLEdBVFIsYUFTaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUFUL0MsU0FTd0RQLFdBVHhEO0FBVVFLLGdCQUFBQSxNQVZSLEdBVWlCLEtBVmpCO0FBV1FtQyxnQkFBQUEsT0FYUixHQVdzQztBQUNsQ3hFLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFGa0M7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSGtDO0FBSWxDUyxrQkFBQUEsT0FBTyw0QkFBRSxLQUFLbEQsYUFBTCxDQUFtQm1ELHFCQUFyQiwyRUFBOEMsS0FBS25ELGFBQUwsQ0FBbUJvRCxvQkFBbkIsQ0FBd0MyRDtBQUozRCxpQkFYdEM7QUFrQlFwRSxnQkFBQUEsYUFsQlIsR0FrQndCQyxrQkFBTUMsTUFBTixFQWxCeEI7QUFBQSxrREFtQlMsSUFBSWdCLE9BQUo7QUFBQSw0R0FBWSxrQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPOztBQUFBLGlDQUtYQSxJQUxXO0FBQUE7QUFBQTtBQUFBOztBQU1iLDRCQUFBLE1BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEUsd0JBQXRELEVBQWdGLHNDQUFoRixFQUF3SGpELFNBQXhILEVBQW1JTixRQUFuSSxFQUE2SUMseUJBQTdJLEVBQXdLcEIsV0FBeEssRUFBcUxLLE1BQXJMOztBQUVBcUMsNEJBQUFBLE9BQU8sQ0FBQ3BCLElBQUQsQ0FBUDtBQVJhOztBQUFBO0FBV2Y7QUFDQSw0QkFBQSxNQUFJLENBQUMzQixhQUFMLENBQW1CQyxtQkFBU2lGLElBQTVCLEVBQWtDL0UsMkJBQW9CNEUsd0JBQXRELEVBQWdGLHVEQUFoRixFQUF5SWpELFNBQXpJLEVBQW9KTixRQUFwSixFQUE4SkMseUJBQTlKLEVBQXlMcEIsV0FBekwsRUFBc01LLE1BQXRNOztBQUVBcUMsNEJBQUFBLE9BQU87QUFkUTs7QUFBQTtBQUFBO0FBQUE7QUFpQlR0Qiw0QkFBQUEsMkJBakJTLEdBaUJtQjVCLEtBQUssQ0FBQzZCLG1CQWpCekI7O0FBa0JmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0I0RSx3QkFBdkQsRUFBaUYsbUNBQWpGLEVBQXNIakQsU0FBdEgsRUFBaUlBLFNBQWpJLEVBQTRJTCwyQkFBNUksRUFBdUtwQixXQUF2SyxFQUFvTEssTUFBcEw7O0FBQ0EsZ0NBQUksb0RBQTRCcEIsc0JBQVU4RCxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sY0FBTjtBQXRCZTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFuQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUErQ0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7Z0hBQ0UsbUJBQWtDckMsU0FBbEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQXFEd0YsZ0JBQUFBLCtCQUFyRCxpRUFBNEgsRUFBNUg7QUFDUXRGLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CaUYsMkJBQXRELEVBQW1GLGdDQUFuRixFQUFxSHpGLFNBQXJIO0FBRU1VLGdCQUFBQSxXQUpSLGNBSTBCQyxpQ0FBcUIrRSx3QkFKL0MsY0FJMkUsS0FBS3BILHdCQUFMLENBQThCdUMsS0FKekcsY0FJa0gsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFKaEosY0FJNEpkLFNBSjVKO0FBS1FrQixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFNRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFdUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUMzRCxtQ0FBdUJGLGFBQXhCLENBQXBCO0FBQTREeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDO0FBQXhGLGlCQUExQjtBQUVRb0IsZ0JBQUFBLHNCQVJWLEdBUThEOEMsK0JBUjlELENBUVU5QyxzQkFSVixFQVFrQ2lELFdBUmxDLEdBUThESCwrQkFSOUQsQ0FRa0NHLFdBUmxDLEVBUStDQyxVQVIvQyxHQVE4REosK0JBUjlELENBUStDSSxVQVIvQztBQVVRbEgsZ0JBQUFBLE9BVlIsR0FVNkJpQixzQkFBVWlELGNBVnZDOztBQVlFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQmhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QjRELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQWhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNEOztBQUVELHFCQUFLa0Usa0JBQUwsQ0FBd0IsS0FBS2pFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNc0QsZ0JBQUFBLElBbkJSLEdBbUI0QjJELFdBQVcsSUFBSSxFQW5CM0M7QUFxQlFFLGdCQUFBQSxPQXJCUixHQXFCa0I7QUFDZCwyQkFBUyxLQUFLdkgsd0JBQUwsQ0FBOEJ1QyxLQUR6QjtBQUVkLDhCQUFZLEtBQUt2Qyx3QkFBTCxDQUE4QndDO0FBRjVCLGlCQXJCbEI7O0FBMEJFLG9CQUFJa0IsSUFBSSxJQUFJQSxJQUFJLENBQUM4RCxpQkFBakIsRUFBb0M7QUFDNUJDLGtCQUFBQSxPQUQ0QixHQUNsQkMscUNBQWtCQyxJQUFsQixDQUF1QmpFLElBQUksQ0FBQzhELGlCQUE1QixDQURrQjtBQUVsQzlHLGtCQUFBQSxNQUFNLENBQUNrSCxNQUFQLENBQWNMLE9BQWQsRUFBdUI7QUFBRSxxQ0FBaUJFO0FBQW5CLG1CQUF2QjtBQUNEOztBQUVELG9CQUFJL0QsSUFBSSxDQUFDbUUsZUFBVCxFQUEwQjtBQUN4Qm5ILGtCQUFBQSxNQUFNLENBQUNrSCxNQUFQLENBQWNMLE9BQWQsRUFBdUI7QUFBRSx1Q0FBbUI3RCxJQUFJLENBQUNtRTtBQUExQixtQkFBdkI7QUFDRDs7QUFFRG5FLGdCQUFBQSxJQUFJLENBQUNvRSxRQUFMLEdBQWdCQyxJQUFJLENBQUNDLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEJDLE1BQTFCLENBQWlDQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVosT0FBZixDQUFqQyxFQUEwRGEsTUFBMUQsQ0FBaUUsS0FBakUsRUFBd0VDLFFBQXhFLEVBQWhCOztBQW5DRixzQkFxQ01mLFVBQVUsSUFBSSxDQUFDZ0IsTUFBTSxDQUFDQyxRQXJDNUI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBc0NXekUsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSTVDLEtBQUosZ0RBQWYsQ0F0Q1g7O0FBQUE7QUF5Q0Usb0JBQUltRyxVQUFKLEVBQWdCO0FBQ2Q1RCxrQkFBQUEsSUFBSSxDQUFDOEUsT0FBTCxHQUFlQyx5QkFBWUMsY0FBWixFQUFmO0FBQ0FoRixrQkFBQUEsSUFBSSxDQUFDaUYsTUFBTCxHQUFjQyx1QkFBV0MsYUFBWCxFQUFkO0FBQ0FuRixrQkFBQUEsSUFBSSxDQUFDb0YsU0FBTCxHQUFpQlIsTUFBTSxDQUFDUyxRQUFQLENBQWdCQyxJQUFqQztBQUNBdEYsa0JBQUFBLElBQUksQ0FBQ3VGLEVBQUwsR0FBVUMsZUFBT0MsU0FBUCxFQUFWO0FBQ0Q7O0FBRUQsb0JBQUksQ0FBQ3pGLElBQUksQ0FBQzBGLE1BQVYsRUFBa0I7QUFDaEIxRixrQkFBQUEsSUFBSSxDQUFDMEYsTUFBTCxHQUFjL0gsc0JBQVVnSSxhQUF4QjtBQUNELGlCQWxESCxDQW9ERTs7O0FBcERGLHNCQXFETTNGLElBQUksQ0FBQzBGLE1BQUwsSUFBZSxDQUFDRSxvQkFBUUMsZ0JBQVIsQ0FBeUJySSxRQUF6QixDQUFrQ3dDLElBQUksQ0FBQzBGLE1BQXZDLENBckR0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREFzRFd0RixPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJNUMsS0FBSixnQ0FBa0N1QyxJQUFJLENBQUMwRixNQUF2QyxPQUFmLENBdERYOztBQUFBO0FBeURRMUcsZ0JBQUFBLEdBekRSLGFBeURpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQXpEL0MsU0F5RHdEUCxXQXpEeEQ7QUEwRFFLLGdCQUFBQSxNQTFEUixHQTBEaUIsTUExRGpCO0FBNERRbUMsZ0JBQUFBLE9BNURSLEdBNERzQztBQUNsQ2xCLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDdEQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q21HO0FBTDNELGlCQTVEdEM7QUFBQSxtREFvRVMsSUFBSTFGLE9BQUo7QUFBQSw0R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLEtBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSUR0RCxTQUpDLEdBSVdtRCxRQUpYLENBSURuRCxPQUpDOztBQUtmLDRCQUFBLE1BQUksQ0FBQzJFLGdCQUFMLENBQXNCM0UsU0FBdEI7O0FBRUEsZ0NBQUlzRCxLQUFKLEVBQVU7QUFDUiw4QkFBQSxNQUFJLENBQUMzQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnVILDZCQUF0RCxFQUFxRixrQ0FBckYsRUFBeUgvSCxTQUF6SCxFQUFvSTZCLFFBQXBJLEVBQThJQyx5QkFBOUksRUFBeUtwQixXQUF6SyxFQUFzTEssTUFBdEw7O0FBRUFxQyw4QkFBQUEsT0FBTyxDQUFDcEIsS0FBRCxDQUFQO0FBQ0Q7O0FBWGM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVEYsNEJBQUFBLDJCQWJTLEdBYW1CNUIsS0FBSyxDQUFDNkIsbUJBYnpCOztBQWNmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0J3SCwwQkFBdkQsRUFBbUYsK0JBQW5GLEVBQW9IaEksU0FBcEgsRUFBK0htQyxTQUEvSCxFQUEwSUwsMkJBQTFJLEVBQXFLcEIsV0FBckssRUFBa0xLLE1BQWxMOztBQUVBLGdDQUFJLHFEQUE2QnBCLHNCQUFVOEQscUJBQXZDLENBQUosRUFBbUU7QUFDakU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBbkJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXBFVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTRGQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt1R0FDRSxtQkFBeUJyQyxTQUF6QjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNENpSSxnQkFBQUEseUJBQTVDLGlFQUFvRyxFQUFwRztBQUNRL0gsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0IwSCxrQkFBdEQsRUFBMEUsc0JBQTFFLEVBQWtHbEksU0FBbEc7QUFDTWtCLGdCQUFBQSxhQUhSLEdBR3dCQyxrQkFBTUMsTUFBTixFQUh4QjtBQUtFLDRDQUFXRixhQUFYLEVBQTBCO0FBQ3hCRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0MsMEJBREo7QUFFeEI2RyxrQkFBQUEsV0FBVyxFQUFFQyxtQ0FGVztBQUd4QjNGLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QjtBQUhNLGlCQUExQjtBQU1RK0QsZ0JBQUFBLFdBWFYsR0FXMkVzRix5QkFYM0UsQ0FXVXRGLFdBWFYsRUFXdUJELHNCQVh2QixHQVcyRXVGLHlCQVgzRSxDQVd1QnZGLHNCQVh2QixFQVcrQ2lELFdBWC9DLEdBVzJFc0MseUJBWDNFLENBVytDdEMsV0FYL0MsRUFXNERDLFVBWDVELEdBVzJFcUMseUJBWDNFLENBVzREckMsVUFYNUQ7QUFZUWxILGdCQUFBQSxPQVpSLEdBWTZCaUIsc0JBQVVpRCxjQVp2QztBQWFNbEMsZ0JBQUFBLFdBYk4sY0Fhd0JDLGlDQUFxQjBILHVCQWI3QyxjQWF3RSxLQUFLL0osd0JBQUwsQ0FBOEJ1QyxLQWJ0RyxjQWErRyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQWI3SSxjQWF5SmQsU0Fieko7O0FBY0Usb0JBQUkwQyxzQkFBSixFQUE0QjtBQUMxQmhDLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQjJILDJCQUE1QixjQUEyRCxLQUFLaEssd0JBQUwsQ0FBOEJ1QyxLQUF6RixjQUFrRyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUFoSSxjQUE0SWQsU0FBNUksQ0FBWDtBQUNBdEIsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUQscUJBQUtrRSxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDOztBQUVBLG9CQUFJLENBQUMsS0FBS0gsYUFBTCxDQUFtQndFLGlDQUF4QixFQUEyRDtBQUN6RCxzQkFBSUosV0FBSixFQUFpQjtBQUNmakMsb0JBQUFBLFdBQVcsZUFBUWlDLFdBQVIsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUtLLGdCQUFBQSxNQTVCUixHQTRCNEM7QUFDeEMzRCxrQkFBQUEsU0FBUyxFQUFFLEtBQUtmLHdCQUFMLENBQThCZTtBQURELGlCQTVCNUM7O0FBZ0NFLG9CQUFJLEtBQUtkLGFBQUwsQ0FBbUJ3RSxpQ0FBdkIsRUFBMEQ7QUFDeEQsc0JBQUlKLFdBQUosRUFBaUI7QUFDZkssb0JBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhTixXQUFiO0FBQ0Q7QUFDRjs7QUFFS1gsZ0JBQUFBLElBdENSLEdBc0M0QjJELFdBQVcsSUFBSSxFQXRDM0M7O0FBQUEsc0JBd0NNQyxVQUFVLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ0MsUUF4QzVCO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQXlDV3pFLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLElBQUk1QyxLQUFKLGdEQUFmLENBekNYOztBQUFBO0FBNENFLG9CQUFJbUcsVUFBSixFQUFnQjtBQUNkNUQsa0JBQUFBLElBQUksQ0FBQzhFLE9BQUwsR0FBZUMseUJBQVlDLGNBQVosRUFBZjtBQUNBaEYsa0JBQUFBLElBQUksQ0FBQ2lGLE1BQUwsR0FBY0MsdUJBQVdDLGFBQVgsRUFBZDtBQUNBbkYsa0JBQUFBLElBQUksQ0FBQ29GLFNBQUwsR0FBaUJSLE1BQU0sQ0FBQ1MsUUFBUCxDQUFnQkMsSUFBakM7QUFDQXRGLGtCQUFBQSxJQUFJLENBQUN1RixFQUFMLEdBQVVDLGVBQU9DLFNBQVAsRUFBVjtBQUNELGlCQWpESCxDQW1ERTs7O0FBQ0Esb0JBQUksQ0FBQ3pGLElBQUksQ0FBQzBGLE1BQVYsRUFBa0I7QUFDaEIxRixrQkFBQUEsSUFBSSxDQUFDMEYsTUFBTCxHQUFjL0gsc0JBQVVnSSxhQUF4QjtBQUNELGlCQXRESCxDQXdERTs7O0FBeERGLHNCQXlETTNGLElBQUksQ0FBQzBGLE1BQUwsSUFBZSxDQUFDRSxvQkFBUUMsZ0JBQVIsQ0FBeUJySSxRQUF6QixDQUFrQ3dDLElBQUksQ0FBQzBGLE1BQXZDLENBekR0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREEwRFd0RixPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJNUMsS0FBSixnQ0FBa0N1QyxJQUFJLENBQUMwRixNQUF2QyxPQUFmLENBMURYOztBQUFBO0FBNkRRMUcsZ0JBQUFBLEdBN0RSLGFBNkRpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQTdEL0MsU0E2RHdEUCxXQTdEeEQ7QUE4RFFLLGdCQUFBQSxNQTlEUixHQThEaUIsTUE5RGpCO0FBK0RRbUMsZ0JBQUFBLE9BL0RSLEdBK0RzQztBQUNsQ2xCLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDdEQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENnQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUxrQztBQU1sQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3QzRHO0FBTjNELGlCQS9EdEM7QUFBQSxtREF3RVMsSUFBSW5HLE9BQUo7QUFBQSw0R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUHJELDRCQUFBQSxTQUpPLEdBSUttRCxRQUpMLENBSVBuRCxPQUpPOztBQUtmLDRCQUFBLE1BQUksQ0FBQzJFLGdCQUFMLENBQXNCM0UsU0FBdEI7O0FBRUEsNEJBQUEsTUFBSSxDQUFDMkIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JnSSxvQkFBdEQsRUFBNEUsd0JBQTVFLEVBQXNHeEksU0FBdEcsRUFBaUg2QixRQUFqSCxFQUEySEMseUJBQTNILEVBQXNKcEIsV0FBdEosRUFBbUtLLE1BQW5LLEVBQTJLb0IsU0FBM0ssRUFBc0xILElBQXRMOztBQUNBb0IsNEJBQUFBLE9BQU87QUFSUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVVUdEIsNEJBQUFBLDJCQVZTLEdBVW1CNUIsS0FBSyxDQUFDNkIsbUJBVnpCOztBQVdmLDRCQUFBLE1BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0JpSSxpQkFBdkQsRUFBMEUscUJBQTFFLEVBQWlHekksU0FBakcsRUFBNEdtQyxTQUE1RyxFQUF1SEwsMkJBQXZILEVBQWtKcEIsV0FBbEosRUFBK0pLLE1BQS9KLGlCQUE4S2lCLElBQTlLOztBQUNBLGdDQUFJLHFEQUE0QnJDLHNCQUFVOEQscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBZmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBeEVUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBNEZBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O3dHQUNFLG1CQUEwQnJDLFNBQTFCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkMwSSxnQkFBQUEsMEJBQTdDLGlFQUF1RyxFQUF2RztBQUNReEksZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JtSSxtQkFBdEQsRUFBMkUsdUJBQTNFLEVBQW9HM0ksU0FBcEc7QUFFSVUsZ0JBQUFBLFdBSk4sY0FJd0JDLGlDQUFxQmlJLHdCQUo3QyxjQUl5RSxLQUFLdEssd0JBQUwsQ0FBOEJ1QyxLQUp2RyxjQUlnSCxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUo5SSxjQUkwSmQsU0FKMUosd0JBSWlMLEtBQUsxQix3QkFBTCxDQUE4QmUsU0FKL007QUFLUTZCLGdCQUFBQSxhQUxSLEdBS3dCQyxrQkFBTUMsTUFBTixFQUx4QjtBQU1FLDRDQUFXRixhQUFYLEVBQTBCO0FBQUV1QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzNELG1DQUF1QkYsYUFBeEIsQ0FBcEI7QUFBNER5QyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0M7QUFBeEYsaUJBQTFCO0FBRVFvQixnQkFBQUEsc0JBUlYsR0FRZ0ZnRywwQkFSaEYsQ0FRVWhHLHNCQVJWLEVBUWtDbUcsZUFSbEMsR0FRZ0ZILDBCQVJoRixDQVFrQ0csZUFSbEMsRUFRbURDLGdCQVJuRCxHQVFnRkosMEJBUmhGLENBUW1ESSxnQkFSbkQsRUFRcUVDLE1BUnJFLEdBUWdGTCwwQkFSaEYsQ0FRcUVLLE1BUnJFO0FBVVFySyxnQkFBQUEsT0FWUixHQVU2QmlCLHNCQUFVaUQsY0FWdkM7QUFXUVosZ0JBQUFBLElBWFIsR0FXb0IsRUFYcEIsRUFXd0I7O0FBQ3RCQSxnQkFBQUEsSUFBSSxDQUFDK0csTUFBTCxHQUFjQSxNQUFkOztBQUVBLG9CQUFJckcsc0JBQUosRUFBNEI7QUFDMUJoQyxrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUJxSSw0QkFBNUIsY0FBNEQsS0FBSzFLLHdCQUFMLENBQThCdUMsS0FBMUYsY0FBbUcsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFBakksY0FBNklkLFNBQTdJLHdCQUFvSyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQWxNLENBQVg7QUFDQVgsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUQscUJBQUtrRSxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDOztBQUVBLG9CQUFJbUssZUFBSixFQUFxQjtBQUNuQm5JLGtCQUFBQSxXQUFXLDJCQUFYO0FBQ0Q7O0FBRUQsb0JBQUlvSSxnQkFBSixFQUFzQjtBQUNwQnBJLGtCQUFBQSxXQUFXLDRCQUFYO0FBQ0Q7O0FBRUtNLGdCQUFBQSxHQTlCUixhQThCaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUE5Qi9DLFNBOEJ3RFAsV0E5QnhEO0FBK0JRSyxnQkFBQUEsTUEvQlIsR0ErQmlCLE1BL0JqQjtBQWdDUW1DLGdCQUFBQSxPQWhDUixHQWdDc0M7QUFDbENsQixrQkFBQUEsSUFBSSxFQUFKQSxJQURrQztBQUVsQ3RELGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFIa0M7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSmtDO0FBS2xDUyxrQkFBQUEsT0FBTyw0QkFBRSxLQUFLbEQsYUFBTCxDQUFtQm1ELHFCQUFyQiwyRUFBOEMsS0FBS25ELGFBQUwsQ0FBbUJvRCxvQkFBbkIsQ0FBd0NzSDtBQUwzRCxpQkFoQ3RDO0FBQUEsbURBd0NTLElBQUk3RyxPQUFKO0FBQUEsNEdBQVksbUJBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRbkIsYUFBYSxDQUFDZ0MsT0FBRCxDQUZyQjs7QUFBQTtBQUVUckIsNEJBQUFBLFFBRlM7QUFHUG5ELDRCQUFBQSxTQUhPLEdBR0ttRCxRQUhMLENBR1BuRCxPQUhPOztBQUlmLDRCQUFBLE1BQUksQ0FBQzJFLGdCQUFMLENBQXNCM0UsU0FBdEI7O0FBRU1vRCw0QkFBQUEseUJBTlMsR0FNbUI1QixLQUFLLENBQUM2QixtQkFOekI7O0FBT2YsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0IwSSxxQkFBdEQsRUFBNkUseUJBQTdFLEVBQXdHbEosU0FBeEcsRUFBbUg2QixRQUFuSCxFQUE2SEMseUJBQTdILEVBQXdKcEIsV0FBeEosRUFBcUtLLE1BQXJLOztBQUVBcUMsNEJBQUFBLE9BQU8sR0FUUSxDQVVqQjs7QUFWaUI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZVHRCLDRCQUFBQSwyQkFaUyxHQVltQjVCLEtBQUssQ0FBQzZCLG1CQVp6Qjs7QUFhZiw0QkFBQSxNQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU2lELEtBQTVCLEVBQW1DL0MsMkJBQW9CMkksa0JBQXZELEVBQTJFLHNCQUEzRSxFQUFtR25KLFNBQW5HLEVBQThHbUMsU0FBOUcsRUFBeUhMLDJCQUF6SCxFQUFvSnBCLFdBQXBKLEVBQWlLSyxNQUFqSzs7QUFDQSxnQ0FBSSxjQUFNNEQsSUFBTixLQUFlaEYsc0JBQVU4RCxxQkFBN0IsRUFBb0Q7QUFDbEQ7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBakJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXhDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQThEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7OztrSEFDRSxtQkFBb0NyQyxTQUFwQyxFQUF1RG9KLG9DQUF2RDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRbEosZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I2SSw2QkFBdEQsRUFBcUYsbUNBQXJGLEVBQTBIckosU0FBMUg7QUFFUTBDLGdCQUFBQSxzQkFKVixHQUk2QzBHLG9DQUo3QyxDQUlVMUcsc0JBSlYsRUFJa0NxRyxNQUpsQyxHQUk2Q0ssb0NBSjdDLENBSWtDTCxNQUpsQztBQUtRckksZ0JBQUFBLFdBTFIsY0FLMEJDLGlDQUFxQjJJLHFDQUwvQyxjQUt3RixLQUFLaEwsd0JBQUwsQ0FBOEJ1QyxLQUx0SCxjQUsrSCxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUw3SixjQUt5S2lJLE1BTHpLLGNBS21ML0ksU0FMbkwsd0JBSzBNLEtBQUsxQix3QkFBTCxDQUE4QmUsU0FMeE87QUFNUTZCLGdCQUFBQSxhQU5SLEdBTXdCQyxrQkFBTUMsTUFBTixFQU54QjtBQU9FLDRDQUFXRixhQUFYLEVBQTBCO0FBQUV1QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzNELG1DQUF1QkYsYUFBeEIsQ0FBcEI7QUFBNER5QyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0M7QUFBeEYsaUJBQTFCO0FBQ001QyxnQkFBQUEsT0FSUixHQVE2QmlCLHNCQUFVaUQsY0FSdkM7O0FBU0Usb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUQscUJBQUtrRSxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0FoQlIsYUFnQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BaEIvQyxTQWdCd0RQLFdBaEJ4RDtBQWlCUUssZ0JBQUFBLE1BakJSLEdBaUJpQixLQWpCakI7QUFrQlFtQyxnQkFBQUEsT0FsQlIsR0FrQnNDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDJFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3QzRIO0FBSjNELGlCQWxCdEM7QUFBQSxtREF5QlMsSUFBSW5ILE9BQUo7QUFBQSw0R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdQbkQsNEJBQUFBLFNBSE8sR0FHS21ELFFBSEwsQ0FHUG5ELE9BSE87O0FBSWYsNEJBQUEsTUFBSSxDQUFDMkUsZ0JBQUwsQ0FBc0IzRSxTQUF0Qjs7QUFFTW9ELDRCQUFBQSx5QkFOUyxHQU1tQjVCLEtBQUssQ0FBQzZCLG1CQU56Qjs7QUFPZixnQ0FBSSxtQkFBQUYsUUFBUSxDQUFDRyxJQUFULGtFQUFld0gsYUFBZixNQUFpQyxJQUFyQyxFQUEyQztBQUN6Qyw4QkFBQSxNQUFJLENBQUNuSixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQmlKLCtCQUF0RCxFQUF1RixxQ0FBdkYsRUFBOEh6SixTQUE5SCxFQUF5STZCLFFBQXpJLEVBQW1KQyx5QkFBbkosRUFBOEtwQixXQUE5SyxFQUEyTEssTUFBM0w7O0FBRUFxQyw4QkFBQUEsT0FBTyxDQUFDdkIsUUFBUSxDQUFDRyxJQUFWLENBQVA7QUFDRCw2QkFKRCxNQUlPO0FBQ0wsOEJBQUEsTUFBSSxDQUFDM0IsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JrSiw0QkFBdEQsRUFBb0Ysb0ZBQXBGLEVBQTBLMUosU0FBMUssRUFBcUw2QixRQUFyTCxFQUErTEMseUJBQS9MLEVBQTBOcEIsV0FBMU4sRUFBdU9LLE1BQXZPOztBQUVBc0IsOEJBQUFBLE1BQU0sQ0FBQyxJQUFJNUMsS0FBSixDQUFVLG9GQUFWLENBQUQsQ0FBTjtBQUNELDZCQWZjLENBaUJqQjs7O0FBakJpQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQW1CVHFDLDRCQUFBQSwyQkFuQlMsR0FtQm1CNUIsS0FBSyxDQUFDNkIsbUJBbkJ6Qjs7QUFxQmYsNEJBQUEsTUFBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNpRCxLQUE1QixFQUFtQy9DLDJCQUFvQmtKLDRCQUF2RCxFQUFxRixrQ0FBckYsRUFBeUgxSixTQUF6SCxFQUFvSW1DLFNBQXBJLEVBQStJTCwyQkFBL0ksRUFBMEtwQixXQUExSyxFQUF1TEssTUFBdkw7O0FBRUEsZ0NBQUkscURBQTRCcEIsc0JBQVU4RCxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUVELGdDQUFJLGNBQU1rRCxRQUFOLE9BQXFCLDRDQUF6QixFQUF1RTtBQUFFO0FBQ3ZFdkQsOEJBQUFBLE9BQU8sQ0FBQyxFQUFELENBQVA7QUFDRCw2QkFGRCxNQUVPO0FBQ0xmLDhCQUFBQSxNQUFNLGVBQU47QUFDRDs7QUEvQmM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBekJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBNkRBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7a0hBQ0UsbUJBQW9DckMsU0FBcEMsRUFBdUQySixnQkFBdkQ7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBaUZDLGdCQUFBQSxvQ0FBakYsaUVBQStKLEVBQS9KO0FBQ1ExSixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnFKLHFCQUF0RCxFQUE2RSwwQkFBN0UsRUFBeUc3SixTQUF6RztBQUVJVSxnQkFBQUEsV0FKTixjQUl3QkMsaUNBQXFCbUosMEJBSjdDLGNBSTJFLEtBQUt4TCx3QkFBTCxDQUE4QnVDLEtBSnpHLGNBSWtILEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBSmhKLGNBSTRKZCxTQUo1Six3QkFJbUwsS0FBSzFCLHdCQUFMLENBQThCZSxTQUpqTjtBQUtRNkIsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBTUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQztBQUF4RixpQkFBMUI7QUFFUW9CLGdCQUFBQSxzQkFSVixHQVFxQ2tILG9DQVJyQyxDQVFVbEgsc0JBUlY7QUFVUWhFLGdCQUFBQSxPQVZSLEdBVTZCaUIsc0JBQVVpRCxjQVZ2Qzs7QUFZRSxvQkFBSUYsc0JBQUosRUFBNEI7QUFDMUJoQyxrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUJvSiw4QkFBNUIsY0FBOEQsS0FBS3pMLHdCQUFMLENBQThCdUMsS0FBNUYsY0FBcUcsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFBbkksY0FBK0lkLFNBQS9JLHdCQUFzSyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQXBNLENBQVg7QUFDQVgsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNEQsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBaEUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUtvQyxnQkFBQUEsR0FsQlIsYUFrQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BbEIvQyxTQWtCd0RQLFdBbEJ4RDtBQW1CUUssZ0JBQUFBLE1BbkJSLEdBbUJpQixNQW5CakI7QUFvQlFtQyxnQkFBQUEsT0FwQlIsR0FvQnNDO0FBQ2xDbEIsa0JBQUFBLElBQUksRUFBRXdFLElBQUksQ0FBQ0MsU0FBTCxDQUFla0QsZ0JBQWYsQ0FENEI7QUFFbENqTCxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1Msa0JBQUFBLE9BQU8sNkJBQUUsS0FBS2xELGFBQUwsQ0FBbUJtRCxxQkFBckIsNkVBQThDLEtBQUtuRCxhQUFMLENBQW1Cb0Qsb0JBQW5CLENBQXdDcUk7QUFMM0QsaUJBcEJ0QztBQUFBLG1EQTRCUyxJQUFJNUgsT0FBSjtBQUFBLDRHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUW5CLGFBQWEsQ0FBQ2dDLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHJCLDRCQUFBQSxRQUZTO0FBR1BuRCw0QkFBQUEsU0FITyxHQUdLbUQsUUFITCxDQUdQbkQsT0FITzs7QUFJZiw0QkFBQSxPQUFJLENBQUMyRSxnQkFBTCxDQUFzQjNFLFNBQXRCOztBQUVNb0QsNEJBQUFBLHlCQU5TLEdBTW1CNUIsS0FBSyxDQUFDNkIsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CeUosdUJBQXRELEVBQStFLDRCQUEvRSxFQUE2R2pLLFNBQTdHLEVBQXdINkIsUUFBeEgsRUFBa0lDLHlCQUFsSSxFQUE2SnBCLFdBQTdKLEVBQTBLSyxNQUExSzs7QUFFQXFDLDRCQUFBQSxPQUFPO0FBVFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZVHRCLDRCQUFBQSw0QkFaUyxHQVltQjVCLEtBQUssQ0FBQzZCLG1CQVp6Qjs7QUFhZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU2lELEtBQTVCLEVBQW1DL0MsMkJBQW9CMEosb0JBQXZELEVBQTZFLHlCQUE3RSxFQUF3R2xLLFNBQXhHLEVBQW1IbUMsU0FBbkgsRUFBOEhMLDRCQUE5SCxFQUF5SnBCLFdBQXpKLEVBQXNLSyxNQUF0Szs7QUFDQSxnQ0FBSSxxREFBNEJwQixzQkFBVThELHFCQUF0QyxDQUFKLEVBQWtFO0FBQ2hFO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkE1QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFrREE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsrR0FDRSxtQkFBaUM4SCxhQUFqQyxFQUF3REMsMEJBQXhEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEZDLGdCQUFBQSxpQ0FBNUYsaUVBQW9LLEVBQXBLO0FBQ1FuSyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLM0IsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVk2TCxHQUFaLENBQWdCaEssbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQitKLDBCQUR0QixFQUVFO0FBQUVDLG9CQUFBQSxhQUFhLEVBQUVMO0FBQWpCLG1CQUZGLEVBR0UsZ0NBSEY7QUFJRDs7QUFDR3pKLGdCQUFBQSxXQVJOLGNBUXdCQyxpQ0FBcUI4SiwrQkFSN0MsY0FRZ0YsS0FBS25NLHdCQUFMLENBQThCdUMsS0FSOUcsY0FRdUhzSixhQVJ2SDtBQVNRakosZ0JBQUFBLGFBVFIsR0FTd0JDLGtCQUFNQyxNQUFOLEVBVHhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQztBQUF4RixpQkFBMUI7QUFFUW9CLGdCQUFBQSxzQkFaVixHQVlnRDJILGlDQVpoRCxDQVlVM0gsc0JBWlYsRUFZa0MxQyxTQVpsQyxHQVlnRHFLLGlDQVpoRCxDQVlrQ3JLLFNBWmxDO0FBY1F0QixnQkFBQUEsT0FkUixHQWM2QmlCLHNCQUFVaUQsY0FkdkM7O0FBZ0JFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQmhDLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQitKLG1DQUE1QixjQUFtRSxLQUFLcE0sd0JBQUwsQ0FBOEJ1QyxLQUFqRyxjQUEwR3NKLGFBQTFHLENBQVg7QUFDQXpMLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QjRELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQWhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBRixrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUI2TCxXQUF4QixDQUFQLEdBQThDLEtBQUtyTSx3QkFBTCxDQUE4QndDLFFBQTVFO0FBQ0Q7O0FBRUQscUJBQUtnQyxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDOztBQUVBLG9CQUFJc0IsU0FBSixFQUFlO0FBQ2J0QixrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJrQixTQUF4QixDQUFQLEdBQTRDQSxTQUE1QztBQUNEOztBQUVLZ0IsZ0JBQUFBLEdBN0JSLGFBNkJpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQTdCL0MsU0E2QndEUCxXQTdCeEQ7QUE4QlFLLGdCQUFBQSxNQTlCUixHQThCaUIsTUE5QmpCO0FBK0JRbUMsZ0JBQUFBLE9BL0JSLEdBK0JzQztBQUNsQ2xCLGtCQUFBQSxJQUFJLEVBQUV3RSxJQUFJLENBQUNDLFNBQUwsQ0FBZTJELDBCQUFmLENBRDRCO0FBRWxDMUwsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDZFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q2lKO0FBTDNELGlCQS9CdEM7QUFBQSxtREF1Q1MsSUFBSXhJLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdQRyw0QkFBQUEsSUFITyxHQUdXSCxRQUhYLENBR1BHLElBSE8sRUFHRHRELFNBSEMsR0FHV21ELFFBSFgsQ0FHRG5ELE9BSEM7O0FBSWYsNEJBQUEsT0FBSSxDQUFDMkUsZ0JBQUwsQ0FBc0IzRSxTQUF0Qjs7QUFFTW9ELDRCQUFBQSx5QkFOUyxHQU1tQjVCLEtBQUssQ0FBQzZCLG1CQU56Qjs7QUFPZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnFLLDRCQUF0RCxFQUFvRixrQ0FBcEYsRUFBd0g3SyxTQUF4SCxFQUFtSTZCLFFBQW5JLEVBQTZJQyx5QkFBN0ksRUFBd0twQixXQUF4SyxFQUFxTEssTUFBckw7O0FBRUFxQyw0QkFBQUEsT0FBTyxDQUFDcEIsSUFBRCxDQUFQO0FBVGU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZVEYsNEJBQUFBLDRCQVpTLEdBWW1CNUIsS0FBSyxDQUFDNkIsbUJBWnpCOztBQWFmLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0JzSyx5QkFBdkQsRUFBa0YsK0JBQWxGLEVBQW1IOUssU0FBbkgsRUFBOEhtQyxTQUE5SCxFQUF5SUwsNEJBQXpJLEVBQW9LcEIsV0FBcEssRUFBaUxLLE1BQWpMOztBQUNBLGdDQUFJLHFEQUE0QnBCLHNCQUFVOEQscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBakJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXZDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTZEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OEdBQ0UsbUJBQWdDckMsU0FBaEMsRUFBbUQrSSxNQUFuRCxFQUFtRWdDLEtBQW5FO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBa0ZDLGdCQUFBQSxnQ0FBbEYsaUVBQXdKLEVBQXhKO0FBQ1E5SyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnlLLHdCQUF0RCxFQUFnRiw2QkFBaEYsRUFBK0dqTCxTQUEvRztBQUVJVSxnQkFBQUEsV0FKTixjQUl3QkMsaUNBQXFCdUssNkJBSjdDLGNBSThFbkMsTUFKOUUsY0FJd0YvSSxTQUp4Rix3QkFJK0csS0FBSzFCLHdCQUFMLENBQThCZSxTQUo3STtBQUtRNkIsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBTUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQztBQUF4RixpQkFBMUI7QUFFUW9CLGdCQUFBQSxzQkFSVixHQVE2RHNJLGdDQVI3RCxDQVFVdEksc0JBUlYsRUFRa0NrQixzQkFSbEMsR0FRNkRvSCxnQ0FSN0QsQ0FRa0NwSCxzQkFSbEM7QUFVUWxGLGdCQUFBQSxPQVZSLEdBVTZCaUIsc0JBQVVpRCxjQVZ2QztBQVdFbEUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCcU0sY0FBeEIsQ0FBUCxHQUFpRCxLQUFLN00sd0JBQUwsQ0FBOEJ1QyxLQUEvRTtBQUNBbkMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNkwsV0FBeEIsQ0FBUCxHQUE4QyxLQUFLck0sd0JBQUwsQ0FBOEJ3QyxRQUE1RTtBQUNBcEMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCc00sYUFBeEIsQ0FBUCxHQUFnREwsS0FBaEQ7O0FBRUEsb0JBQUksS0FBS2xMLGVBQUwsS0FBeUJDLHVCQUFnQkMsRUFBekMsSUFBZ0Q2RCxzQkFBc0IsSUFBSUEsc0JBQXNCLEtBQUs5RCx1QkFBZ0JDLEVBQXpILEVBQThIO0FBQzVIVyxrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUIwSywrQkFBNUIsY0FBK0R0QyxNQUEvRCxjQUF5RS9JLFNBQXpFLHdCQUFnRyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQTlILENBQVg7O0FBQ0Esc0JBQUlxRCxzQkFBSixFQUE0QjtBQUMxQmhFLG9CQUFBQSxPQUFPLENBQUNJLG1DQUF1QjRELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQWhFLG9CQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsb0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCMkssbUNBQTVCLGNBQW1FdkMsTUFBbkUsY0FBNkUvSSxTQUE3RSx3QkFBb0csS0FBSzFCLHdCQUFMLENBQThCZSxTQUFsSSxDQUFYO0FBQ0Q7QUFDRixpQkFQRCxNQVFLLElBQUlxRCxzQkFBSixFQUE0QjtBQUMvQmhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QjRELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQWhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCNEssaUNBQTVCLGNBQWlFeEMsTUFBakUsY0FBMkUvSSxTQUEzRSx3QkFBa0csS0FBSzFCLHdCQUFMLENBQThCZSxTQUFoSSxDQUFYO0FBQ0Q7O0FBRUQscUJBQUt5RCxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0EvQlIsYUErQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BL0IvQyxTQStCd0RQLFdBL0J4RDtBQWdDUUssZ0JBQUFBLE1BaENSLEdBZ0NpQixLQWhDakI7QUFpQ1FtQyxnQkFBQUEsT0FqQ1IsR0FpQ3NDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDZFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3QzZKO0FBSjNELGlCQWpDdEM7QUFBQSxtREF3Q1MsSUFBSXBKLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSUR0RCxVQUpDLEdBSVdtRCxRQUpYLENBSURuRCxPQUpDOztBQUtmLDRCQUFBLE9BQUksQ0FBQzJFLGdCQUFMLENBQXNCM0UsVUFBdEI7O0FBRUEsNEJBQUEsT0FBSSxDQUFDMkIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JpTCwwQkFBdEQsRUFBa0YsK0JBQWxGLEVBQW1IekwsU0FBbkgsRUFBOEg2QixRQUE5SCxFQUF3SUMseUJBQXhJLEVBQW1LcEIsV0FBbkssRUFBZ0xLLE1BQWhMOztBQUVBcUMsNEJBQUFBLE9BQU8sQ0FBQ3BCLElBQUQsQ0FBUDtBQVRlO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBWVRGLDRCQUFBQSw0QkFaUyxHQVltQjVCLEtBQUssQ0FBQzZCLG1CQVp6Qjs7QUFhZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU2lELEtBQTVCLEVBQW1DL0MsMkJBQW9Ca0wsdUJBQXZELEVBQWdGLDRCQUFoRixFQUE4RzFMLFNBQTlHLEVBQXlIbUMsU0FBekgsRUFBb0lMLDRCQUFwSSxFQUErSnBCLFdBQS9KLEVBQTRLSyxNQUE1Szs7QUFDQSxnQ0FBSSxxREFBNEJwQixzQkFBVThELHFCQUF0QyxDQUFKLEVBQWtFO0FBQ2hFO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF4Q1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE4REE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzJHQUNFLG1CQUE2QnJDLFNBQTdCLEVBQWdEK0ssS0FBaEQsRUFBK0RZLGdCQUEvRDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF5RkMsZ0JBQUFBLDZCQUF6RixpRUFBeUosRUFBeko7QUFDUTFMLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CcUwsc0JBQXRELEVBQThFLDBCQUE5RSxFQUEwRzdMLFNBQTFHO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUJtTCxrQ0FKN0MsY0FJbUY5TCxTQUpuRix3QkFJMEcsS0FBSzFCLHdCQUFMLENBQThCZSxTQUp4STtBQUtRNkIsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBTUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXVCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDM0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUE0RHlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQztBQUF4RixpQkFBMUI7QUFFUW9CLGdCQUFBQSxzQkFSVixHQVFxQ2tKLDZCQVJyQyxDQVFVbEosc0JBUlY7QUFVUWhFLGdCQUFBQSxPQVZSLEdBVTZCaUIsc0JBQVVpRCxjQVZ2QztBQVdFbEUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCcU0sY0FBeEIsQ0FBUCxHQUFpRCxLQUFLN00sd0JBQUwsQ0FBOEJ1QyxLQUEvRTtBQUNBbkMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCNkwsV0FBeEIsQ0FBUCxHQUE4QyxLQUFLck0sd0JBQUwsQ0FBOEJ3QyxRQUE1RTtBQUNBcEMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCc00sYUFBeEIsQ0FBUCxHQUFnREwsS0FBaEQ7O0FBRUEsb0JBQUlySSxzQkFBSixFQUE0QjtBQUMxQmhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QjRELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQWhFLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCb0wsc0NBQTVCLGNBQXNFL0wsU0FBdEUsd0JBQTZGLEtBQUsxQix3QkFBTCxDQUE4QmUsU0FBM0gsQ0FBWDtBQUNEOztBQUVELHFCQUFLeUQsa0JBQUwsQ0FBd0IsS0FBS2pFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNc0MsZ0JBQUFBLEdBdkJSLGFBdUJpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQXZCL0MsU0F1QndEUCxXQXZCeEQ7QUF3QlFLLGdCQUFBQSxNQXhCUixHQXdCaUIsTUF4QmpCO0FBeUJRbUMsZ0JBQUFBLE9BekJSLEdBeUJzQztBQUNsQ2xCLGtCQUFBQSxJQUFJLEVBQUV3RSxJQUFJLENBQUNDLFNBQUwsQ0FBZWtGLGdCQUFmLENBRDRCO0FBRWxDak4sa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDZFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q3FLO0FBTDNELGlCQXpCdEM7QUFBQSxtREFpQ1MsSUFBSTVKLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdQbkQsNEJBQUFBLFVBSE8sR0FHS21ELFFBSEwsQ0FHUG5ELE9BSE87O0FBSWYsNEJBQUEsT0FBSSxDQUFDMkUsZ0JBQUwsQ0FBc0IzRSxVQUF0Qjs7QUFFTW9ELDRCQUFBQSx5QkFOUyxHQU1tQjVCLEtBQUssQ0FBQzZCLG1CQU56Qjs7QUFPZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnlMLHdCQUF0RCxFQUFnRiw0QkFBaEYsRUFBOEdqTSxTQUE5RyxFQUF5SDZCLFFBQXpILEVBQW1JQyx5QkFBbkksRUFBOEpwQixXQUE5SixFQUEyS0ssTUFBM0s7O0FBRUFxQyw0QkFBQUEsT0FBTztBQVRRO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBWVR0Qiw0QkFBQUEsNEJBWlMsR0FZbUI1QixLQUFLLENBQUM2QixtQkFaekI7O0FBYWYsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNpRCxLQUE1QixFQUFtQy9DLDJCQUFvQjBMLHFCQUF2RCxFQUE4RSx5QkFBOUUsRUFBeUdsTSxTQUF6RyxFQUFvSG1DLFNBQXBILEVBQStITCw0QkFBL0gsRUFBMEpwQixXQUExSixFQUF1S0ssTUFBdks7O0FBQ0EsZ0NBQUkscURBQTRCcEIsc0JBQVU4RCxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sZUFBTjs7QUFqQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBakNUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBdURBO0FBQ0Y7QUFDQTtBQUNBOzs7OztnSEFDRSxtQkFBa0NyQyxTQUFsQztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRRSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjJMLHVCQUF0RCxFQUErRSw0QkFBL0UsRUFBNkduTSxTQUE3Rzs7QUFDQSxvQkFBSSxDQUFDQSxTQUFMLEVBQWdCO0FBQ2RBLGtCQUFBQSxTQUFTLEdBQUcsbUJBQVo7QUFDRDs7QUFFS1UsZ0JBQUFBLFdBUFIsY0FPMEJDLGlDQUFxQnlMLGdDQVAvQyxjQU9tRixLQUFLOU4sd0JBQUwsQ0FBOEJ1QyxLQVBqSDtBQVFRSyxnQkFBQUEsYUFSUixHQVF3QkMsa0JBQU1DLE1BQU4sRUFSeEI7QUFTRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0M7QUFBOUIsaUJBQTFCO0FBRU01QyxnQkFBQUEsT0FYUixHQVc2QmlCLHNCQUFVaUQsY0FYdkM7QUFZRWxFLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QnFNLGNBQXhCLENBQVAsR0FBaUQsS0FBSzdNLHdCQUFMLENBQThCdUMsS0FBL0U7QUFDQW5DLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QmtCLFNBQXhCLENBQVAsR0FBNENBLFNBQTVDO0FBRUEscUJBQUs4QyxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0FqQlIsYUFpQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BakIvQyxTQWlCd0RQLFdBakJ4RDtBQWtCUUssZ0JBQUFBLE1BbEJSLEdBa0JpQixLQWxCakI7QUFtQlFtQyxnQkFBQUEsT0FuQlIsR0FtQnNDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDZFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3QzBLO0FBSjNELGlCQW5CdEM7QUFBQSxtREEwQlMsSUFBSWpLLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJRUgsUUFKRixDQUlQRyxJQUpPOztBQUtmLDRCQUFBLE9BQUksQ0FBQzNCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9COEwseUJBQXRELEVBQWlGLDhCQUFqRixFQUFpSHRNLFNBQWpILEVBQTRINkIsUUFBNUgsRUFBc0lDLHlCQUF0SSxFQUFpS3BCLFdBQWpLLEVBQThLSyxNQUE5Szs7QUFFQXFDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFQZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVVURiw0QkFBQUEsNEJBVlMsR0FVbUI1QixLQUFLLENBQUM2QixtQkFWekI7O0FBV2YsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNpRCxLQUE1QixFQUFtQy9DLDJCQUFvQitMLHNCQUF2RCxFQUErRSwyQkFBL0UsRUFBNEd2TSxTQUE1RyxFQUF1SG1DLFNBQXZILEVBQWtJTCw0QkFBbEksRUFBNkpwQixXQUE3SixFQUEwS0ssTUFBMUs7O0FBQ0EsZ0NBQUkscURBQTRCcEIsc0JBQVU4RCxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sZUFBTjs7QUFmZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkExQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUE4Q0E7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs0SEFDRSxtQkFBOENyQyxTQUE5QyxFQUFpRXdNLGdDQUFqRTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUEyR0MsZ0JBQUFBLG1DQUEzRyxpRUFBdUwsRUFBdkw7QUFDUXZNLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Ca00sbUNBQXRELEVBQTJGLHlDQUEzRixFQUFzSTFNLFNBQXRJO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUJnTSxpQ0FKN0MsY0FJa0YsS0FBS3JPLHdCQUFMLENBQThCdUMsS0FKaEgsY0FJeUgsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFKdkosY0FJbUtkLFNBSm5LO0FBS1FrQixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFNRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFdUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUMzRCxtQ0FBdUJGLGFBQXhCLENBQXBCO0FBQTREeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDO0FBQXhGLGlCQUExQjtBQUVRb0IsZ0JBQUFBLHNCQVJWLEdBUXFDK0osbUNBUnJDLENBUVUvSixzQkFSVjtBQVVRaEUsZ0JBQUFBLE9BVlIsR0FVNkJpQixzQkFBVWlELGNBVnZDO0FBV0VsRSxnQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJxTSxjQUF4QixDQUFQLEdBQWlELEtBQUs3TSx3QkFBTCxDQUE4QnVDLEtBQS9FOztBQUVBLG9CQUFJNkIsc0JBQUosRUFBNEI7QUFDMUJoRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUI0RCxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0FoRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJGLGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDQThCLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQmlNLHFDQUE1QixjQUFxRSxLQUFLdE8sd0JBQUwsQ0FBOEJ1QyxLQUFuRyxjQUE0RyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUExSSxjQUFzSmQsU0FBdEosQ0FBWDtBQUNEOztBQUVELHFCQUFLOEMsa0JBQUwsQ0FBd0IsS0FBS2pFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVBZ0MsZ0JBQUFBLFdBQVcsSUFBSSxnQkFBZ0JmLHNCQUFVa04sZ0JBQXpDO0FBRU03TCxnQkFBQUEsR0F2QlIsYUF1QmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BdkIvQyxTQXVCd0RQLFdBdkJ4RDtBQXdCUUssZ0JBQUFBLE1BeEJSLEdBd0JpQixNQXhCakI7QUF5QlFtQyxnQkFBQUEsT0F6QlIsR0F5QnNDO0FBQ2xDbEIsa0JBQUFBLElBQUksRUFBRXdFLElBQUksQ0FBQ0MsU0FBTCxDQUFlK0YsZ0NBQWYsQ0FENEI7QUFFbEM5TixrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1Msa0JBQUFBLE9BQU8sNkJBQUUsS0FBS2xELGFBQUwsQ0FBbUJtRCxxQkFBckIsNkVBQThDLEtBQUtuRCxhQUFMLENBQW1Cb0Qsb0JBQW5CLENBQXdDbUw7QUFMM0QsaUJBekJ0QztBQUFBLG1EQWlDUyxJQUFJMUssT0FBSjtBQUFBLDZHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUW5CLGFBQWEsQ0FBQ2dDLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHJCLDRCQUFBQSxRQUZTO0FBR1BuRCw0QkFBQUEsVUFITyxHQUdLbUQsUUFITCxDQUdQbkQsT0FITzs7QUFJZiw0QkFBQSxPQUFJLENBQUMyRSxnQkFBTCxDQUFzQjNFLFVBQXRCOztBQUVNb0QsNEJBQUFBLHlCQU5TLEdBTW1CNUIsS0FBSyxDQUFDNkIsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CdU0scUNBQXRELEVBQTZGLDJDQUE3RixFQUEwSS9NLFNBQTFJLEVBQXFKNkIsUUFBckosRUFBK0pDLHlCQUEvSixFQUEwTHBCLFdBQTFMLEVBQXVNSyxNQUF2TTs7QUFDQXFDLDRCQUFBQSxPQUFPO0FBUlE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFXVHRCLDRCQUFBQSw0QkFYUyxHQVdtQjVCLEtBQUssQ0FBQzZCLG1CQVh6Qjs7QUFZZiw0QkFBQSxPQUFJLENBQUMxQixhQUFMLENBQW1CQyxtQkFBU2lELEtBQTVCLEVBQW1DL0MsMkJBQW9Cd00sa0NBQXZELEVBQTJGLHdDQUEzRixFQUFxSWhOLFNBQXJJLEVBQWdKbUMsU0FBaEosRUFBMkpMLDRCQUEzSixFQUFzTHBCLFdBQXRMLEVBQW1NSyxNQUFuTTs7QUFDQSxnQ0FBSSxxREFBNkJwQixzQkFBVThELHFCQUF2QyxDQUFKLEVBQW1FO0FBQ2pFO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWhCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFqQ1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFzREE7QUFDRjtBQUNBOzs7OzsrR0FDRSxtQkFBaUNyQyxTQUFqQyxFQUFvRDRELHNCQUFwRDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFvRnFKLGdCQUFBQSxpQ0FBcEYsaUVBQTRKLEVBQTVKOztBQUFBLHNCQUVNLENBQUNySixzQkFBRCxJQUEyQkEsc0JBQXNCLEtBQUs5RCx1QkFBZ0JDLEVBRjVFO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQUdXcUMsT0FBTyxDQUFDZ0IsT0FBUixFQUhYOztBQUFBO0FBS1FsRCxnQkFBQUEsS0FMUixHQUtnQkMsYUFBTUMsS0FBTixFQUxoQjtBQU1VOE0sZ0JBQUFBLG1CQU5WLEdBTWtDRCxpQ0FObEMsQ0FNVUMsbUJBTlY7O0FBQUEsc0JBT00sQ0FBQ3RKLHNCQUFELElBQTJCQSxzQkFBc0IsS0FBSzlELHVCQUFnQkMsRUFQNUU7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBT3dGLElBQUlOLEtBQUosQ0FBVSwwQ0FBVixDQVB4Rjs7QUFBQTtBQVFRaUIsZ0JBQUFBLFdBUlIsY0FRMEJDLGlDQUFxQndNLHVCQVIvQyxjQVEwRW5OLFNBUjFFO0FBU1FrQixnQkFBQUEsYUFUUixHQVN3QkMsa0JBQU1DLE1BQU4sRUFUeEI7QUFXUTFDLGdCQUFBQSxPQVhSLEdBVzZCaUIsc0JBQVVpRCxjQVh2QztBQVlFbEUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCcU0sY0FBeEIsQ0FBUCxHQUFpRCxLQUFLN00sd0JBQUwsQ0FBOEJ1QyxLQUEvRTs7QUFDQSxvQkFBSXFNLG1CQUFKLEVBQXlCO0FBQ3ZCeE8sa0JBQUFBLE9BQU8sQ0FBQ2lCLHNCQUFVdU4sbUJBQVgsQ0FBUCxHQUF5Q0EsbUJBQXpDO0FBQ0Q7O0FBRUQscUJBQUtwSyxrQkFBTCxDQUF3QixLQUFLakUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0FuQlIsYUFtQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BbkIvQyxTQW1Cd0RQLFdBbkJ4RDtBQW9CUUssZ0JBQUFBLE1BcEJSLEdBb0JpQixNQXBCakI7QUFxQlFtQyxnQkFBQUEsT0FyQlIsR0FxQnNDO0FBQ2xDeEUsa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENTLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtsRCxhQUFMLENBQW1CbUQscUJBQXJCLDZFQUE4QyxLQUFLbkQsYUFBTCxDQUFtQm9ELG9CQUFuQixDQUF3Q3lMO0FBSjNELGlCQXJCdEM7QUFBQSxtREE0QlMsSUFBSWhMLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFuQixhQUFhLENBQUNnQyxPQUFELENBRnJCOztBQUFBO0FBRVRyQiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI1QixLQUFLLENBQUM2QixtQkFIekI7O0FBSWYsNEJBQUEsT0FBSSxDQUFDMUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I2TSw0QkFBdEQsRUFBb0YsaUNBQXBGLEVBQXVIck4sU0FBdkgsRUFBa0k2QixRQUFsSSxFQUE0SUMseUJBQTVJLEVBQXVLcEIsV0FBdkssRUFBb0xLLE1BQXBMOztBQUVBcUMsNEJBQUFBLE9BQU87QUFOUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVNUdEIsNEJBQUFBLDRCQVRTLEdBU21CNUIsS0FBSyxDQUFDNkIsbUJBVHpCOztBQVdmLDRCQUFBLE9BQUksQ0FBQzFCLGFBQUwsQ0FBbUJDLG1CQUFTaUQsS0FBNUIsRUFBbUMvQywyQkFBb0I4TSx5QkFBdkQsRUFBa0YsOEJBQWxGLEVBQWtIdE4sU0FBbEgsRUFBNkhtQyxTQUE3SCxFQUF3SUwsNEJBQXhJLEVBQW1LcEIsV0FBbkssRUFBZ0xLLE1BQWhMOztBQUVBLGdDQUFJLHFEQUE0QnBCLHNCQUFVOEQscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBaEJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQTVCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQWlEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O1dBQ0UsdUJBQXNCa0wsUUFBdEIsRUFBMENDLGtCQUExQyxFQUFtRkMsV0FBbkYsRUFBd0d6TixTQUF4RyxFQUE0SDZCLFFBQTVILEVBQTJKQyx5QkFBM0osRUFBK0xwQixXQUEvTCxFQUFxTkssTUFBck4sRUFBc08rRCxLQUF0TyxFQUF1UDRJLGNBQXZQLEVBQW1SO0FBQUE7O0FBQUU7QUFDblIsVUFBSSxDQUFDLEtBQUtqUCxNQUFWLEVBQWtCO0FBQ2hCO0FBQ0Q7O0FBQ0QsVUFBSXFHLEtBQUosRUFBVztBQUNUNkksMkNBQWlCQyw2QkFBakIsQ0FBK0M5SSxLQUEvQztBQUNEOztBQUVELFVBQUkrSSx1QkFBdUIsR0FBRzFMLFNBQTlCOztBQUNBLFVBQUl1TCxjQUFKLEVBQW9CO0FBQ2xCRyxRQUFBQSx1QkFBdUIscUJBQVFILGNBQVIsQ0FBdkI7O0FBQ0EsWUFBSUcsdUJBQXVCLENBQUMvSCxpQkFBNUIsRUFBK0M7QUFDN0M2SCw2Q0FBaUJHLDRCQUFqQixDQUE4Q0QsdUJBQXVCLENBQUMvSCxpQkFBdEU7QUFDRDs7QUFDRCxZQUFJK0gsdUJBQXVCLENBQUNFLGVBQTVCLEVBQTZDO0FBQzNDSiw2Q0FBaUJLLG9CQUFqQixDQUFzQ0gsdUJBQXVCLENBQUNFLGVBQTlEO0FBQ0Q7O0FBQ0RKLDJDQUFpQk0sZ0JBQWpCLENBQWtDSix1QkFBbEM7QUFDRDs7QUFFRCxVQUFNSyxVQUFVLEdBQUc7QUFDakJDLFFBQUFBLFNBQVMsRUFBRW5PLFNBRE07QUFFakJvTyxRQUFBQSxNQUFNLEVBQUV2TSxRQUFGLGFBQUVBLFFBQUYsdUJBQUVBLFFBQVEsQ0FBRUcsSUFBVixDQUFlb00sTUFGTjtBQUdqQkMsUUFBQUEseUJBQXlCLEVBQUV2TSx5QkFIVjtBQUlqQndNLFFBQUFBLGFBQWEsRUFBRXpNLFFBQUYsYUFBRUEsUUFBRix1QkFBRUEsUUFBUSxDQUFFbkQsT0FBVixDQUFrQmlCLHNCQUFVNE8sYUFBNUIsQ0FKRTtBQUtqQkMsUUFBQUEsV0FBVyxFQUFFOU4sV0FMSTtBQU1qQitOLFFBQUFBLGFBQWEsRUFBRTFOLE1BTkU7QUFPakIyTixRQUFBQSxrQkFBa0IsRUFBRTdNLFFBQVEsR0FBR0EsUUFBUSxDQUFDeUMsTUFBWixHQUFxQlEsS0FBSyxpQkFBSUEsS0FBRCxDQUFlakQsUUFBbEIsK0NBQUcsV0FBeUJ5QyxNQUE1QixHQUFxQ25DLFNBUDFFO0FBT3FGO0FBQ3RHd00sUUFBQUEsZ0JBQWdCLEVBQUU3SixLQVJEO0FBU2pCOEosUUFBQUEsY0FBYyxFQUFFZjtBQVRDLE9BQW5CO0FBV0EsV0FBS3BQLE1BQUwsQ0FBWTZMLEdBQVosQ0FBZ0JpRCxRQUFoQixFQUEwQkMsa0JBQTFCLEVBQThDVSxVQUE5QyxFQUEwRFQsV0FBMUQ7QUFDRCxLLENBRUQ7Ozs7Ozs7aUNBdnNDbUJwUCxHLGlDQUNnRDtBQUNqRXVELEVBQUFBLGFBQWEsRUFBRSxLQURrRDtBQUVqRXVCLEVBQUFBLGFBQWEsRUFBRSxLQUZrRDtBQUdqRWEsRUFBQUEsWUFBWSxFQUFFLEtBSG1EO0FBSWpFdUUsRUFBQUEsV0FBVyxFQUFFLEtBSm9EO0FBS2pFVSxFQUFBQSxZQUFZLEVBQUUsS0FMbUQ7QUFNakU5RCxFQUFBQSxxQkFBcUIsRUFBRSxLQU4wQztBQU9qRUcsRUFBQUEsd0JBQXdCLEVBQUUsS0FQdUM7QUFRakUwRSxFQUFBQSxzQkFBc0IsRUFBRSxLQVJ5QztBQVNqRVksRUFBQUEsbUJBQW1CLEVBQUUsS0FUNEM7QUFVakVZLEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFUSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVLLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFUyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRWhGLEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFc0YsRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEbEwsRywwQkFvQnNDO0FBQ3ZETyxFQUFBQSxhQUFhLEVBQUUsb0JBQVNpUSxTQUFULENBQW1CLENBQW5CLEVBQXNCLENBQXRCLENBRHdDO0FBRXZEbkssRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkRiLEVBQUFBLHNCQUFzQixFQUFFLEtBSitCO0FBS3ZENUMsRUFBQUEsMEJBQTBCLEVBQUUsQ0FMMkI7QUFNdkRJLEVBQUFBLHFCQUFxQixFQUFFUyxTQU5nQztBQU92RFIsRUFBQUEsb0JBQW9CLEVBQUV0RCxHQUFHLENBQUN5USwyQkFQNkI7QUFRdkQvTCxFQUFBQSxpQ0FBaUMsRUFBRTtBQVJvQixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50IH0gZnJvbSBcIi4vVXRpbHMvZW5kcG9pbnRzQ3JlYXRvcnNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IgZnJvbSBcIi4vVXRpbHMvdGhyb3dDbGllbnRIVFRQRXJyb3JcIjtcbmltcG9ydCBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciBmcm9tIFwiLi9VdGlscy9TZXNzaW9uSW5pdFJldHJ5SGFuZGxlclwiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG4gIHNlc3Npb25JZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGQUlMRUQsIFwiR2V0IENoYXQgY29uZmlnIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIC8vIEFwcGVuZCByZWNvbm5lY3QgaWQgb24gdGhlIGVuZHBvaW50IGlmIHZhaWxhYmxlXG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlKTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJhbXMucmVmcmVzaFRva2VuID0gJ3RydWUnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLCByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgbGV0IGdldENoYXRUb2tlbkVycm9yOmFueSA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgXCJHZXQgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgZ2V0Q2hhdFRva2VuRXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAvLyBTdG9wIHJldHJ5IG9uIDQyOVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICBpZiAoZ2V0Q2hhdFRva2VuRXJyb3IgJiYgZ2V0Q2hhdFRva2VuRXJyb3IuY29kZSA9PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGdldENoYXRUb2tlbkVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHJpZXMgdW50aWwgaXQgcmVhY2hlcyBpdHMgbGltaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmdldENoYXRUb2tlbihyZXF1ZXN0SWQsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zLCBjdXJyZW50UmV0cnlDb3VudCArIDEpLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSkuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICAgIH0sIHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0YWJsZUNoYXRzKHJlY29ubmVjdGFibGVDaGF0c1BhcmFtczogSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyk6IFByb21pc2U8UmVjb25uZWN0TWFwcGluZ1JlY29yZCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nKTogUHJvbWlzZTxSZWNvbm5lY3RBdmFpbGFiaWxpdHkgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuV0FSTiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGFcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IEF2YWlsYWJpbGl0eSBmYWlsZWRcIiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIsXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvciA6IGFueSkge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvciA6IGFueSkge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYXQgdHJhbnNjcmlwdHMgZm9yIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRyYW5zY3JpcHRzKHJlcXVlc3RJZDogc3RyaW5nLCBjaGF0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRGQUlMRUQsIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsICBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55KTogdm9pZCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==