@microsoft/ocsdk 0.5.22-main.a753951 → 0.6.0-main.316a2fa
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/SDK.min.js +1 -1
- package/dist/SDK.min.js.LICENSE.txt +1 -1
- package/lib/Common/Constants.d.ts +7 -7
- package/lib/Common/Constants.js +5 -5
- package/lib/Common/Constants.js.map +1 -1
- package/lib/Common/Enums.d.ts +4 -1
- package/lib/Common/Enums.js +4 -1
- package/lib/Common/Enums.js.map +1 -1
- package/lib/Common/OmnichannelEndpoints.d.ts +2 -0
- package/lib/Common/OmnichannelEndpoints.js +3 -1
- package/lib/Common/OmnichannelEndpoints.js.map +1 -1
- package/lib/Common/RequestTimeoutConfig.d.ts +1 -0
- package/lib/Common/RequestTimeoutConfig.js +1 -1
- package/lib/Interfaces/IRenewChatTokenOptionalParams.d.ts +6 -0
- package/lib/Interfaces/IRenewChatTokenOptionalParams.js +2 -0
- package/lib/Interfaces/IRenewChatTokenOptionalParams.js.map +1 -0
- package/lib/Interfaces/ISDK.d.ts +3 -0
- package/lib/Interfaces/ISDK.js +1 -1
- package/lib/Interfaces/ISDKConfiguration.d.ts +4 -0
- package/lib/Interfaces/ISDKConfiguration.js +1 -1
- package/lib/Model/IOCSDKLogData.d.ts +1 -0
- package/lib/Model/IOCSDKLogData.js +1 -1
- package/lib/Model/RenewChatTokenResponse.d.ts +10 -0
- package/lib/Model/RenewChatTokenResponse.js +22 -0
- package/lib/Model/RenewChatTokenResponse.js.map +1 -0
- package/lib/SDK.d.ts +10 -0
- package/lib/SDK.js +771 -633
- package/lib/SDK.js.map +1 -1
- package/lib/Utils/LoggingSanitizer.d.ts +1 -0
- package/lib/Utils/LoggingSanitizer.js +24 -5
- package/lib/Utils/LoggingSanitizer.js.map +1 -1
- package/lib/Utils/TelemetryHelper.js +3 -2
- package/lib/Utils/TelemetryHelper.js.map +1 -1
- package/lib/Utils/axiosRetryHandler.d.ts +8 -1
- package/lib/Utils/axiosRetryHandler.js +28 -6
- package/lib/Utils/axiosRetryHandler.js.map +1 -1
- package/lib/Utils/waitTimeBetweenRetriesConfigs.js +3 -2
- package/lib/Utils/waitTimeBetweenRetriesConfigs.js.map +1 -1
- package/package.json +5 -5
package/lib/SDK.js
CHANGED
|
@@ -35,7 +35,7 @@ var _SessionInitRetryHandler = _interopRequireDefault(require("./Utils/SessionIn
|
|
|
35
35
|
var _uuid = require("./Utils/uuid");
|
|
36
36
|
var _waitTimeBetweenRetriesConfigs = require("./Utils/waitTimeBetweenRetriesConfigs");
|
|
37
37
|
var _SDK;
|
|
38
|
-
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var
|
|
38
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t22 in e) "default" !== _t22 && {}.hasOwnProperty.call(e, _t22) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t22)) && (i.get || i.set) ? o(f, _t22, i) : f[_t22] = e[_t22]); return f; })(e, t); }
|
|
39
39
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
40
40
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
41
41
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
@@ -204,6 +204,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
204
204
|
data,
|
|
205
205
|
_httpRequestResponseTime2,
|
|
206
206
|
_elapsedTimeInMilliseconds2,
|
|
207
|
+
retryCount,
|
|
207
208
|
_args2 = arguments,
|
|
208
209
|
_t2;
|
|
209
210
|
return _regenerator["default"].wrap(function (_context2) {
|
|
@@ -221,6 +222,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
221
222
|
axiosInstance = _axios["default"].create();
|
|
222
223
|
(0, _axiosRetryHandler["default"])(axiosInstance, {
|
|
223
224
|
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
225
|
+
retryOn429: this.configuration.getChatConfigRetryOn429,
|
|
224
226
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatConfig
|
|
225
227
|
});
|
|
226
228
|
requestHeaders = {};
|
|
@@ -249,14 +251,15 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
249
251
|
data.headers["date"] = response.headers["date"];
|
|
250
252
|
}
|
|
251
253
|
}
|
|
252
|
-
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
254
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime, (0, _axiosRetryHandler.getRetryCount)(response === null || response === void 0 ? void 0 : response.config));
|
|
253
255
|
return _context2.abrupt("return", data);
|
|
254
256
|
case 3:
|
|
255
257
|
_context2.prev = 3;
|
|
256
258
|
_t2 = _context2["catch"](1);
|
|
257
259
|
_httpRequestResponseTime2 = backendTimer.milliSecondsElapsed;
|
|
258
260
|
_elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
|
|
259
|
-
|
|
261
|
+
retryCount = (0, _axiosRetryHandler.getRetryCount)(_t2 === null || _t2 === void 0 ? void 0 : _t2.config);
|
|
262
|
+
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _t2, undefined, requestHeaders, _httpRequestResponseTime2, retryCount);
|
|
260
263
|
return _context2.abrupt("return", Promise.reject(_t2));
|
|
261
264
|
case 4:
|
|
262
265
|
case "end":
|
|
@@ -315,7 +318,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
315
318
|
|
|
316
319
|
// Extract auth token and reconnect id from optional param
|
|
317
320
|
authenticatedUserToken = getLWIDetailsOptionalParams.authenticatedUserToken, reconnectId = getLWIDetailsOptionalParams.reconnectId;
|
|
318
|
-
requestHeaders = _Constants["default"].defaultHeaders; // updated auth endpoint for authenticated chats and add auth token in header
|
|
321
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders); // updated auth endpoint for authenticated chats and add auth token in header
|
|
319
322
|
if (authenticatedUserToken) {
|
|
320
323
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthLiveWorkItemDetailsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
321
324
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
@@ -448,7 +451,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
448
451
|
if (!requestId) {
|
|
449
452
|
requestId = (0, _uuid.uuidv4)();
|
|
450
453
|
}
|
|
451
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
454
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
452
455
|
this.addDefaultHeaders(requestId, requestHeaders);
|
|
453
456
|
endpoint = (0, _endpointsCreators.createGetChatTokenEndpoint)(currentLiveChatVersion || this.liveChatVersion, authenticatedUserToken ? true : false, multiBot);
|
|
454
457
|
if (authenticatedUserToken) {
|
|
@@ -572,41 +575,75 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
572
575
|
return getChatToken;
|
|
573
576
|
}()
|
|
574
577
|
/**
|
|
575
|
-
*
|
|
576
|
-
*
|
|
578
|
+
* Renews the ACS chat token of the visitor in an open conversation, so the chat can continue after the token
|
|
579
|
+
* from getChatToken expires. Rejects when the API is not available or the conversation can't be renewed (e.g. 404);
|
|
580
|
+
* callers should keep their current token in that case.
|
|
581
|
+
* @param requestId RequestId of the conversation, or the reconnect id for a reconnected chat.
|
|
582
|
+
* @param renewChatTokenOptionalParams Optional parameters for renew chat token.
|
|
577
583
|
*/
|
|
578
584
|
)
|
|
579
585
|
}, {
|
|
580
|
-
key: "
|
|
586
|
+
key: "renewChatToken",
|
|
581
587
|
value: (function () {
|
|
582
|
-
var
|
|
588
|
+
var _renewChatToken = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8(requestId) {
|
|
583
589
|
var _this$configuration$d5,
|
|
590
|
+
_this$configuration$w,
|
|
591
|
+
_this$configuration$w2,
|
|
584
592
|
_this4 = this;
|
|
585
|
-
var
|
|
593
|
+
var renewChatTokenOptionalParams,
|
|
594
|
+
timer,
|
|
595
|
+
authenticatedUserToken,
|
|
596
|
+
requestHeaders,
|
|
597
|
+
endpoint,
|
|
598
|
+
requestPath,
|
|
599
|
+
params,
|
|
600
|
+
url,
|
|
601
|
+
method,
|
|
602
|
+
options,
|
|
603
|
+
axiosInstance,
|
|
604
|
+
_args8 = arguments;
|
|
586
605
|
return _regenerator["default"].wrap(function (_context8) {
|
|
587
606
|
while (1) switch (_context8.prev = _context8.next) {
|
|
588
607
|
case 0:
|
|
608
|
+
renewChatTokenOptionalParams = _args8.length > 1 && _args8[1] !== undefined ? _args8[1] : {};
|
|
589
609
|
timer = _Timer.Timer.TIMER();
|
|
590
|
-
authenticatedUserToken =
|
|
591
|
-
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
592
|
-
requestId
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
610
|
+
authenticatedUserToken = renewChatTokenOptionalParams.authenticatedUserToken;
|
|
611
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.RENEWCHATTOKENSTARTED, "Renew Chat Token Started", requestId);
|
|
612
|
+
if (requestId) {
|
|
613
|
+
_context8.next = 1;
|
|
614
|
+
break;
|
|
615
|
+
}
|
|
616
|
+
throw new Error("Invalid requestId");
|
|
617
|
+
case 1:
|
|
618
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
619
|
+
if (authenticatedUserToken) {
|
|
620
|
+
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
621
|
+
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
622
|
+
}
|
|
597
623
|
this.addDefaultHeaders(requestId, requestHeaders);
|
|
624
|
+
endpoint = authenticatedUserToken ? _OmnichannelEndpoints["default"].LiveChatv2AuthRenewChatTokenPath : _OmnichannelEndpoints["default"].LiveChatv2RenewChatTokenPath;
|
|
625
|
+
requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
626
|
+
params = {
|
|
627
|
+
channelId: this.omnichannelConfiguration.channelId
|
|
628
|
+
};
|
|
598
629
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
599
630
|
method = "GET";
|
|
600
631
|
options = {
|
|
601
632
|
headers: requestHeaders,
|
|
602
633
|
method: method,
|
|
603
634
|
url: url,
|
|
604
|
-
|
|
635
|
+
params: params,
|
|
636
|
+
timeout: (_this$configuration$d5 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d5 !== void 0 ? _this$configuration$d5 : this.configuration.requestTimeoutConfig.renewChatToken
|
|
605
637
|
};
|
|
606
638
|
axiosInstance = _axios["default"].create();
|
|
639
|
+
(0, _axiosRetryHandler["default"])(axiosInstance, {
|
|
640
|
+
headerOverwrites: [_OmnichannelHTTPHeaders["default"].authCodeNonce],
|
|
641
|
+
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
642
|
+
waitTimeInMsBetweenRetries: (_this$configuration$w = (_this$configuration$w2 = this.configuration.waitTimeBetweenRetriesConfig) === null || _this$configuration$w2 === void 0 ? void 0 : _this$configuration$w2.renewChatToken) !== null && _this$configuration$w !== void 0 ? _this$configuration$w : _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs.renewChatToken
|
|
643
|
+
});
|
|
607
644
|
return _context8.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
608
645
|
var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7(resolve, reject) {
|
|
609
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime5, _elapsedTimeInMilliseconds5, _t5;
|
|
646
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, error, _httpRequestResponseTime5, _elapsedTimeInMilliseconds5, _t5;
|
|
610
647
|
return _regenerator["default"].wrap(function (_context7) {
|
|
611
648
|
while (1) switch (_context7.prev = _context7.next) {
|
|
612
649
|
case 0:
|
|
@@ -620,31 +657,35 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
620
657
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
621
658
|
data = response.data, headers = response.headers;
|
|
622
659
|
_this4.setAuthCodeNonce(headers);
|
|
623
|
-
|
|
624
|
-
// Resolves only if it contains reconnectable chats response which only happens on status 200
|
|
625
|
-
if (!data) {
|
|
660
|
+
if (!(!data || (0, _typeof2["default"])(data) !== "object" || !data.Token)) {
|
|
626
661
|
_context7.next = 3;
|
|
627
662
|
break;
|
|
628
663
|
}
|
|
629
|
-
|
|
630
|
-
|
|
664
|
+
error = new Error("Invalid data received from renewChatToken"); // Not passing response: logWithLogger reads response.data.Region, which throws when data is null
|
|
665
|
+
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.RENEWCHATTOKENFAILED, "Renew Chat Token failed", requestId, undefined, elapsedTimeInMilliseconds, requestPath, method, error, undefined, requestHeaders, httpRequestResponseTime);
|
|
666
|
+
reject(error);
|
|
631
667
|
return _context7.abrupt("return");
|
|
632
668
|
case 3:
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
669
|
+
data.requestId = requestId;
|
|
670
|
+
_this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.RENEWCHATTOKENSUCCEEDED, "Renew Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
671
|
+
resolve(data);
|
|
672
|
+
_context7.next = 6;
|
|
673
|
+
break;
|
|
636
674
|
case 4:
|
|
637
675
|
_context7.prev = 4;
|
|
638
676
|
_t5 = _context7["catch"](1);
|
|
639
677
|
_httpRequestResponseTime5 = backendTimer.milliSecondsElapsed;
|
|
640
678
|
_elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
|
|
641
|
-
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.
|
|
642
|
-
if ((0, _isExpectedAxiosError["default"])(_t5, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
643
|
-
|
|
679
|
+
_this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.RENEWCHATTOKENFAILED, "Renew Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _t5, undefined, requestHeaders, _httpRequestResponseTime5);
|
|
680
|
+
if (!(0, _isExpectedAxiosError["default"])(_t5, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
681
|
+
_context7.next = 5;
|
|
682
|
+
break;
|
|
644
683
|
}
|
|
645
|
-
reject(
|
|
684
|
+
reject(new Error(_this4.HTTPTimeOutErrorMessage));
|
|
646
685
|
return _context7.abrupt("return");
|
|
647
686
|
case 5:
|
|
687
|
+
reject(_t5);
|
|
688
|
+
case 6:
|
|
648
689
|
case "end":
|
|
649
690
|
return _context7.stop();
|
|
650
691
|
}
|
|
@@ -654,58 +695,53 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
654
695
|
return _ref3.apply(this, arguments);
|
|
655
696
|
};
|
|
656
697
|
}()));
|
|
657
|
-
case
|
|
698
|
+
case 2:
|
|
658
699
|
case "end":
|
|
659
700
|
return _context8.stop();
|
|
660
701
|
}
|
|
661
702
|
}, _callee8, this);
|
|
662
703
|
}));
|
|
663
|
-
function
|
|
664
|
-
return
|
|
704
|
+
function renewChatToken(_x8) {
|
|
705
|
+
return _renewChatToken.apply(this, arguments);
|
|
665
706
|
}
|
|
666
|
-
return
|
|
707
|
+
return renewChatToken;
|
|
667
708
|
}()
|
|
668
709
|
/**
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
710
|
+
* Fetches the reconnectable chats from omnichannel from the given user information in JWT token(claim name: sub).
|
|
711
|
+
* @param reconnectableChatsParams Mandate parameters for get reconnectable chats.
|
|
712
|
+
*/
|
|
672
713
|
)
|
|
673
714
|
}, {
|
|
674
|
-
key: "
|
|
715
|
+
key: "getReconnectableChats",
|
|
675
716
|
value: (function () {
|
|
676
|
-
var
|
|
717
|
+
var _getReconnectableChats = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0(reconnectableChatsParams) {
|
|
677
718
|
var _this$configuration$d6,
|
|
678
719
|
_this5 = this;
|
|
679
|
-
var
|
|
680
|
-
timer,
|
|
681
|
-
requestPath,
|
|
682
|
-
requestHeaders,
|
|
683
|
-
url,
|
|
684
|
-
method,
|
|
685
|
-
options,
|
|
686
|
-
axiosInstance,
|
|
687
|
-
_args0 = arguments;
|
|
720
|
+
var timer, authenticatedUserToken, requestId, requestPath, requestHeaders, url, method, options, axiosInstance;
|
|
688
721
|
return _regenerator["default"].wrap(function (_context0) {
|
|
689
722
|
while (1) switch (_context0.prev = _context0.next) {
|
|
690
723
|
case 0:
|
|
691
|
-
optionalParams = _args0.length > 1 && _args0[1] !== undefined ? _args0[1] : {};
|
|
692
724
|
timer = _Timer.Timer.TIMER();
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
725
|
+
authenticatedUserToken = reconnectableChatsParams.authenticatedUserToken;
|
|
726
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSSTARTED, "Get Reconnectable chat Started");
|
|
727
|
+
requestId = reconnectableChatsParams === null || reconnectableChatsParams === void 0 ? void 0 : reconnectableChatsParams.requestId;
|
|
728
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetReconnectableChatsPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
729
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
730
|
+
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
731
|
+
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
732
|
+
this.addDefaultHeaders(requestId, requestHeaders);
|
|
697
733
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
698
734
|
method = "GET";
|
|
699
735
|
options = {
|
|
700
736
|
headers: requestHeaders,
|
|
701
737
|
method: method,
|
|
702
738
|
url: url,
|
|
703
|
-
timeout: (_this$configuration$d6 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d6 !== void 0 ? _this$configuration$d6 : this.configuration.requestTimeoutConfig.
|
|
739
|
+
timeout: (_this$configuration$d6 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d6 !== void 0 ? _this$configuration$d6 : this.configuration.requestTimeoutConfig.getReconnectableChats
|
|
704
740
|
};
|
|
705
741
|
axiosInstance = _axios["default"].create();
|
|
706
742
|
return _context0.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
707
743
|
var _ref4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9(resolve, reject) {
|
|
708
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime6, _elapsedTimeInMilliseconds6, _t6;
|
|
744
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime6, _elapsedTimeInMilliseconds6, _t6;
|
|
709
745
|
return _regenerator["default"].wrap(function (_context9) {
|
|
710
746
|
while (1) switch (_context9.prev = _context9.next) {
|
|
711
747
|
case 0:
|
|
@@ -717,17 +753,19 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
717
753
|
response = _context9.sent;
|
|
718
754
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
719
755
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
720
|
-
data = response.data;
|
|
756
|
+
data = response.data, headers = response.headers;
|
|
757
|
+
_this5.setAuthCodeNonce(headers);
|
|
758
|
+
|
|
759
|
+
// Resolves only if it contains reconnectable chats response which only happens on status 200
|
|
721
760
|
if (!data) {
|
|
722
761
|
_context9.next = 3;
|
|
723
762
|
break;
|
|
724
763
|
}
|
|
725
|
-
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.
|
|
764
|
+
_this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSSUCCEEDED, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
726
765
|
resolve(data);
|
|
727
766
|
return _context9.abrupt("return");
|
|
728
767
|
case 3:
|
|
729
|
-
// No data found so returning null
|
|
730
|
-
_this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
768
|
+
// No data found in the old sessions so returning null
|
|
731
769
|
resolve();
|
|
732
770
|
return _context9.abrupt("return");
|
|
733
771
|
case 4:
|
|
@@ -735,7 +773,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
735
773
|
_t6 = _context9["catch"](1);
|
|
736
774
|
_httpRequestResponseTime6 = backendTimer.milliSecondsElapsed;
|
|
737
775
|
_elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
|
|
738
|
-
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.
|
|
776
|
+
_this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATSFAILED, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _t6, undefined, requestHeaders, _httpRequestResponseTime6);
|
|
739
777
|
if ((0, _isExpectedAxiosError["default"])(_t6, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
740
778
|
reject(new Error(_this5.HTTPTimeOutErrorMessage));
|
|
741
779
|
}
|
|
@@ -757,7 +795,104 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
757
795
|
}
|
|
758
796
|
}, _callee0, this);
|
|
759
797
|
}));
|
|
760
|
-
function
|
|
798
|
+
function getReconnectableChats(_x1) {
|
|
799
|
+
return _getReconnectableChats.apply(this, arguments);
|
|
800
|
+
}
|
|
801
|
+
return getReconnectableChats;
|
|
802
|
+
}()
|
|
803
|
+
/**
|
|
804
|
+
* Fetches the reconnectable chats from omnichannel from the given user information in JWT token(claim name: sub).
|
|
805
|
+
* @param reconnectableChatsParams Mandate parameters for get reconnectable chats.
|
|
806
|
+
*/
|
|
807
|
+
)
|
|
808
|
+
}, {
|
|
809
|
+
key: "getReconnectAvailability",
|
|
810
|
+
value: (function () {
|
|
811
|
+
var _getReconnectAvailability = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10(reconnectId) {
|
|
812
|
+
var _this$configuration$d7,
|
|
813
|
+
_this6 = this;
|
|
814
|
+
var optionalParams,
|
|
815
|
+
timer,
|
|
816
|
+
requestPath,
|
|
817
|
+
requestHeaders,
|
|
818
|
+
url,
|
|
819
|
+
method,
|
|
820
|
+
options,
|
|
821
|
+
axiosInstance,
|
|
822
|
+
_args10 = arguments;
|
|
823
|
+
return _regenerator["default"].wrap(function (_context10) {
|
|
824
|
+
while (1) switch (_context10.prev = _context10.next) {
|
|
825
|
+
case 0:
|
|
826
|
+
optionalParams = _args10.length > 1 && _args10[1] !== undefined ? _args10[1] : {};
|
|
827
|
+
timer = _Timer.Timer.TIMER();
|
|
828
|
+
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSTARTED, "Get Reconnectable availability Started");
|
|
829
|
+
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatReconnectAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(reconnectId);
|
|
830
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
831
|
+
this.addDefaultHeaders(optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, requestHeaders);
|
|
832
|
+
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
833
|
+
method = "GET";
|
|
834
|
+
options = {
|
|
835
|
+
headers: requestHeaders,
|
|
836
|
+
method: method,
|
|
837
|
+
url: url,
|
|
838
|
+
timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.getReconnectAvailability
|
|
839
|
+
};
|
|
840
|
+
axiosInstance = _axios["default"].create();
|
|
841
|
+
return _context10.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
842
|
+
var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1(resolve, reject) {
|
|
843
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime7, _elapsedTimeInMilliseconds7, _t7;
|
|
844
|
+
return _regenerator["default"].wrap(function (_context1) {
|
|
845
|
+
while (1) switch (_context1.prev = _context1.next) {
|
|
846
|
+
case 0:
|
|
847
|
+
backendTimer = _Timer.Timer.TIMER();
|
|
848
|
+
_context1.prev = 1;
|
|
849
|
+
_context1.next = 2;
|
|
850
|
+
return axiosInstance(options);
|
|
851
|
+
case 2:
|
|
852
|
+
response = _context1.sent;
|
|
853
|
+
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
854
|
+
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
855
|
+
data = response.data;
|
|
856
|
+
if (!data) {
|
|
857
|
+
_context1.next = 3;
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
_this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability succeeded", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
861
|
+
resolve(data);
|
|
862
|
+
return _context1.abrupt("return");
|
|
863
|
+
case 3:
|
|
864
|
+
// No data found so returning null
|
|
865
|
+
_this6.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYSUCCEEDED, "Get Reconnect availability didn't send any valid data", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
866
|
+
resolve();
|
|
867
|
+
return _context1.abrupt("return");
|
|
868
|
+
case 4:
|
|
869
|
+
_context1.prev = 4;
|
|
870
|
+
_t7 = _context1["catch"](1);
|
|
871
|
+
_httpRequestResponseTime7 = backendTimer.milliSecondsElapsed;
|
|
872
|
+
_elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
|
|
873
|
+
_this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITYFAILED, "Get Reconnect Availability failed", optionalParams === null || optionalParams === void 0 ? void 0 : optionalParams.requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _t7, undefined, requestHeaders, _httpRequestResponseTime7);
|
|
874
|
+
if ((0, _isExpectedAxiosError["default"])(_t7, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
875
|
+
reject(new Error(_this6.HTTPTimeOutErrorMessage));
|
|
876
|
+
}
|
|
877
|
+
reject(_t7);
|
|
878
|
+
return _context1.abrupt("return");
|
|
879
|
+
case 5:
|
|
880
|
+
case "end":
|
|
881
|
+
return _context1.stop();
|
|
882
|
+
}
|
|
883
|
+
}, _callee1, null, [[1, 4]]);
|
|
884
|
+
}));
|
|
885
|
+
return function (_x13, _x14) {
|
|
886
|
+
return _ref5.apply(this, arguments);
|
|
887
|
+
};
|
|
888
|
+
}()));
|
|
889
|
+
case 1:
|
|
890
|
+
case "end":
|
|
891
|
+
return _context10.stop();
|
|
892
|
+
}
|
|
893
|
+
}, _callee10, this);
|
|
894
|
+
}));
|
|
895
|
+
function getReconnectAvailability(_x12) {
|
|
761
896
|
return _getReconnectAvailability.apply(this, arguments);
|
|
762
897
|
}
|
|
763
898
|
return getReconnectAvailability;
|
|
@@ -771,9 +906,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
771
906
|
}, {
|
|
772
907
|
key: "getAgentAvailability",
|
|
773
908
|
value: (function () {
|
|
774
|
-
var _getAgentAvailability = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
775
|
-
var _this$configuration$
|
|
776
|
-
|
|
909
|
+
var _getAgentAvailability = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
|
|
910
|
+
var _this$configuration$d8,
|
|
911
|
+
_this7 = this;
|
|
777
912
|
var queueAvailabilityOptionalParams,
|
|
778
913
|
timer,
|
|
779
914
|
requestPath,
|
|
@@ -788,11 +923,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
788
923
|
url,
|
|
789
924
|
method,
|
|
790
925
|
options,
|
|
791
|
-
|
|
792
|
-
return _regenerator["default"].wrap(function (
|
|
793
|
-
while (1) switch (
|
|
926
|
+
_args12 = arguments;
|
|
927
|
+
return _regenerator["default"].wrap(function (_context12) {
|
|
928
|
+
while (1) switch (_context12.prev = _context12.next) {
|
|
794
929
|
case 0:
|
|
795
|
-
queueAvailabilityOptionalParams =
|
|
930
|
+
queueAvailabilityOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
|
|
796
931
|
timer = _Timer.Timer.TIMER();
|
|
797
932
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSTARTED, "Get agent availability Started", requestId);
|
|
798
933
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
|
|
@@ -803,7 +938,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
803
938
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getAgentAvailability
|
|
804
939
|
});
|
|
805
940
|
authenticatedUserToken = queueAvailabilityOptionalParams.authenticatedUserToken, initContext = queueAvailabilityOptionalParams.initContext, getContext = queueAvailabilityOptionalParams.getContext;
|
|
806
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
941
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
807
942
|
if (authenticatedUserToken) {
|
|
808
943
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
809
944
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
@@ -829,10 +964,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
829
964
|
//data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
|
|
830
965
|
data.cacheKey = (0, _sha["default"])(JSON.stringify(cachObj)).toString(_encHex["default"]);
|
|
831
966
|
if (!(getContext && !window.document)) {
|
|
832
|
-
|
|
967
|
+
_context12.next = 1;
|
|
833
968
|
break;
|
|
834
969
|
}
|
|
835
|
-
return
|
|
970
|
+
return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
836
971
|
case 1:
|
|
837
972
|
if (getContext) {
|
|
838
973
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
@@ -846,10 +981,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
846
981
|
|
|
847
982
|
// Validate locale
|
|
848
983
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
849
|
-
|
|
984
|
+
_context12.next = 2;
|
|
850
985
|
break;
|
|
851
986
|
}
|
|
852
|
-
return
|
|
987
|
+
return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
853
988
|
case 2:
|
|
854
989
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
855
990
|
method = "POST";
|
|
@@ -858,61 +993,61 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
858
993
|
headers: requestHeaders,
|
|
859
994
|
method: method,
|
|
860
995
|
url: url,
|
|
861
|
-
timeout: (_this$configuration$
|
|
996
|
+
timeout: (_this$configuration$d8 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d8 !== void 0 ? _this$configuration$d8 : this.configuration.requestTimeoutConfig.getAgentAvailability
|
|
862
997
|
};
|
|
863
|
-
return
|
|
864
|
-
var
|
|
865
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _data, headers,
|
|
866
|
-
return _regenerator["default"].wrap(function (
|
|
867
|
-
while (1) switch (
|
|
998
|
+
return _context12.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
999
|
+
var _ref6 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11(resolve, reject) {
|
|
1000
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _data, headers, _httpRequestResponseTime8, _elapsedTimeInMilliseconds8, _t8;
|
|
1001
|
+
return _regenerator["default"].wrap(function (_context11) {
|
|
1002
|
+
while (1) switch (_context11.prev = _context11.next) {
|
|
868
1003
|
case 0:
|
|
869
1004
|
backendTimer = _Timer.Timer.TIMER();
|
|
870
|
-
|
|
871
|
-
|
|
1005
|
+
_context11.prev = 1;
|
|
1006
|
+
_context11.next = 2;
|
|
872
1007
|
return axiosInstance(options);
|
|
873
1008
|
case 2:
|
|
874
|
-
response =
|
|
1009
|
+
response = _context11.sent;
|
|
875
1010
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
876
1011
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
877
1012
|
_data = response.data, headers = response.headers;
|
|
878
|
-
|
|
1013
|
+
_this7.setAuthCodeNonce(headers);
|
|
879
1014
|
if (_data) {
|
|
880
|
-
|
|
1015
|
+
_this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSUCCEEDED, "Get agent availability succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
881
1016
|
resolve(_data);
|
|
882
1017
|
}
|
|
883
|
-
|
|
1018
|
+
_context11.next = 5;
|
|
884
1019
|
break;
|
|
885
1020
|
case 3:
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
892
|
-
|
|
1021
|
+
_context11.prev = 3;
|
|
1022
|
+
_t8 = _context11["catch"](1);
|
|
1023
|
+
_httpRequestResponseTime8 = backendTimer.milliSecondsElapsed;
|
|
1024
|
+
_elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
|
|
1025
|
+
_this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _t8, undefined, requestHeaders, _httpRequestResponseTime8);
|
|
1026
|
+
if (!(0, _isExpectedAxiosError["default"])(_t8, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1027
|
+
_context11.next = 4;
|
|
893
1028
|
break;
|
|
894
1029
|
}
|
|
895
|
-
reject(new Error(
|
|
896
|
-
return
|
|
1030
|
+
reject(new Error(_this7.HTTPTimeOutErrorMessage));
|
|
1031
|
+
return _context11.abrupt("return");
|
|
897
1032
|
case 4:
|
|
898
|
-
reject(
|
|
1033
|
+
reject(_t8);
|
|
899
1034
|
case 5:
|
|
900
1035
|
case "end":
|
|
901
|
-
return
|
|
1036
|
+
return _context11.stop();
|
|
902
1037
|
}
|
|
903
|
-
},
|
|
1038
|
+
}, _callee11, null, [[1, 3]]);
|
|
904
1039
|
}));
|
|
905
|
-
return function (
|
|
906
|
-
return
|
|
1040
|
+
return function (_x16, _x17) {
|
|
1041
|
+
return _ref6.apply(this, arguments);
|
|
907
1042
|
};
|
|
908
1043
|
}()));
|
|
909
1044
|
case 3:
|
|
910
1045
|
case "end":
|
|
911
|
-
return
|
|
1046
|
+
return _context12.stop();
|
|
912
1047
|
}
|
|
913
|
-
},
|
|
1048
|
+
}, _callee12, this);
|
|
914
1049
|
}));
|
|
915
|
-
function getAgentAvailability(
|
|
1050
|
+
function getAgentAvailability(_x15) {
|
|
916
1051
|
return _getAgentAvailability.apply(this, arguments);
|
|
917
1052
|
}
|
|
918
1053
|
return getAgentAvailability;
|
|
@@ -926,9 +1061,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
926
1061
|
}, {
|
|
927
1062
|
key: "sessionInit",
|
|
928
1063
|
value: (function () {
|
|
929
|
-
var _sessionInit = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
930
|
-
var _this$configuration$
|
|
931
|
-
|
|
1064
|
+
var _sessionInit = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
|
|
1065
|
+
var _this$configuration$d9,
|
|
1066
|
+
_this8 = this;
|
|
932
1067
|
var sessionInitOptionalParams,
|
|
933
1068
|
timer,
|
|
934
1069
|
axiosInstance,
|
|
@@ -946,11 +1081,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
946
1081
|
url,
|
|
947
1082
|
method,
|
|
948
1083
|
options,
|
|
949
|
-
|
|
950
|
-
return _regenerator["default"].wrap(function (
|
|
951
|
-
while (1) switch (
|
|
1084
|
+
_args14 = arguments;
|
|
1085
|
+
return _regenerator["default"].wrap(function (_context14) {
|
|
1086
|
+
while (1) switch (_context14.prev = _context14.next) {
|
|
952
1087
|
case 0:
|
|
953
|
-
sessionInitOptionalParams =
|
|
1088
|
+
sessionInitOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
|
|
954
1089
|
timer = _Timer.Timer.TIMER();
|
|
955
1090
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, "Session Init Started", requestId);
|
|
956
1091
|
axiosInstance = _axios["default"].create();
|
|
@@ -988,10 +1123,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
988
1123
|
params.sig = reconnectId;
|
|
989
1124
|
}
|
|
990
1125
|
if (!(getContext && !window.document)) {
|
|
991
|
-
|
|
1126
|
+
_context14.next = 1;
|
|
992
1127
|
break;
|
|
993
1128
|
}
|
|
994
|
-
return
|
|
1129
|
+
return _context14.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
995
1130
|
case 1:
|
|
996
1131
|
if (getContext) {
|
|
997
1132
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
@@ -1007,10 +1142,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1007
1142
|
|
|
1008
1143
|
// Validate locale
|
|
1009
1144
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1010
|
-
|
|
1145
|
+
_context14.next = 2;
|
|
1011
1146
|
break;
|
|
1012
1147
|
}
|
|
1013
|
-
return
|
|
1148
|
+
return _context14.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1014
1149
|
case 2:
|
|
1015
1150
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1016
1151
|
method = "POST";
|
|
@@ -1020,59 +1155,59 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1020
1155
|
method: method,
|
|
1021
1156
|
url: url,
|
|
1022
1157
|
params: params,
|
|
1023
|
-
timeout: (_this$configuration$
|
|
1158
|
+
timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.sessionInit
|
|
1024
1159
|
};
|
|
1025
|
-
return
|
|
1026
|
-
var
|
|
1027
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, headers,
|
|
1028
|
-
return _regenerator["default"].wrap(function (
|
|
1029
|
-
while (1) switch (
|
|
1160
|
+
return _context14.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1161
|
+
var _ref7 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
|
|
1162
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, headers, _httpRequestResponseTime9, _elapsedTimeInMilliseconds9, _t9;
|
|
1163
|
+
return _regenerator["default"].wrap(function (_context13) {
|
|
1164
|
+
while (1) switch (_context13.prev = _context13.next) {
|
|
1030
1165
|
case 0:
|
|
1031
1166
|
backendTimer = _Timer.Timer.TIMER();
|
|
1032
|
-
|
|
1033
|
-
|
|
1167
|
+
_context13.prev = 1;
|
|
1168
|
+
_context13.next = 2;
|
|
1034
1169
|
return axiosInstance(options);
|
|
1035
1170
|
case 2:
|
|
1036
|
-
response =
|
|
1171
|
+
response = _context13.sent;
|
|
1037
1172
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1038
1173
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1039
1174
|
headers = response.headers;
|
|
1040
|
-
|
|
1041
|
-
|
|
1175
|
+
_this8.setAuthCodeNonce(headers);
|
|
1176
|
+
_this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data, requestHeaders, httpRequestResponseTime);
|
|
1042
1177
|
resolve();
|
|
1043
|
-
|
|
1178
|
+
_context13.next = 5;
|
|
1044
1179
|
break;
|
|
1045
1180
|
case 3:
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
1052
|
-
|
|
1181
|
+
_context13.prev = 3;
|
|
1182
|
+
_t9 = _context13["catch"](1);
|
|
1183
|
+
_httpRequestResponseTime9 = backendTimer.milliSecondsElapsed;
|
|
1184
|
+
_elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
|
|
1185
|
+
_this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _t9, data, requestHeaders, _httpRequestResponseTime9);
|
|
1186
|
+
if (!(0, _isExpectedAxiosError["default"])(_t9, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1187
|
+
_context13.next = 4;
|
|
1053
1188
|
break;
|
|
1054
1189
|
}
|
|
1055
|
-
reject(new Error(
|
|
1056
|
-
return
|
|
1190
|
+
reject(new Error(_this8.HTTPTimeOutErrorMessage));
|
|
1191
|
+
return _context13.abrupt("return");
|
|
1057
1192
|
case 4:
|
|
1058
|
-
reject(
|
|
1193
|
+
reject(_t9);
|
|
1059
1194
|
case 5:
|
|
1060
1195
|
case "end":
|
|
1061
|
-
return
|
|
1196
|
+
return _context13.stop();
|
|
1062
1197
|
}
|
|
1063
|
-
},
|
|
1198
|
+
}, _callee13, null, [[1, 3]]);
|
|
1064
1199
|
}));
|
|
1065
|
-
return function (
|
|
1066
|
-
return
|
|
1200
|
+
return function (_x19, _x20) {
|
|
1201
|
+
return _ref7.apply(this, arguments);
|
|
1067
1202
|
};
|
|
1068
1203
|
}()));
|
|
1069
1204
|
case 3:
|
|
1070
1205
|
case "end":
|
|
1071
|
-
return
|
|
1206
|
+
return _context14.stop();
|
|
1072
1207
|
}
|
|
1073
|
-
},
|
|
1208
|
+
}, _callee14, this);
|
|
1074
1209
|
}));
|
|
1075
|
-
function sessionInit(
|
|
1210
|
+
function sessionInit(_x18) {
|
|
1076
1211
|
return _sessionInit.apply(this, arguments);
|
|
1077
1212
|
}
|
|
1078
1213
|
return sessionInit;
|
|
@@ -1080,8 +1215,8 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1080
1215
|
}, {
|
|
1081
1216
|
key: "createConversation",
|
|
1082
1217
|
value: function () {
|
|
1083
|
-
var _createConversation = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1084
|
-
var _this$configuration$
|
|
1218
|
+
var _createConversation = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId) {
|
|
1219
|
+
var _this$configuration$d0;
|
|
1085
1220
|
var sessionInitOptionalParams,
|
|
1086
1221
|
timer,
|
|
1087
1222
|
axiosInstance,
|
|
@@ -1103,14 +1238,14 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1103
1238
|
elapsedTimeInMilliseconds,
|
|
1104
1239
|
_data2,
|
|
1105
1240
|
headers,
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
return _regenerator["default"].wrap(function (
|
|
1111
|
-
while (1) switch (
|
|
1241
|
+
_httpRequestResponseTime0,
|
|
1242
|
+
_elapsedTimeInMilliseconds0,
|
|
1243
|
+
_args15 = arguments,
|
|
1244
|
+
_t0;
|
|
1245
|
+
return _regenerator["default"].wrap(function (_context15) {
|
|
1246
|
+
while (1) switch (_context15.prev = _context15.next) {
|
|
1112
1247
|
case 0:
|
|
1113
|
-
sessionInitOptionalParams =
|
|
1248
|
+
sessionInitOptionalParams = _args15.length > 1 && _args15[1] !== undefined ? _args15[1] : {};
|
|
1114
1249
|
timer = _Timer.Timer.TIMER();
|
|
1115
1250
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.CREATESESSIONSTARTED, "Create conversation call Started", requestId);
|
|
1116
1251
|
axiosInstance = _axios["default"].create();
|
|
@@ -1138,10 +1273,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1138
1273
|
}
|
|
1139
1274
|
data.channelId = this.omnichannelConfiguration.channelId;
|
|
1140
1275
|
if (!(getContext && !window.document)) {
|
|
1141
|
-
|
|
1276
|
+
_context15.next = 1;
|
|
1142
1277
|
break;
|
|
1143
1278
|
}
|
|
1144
|
-
return
|
|
1279
|
+
return _context15.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
|
|
1145
1280
|
case 1:
|
|
1146
1281
|
if (getContext) {
|
|
1147
1282
|
data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
|
|
@@ -1157,10 +1292,10 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1157
1292
|
|
|
1158
1293
|
// Validate locale
|
|
1159
1294
|
if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
|
|
1160
|
-
|
|
1295
|
+
_context15.next = 2;
|
|
1161
1296
|
break;
|
|
1162
1297
|
}
|
|
1163
|
-
return
|
|
1298
|
+
return _context15.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
|
|
1164
1299
|
case 2:
|
|
1165
1300
|
url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
|
|
1166
1301
|
method = "POST";
|
|
@@ -1169,14 +1304,14 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1169
1304
|
headers: requestHeaders,
|
|
1170
1305
|
method: method,
|
|
1171
1306
|
url: url,
|
|
1172
|
-
timeout: (_this$configuration$
|
|
1307
|
+
timeout: (_this$configuration$d0 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d0 !== void 0 ? _this$configuration$d0 : this.configuration.requestTimeoutConfig.sessionInit
|
|
1173
1308
|
};
|
|
1174
1309
|
backendTimer = _Timer.Timer.TIMER();
|
|
1175
|
-
|
|
1176
|
-
|
|
1310
|
+
_context15.prev = 3;
|
|
1311
|
+
_context15.next = 4;
|
|
1177
1312
|
return axiosInstance(options);
|
|
1178
1313
|
case 4:
|
|
1179
|
-
response =
|
|
1314
|
+
response = _context15.sent;
|
|
1180
1315
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1181
1316
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1182
1317
|
_data2 = response.data, headers = response.headers;
|
|
@@ -1189,34 +1324,34 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1189
1324
|
|
|
1190
1325
|
// check if data is empty, if so, then throw an error
|
|
1191
1326
|
if (!(Object.keys(_data2).length === 0)) {
|
|
1192
|
-
|
|
1327
|
+
_context15.next = 5;
|
|
1193
1328
|
break;
|
|
1194
1329
|
}
|
|
1195
1330
|
throw new Error("Empty data received from getChatToken");
|
|
1196
1331
|
case 5:
|
|
1197
1332
|
_data2.requestId = requestId;
|
|
1198
1333
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.CREATESESSIONSUCCEEDED, "Create coversation call Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1199
|
-
return
|
|
1334
|
+
return _context15.abrupt("return", _data2);
|
|
1200
1335
|
case 6:
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.CREATESESSIONFAILED, "Create conversation call failed", requestId, undefined,
|
|
1206
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
1207
|
-
|
|
1336
|
+
_context15.prev = 6;
|
|
1337
|
+
_t0 = _context15["catch"](3);
|
|
1338
|
+
_httpRequestResponseTime0 = backendTimer.milliSecondsElapsed;
|
|
1339
|
+
_elapsedTimeInMilliseconds0 = timer.milliSecondsElapsed;
|
|
1340
|
+
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.CREATESESSIONFAILED, "Create conversation call failed", requestId, undefined, _elapsedTimeInMilliseconds0, requestPath, method, _t0, data, requestHeaders, _httpRequestResponseTime0);
|
|
1341
|
+
if (!(0, _isExpectedAxiosError["default"])(_t0, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1342
|
+
_context15.next = 7;
|
|
1208
1343
|
break;
|
|
1209
1344
|
}
|
|
1210
1345
|
throw new Error(this.HTTPTimeOutErrorMessage);
|
|
1211
1346
|
case 7:
|
|
1212
|
-
throw
|
|
1347
|
+
throw _t0;
|
|
1213
1348
|
case 8:
|
|
1214
1349
|
case "end":
|
|
1215
|
-
return
|
|
1350
|
+
return _context15.stop();
|
|
1216
1351
|
}
|
|
1217
|
-
},
|
|
1352
|
+
}, _callee15, this, [[3, 6]]);
|
|
1218
1353
|
}));
|
|
1219
|
-
function createConversation(
|
|
1354
|
+
function createConversation(_x21) {
|
|
1220
1355
|
return _createConversation.apply(this, arguments);
|
|
1221
1356
|
}
|
|
1222
1357
|
return createConversation;
|
|
@@ -1229,9 +1364,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1229
1364
|
}, {
|
|
1230
1365
|
key: "sessionClose",
|
|
1231
1366
|
value: (function () {
|
|
1232
|
-
var _sessionClose = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1233
|
-
var _this$configuration$
|
|
1234
|
-
|
|
1367
|
+
var _sessionClose = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId) {
|
|
1368
|
+
var _this$configuration$d1,
|
|
1369
|
+
_this9 = this;
|
|
1235
1370
|
var sessionCloseOptionalParams,
|
|
1236
1371
|
timer,
|
|
1237
1372
|
requestPath,
|
|
@@ -1245,11 +1380,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1245
1380
|
url,
|
|
1246
1381
|
method,
|
|
1247
1382
|
options,
|
|
1248
|
-
|
|
1249
|
-
return _regenerator["default"].wrap(function (
|
|
1250
|
-
while (1) switch (
|
|
1383
|
+
_args17 = arguments;
|
|
1384
|
+
return _regenerator["default"].wrap(function (_context17) {
|
|
1385
|
+
while (1) switch (_context17.prev = _context17.next) {
|
|
1251
1386
|
case 0:
|
|
1252
|
-
sessionCloseOptionalParams =
|
|
1387
|
+
sessionCloseOptionalParams = _args17.length > 1 && _args17[1] !== undefined ? _args17[1] : {};
|
|
1253
1388
|
timer = _Timer.Timer.TIMER();
|
|
1254
1389
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESTARTED, "Session Close Started", requestId);
|
|
1255
1390
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1260,7 +1395,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1260
1395
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.sessionClose
|
|
1261
1396
|
});
|
|
1262
1397
|
authenticatedUserToken = sessionCloseOptionalParams.authenticatedUserToken, isReconnectChat = sessionCloseOptionalParams.isReconnectChat, isPersistentChat = sessionCloseOptionalParams.isPersistentChat, chatId = sessionCloseOptionalParams.chatId;
|
|
1263
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1398
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1264
1399
|
data = {}; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
1265
1400
|
data.chatId = chatId;
|
|
1266
1401
|
if (authenticatedUserToken) {
|
|
@@ -1282,56 +1417,56 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1282
1417
|
headers: requestHeaders,
|
|
1283
1418
|
method: method,
|
|
1284
1419
|
url: url,
|
|
1285
|
-
timeout: (_this$configuration$
|
|
1420
|
+
timeout: (_this$configuration$d1 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d1 !== void 0 ? _this$configuration$d1 : this.configuration.requestTimeoutConfig.sessionClose
|
|
1286
1421
|
};
|
|
1287
|
-
return
|
|
1288
|
-
var
|
|
1289
|
-
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
1290
|
-
return _regenerator["default"].wrap(function (
|
|
1291
|
-
while (1) switch (
|
|
1422
|
+
return _context17.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1423
|
+
var _ref8 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
|
|
1424
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime1, _elapsedTimeInMilliseconds1, _t1;
|
|
1425
|
+
return _regenerator["default"].wrap(function (_context16) {
|
|
1426
|
+
while (1) switch (_context16.prev = _context16.next) {
|
|
1292
1427
|
case 0:
|
|
1293
1428
|
backendTimer = _Timer.Timer.TIMER();
|
|
1294
|
-
|
|
1295
|
-
|
|
1429
|
+
_context16.prev = 1;
|
|
1430
|
+
_context16.next = 2;
|
|
1296
1431
|
return axiosInstance(options);
|
|
1297
1432
|
case 2:
|
|
1298
|
-
response =
|
|
1433
|
+
response = _context16.sent;
|
|
1299
1434
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1300
1435
|
headers = response.headers;
|
|
1301
|
-
|
|
1436
|
+
_this9.setAuthCodeNonce(headers);
|
|
1302
1437
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1303
|
-
|
|
1438
|
+
_this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1304
1439
|
resolve();
|
|
1305
1440
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1306
|
-
|
|
1441
|
+
_context16.next = 4;
|
|
1307
1442
|
break;
|
|
1308
1443
|
case 3:
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
if (
|
|
1315
|
-
reject(new Error(
|
|
1444
|
+
_context16.prev = 3;
|
|
1445
|
+
_t1 = _context16["catch"](1);
|
|
1446
|
+
_httpRequestResponseTime1 = backendTimer.milliSecondsElapsed;
|
|
1447
|
+
_elapsedTimeInMilliseconds1 = timer.milliSecondsElapsed;
|
|
1448
|
+
_this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds1, requestPath, method, _t1, undefined, requestHeaders, _httpRequestResponseTime1);
|
|
1449
|
+
if (_t1.code === _Constants["default"].axiosTimeoutErrorCode) {
|
|
1450
|
+
reject(new Error(_this9.HTTPTimeOutErrorMessage));
|
|
1316
1451
|
}
|
|
1317
|
-
reject(
|
|
1452
|
+
reject(_t1);
|
|
1318
1453
|
case 4:
|
|
1319
1454
|
case "end":
|
|
1320
|
-
return
|
|
1455
|
+
return _context16.stop();
|
|
1321
1456
|
}
|
|
1322
|
-
},
|
|
1457
|
+
}, _callee16, null, [[1, 3]]);
|
|
1323
1458
|
}));
|
|
1324
|
-
return function (
|
|
1325
|
-
return
|
|
1459
|
+
return function (_x23, _x24) {
|
|
1460
|
+
return _ref8.apply(this, arguments);
|
|
1326
1461
|
};
|
|
1327
1462
|
}()));
|
|
1328
1463
|
case 1:
|
|
1329
1464
|
case "end":
|
|
1330
|
-
return
|
|
1465
|
+
return _context17.stop();
|
|
1331
1466
|
}
|
|
1332
|
-
},
|
|
1467
|
+
}, _callee17, this);
|
|
1333
1468
|
}));
|
|
1334
|
-
function sessionClose(
|
|
1469
|
+
function sessionClose(_x22) {
|
|
1335
1470
|
return _sessionClose.apply(this, arguments);
|
|
1336
1471
|
}
|
|
1337
1472
|
return sessionClose;
|
|
@@ -1345,12 +1480,12 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1345
1480
|
}, {
|
|
1346
1481
|
key: "validateAuthChatRecord",
|
|
1347
1482
|
value: (function () {
|
|
1348
|
-
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1349
|
-
var _this$configuration$
|
|
1350
|
-
|
|
1483
|
+
var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee19(requestId, validateAuthChatRecordOptionalParams) {
|
|
1484
|
+
var _this$configuration$d10,
|
|
1485
|
+
_this0 = this;
|
|
1351
1486
|
var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, requestHeaders, url, method, options;
|
|
1352
|
-
return _regenerator["default"].wrap(function (
|
|
1353
|
-
while (1) switch (
|
|
1487
|
+
return _regenerator["default"].wrap(function (_context19) {
|
|
1488
|
+
while (1) switch (_context19.prev = _context19.next) {
|
|
1354
1489
|
case 0:
|
|
1355
1490
|
timer = _Timer.Timer.TIMER();
|
|
1356
1491
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSTARTED, "Validate Auth Chat Record Started", requestId);
|
|
@@ -1362,7 +1497,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1362
1497
|
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
1363
1498
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.validateAuthChatRecord
|
|
1364
1499
|
});
|
|
1365
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1500
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1366
1501
|
if (authenticatedUserToken) {
|
|
1367
1502
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
1368
1503
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authCodeNonce] = this.configuration.authCodeNonce;
|
|
@@ -1374,67 +1509,67 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1374
1509
|
headers: requestHeaders,
|
|
1375
1510
|
method: method,
|
|
1376
1511
|
url: url,
|
|
1377
|
-
timeout: (_this$configuration$
|
|
1512
|
+
timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
|
|
1378
1513
|
};
|
|
1379
|
-
return
|
|
1380
|
-
var
|
|
1381
|
-
var backendTimer, _response$data, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
1382
|
-
return _regenerator["default"].wrap(function (
|
|
1383
|
-
while (1) switch (
|
|
1514
|
+
return _context19.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1515
|
+
var _ref9 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
|
|
1516
|
+
var backendTimer, _response$data, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime10, _elapsedTimeInMilliseconds10, _t10;
|
|
1517
|
+
return _regenerator["default"].wrap(function (_context18) {
|
|
1518
|
+
while (1) switch (_context18.prev = _context18.next) {
|
|
1384
1519
|
case 0:
|
|
1385
1520
|
backendTimer = _Timer.Timer.TIMER();
|
|
1386
|
-
|
|
1387
|
-
|
|
1521
|
+
_context18.prev = 1;
|
|
1522
|
+
_context18.next = 2;
|
|
1388
1523
|
return axiosInstance(options);
|
|
1389
1524
|
case 2:
|
|
1390
|
-
response =
|
|
1525
|
+
response = _context18.sent;
|
|
1391
1526
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1392
1527
|
headers = response.headers;
|
|
1393
|
-
|
|
1528
|
+
_this0.setAuthCodeNonce(headers);
|
|
1394
1529
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1395
1530
|
if (((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true) {
|
|
1396
|
-
|
|
1531
|
+
_this0.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSUCCEEDED, "Validate Auth Chat Record succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1397
1532
|
resolve(response.data);
|
|
1398
1533
|
} else {
|
|
1399
|
-
|
|
1534
|
+
_this0.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record Failed. Record is not found or request is not authorized", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1400
1535
|
reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized"));
|
|
1401
1536
|
}
|
|
1402
1537
|
|
|
1403
1538
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1404
|
-
|
|
1539
|
+
_context18.next = 4;
|
|
1405
1540
|
break;
|
|
1406
1541
|
case 3:
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
1413
|
-
reject(new Error(
|
|
1542
|
+
_context18.prev = 3;
|
|
1543
|
+
_t10 = _context18["catch"](1);
|
|
1544
|
+
_httpRequestResponseTime10 = backendTimer.milliSecondsElapsed;
|
|
1545
|
+
_elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
|
|
1546
|
+
_this0.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _t10, undefined, requestHeaders, _httpRequestResponseTime10);
|
|
1547
|
+
if ((0, _isExpectedAxiosError["default"])(_t10, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1548
|
+
reject(new Error(_this0.HTTPTimeOutErrorMessage));
|
|
1414
1549
|
}
|
|
1415
|
-
if (
|
|
1550
|
+
if (_t10.toString() === "Error: Request failed with status code 404") {
|
|
1416
1551
|
// backward compatibility
|
|
1417
1552
|
resolve({});
|
|
1418
1553
|
} else {
|
|
1419
|
-
reject(
|
|
1554
|
+
reject(_t10);
|
|
1420
1555
|
}
|
|
1421
1556
|
case 4:
|
|
1422
1557
|
case "end":
|
|
1423
|
-
return
|
|
1558
|
+
return _context18.stop();
|
|
1424
1559
|
}
|
|
1425
|
-
},
|
|
1560
|
+
}, _callee18, null, [[1, 3]]);
|
|
1426
1561
|
}));
|
|
1427
|
-
return function (
|
|
1428
|
-
return
|
|
1562
|
+
return function (_x27, _x28) {
|
|
1563
|
+
return _ref9.apply(this, arguments);
|
|
1429
1564
|
};
|
|
1430
1565
|
}()));
|
|
1431
1566
|
case 1:
|
|
1432
1567
|
case "end":
|
|
1433
|
-
return
|
|
1568
|
+
return _context19.stop();
|
|
1434
1569
|
}
|
|
1435
|
-
},
|
|
1570
|
+
}, _callee19, this);
|
|
1436
1571
|
}));
|
|
1437
|
-
function validateAuthChatRecord(
|
|
1572
|
+
function validateAuthChatRecord(_x25, _x26) {
|
|
1438
1573
|
return _validateAuthChatRecord.apply(this, arguments);
|
|
1439
1574
|
}
|
|
1440
1575
|
return validateAuthChatRecord;
|
|
@@ -1449,9 +1584,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1449
1584
|
}, {
|
|
1450
1585
|
key: "submitPostChatResponse",
|
|
1451
1586
|
value: (function () {
|
|
1452
|
-
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1453
|
-
var _this$configuration$
|
|
1454
|
-
|
|
1587
|
+
var _submitPostChatResponse = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, postChatResponse) {
|
|
1588
|
+
var _this$configuration$d11,
|
|
1589
|
+
_this1 = this;
|
|
1455
1590
|
var submitPostChatResponseOptionalParams,
|
|
1456
1591
|
timer,
|
|
1457
1592
|
requestPath,
|
|
@@ -1461,11 +1596,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1461
1596
|
url,
|
|
1462
1597
|
method,
|
|
1463
1598
|
options,
|
|
1464
|
-
|
|
1465
|
-
return _regenerator["default"].wrap(function (
|
|
1466
|
-
while (1) switch (
|
|
1599
|
+
_args21 = arguments;
|
|
1600
|
+
return _regenerator["default"].wrap(function (_context21) {
|
|
1601
|
+
while (1) switch (_context21.prev = _context21.next) {
|
|
1467
1602
|
case 0:
|
|
1468
|
-
submitPostChatResponseOptionalParams =
|
|
1603
|
+
submitPostChatResponseOptionalParams = _args21.length > 2 && _args21[2] !== undefined ? _args21[2] : {};
|
|
1469
1604
|
timer = _Timer.Timer.TIMER();
|
|
1470
1605
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSTARTED, "Submit Post Chat Started", requestId);
|
|
1471
1606
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1476,7 +1611,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1476
1611
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.submitPostChatResponse
|
|
1477
1612
|
});
|
|
1478
1613
|
authenticatedUserToken = submitPostChatResponseOptionalParams.authenticatedUserToken;
|
|
1479
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1614
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1480
1615
|
this.addDefaultHeaders(requestId, requestHeaders);
|
|
1481
1616
|
if (authenticatedUserToken) {
|
|
1482
1617
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1490,55 +1625,55 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1490
1625
|
headers: requestHeaders,
|
|
1491
1626
|
method: method,
|
|
1492
1627
|
url: url,
|
|
1493
|
-
timeout: (_this$configuration$
|
|
1628
|
+
timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.submitPostChatResponse
|
|
1494
1629
|
};
|
|
1495
|
-
return
|
|
1496
|
-
var
|
|
1497
|
-
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
1498
|
-
return _regenerator["default"].wrap(function (
|
|
1499
|
-
while (1) switch (
|
|
1630
|
+
return _context21.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1631
|
+
var _ref0 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
|
|
1632
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime11, _elapsedTimeInMilliseconds11, _t11;
|
|
1633
|
+
return _regenerator["default"].wrap(function (_context20) {
|
|
1634
|
+
while (1) switch (_context20.prev = _context20.next) {
|
|
1500
1635
|
case 0:
|
|
1501
1636
|
backendTimer = _Timer.Timer.TIMER();
|
|
1502
|
-
|
|
1503
|
-
|
|
1637
|
+
_context20.prev = 1;
|
|
1638
|
+
_context20.next = 2;
|
|
1504
1639
|
return axiosInstance(options);
|
|
1505
1640
|
case 2:
|
|
1506
|
-
response =
|
|
1641
|
+
response = _context20.sent;
|
|
1507
1642
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1508
1643
|
headers = response.headers;
|
|
1509
|
-
|
|
1644
|
+
_this1.setAuthCodeNonce(headers);
|
|
1510
1645
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1511
|
-
|
|
1646
|
+
_this1.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1512
1647
|
resolve();
|
|
1513
|
-
|
|
1648
|
+
_context20.next = 4;
|
|
1514
1649
|
break;
|
|
1515
1650
|
case 3:
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
1522
|
-
reject(new Error(
|
|
1651
|
+
_context20.prev = 3;
|
|
1652
|
+
_t11 = _context20["catch"](1);
|
|
1653
|
+
_httpRequestResponseTime11 = backendTimer.milliSecondsElapsed;
|
|
1654
|
+
_elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
|
|
1655
|
+
_this1.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _t11, undefined, requestHeaders, _httpRequestResponseTime11);
|
|
1656
|
+
if ((0, _isExpectedAxiosError["default"])(_t11, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1657
|
+
reject(new Error(_this1.HTTPTimeOutErrorMessage));
|
|
1523
1658
|
}
|
|
1524
|
-
reject(
|
|
1659
|
+
reject(_t11);
|
|
1525
1660
|
case 4:
|
|
1526
1661
|
case "end":
|
|
1527
|
-
return
|
|
1662
|
+
return _context20.stop();
|
|
1528
1663
|
}
|
|
1529
|
-
},
|
|
1664
|
+
}, _callee20, null, [[1, 3]]);
|
|
1530
1665
|
}));
|
|
1531
|
-
return function (
|
|
1532
|
-
return
|
|
1666
|
+
return function (_x31, _x32) {
|
|
1667
|
+
return _ref0.apply(this, arguments);
|
|
1533
1668
|
};
|
|
1534
1669
|
}()));
|
|
1535
1670
|
case 1:
|
|
1536
1671
|
case "end":
|
|
1537
|
-
return
|
|
1672
|
+
return _context21.stop();
|
|
1538
1673
|
}
|
|
1539
|
-
},
|
|
1674
|
+
}, _callee21, this);
|
|
1540
1675
|
}));
|
|
1541
|
-
function submitPostChatResponse(
|
|
1676
|
+
function submitPostChatResponse(_x29, _x30) {
|
|
1542
1677
|
return _submitPostChatResponse.apply(this, arguments);
|
|
1543
1678
|
}
|
|
1544
1679
|
return submitPostChatResponse;
|
|
@@ -1553,9 +1688,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1553
1688
|
}, {
|
|
1554
1689
|
key: "getSurveyInviteLink",
|
|
1555
1690
|
value: (function () {
|
|
1556
|
-
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1557
|
-
var _this$configuration$
|
|
1558
|
-
|
|
1691
|
+
var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee23(surveyOwnerId, surveyInviteAPIRequestBody) {
|
|
1692
|
+
var _this$configuration$d12,
|
|
1693
|
+
_this10 = this;
|
|
1559
1694
|
var getsurveyInviteLinkOptionalParams,
|
|
1560
1695
|
timer,
|
|
1561
1696
|
requestPath,
|
|
@@ -1566,11 +1701,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1566
1701
|
url,
|
|
1567
1702
|
method,
|
|
1568
1703
|
options,
|
|
1569
|
-
|
|
1570
|
-
return _regenerator["default"].wrap(function (
|
|
1571
|
-
while (1) switch (
|
|
1704
|
+
_args23 = arguments;
|
|
1705
|
+
return _regenerator["default"].wrap(function (_context23) {
|
|
1706
|
+
while (1) switch (_context23.prev = _context23.next) {
|
|
1572
1707
|
case 0:
|
|
1573
|
-
getsurveyInviteLinkOptionalParams =
|
|
1708
|
+
getsurveyInviteLinkOptionalParams = _args23.length > 2 && _args23[2] !== undefined ? _args23[2] : {};
|
|
1574
1709
|
timer = _Timer.Timer.TIMER();
|
|
1575
1710
|
if (this.logger) {
|
|
1576
1711
|
this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSTARTED, {
|
|
@@ -1585,7 +1720,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1585
1720
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getSurveyInviteLink
|
|
1586
1721
|
});
|
|
1587
1722
|
authenticatedUserToken = getsurveyInviteLinkOptionalParams.authenticatedUserToken, requestId = getsurveyInviteLinkOptionalParams.requestId;
|
|
1588
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1723
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1589
1724
|
if (authenticatedUserToken) {
|
|
1590
1725
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetSurveyInviteLinkPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(surveyOwnerId);
|
|
1591
1726
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
@@ -1603,55 +1738,55 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1603
1738
|
headers: requestHeaders,
|
|
1604
1739
|
method: method,
|
|
1605
1740
|
url: url,
|
|
1606
|
-
timeout: (_this$configuration$
|
|
1741
|
+
timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
|
|
1607
1742
|
};
|
|
1608
|
-
return
|
|
1609
|
-
var
|
|
1610
|
-
var backendTimer, response, httpRequestResponseTime, data, headers, elapsedTimeInMilliseconds,
|
|
1611
|
-
return _regenerator["default"].wrap(function (
|
|
1612
|
-
while (1) switch (
|
|
1743
|
+
return _context23.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1744
|
+
var _ref1 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
|
|
1745
|
+
var backendTimer, response, httpRequestResponseTime, data, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime12, _elapsedTimeInMilliseconds12, _t12;
|
|
1746
|
+
return _regenerator["default"].wrap(function (_context22) {
|
|
1747
|
+
while (1) switch (_context22.prev = _context22.next) {
|
|
1613
1748
|
case 0:
|
|
1614
1749
|
backendTimer = _Timer.Timer.TIMER();
|
|
1615
|
-
|
|
1616
|
-
|
|
1750
|
+
_context22.prev = 1;
|
|
1751
|
+
_context22.next = 2;
|
|
1617
1752
|
return axiosInstance(options);
|
|
1618
1753
|
case 2:
|
|
1619
|
-
response =
|
|
1754
|
+
response = _context22.sent;
|
|
1620
1755
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1621
1756
|
data = response.data, headers = response.headers;
|
|
1622
|
-
|
|
1757
|
+
_this10.setAuthCodeNonce(headers);
|
|
1623
1758
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1624
|
-
|
|
1759
|
+
_this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1625
1760
|
resolve(data);
|
|
1626
|
-
|
|
1761
|
+
_context22.next = 4;
|
|
1627
1762
|
break;
|
|
1628
1763
|
case 3:
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
1635
|
-
reject(new Error(
|
|
1764
|
+
_context22.prev = 3;
|
|
1765
|
+
_t12 = _context22["catch"](1);
|
|
1766
|
+
_httpRequestResponseTime12 = backendTimer.milliSecondsElapsed;
|
|
1767
|
+
_elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
|
|
1768
|
+
_this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _t12, undefined, requestHeaders, _httpRequestResponseTime12);
|
|
1769
|
+
if ((0, _isExpectedAxiosError["default"])(_t12, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1770
|
+
reject(new Error(_this10.HTTPTimeOutErrorMessage));
|
|
1636
1771
|
}
|
|
1637
|
-
reject(
|
|
1772
|
+
reject(_t12);
|
|
1638
1773
|
case 4:
|
|
1639
1774
|
case "end":
|
|
1640
|
-
return
|
|
1775
|
+
return _context22.stop();
|
|
1641
1776
|
}
|
|
1642
|
-
},
|
|
1777
|
+
}, _callee22, null, [[1, 3]]);
|
|
1643
1778
|
}));
|
|
1644
|
-
return function (
|
|
1645
|
-
return
|
|
1779
|
+
return function (_x35, _x36) {
|
|
1780
|
+
return _ref1.apply(this, arguments);
|
|
1646
1781
|
};
|
|
1647
1782
|
}()));
|
|
1648
1783
|
case 1:
|
|
1649
1784
|
case "end":
|
|
1650
|
-
return
|
|
1785
|
+
return _context23.stop();
|
|
1651
1786
|
}
|
|
1652
|
-
},
|
|
1787
|
+
}, _callee23, this);
|
|
1653
1788
|
}));
|
|
1654
|
-
function getSurveyInviteLink(
|
|
1789
|
+
function getSurveyInviteLink(_x33, _x34) {
|
|
1655
1790
|
return _getSurveyInviteLink.apply(this, arguments);
|
|
1656
1791
|
}
|
|
1657
1792
|
return getSurveyInviteLink;
|
|
@@ -1667,9 +1802,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1667
1802
|
}, {
|
|
1668
1803
|
key: "getChatTranscripts",
|
|
1669
1804
|
value: (function () {
|
|
1670
|
-
var _getChatTranscripts = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1671
|
-
var _this$configuration$
|
|
1672
|
-
|
|
1805
|
+
var _getChatTranscripts = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId, chatId, token) {
|
|
1806
|
+
var _this$configuration$d13,
|
|
1807
|
+
_this11 = this;
|
|
1673
1808
|
var getChatTranscriptsOptionalParams,
|
|
1674
1809
|
timer,
|
|
1675
1810
|
requestPath,
|
|
@@ -1680,11 +1815,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1680
1815
|
url,
|
|
1681
1816
|
method,
|
|
1682
1817
|
options,
|
|
1683
|
-
|
|
1684
|
-
return _regenerator["default"].wrap(function (
|
|
1685
|
-
while (1) switch (
|
|
1818
|
+
_args25 = arguments;
|
|
1819
|
+
return _regenerator["default"].wrap(function (_context25) {
|
|
1820
|
+
while (1) switch (_context25.prev = _context25.next) {
|
|
1686
1821
|
case 0:
|
|
1687
|
-
getChatTranscriptsOptionalParams =
|
|
1822
|
+
getChatTranscriptsOptionalParams = _args25.length > 3 && _args25[3] !== undefined ? _args25[3] : {};
|
|
1688
1823
|
timer = _Timer.Timer.TIMER();
|
|
1689
1824
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSTARTED, "Get Chat Transcript Started", requestId);
|
|
1690
1825
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1695,7 +1830,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1695
1830
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatTranscripts
|
|
1696
1831
|
});
|
|
1697
1832
|
authenticatedUserToken = getChatTranscriptsOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTranscriptsOptionalParams.currentLiveChatVersion;
|
|
1698
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
1833
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1699
1834
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
1700
1835
|
requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
|
|
1701
1836
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authorization] = token;
|
|
@@ -1718,55 +1853,55 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1718
1853
|
headers: requestHeaders,
|
|
1719
1854
|
method: method,
|
|
1720
1855
|
url: url,
|
|
1721
|
-
timeout: (_this$configuration$
|
|
1856
|
+
timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.getChatTranscripts
|
|
1722
1857
|
};
|
|
1723
|
-
return
|
|
1724
|
-
var
|
|
1725
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers,
|
|
1726
|
-
return _regenerator["default"].wrap(function (
|
|
1727
|
-
while (1) switch (
|
|
1858
|
+
return _context25.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1859
|
+
var _ref10 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
|
|
1860
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime13, _elapsedTimeInMilliseconds13, _t13;
|
|
1861
|
+
return _regenerator["default"].wrap(function (_context24) {
|
|
1862
|
+
while (1) switch (_context24.prev = _context24.next) {
|
|
1728
1863
|
case 0:
|
|
1729
1864
|
backendTimer = _Timer.Timer.TIMER();
|
|
1730
|
-
|
|
1731
|
-
|
|
1865
|
+
_context24.prev = 1;
|
|
1866
|
+
_context24.next = 2;
|
|
1732
1867
|
return axiosInstance(options);
|
|
1733
1868
|
case 2:
|
|
1734
|
-
response =
|
|
1869
|
+
response = _context24.sent;
|
|
1735
1870
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1736
1871
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1737
1872
|
data = response.data, headers = response.headers;
|
|
1738
|
-
|
|
1739
|
-
|
|
1873
|
+
_this11.setAuthCodeNonce(headers);
|
|
1874
|
+
_this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1740
1875
|
resolve(data);
|
|
1741
|
-
|
|
1876
|
+
_context24.next = 4;
|
|
1742
1877
|
break;
|
|
1743
1878
|
case 3:
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
1750
|
-
reject(new Error(
|
|
1879
|
+
_context24.prev = 3;
|
|
1880
|
+
_t13 = _context24["catch"](1);
|
|
1881
|
+
_httpRequestResponseTime13 = backendTimer.milliSecondsElapsed;
|
|
1882
|
+
_elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
|
|
1883
|
+
_this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _t13, undefined, requestHeaders, _httpRequestResponseTime13);
|
|
1884
|
+
if ((0, _isExpectedAxiosError["default"])(_t13, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
1885
|
+
reject(new Error(_this11.HTTPTimeOutErrorMessage));
|
|
1751
1886
|
}
|
|
1752
|
-
reject(
|
|
1887
|
+
reject(_t13);
|
|
1753
1888
|
case 4:
|
|
1754
1889
|
case "end":
|
|
1755
|
-
return
|
|
1890
|
+
return _context24.stop();
|
|
1756
1891
|
}
|
|
1757
|
-
},
|
|
1892
|
+
}, _callee24, null, [[1, 3]]);
|
|
1758
1893
|
}));
|
|
1759
|
-
return function (
|
|
1760
|
-
return
|
|
1894
|
+
return function (_x40, _x41) {
|
|
1895
|
+
return _ref10.apply(this, arguments);
|
|
1761
1896
|
};
|
|
1762
1897
|
}()));
|
|
1763
1898
|
case 1:
|
|
1764
1899
|
case "end":
|
|
1765
|
-
return
|
|
1900
|
+
return _context25.stop();
|
|
1766
1901
|
}
|
|
1767
|
-
},
|
|
1902
|
+
}, _callee25, this);
|
|
1768
1903
|
}));
|
|
1769
|
-
function getChatTranscripts(
|
|
1904
|
+
function getChatTranscripts(_x37, _x38, _x39) {
|
|
1770
1905
|
return _getChatTranscripts.apply(this, arguments);
|
|
1771
1906
|
}
|
|
1772
1907
|
return getChatTranscripts;
|
|
@@ -1780,9 +1915,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1780
1915
|
}, {
|
|
1781
1916
|
key: "getPersistentChatHistory",
|
|
1782
1917
|
value: (function () {
|
|
1783
|
-
var _getPersistentChatHistory = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1784
|
-
var _this$configuration$
|
|
1785
|
-
|
|
1918
|
+
var _getPersistentChatHistory = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId) {
|
|
1919
|
+
var _this$configuration$d14,
|
|
1920
|
+
_this12 = this;
|
|
1786
1921
|
var getPersistentChatHistoryOptionalParams,
|
|
1787
1922
|
timer,
|
|
1788
1923
|
authenticatedUserToken,
|
|
@@ -1796,21 +1931,21 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1796
1931
|
url,
|
|
1797
1932
|
method,
|
|
1798
1933
|
options,
|
|
1799
|
-
|
|
1800
|
-
return _regenerator["default"].wrap(function (
|
|
1801
|
-
while (1) switch (
|
|
1934
|
+
_args27 = arguments;
|
|
1935
|
+
return _regenerator["default"].wrap(function (_context27) {
|
|
1936
|
+
while (1) switch (_context27.prev = _context27.next) {
|
|
1802
1937
|
case 0:
|
|
1803
|
-
getPersistentChatHistoryOptionalParams =
|
|
1938
|
+
getPersistentChatHistoryOptionalParams = _args27.length > 1 && _args27[1] !== undefined ? _args27[1] : {};
|
|
1804
1939
|
timer = _Timer.Timer.TIMER();
|
|
1805
1940
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYSTARTED, "Get Persistent Chat History Started", requestId);
|
|
1806
1941
|
authenticatedUserToken = getPersistentChatHistoryOptionalParams.authenticatedUserToken, pageSize = getPersistentChatHistoryOptionalParams.pageSize, pageToken = getPersistentChatHistoryOptionalParams.pageToken;
|
|
1807
1942
|
if (authenticatedUserToken) {
|
|
1808
|
-
|
|
1943
|
+
_context27.next = 1;
|
|
1809
1944
|
break;
|
|
1810
1945
|
}
|
|
1811
1946
|
errorMessage = "Authenticated user token is required for persistent chat history";
|
|
1812
1947
|
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYFAILED, "Get Persistent Chat History failed - Missing authenticated user token", requestId);
|
|
1813
|
-
return
|
|
1948
|
+
return _context27.abrupt("return", Promise.reject(new Error(errorMessage)));
|
|
1814
1949
|
case 1:
|
|
1815
1950
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetPersistentChatHistoryPath, "/").concat(this.omnichannelConfiguration.orgId, "/widgetapp/").concat(this.omnichannelConfiguration.widgetId, "/conversation/history");
|
|
1816
1951
|
axiosInstance = _axios["default"].create();
|
|
@@ -1837,59 +1972,59 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1837
1972
|
method: method,
|
|
1838
1973
|
url: url,
|
|
1839
1974
|
params: params,
|
|
1840
|
-
timeout: (_this$configuration$
|
|
1975
|
+
timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.getPersistentChatHistory
|
|
1841
1976
|
};
|
|
1842
|
-
return
|
|
1843
|
-
var
|
|
1844
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers,
|
|
1845
|
-
return _regenerator["default"].wrap(function (
|
|
1846
|
-
while (1) switch (
|
|
1977
|
+
return _context27.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
1978
|
+
var _ref11 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
|
|
1979
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, headers, _httpRequestResponseTime14, _elapsedTimeInMilliseconds14, _t14;
|
|
1980
|
+
return _regenerator["default"].wrap(function (_context26) {
|
|
1981
|
+
while (1) switch (_context26.prev = _context26.next) {
|
|
1847
1982
|
case 0:
|
|
1848
1983
|
backendTimer = _Timer.Timer.TIMER();
|
|
1849
|
-
|
|
1850
|
-
|
|
1984
|
+
_context26.prev = 1;
|
|
1985
|
+
_context26.next = 2;
|
|
1851
1986
|
return axiosInstance(options);
|
|
1852
1987
|
case 2:
|
|
1853
|
-
response =
|
|
1988
|
+
response = _context26.sent;
|
|
1854
1989
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1855
1990
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1856
1991
|
data = response.data, headers = response.headers;
|
|
1857
|
-
|
|
1858
|
-
|
|
1992
|
+
_this12.setAuthCodeNonce(headers);
|
|
1993
|
+
_this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYSUCCEEDED, "Get Persistent Chat History succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1859
1994
|
resolve(data);
|
|
1860
|
-
|
|
1995
|
+
_context26.next = 5;
|
|
1861
1996
|
break;
|
|
1862
1997
|
case 3:
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
1869
|
-
|
|
1998
|
+
_context26.prev = 3;
|
|
1999
|
+
_t14 = _context26["catch"](1);
|
|
2000
|
+
_httpRequestResponseTime14 = backendTimer.milliSecondsElapsed;
|
|
2001
|
+
_elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
|
|
2002
|
+
_this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETPERSISTENTCHATHISTORYFAILED, "Get Persistent Chat History failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _t14, undefined, requestHeaders, _httpRequestResponseTime14);
|
|
2003
|
+
if (!(0, _isExpectedAxiosError["default"])(_t14, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2004
|
+
_context26.next = 4;
|
|
1870
2005
|
break;
|
|
1871
2006
|
}
|
|
1872
|
-
reject(new Error(
|
|
1873
|
-
return
|
|
2007
|
+
reject(new Error(_this12.HTTPTimeOutErrorMessage));
|
|
2008
|
+
return _context26.abrupt("return");
|
|
1874
2009
|
case 4:
|
|
1875
|
-
reject(
|
|
2010
|
+
reject(_t14);
|
|
1876
2011
|
case 5:
|
|
1877
2012
|
case "end":
|
|
1878
|
-
return
|
|
2013
|
+
return _context26.stop();
|
|
1879
2014
|
}
|
|
1880
|
-
},
|
|
2015
|
+
}, _callee26, null, [[1, 3]]);
|
|
1881
2016
|
}));
|
|
1882
|
-
return function (
|
|
1883
|
-
return
|
|
2017
|
+
return function (_x43, _x44) {
|
|
2018
|
+
return _ref11.apply(this, arguments);
|
|
1884
2019
|
};
|
|
1885
2020
|
}()));
|
|
1886
2021
|
case 2:
|
|
1887
2022
|
case "end":
|
|
1888
|
-
return
|
|
2023
|
+
return _context27.stop();
|
|
1889
2024
|
}
|
|
1890
|
-
},
|
|
2025
|
+
}, _callee27, this);
|
|
1891
2026
|
}));
|
|
1892
|
-
function getPersistentChatHistory(
|
|
2027
|
+
function getPersistentChatHistory(_x42) {
|
|
1893
2028
|
return _getPersistentChatHistory.apply(this, arguments);
|
|
1894
2029
|
}
|
|
1895
2030
|
return getPersistentChatHistory;
|
|
@@ -1905,9 +2040,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1905
2040
|
}, {
|
|
1906
2041
|
key: "emailTranscript",
|
|
1907
2042
|
value: (function () {
|
|
1908
|
-
var _emailTranscript = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
1909
|
-
var _this$configuration$
|
|
1910
|
-
|
|
2043
|
+
var _emailTranscript = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, token, emailRequestBody) {
|
|
2044
|
+
var _this$configuration$d15,
|
|
2045
|
+
_this13 = this;
|
|
1911
2046
|
var emailTranscriptOptionalParams,
|
|
1912
2047
|
timer,
|
|
1913
2048
|
requestPath,
|
|
@@ -1917,11 +2052,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1917
2052
|
url,
|
|
1918
2053
|
method,
|
|
1919
2054
|
options,
|
|
1920
|
-
|
|
1921
|
-
return _regenerator["default"].wrap(function (
|
|
1922
|
-
while (1) switch (
|
|
2055
|
+
_args29 = arguments;
|
|
2056
|
+
return _regenerator["default"].wrap(function (_context29) {
|
|
2057
|
+
while (1) switch (_context29.prev = _context29.next) {
|
|
1923
2058
|
case 0:
|
|
1924
|
-
emailTranscriptOptionalParams =
|
|
2059
|
+
emailTranscriptOptionalParams = _args29.length > 3 && _args29[3] !== undefined ? _args29[3] : {};
|
|
1925
2060
|
timer = _Timer.Timer.TIMER();
|
|
1926
2061
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSTARTED, "Email Transcript Started", requestId);
|
|
1927
2062
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
|
|
@@ -1932,7 +2067,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1932
2067
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.emailTranscript
|
|
1933
2068
|
});
|
|
1934
2069
|
authenticatedUserToken = emailTranscriptOptionalParams.authenticatedUserToken;
|
|
1935
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
2070
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
1936
2071
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
1937
2072
|
requestHeaders[_OmnichannelHTTPHeaders["default"].widgetAppId] = this.omnichannelConfiguration.widgetId;
|
|
1938
2073
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authorization] = token;
|
|
@@ -1949,55 +2084,55 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
1949
2084
|
headers: requestHeaders,
|
|
1950
2085
|
method: method,
|
|
1951
2086
|
url: url,
|
|
1952
|
-
timeout: (_this$configuration$
|
|
2087
|
+
timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.emailTranscript
|
|
1953
2088
|
};
|
|
1954
|
-
return
|
|
1955
|
-
var
|
|
1956
|
-
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
1957
|
-
return _regenerator["default"].wrap(function (
|
|
1958
|
-
while (1) switch (
|
|
2089
|
+
return _context29.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2090
|
+
var _ref12 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
|
|
2091
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime15, _elapsedTimeInMilliseconds15, _t15;
|
|
2092
|
+
return _regenerator["default"].wrap(function (_context28) {
|
|
2093
|
+
while (1) switch (_context28.prev = _context28.next) {
|
|
1959
2094
|
case 0:
|
|
1960
2095
|
backendTimer = _Timer.Timer.TIMER();
|
|
1961
|
-
|
|
1962
|
-
|
|
2096
|
+
_context28.prev = 1;
|
|
2097
|
+
_context28.next = 2;
|
|
1963
2098
|
return axiosInstance(options);
|
|
1964
2099
|
case 2:
|
|
1965
|
-
response =
|
|
2100
|
+
response = _context28.sent;
|
|
1966
2101
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
1967
2102
|
headers = response.headers;
|
|
1968
|
-
|
|
2103
|
+
_this13.setAuthCodeNonce(headers);
|
|
1969
2104
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
1970
|
-
|
|
2105
|
+
_this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
1971
2106
|
resolve();
|
|
1972
|
-
|
|
2107
|
+
_context28.next = 4;
|
|
1973
2108
|
break;
|
|
1974
2109
|
case 3:
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
1981
|
-
reject(new Error(
|
|
2110
|
+
_context28.prev = 3;
|
|
2111
|
+
_t15 = _context28["catch"](1);
|
|
2112
|
+
_httpRequestResponseTime15 = backendTimer.milliSecondsElapsed;
|
|
2113
|
+
_elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
|
|
2114
|
+
_this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _t15, undefined, requestHeaders, _httpRequestResponseTime15);
|
|
2115
|
+
if ((0, _isExpectedAxiosError["default"])(_t15, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2116
|
+
reject(new Error(_this13.HTTPTimeOutErrorMessage));
|
|
1982
2117
|
}
|
|
1983
|
-
reject(
|
|
2118
|
+
reject(_t15);
|
|
1984
2119
|
case 4:
|
|
1985
2120
|
case "end":
|
|
1986
|
-
return
|
|
2121
|
+
return _context28.stop();
|
|
1987
2122
|
}
|
|
1988
|
-
},
|
|
2123
|
+
}, _callee28, null, [[1, 3]]);
|
|
1989
2124
|
}));
|
|
1990
|
-
return function (
|
|
1991
|
-
return
|
|
2125
|
+
return function (_x48, _x49) {
|
|
2126
|
+
return _ref12.apply(this, arguments);
|
|
1992
2127
|
};
|
|
1993
2128
|
}()));
|
|
1994
2129
|
case 1:
|
|
1995
2130
|
case "end":
|
|
1996
|
-
return
|
|
2131
|
+
return _context29.stop();
|
|
1997
2132
|
}
|
|
1998
|
-
},
|
|
2133
|
+
}, _callee29, this);
|
|
1999
2134
|
}));
|
|
2000
|
-
function emailTranscript(
|
|
2135
|
+
function emailTranscript(_x45, _x46, _x47) {
|
|
2001
2136
|
return _emailTranscript.apply(this, arguments);
|
|
2002
2137
|
}
|
|
2003
2138
|
return emailTranscript;
|
|
@@ -2010,12 +2145,12 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2010
2145
|
}, {
|
|
2011
2146
|
key: "fetchDataMaskingInfo",
|
|
2012
2147
|
value: (function () {
|
|
2013
|
-
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2014
|
-
var _this$configuration$
|
|
2015
|
-
|
|
2148
|
+
var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId) {
|
|
2149
|
+
var _this$configuration$d16,
|
|
2150
|
+
_this14 = this;
|
|
2016
2151
|
var timer, requestPath, axiosInstance, requestHeaders, url, method, options;
|
|
2017
|
-
return _regenerator["default"].wrap(function (
|
|
2018
|
-
while (1) switch (
|
|
2152
|
+
return _regenerator["default"].wrap(function (_context31) {
|
|
2153
|
+
while (1) switch (_context31.prev = _context31.next) {
|
|
2019
2154
|
case 0:
|
|
2020
2155
|
timer = _Timer.Timer.TIMER();
|
|
2021
2156
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSTARTED, "Fetch Data Masking Started", requestId);
|
|
@@ -2028,7 +2163,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2028
2163
|
retries: this.configuration.maxRequestRetriesOnFailure,
|
|
2029
2164
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.fetchDataMaskingInfo
|
|
2030
2165
|
});
|
|
2031
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
2166
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
2032
2167
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
2033
2168
|
requestHeaders[_OmnichannelHTTPHeaders["default"].requestId] = requestId;
|
|
2034
2169
|
this.addDefaultHeaders(requestId, requestHeaders);
|
|
@@ -2038,54 +2173,54 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2038
2173
|
headers: requestHeaders,
|
|
2039
2174
|
method: method,
|
|
2040
2175
|
url: url,
|
|
2041
|
-
timeout: (_this$configuration$
|
|
2176
|
+
timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
|
|
2042
2177
|
};
|
|
2043
|
-
return
|
|
2044
|
-
var
|
|
2045
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data,
|
|
2046
|
-
return _regenerator["default"].wrap(function (
|
|
2047
|
-
while (1) switch (
|
|
2178
|
+
return _context31.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2179
|
+
var _ref13 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
|
|
2180
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, data, _httpRequestResponseTime16, _elapsedTimeInMilliseconds16, _t16;
|
|
2181
|
+
return _regenerator["default"].wrap(function (_context30) {
|
|
2182
|
+
while (1) switch (_context30.prev = _context30.next) {
|
|
2048
2183
|
case 0:
|
|
2049
2184
|
backendTimer = _Timer.Timer.TIMER();
|
|
2050
|
-
|
|
2051
|
-
|
|
2185
|
+
_context30.prev = 1;
|
|
2186
|
+
_context30.next = 2;
|
|
2052
2187
|
return axiosInstance(options);
|
|
2053
2188
|
case 2:
|
|
2054
|
-
response =
|
|
2189
|
+
response = _context30.sent;
|
|
2055
2190
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2056
2191
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2057
2192
|
data = response.data;
|
|
2058
|
-
|
|
2193
|
+
_this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2059
2194
|
resolve(data);
|
|
2060
|
-
|
|
2195
|
+
_context30.next = 4;
|
|
2061
2196
|
break;
|
|
2062
2197
|
case 3:
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
2069
|
-
reject(new Error(
|
|
2198
|
+
_context30.prev = 3;
|
|
2199
|
+
_t16 = _context30["catch"](1);
|
|
2200
|
+
_httpRequestResponseTime16 = backendTimer.milliSecondsElapsed;
|
|
2201
|
+
_elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
|
|
2202
|
+
_this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _t16, undefined, requestHeaders, _httpRequestResponseTime16);
|
|
2203
|
+
if ((0, _isExpectedAxiosError["default"])(_t16, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2204
|
+
reject(new Error(_this14.HTTPTimeOutErrorMessage));
|
|
2070
2205
|
}
|
|
2071
|
-
reject(
|
|
2206
|
+
reject(_t16);
|
|
2072
2207
|
case 4:
|
|
2073
2208
|
case "end":
|
|
2074
|
-
return
|
|
2209
|
+
return _context30.stop();
|
|
2075
2210
|
}
|
|
2076
|
-
},
|
|
2211
|
+
}, _callee30, null, [[1, 3]]);
|
|
2077
2212
|
}));
|
|
2078
|
-
return function (
|
|
2079
|
-
return
|
|
2213
|
+
return function (_x51, _x52) {
|
|
2214
|
+
return _ref13.apply(this, arguments);
|
|
2080
2215
|
};
|
|
2081
2216
|
}()));
|
|
2082
2217
|
case 1:
|
|
2083
2218
|
case "end":
|
|
2084
|
-
return
|
|
2219
|
+
return _context31.stop();
|
|
2085
2220
|
}
|
|
2086
|
-
},
|
|
2221
|
+
}, _callee31, this);
|
|
2087
2222
|
}));
|
|
2088
|
-
function fetchDataMaskingInfo(
|
|
2223
|
+
function fetchDataMaskingInfo(_x50) {
|
|
2089
2224
|
return _fetchDataMaskingInfo.apply(this, arguments);
|
|
2090
2225
|
}
|
|
2091
2226
|
return fetchDataMaskingInfo;
|
|
@@ -2100,9 +2235,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2100
2235
|
}, {
|
|
2101
2236
|
key: "makeSecondaryChannelEventRequest",
|
|
2102
2237
|
value: (function () {
|
|
2103
|
-
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2104
|
-
var _this$configuration$
|
|
2105
|
-
|
|
2238
|
+
var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee33(requestId, secondaryChannelEventRequestBody) {
|
|
2239
|
+
var _this$configuration$d17,
|
|
2240
|
+
_this15 = this;
|
|
2106
2241
|
var secondaryChannelEventOptionalParams,
|
|
2107
2242
|
timer,
|
|
2108
2243
|
requestPath,
|
|
@@ -2112,11 +2247,11 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2112
2247
|
url,
|
|
2113
2248
|
method,
|
|
2114
2249
|
options,
|
|
2115
|
-
|
|
2116
|
-
return _regenerator["default"].wrap(function (
|
|
2117
|
-
while (1) switch (
|
|
2250
|
+
_args33 = arguments;
|
|
2251
|
+
return _regenerator["default"].wrap(function (_context33) {
|
|
2252
|
+
while (1) switch (_context33.prev = _context33.next) {
|
|
2118
2253
|
case 0:
|
|
2119
|
-
secondaryChannelEventOptionalParams =
|
|
2254
|
+
secondaryChannelEventOptionalParams = _args33.length > 2 && _args33[2] !== undefined ? _args33[2] : {};
|
|
2120
2255
|
timer = _Timer.Timer.TIMER();
|
|
2121
2256
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSTARTED, "Secondary Channel Event Request Started", requestId);
|
|
2122
2257
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
|
|
@@ -2127,7 +2262,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2127
2262
|
waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.makeSecondaryChannelEventRequest
|
|
2128
2263
|
});
|
|
2129
2264
|
authenticatedUserToken = secondaryChannelEventOptionalParams.authenticatedUserToken;
|
|
2130
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
2265
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
2131
2266
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
2132
2267
|
if (authenticatedUserToken) {
|
|
2133
2268
|
requestHeaders[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
|
|
@@ -2143,55 +2278,55 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2143
2278
|
headers: requestHeaders,
|
|
2144
2279
|
method: method,
|
|
2145
2280
|
url: url,
|
|
2146
|
-
timeout: (_this$configuration$
|
|
2281
|
+
timeout: (_this$configuration$d17 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d17 !== void 0 ? _this$configuration$d17 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
|
|
2147
2282
|
};
|
|
2148
|
-
return
|
|
2149
|
-
var
|
|
2150
|
-
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
2151
|
-
return _regenerator["default"].wrap(function (
|
|
2152
|
-
while (1) switch (
|
|
2283
|
+
return _context33.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2284
|
+
var _ref14 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee32(resolve, reject) {
|
|
2285
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime17, _elapsedTimeInMilliseconds17, _t17;
|
|
2286
|
+
return _regenerator["default"].wrap(function (_context32) {
|
|
2287
|
+
while (1) switch (_context32.prev = _context32.next) {
|
|
2153
2288
|
case 0:
|
|
2154
2289
|
backendTimer = _Timer.Timer.TIMER();
|
|
2155
|
-
|
|
2156
|
-
|
|
2290
|
+
_context32.prev = 1;
|
|
2291
|
+
_context32.next = 2;
|
|
2157
2292
|
return axiosInstance(options);
|
|
2158
2293
|
case 2:
|
|
2159
|
-
response =
|
|
2294
|
+
response = _context32.sent;
|
|
2160
2295
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2161
2296
|
headers = response.headers;
|
|
2162
|
-
|
|
2297
|
+
_this15.setAuthCodeNonce(headers);
|
|
2163
2298
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2164
|
-
|
|
2299
|
+
_this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2165
2300
|
resolve();
|
|
2166
|
-
|
|
2301
|
+
_context32.next = 4;
|
|
2167
2302
|
break;
|
|
2168
2303
|
case 3:
|
|
2169
|
-
|
|
2170
|
-
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
2175
|
-
reject(new Error(
|
|
2304
|
+
_context32.prev = 3;
|
|
2305
|
+
_t17 = _context32["catch"](1);
|
|
2306
|
+
_httpRequestResponseTime17 = backendTimer.milliSecondsElapsed;
|
|
2307
|
+
_elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
|
|
2308
|
+
_this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _t17, undefined, requestHeaders, _httpRequestResponseTime17);
|
|
2309
|
+
if ((0, _isExpectedAxiosError["default"])(_t17, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2310
|
+
reject(new Error(_this15.HTTPTimeOutErrorMessage));
|
|
2176
2311
|
}
|
|
2177
|
-
reject(
|
|
2312
|
+
reject(_t17);
|
|
2178
2313
|
case 4:
|
|
2179
2314
|
case "end":
|
|
2180
|
-
return
|
|
2315
|
+
return _context32.stop();
|
|
2181
2316
|
}
|
|
2182
|
-
},
|
|
2317
|
+
}, _callee32, null, [[1, 3]]);
|
|
2183
2318
|
}));
|
|
2184
|
-
return function (
|
|
2185
|
-
return
|
|
2319
|
+
return function (_x55, _x56) {
|
|
2320
|
+
return _ref14.apply(this, arguments);
|
|
2186
2321
|
};
|
|
2187
2322
|
}()));
|
|
2188
2323
|
case 1:
|
|
2189
2324
|
case "end":
|
|
2190
|
-
return
|
|
2325
|
+
return _context33.stop();
|
|
2191
2326
|
}
|
|
2192
|
-
},
|
|
2327
|
+
}, _callee33, this);
|
|
2193
2328
|
}));
|
|
2194
|
-
function makeSecondaryChannelEventRequest(
|
|
2329
|
+
function makeSecondaryChannelEventRequest(_x53, _x54) {
|
|
2195
2330
|
return _makeSecondaryChannelEventRequest.apply(this, arguments);
|
|
2196
2331
|
}
|
|
2197
2332
|
return makeSecondaryChannelEventRequest;
|
|
@@ -2203,9 +2338,9 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2203
2338
|
}, {
|
|
2204
2339
|
key: "sendTypingIndicator",
|
|
2205
2340
|
value: (function () {
|
|
2206
|
-
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2207
|
-
var _this$configuration$
|
|
2208
|
-
|
|
2341
|
+
var _sendTypingIndicator = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee35(requestId, currentLiveChatVersion) {
|
|
2342
|
+
var _this$configuration$d18,
|
|
2343
|
+
_this16 = this;
|
|
2209
2344
|
var sendTypingIndicatorOptionalParams,
|
|
2210
2345
|
timer,
|
|
2211
2346
|
customerDisplayName,
|
|
@@ -2215,28 +2350,28 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2215
2350
|
url,
|
|
2216
2351
|
method,
|
|
2217
2352
|
options,
|
|
2218
|
-
|
|
2219
|
-
return _regenerator["default"].wrap(function (
|
|
2220
|
-
while (1) switch (
|
|
2353
|
+
_args35 = arguments;
|
|
2354
|
+
return _regenerator["default"].wrap(function (_context35) {
|
|
2355
|
+
while (1) switch (_context35.prev = _context35.next) {
|
|
2221
2356
|
case 0:
|
|
2222
|
-
sendTypingIndicatorOptionalParams =
|
|
2357
|
+
sendTypingIndicatorOptionalParams = _args35.length > 2 && _args35[2] !== undefined ? _args35[2] : {};
|
|
2223
2358
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2224
|
-
|
|
2359
|
+
_context35.next = 1;
|
|
2225
2360
|
break;
|
|
2226
2361
|
}
|
|
2227
|
-
return
|
|
2362
|
+
return _context35.abrupt("return", Promise.resolve());
|
|
2228
2363
|
case 1:
|
|
2229
2364
|
timer = _Timer.Timer.TIMER();
|
|
2230
2365
|
customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
|
|
2231
2366
|
if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
|
|
2232
|
-
|
|
2367
|
+
_context35.next = 2;
|
|
2233
2368
|
break;
|
|
2234
2369
|
}
|
|
2235
2370
|
throw new Error('Typing indicator is only supported on v2');
|
|
2236
2371
|
case 2:
|
|
2237
2372
|
requestPath = "/".concat(_OmnichannelEndpoints["default"].SendTypingIndicatorPath, "/").concat(requestId);
|
|
2238
2373
|
axiosInstance = _axios["default"].create();
|
|
2239
|
-
requestHeaders = _Constants["default"].defaultHeaders;
|
|
2374
|
+
requestHeaders = _objectSpread({}, _Constants["default"].defaultHeaders);
|
|
2240
2375
|
requestHeaders[_OmnichannelHTTPHeaders["default"].organizationId] = this.omnichannelConfiguration.orgId;
|
|
2241
2376
|
if (customerDisplayName) {
|
|
2242
2377
|
requestHeaders[_Constants["default"].customerDisplayName] = customerDisplayName;
|
|
@@ -2248,53 +2383,53 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2248
2383
|
headers: requestHeaders,
|
|
2249
2384
|
method: method,
|
|
2250
2385
|
url: url,
|
|
2251
|
-
timeout: (_this$configuration$
|
|
2386
|
+
timeout: (_this$configuration$d18 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d18 !== void 0 ? _this$configuration$d18 : this.configuration.requestTimeoutConfig.sendTypingIndicator
|
|
2252
2387
|
};
|
|
2253
|
-
return
|
|
2254
|
-
var
|
|
2255
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds,
|
|
2256
|
-
return _regenerator["default"].wrap(function (
|
|
2257
|
-
while (1) switch (
|
|
2388
|
+
return _context35.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2389
|
+
var _ref15 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee34(resolve, reject) {
|
|
2390
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, _httpRequestResponseTime18, _elapsedTimeInMilliseconds18, _t18;
|
|
2391
|
+
return _regenerator["default"].wrap(function (_context34) {
|
|
2392
|
+
while (1) switch (_context34.prev = _context34.next) {
|
|
2258
2393
|
case 0:
|
|
2259
2394
|
backendTimer = _Timer.Timer.TIMER();
|
|
2260
|
-
|
|
2261
|
-
|
|
2395
|
+
_context34.prev = 1;
|
|
2396
|
+
_context34.next = 2;
|
|
2262
2397
|
return axiosInstance(options);
|
|
2263
2398
|
case 2:
|
|
2264
|
-
response =
|
|
2399
|
+
response = _context34.sent;
|
|
2265
2400
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2266
2401
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2267
|
-
|
|
2402
|
+
_this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2268
2403
|
resolve();
|
|
2269
|
-
|
|
2404
|
+
_context34.next = 4;
|
|
2270
2405
|
break;
|
|
2271
2406
|
case 3:
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
if ((0, _isExpectedAxiosError["default"])(
|
|
2278
|
-
reject(new Error(
|
|
2407
|
+
_context34.prev = 3;
|
|
2408
|
+
_t18 = _context34["catch"](1);
|
|
2409
|
+
_httpRequestResponseTime18 = backendTimer.milliSecondsElapsed;
|
|
2410
|
+
_elapsedTimeInMilliseconds18 = timer.milliSecondsElapsed;
|
|
2411
|
+
_this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds18, requestPath, method, _t18, undefined, requestHeaders, _httpRequestResponseTime18);
|
|
2412
|
+
if ((0, _isExpectedAxiosError["default"])(_t18, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2413
|
+
reject(new Error(_this16.HTTPTimeOutErrorMessage));
|
|
2279
2414
|
}
|
|
2280
|
-
reject(
|
|
2415
|
+
reject(_t18);
|
|
2281
2416
|
case 4:
|
|
2282
2417
|
case "end":
|
|
2283
|
-
return
|
|
2418
|
+
return _context34.stop();
|
|
2284
2419
|
}
|
|
2285
|
-
},
|
|
2420
|
+
}, _callee34, null, [[1, 3]]);
|
|
2286
2421
|
}));
|
|
2287
|
-
return function (
|
|
2288
|
-
return
|
|
2422
|
+
return function (_x59, _x60) {
|
|
2423
|
+
return _ref15.apply(this, arguments);
|
|
2289
2424
|
};
|
|
2290
2425
|
}()));
|
|
2291
2426
|
case 3:
|
|
2292
2427
|
case "end":
|
|
2293
|
-
return
|
|
2428
|
+
return _context35.stop();
|
|
2294
2429
|
}
|
|
2295
|
-
},
|
|
2430
|
+
}, _callee35, this);
|
|
2296
2431
|
}));
|
|
2297
|
-
function sendTypingIndicator(
|
|
2432
|
+
function sendTypingIndicator(_x57, _x58) {
|
|
2298
2433
|
return _sendTypingIndicator.apply(this, arguments);
|
|
2299
2434
|
}
|
|
2300
2435
|
return sendTypingIndicator;
|
|
@@ -2309,18 +2444,18 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2309
2444
|
}, {
|
|
2310
2445
|
key: "midConversationAuthenticateChat",
|
|
2311
2446
|
value: (function () {
|
|
2312
|
-
var _midConversationAuthenticateChat = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2313
|
-
var _this$configuration$
|
|
2314
|
-
|
|
2447
|
+
var _midConversationAuthenticateChat = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee37(requestId, authenticateChatParams) {
|
|
2448
|
+
var _this$configuration$d19,
|
|
2449
|
+
_this17 = this;
|
|
2315
2450
|
var timer, chatId, authenticatedUserToken, requestPath, axiosInstance, requestHeaders, url, method, options;
|
|
2316
|
-
return _regenerator["default"].wrap(function (
|
|
2317
|
-
while (1) switch (
|
|
2451
|
+
return _regenerator["default"].wrap(function (_context37) {
|
|
2452
|
+
while (1) switch (_context37.prev = _context37.next) {
|
|
2318
2453
|
case 0:
|
|
2319
2454
|
timer = _Timer.Timer.TIMER();
|
|
2320
2455
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.MIDAUTHENTICATECHATSTARTED, "Mid-Authenticate Chat Started", requestId);
|
|
2321
2456
|
chatId = authenticateChatParams.chatId, authenticatedUserToken = authenticateChatParams.authenticatedUserToken;
|
|
2322
2457
|
if (!(!chatId || !authenticatedUserToken)) {
|
|
2323
|
-
|
|
2458
|
+
_context37.next = 1;
|
|
2324
2459
|
break;
|
|
2325
2460
|
}
|
|
2326
2461
|
this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.MIDAUTHENTICATECHATFAILED, "Mid-Authenticate Chat Failed - chatId and authenticatedUserToken are required", requestId);
|
|
@@ -2344,62 +2479,62 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2344
2479
|
headers: requestHeaders,
|
|
2345
2480
|
method: method,
|
|
2346
2481
|
url: url,
|
|
2347
|
-
timeout: (_this$configuration$
|
|
2482
|
+
timeout: (_this$configuration$d19 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d19 !== void 0 ? _this$configuration$d19 : this.configuration.requestTimeoutConfig.midConversationAuthenticateChat
|
|
2348
2483
|
};
|
|
2349
|
-
return
|
|
2350
|
-
var
|
|
2351
|
-
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, headers,
|
|
2352
|
-
return _regenerator["default"].wrap(function (
|
|
2353
|
-
while (1) switch (
|
|
2484
|
+
return _context37.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2485
|
+
var _ref16 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee36(resolve, reject) {
|
|
2486
|
+
var backendTimer, response, httpRequestResponseTime, elapsedTimeInMilliseconds, headers, _httpRequestResponseTime19, _elapsedTimeInMilliseconds19, _t19;
|
|
2487
|
+
return _regenerator["default"].wrap(function (_context36) {
|
|
2488
|
+
while (1) switch (_context36.prev = _context36.next) {
|
|
2354
2489
|
case 0:
|
|
2355
2490
|
backendTimer = _Timer.Timer.TIMER();
|
|
2356
|
-
|
|
2357
|
-
|
|
2491
|
+
_context36.prev = 1;
|
|
2492
|
+
_context36.next = 2;
|
|
2358
2493
|
return axiosInstance(options);
|
|
2359
2494
|
case 2:
|
|
2360
|
-
response =
|
|
2495
|
+
response = _context36.sent;
|
|
2361
2496
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2362
2497
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2363
2498
|
headers = response.headers;
|
|
2364
|
-
|
|
2499
|
+
_this17.setAuthCodeNonce(headers);
|
|
2365
2500
|
if (headers && headers[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()]) {
|
|
2366
|
-
|
|
2501
|
+
_this17.sessionId = headers[_OmnichannelHTTPHeaders["default"].ocSessionId.toLowerCase()];
|
|
2367
2502
|
}
|
|
2368
|
-
|
|
2503
|
+
_this17.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.MIDAUTHENTICATECHATSUCCEEDED, "Mid-Authenticate Chat Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2369
2504
|
resolve();
|
|
2370
|
-
|
|
2505
|
+
_context36.next = 5;
|
|
2371
2506
|
break;
|
|
2372
2507
|
case 3:
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
2379
|
-
|
|
2508
|
+
_context36.prev = 3;
|
|
2509
|
+
_t19 = _context36["catch"](1);
|
|
2510
|
+
_httpRequestResponseTime19 = backendTimer.milliSecondsElapsed;
|
|
2511
|
+
_elapsedTimeInMilliseconds19 = timer.milliSecondsElapsed;
|
|
2512
|
+
_this17.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.MIDAUTHENTICATECHATFAILED, "Mid-Authenticate Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds19, requestPath, method, _t19, undefined, requestHeaders, _httpRequestResponseTime19);
|
|
2513
|
+
if (!(0, _isExpectedAxiosError["default"])(_t19, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2514
|
+
_context36.next = 4;
|
|
2380
2515
|
break;
|
|
2381
2516
|
}
|
|
2382
|
-
reject(new Error(
|
|
2383
|
-
return
|
|
2517
|
+
reject(new Error(_this17.HTTPTimeOutErrorMessage));
|
|
2518
|
+
return _context36.abrupt("return");
|
|
2384
2519
|
case 4:
|
|
2385
|
-
reject(
|
|
2520
|
+
reject(_t19);
|
|
2386
2521
|
case 5:
|
|
2387
2522
|
case "end":
|
|
2388
|
-
return
|
|
2523
|
+
return _context36.stop();
|
|
2389
2524
|
}
|
|
2390
|
-
},
|
|
2525
|
+
}, _callee36, null, [[1, 3]]);
|
|
2391
2526
|
}));
|
|
2392
|
-
return function (
|
|
2393
|
-
return
|
|
2527
|
+
return function (_x63, _x64) {
|
|
2528
|
+
return _ref16.apply(this, arguments);
|
|
2394
2529
|
};
|
|
2395
2530
|
}()));
|
|
2396
2531
|
case 2:
|
|
2397
2532
|
case "end":
|
|
2398
|
-
return
|
|
2533
|
+
return _context37.stop();
|
|
2399
2534
|
}
|
|
2400
|
-
},
|
|
2535
|
+
}, _callee37, this);
|
|
2401
2536
|
}));
|
|
2402
|
-
function midConversationAuthenticateChat(
|
|
2537
|
+
function midConversationAuthenticateChat(_x61, _x62) {
|
|
2403
2538
|
return _midConversationAuthenticateChat.apply(this, arguments);
|
|
2404
2539
|
}
|
|
2405
2540
|
return midConversationAuthenticateChat;
|
|
@@ -2413,12 +2548,12 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2413
2548
|
}, {
|
|
2414
2549
|
key: "getUnreadMessageCount",
|
|
2415
2550
|
value: (function () {
|
|
2416
|
-
var _getUnreadMessageCount = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2417
|
-
var _this$configuration$
|
|
2418
|
-
|
|
2551
|
+
var _getUnreadMessageCount = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee39(authenticatedUserToken) {
|
|
2552
|
+
var _this$configuration$d20,
|
|
2553
|
+
_this18 = this;
|
|
2419
2554
|
var timer, requestId, requestPath, axiosInstance, requestHeaders, url, method, options;
|
|
2420
|
-
return _regenerator["default"].wrap(function (
|
|
2421
|
-
while (1) switch (
|
|
2555
|
+
return _regenerator["default"].wrap(function (_context39) {
|
|
2556
|
+
while (1) switch (_context39.prev = _context39.next) {
|
|
2422
2557
|
case 0:
|
|
2423
2558
|
timer = _Timer.Timer.TIMER();
|
|
2424
2559
|
requestId = (0, _uuid.uuidv4)();
|
|
@@ -2439,59 +2574,59 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2439
2574
|
headers: requestHeaders,
|
|
2440
2575
|
method: method,
|
|
2441
2576
|
url: url,
|
|
2442
|
-
timeout: (_this$configuration$
|
|
2577
|
+
timeout: (_this$configuration$d20 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d20 !== void 0 ? _this$configuration$d20 : this.configuration.requestTimeoutConfig.getUnreadMessageCount
|
|
2443
2578
|
};
|
|
2444
|
-
return
|
|
2445
|
-
var
|
|
2446
|
-
var backendTimer, response, httpRequestResponseTime, data, headers, elapsedTimeInMilliseconds,
|
|
2447
|
-
return _regenerator["default"].wrap(function (
|
|
2448
|
-
while (1) switch (
|
|
2579
|
+
return _context39.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2580
|
+
var _ref17 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee38(resolve, reject) {
|
|
2581
|
+
var backendTimer, response, httpRequestResponseTime, data, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime20, _elapsedTimeInMilliseconds20, _t20;
|
|
2582
|
+
return _regenerator["default"].wrap(function (_context38) {
|
|
2583
|
+
while (1) switch (_context38.prev = _context38.next) {
|
|
2449
2584
|
case 0:
|
|
2450
2585
|
backendTimer = _Timer.Timer.TIMER();
|
|
2451
|
-
|
|
2452
|
-
|
|
2586
|
+
_context38.prev = 1;
|
|
2587
|
+
_context38.next = 2;
|
|
2453
2588
|
return axiosInstance(options);
|
|
2454
2589
|
case 2:
|
|
2455
|
-
response =
|
|
2590
|
+
response = _context38.sent;
|
|
2456
2591
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2457
2592
|
data = response.data, headers = response.headers;
|
|
2458
|
-
|
|
2593
|
+
_this18.setAuthCodeNonce(headers);
|
|
2459
2594
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2460
|
-
|
|
2595
|
+
_this18.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETUNREADMESSAGECOUNTSUCCEEDED, "Get Unread Message Count Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2461
2596
|
resolve(data);
|
|
2462
|
-
|
|
2597
|
+
_context38.next = 5;
|
|
2463
2598
|
break;
|
|
2464
2599
|
case 3:
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
2471
|
-
|
|
2600
|
+
_context38.prev = 3;
|
|
2601
|
+
_t20 = _context38["catch"](1);
|
|
2602
|
+
_httpRequestResponseTime20 = backendTimer.milliSecondsElapsed;
|
|
2603
|
+
_elapsedTimeInMilliseconds20 = timer.milliSecondsElapsed;
|
|
2604
|
+
_this18.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETUNREADMESSAGECOUNTFAILED, "Get Unread Message Count Failed", requestId, undefined, _elapsedTimeInMilliseconds20, requestPath, method, _t20, undefined, requestHeaders, _httpRequestResponseTime20);
|
|
2605
|
+
if (!(0, _isExpectedAxiosError["default"])(_t20, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2606
|
+
_context38.next = 4;
|
|
2472
2607
|
break;
|
|
2473
2608
|
}
|
|
2474
|
-
reject(new Error(
|
|
2475
|
-
return
|
|
2609
|
+
reject(new Error(_this18.HTTPTimeOutErrorMessage));
|
|
2610
|
+
return _context38.abrupt("return");
|
|
2476
2611
|
case 4:
|
|
2477
|
-
reject(
|
|
2612
|
+
reject(_t20);
|
|
2478
2613
|
case 5:
|
|
2479
2614
|
case "end":
|
|
2480
|
-
return
|
|
2615
|
+
return _context38.stop();
|
|
2481
2616
|
}
|
|
2482
|
-
},
|
|
2617
|
+
}, _callee38, null, [[1, 3]]);
|
|
2483
2618
|
}));
|
|
2484
|
-
return function (
|
|
2485
|
-
return
|
|
2619
|
+
return function (_x66, _x67) {
|
|
2620
|
+
return _ref17.apply(this, arguments);
|
|
2486
2621
|
};
|
|
2487
2622
|
}()));
|
|
2488
2623
|
case 1:
|
|
2489
2624
|
case "end":
|
|
2490
|
-
return
|
|
2625
|
+
return _context39.stop();
|
|
2491
2626
|
}
|
|
2492
|
-
},
|
|
2627
|
+
}, _callee39, this);
|
|
2493
2628
|
}));
|
|
2494
|
-
function getUnreadMessageCount(
|
|
2629
|
+
function getUnreadMessageCount(_x65) {
|
|
2495
2630
|
return _getUnreadMessageCount.apply(this, arguments);
|
|
2496
2631
|
}
|
|
2497
2632
|
return getUnreadMessageCount;
|
|
@@ -2507,12 +2642,12 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2507
2642
|
}, {
|
|
2508
2643
|
key: "sendReadReceipt",
|
|
2509
2644
|
value: (function () {
|
|
2510
|
-
var _sendReadReceipt = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function
|
|
2511
|
-
var _this$configuration$
|
|
2512
|
-
|
|
2645
|
+
var _sendReadReceipt = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee41(requestId, messageId, authenticatedUserToken) {
|
|
2646
|
+
var _this$configuration$d21,
|
|
2647
|
+
_this19 = this;
|
|
2513
2648
|
var timer, requestPath, axiosInstance, requestHeaders, url, method, options;
|
|
2514
|
-
return _regenerator["default"].wrap(function (
|
|
2515
|
-
while (1) switch (
|
|
2649
|
+
return _regenerator["default"].wrap(function (_context41) {
|
|
2650
|
+
while (1) switch (_context41.prev = _context41.next) {
|
|
2516
2651
|
case 0:
|
|
2517
2652
|
timer = _Timer.Timer.TIMER();
|
|
2518
2653
|
this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDREADRECEIPTSTARTED, "Send Read Receipt Started", requestId);
|
|
@@ -2535,59 +2670,59 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2535
2670
|
headers: requestHeaders,
|
|
2536
2671
|
method: method,
|
|
2537
2672
|
url: url,
|
|
2538
|
-
timeout: (_this$configuration$
|
|
2673
|
+
timeout: (_this$configuration$d21 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d21 !== void 0 ? _this$configuration$d21 : this.configuration.requestTimeoutConfig.sendReadReceipt
|
|
2539
2674
|
};
|
|
2540
|
-
return
|
|
2541
|
-
var
|
|
2542
|
-
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds,
|
|
2543
|
-
return _regenerator["default"].wrap(function (
|
|
2544
|
-
while (1) switch (
|
|
2675
|
+
return _context41.abrupt("return", new Promise(/*#__PURE__*/function () {
|
|
2676
|
+
var _ref18 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee40(resolve, reject) {
|
|
2677
|
+
var backendTimer, response, httpRequestResponseTime, headers, elapsedTimeInMilliseconds, _httpRequestResponseTime21, _elapsedTimeInMilliseconds21, _t21;
|
|
2678
|
+
return _regenerator["default"].wrap(function (_context40) {
|
|
2679
|
+
while (1) switch (_context40.prev = _context40.next) {
|
|
2545
2680
|
case 0:
|
|
2546
2681
|
backendTimer = _Timer.Timer.TIMER();
|
|
2547
|
-
|
|
2548
|
-
|
|
2682
|
+
_context40.prev = 1;
|
|
2683
|
+
_context40.next = 2;
|
|
2549
2684
|
return axiosInstance(options);
|
|
2550
2685
|
case 2:
|
|
2551
|
-
response =
|
|
2686
|
+
response = _context40.sent;
|
|
2552
2687
|
httpRequestResponseTime = backendTimer.milliSecondsElapsed;
|
|
2553
2688
|
headers = response.headers;
|
|
2554
|
-
|
|
2689
|
+
_this19.setAuthCodeNonce(headers);
|
|
2555
2690
|
elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
|
|
2556
|
-
|
|
2691
|
+
_this19.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDREADRECEIPTSUCCEEDED, "Send Read Receipt Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, undefined, requestHeaders, httpRequestResponseTime);
|
|
2557
2692
|
resolve();
|
|
2558
|
-
|
|
2693
|
+
_context40.next = 5;
|
|
2559
2694
|
break;
|
|
2560
2695
|
case 3:
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
if (!(0, _isExpectedAxiosError["default"])(
|
|
2567
|
-
|
|
2696
|
+
_context40.prev = 3;
|
|
2697
|
+
_t21 = _context40["catch"](1);
|
|
2698
|
+
_httpRequestResponseTime21 = backendTimer.milliSecondsElapsed;
|
|
2699
|
+
_elapsedTimeInMilliseconds21 = timer.milliSecondsElapsed;
|
|
2700
|
+
_this19.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDREADRECEIPTFAILED, "Send Read Receipt Failed", requestId, undefined, _elapsedTimeInMilliseconds21, requestPath, method, _t21, undefined, requestHeaders, _httpRequestResponseTime21);
|
|
2701
|
+
if (!(0, _isExpectedAxiosError["default"])(_t21, _Constants["default"].axiosTimeoutErrorCode)) {
|
|
2702
|
+
_context40.next = 4;
|
|
2568
2703
|
break;
|
|
2569
2704
|
}
|
|
2570
|
-
reject(new Error(
|
|
2571
|
-
return
|
|
2705
|
+
reject(new Error(_this19.HTTPTimeOutErrorMessage));
|
|
2706
|
+
return _context40.abrupt("return");
|
|
2572
2707
|
case 4:
|
|
2573
|
-
reject(
|
|
2708
|
+
reject(_t21);
|
|
2574
2709
|
case 5:
|
|
2575
2710
|
case "end":
|
|
2576
|
-
return
|
|
2711
|
+
return _context40.stop();
|
|
2577
2712
|
}
|
|
2578
|
-
},
|
|
2713
|
+
}, _callee40, null, [[1, 3]]);
|
|
2579
2714
|
}));
|
|
2580
|
-
return function (
|
|
2581
|
-
return
|
|
2715
|
+
return function (_x71, _x72) {
|
|
2716
|
+
return _ref18.apply(this, arguments);
|
|
2582
2717
|
};
|
|
2583
2718
|
}()));
|
|
2584
2719
|
case 1:
|
|
2585
2720
|
case "end":
|
|
2586
|
-
return
|
|
2721
|
+
return _context41.stop();
|
|
2587
2722
|
}
|
|
2588
|
-
},
|
|
2723
|
+
}, _callee41, this);
|
|
2589
2724
|
}));
|
|
2590
|
-
function sendReadReceipt(
|
|
2725
|
+
function sendReadReceipt(_x68, _x69, _x70) {
|
|
2591
2726
|
return _sendReadReceipt.apply(this, arguments);
|
|
2592
2727
|
}
|
|
2593
2728
|
return sendReadReceipt;
|
|
@@ -2609,7 +2744,7 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2609
2744
|
)
|
|
2610
2745
|
}, {
|
|
2611
2746
|
key: "logWithLogger",
|
|
2612
|
-
value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload, requestHeaders, httpRequestResponseTime) {
|
|
2747
|
+
value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload, requestHeaders, httpRequestResponseTime, retryCount) {
|
|
2613
2748
|
var _response, _response2, _response3;
|
|
2614
2749
|
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
2615
2750
|
if (!this.logger) {
|
|
@@ -2674,7 +2809,8 @@ var SDK = exports["default"] = /*#__PURE__*/function () {
|
|
|
2674
2809
|
RequestHeaders: sanitizedRequestHeaders,
|
|
2675
2810
|
ResponseErrorcode: error ? (_response3 = error.response) === null || _response3 === void 0 || (_response3 = _response3.headers) === null || _response3 === void 0 ? void 0 : _response3.errorcode : undefined,
|
|
2676
2811
|
// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
2677
|
-
AuthTokenDetails: authTokenDetails
|
|
2812
|
+
AuthTokenDetails: authTokenDetails,
|
|
2813
|
+
RetryCount: retryCount
|
|
2678
2814
|
};
|
|
2679
2815
|
this.logger.log(logLevel, telemetryEventType, customData, description);
|
|
2680
2816
|
}
|
|
@@ -2708,13 +2844,15 @@ _SDK = SDK;
|
|
|
2708
2844
|
getPersistentChatHistory: 15000,
|
|
2709
2845
|
midConversationAuthenticateChat: 15000,
|
|
2710
2846
|
getUnreadMessageCount: 15000,
|
|
2711
|
-
sendReadReceipt: 5000
|
|
2847
|
+
sendReadReceipt: 5000,
|
|
2848
|
+
renewChatToken: 15000
|
|
2712
2849
|
});
|
|
2713
2850
|
(0, _defineProperty2["default"])(SDK, "defaultConfiguration", {
|
|
2714
2851
|
authCodeNonce: (0, _uuid.uuidv4)().substring(0, 8),
|
|
2715
2852
|
getChatTokenRetryCount: 10,
|
|
2716
2853
|
getChatTokenTimeBetweenRetriesOnFailure: 10000,
|
|
2717
2854
|
getChatTokenRetryOn429: true,
|
|
2855
|
+
getChatConfigRetryOn429: true,
|
|
2718
2856
|
maxRequestRetriesOnFailure: 5,
|
|
2719
2857
|
defaultRequestTimeout: undefined,
|
|
2720
2858
|
requestTimeoutConfig: _SDK.defaultRequestTimeoutConfig,
|
|
@@ -2722,4 +2860,4 @@ _SDK = SDK;
|
|
|
2722
2860
|
waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs,
|
|
2723
2861
|
ocUserAgent: []
|
|
2724
2862
|
});
|
|
2725
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfRW51bXMiLCJyZXF1aXJlIiwiX2F4aW9zIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9heGlvc1JldHJ5SGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0Jyb3dzZXJJbmZvIiwiX0NvbnN0YW50cyIsIl9DdXN0b21Db250ZXh0RGF0YSIsIl9EZXZpY2VJbmZvIiwiX2VuY0hleCIsIl9Mb2NhbGVzIiwiX0xvZ0xldmVsIiwiX0xvZ2dpbmdTYW5pdGl6ZXIiLCJfT1NJbmZvIiwiX09tbmljaGFubmVsRW5kcG9pbnRzIiwiX09tbmljaGFubmVsSFRUUEhlYWRlcnMiLCJfc2hhIiwiX1RpbWVyIiwiX2h0dHBIZWFkZXJzVXRpbHMiLCJfZW5kcG9pbnRzQ3JlYXRvcnMiLCJfaXNFeHBlY3RlZEF4aW9zRXJyb3IiLCJfU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJfdXVpZCIsIl93YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyIsIl9TREsiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mMyIsImhhcyIsImdldCIsInNldCIsIl90MjEiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJUeXBlRXJyb3IiLCJhIiwidSIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIlNESyIsImV4cG9ydHMiLCJvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24iLCJfdGhpcyIsImNvbmZpZ3VyYXRpb24iLCJ1bmRlZmluZWQiLCJkZWZhdWx0Q29uZmlndXJhdGlvbiIsImxvZ2dlciIsIl9jbGFzc0NhbGxDaGVjazIiLCJjb25jYXQiLCJTREtFcnJvciIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lIiwiQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2UiLCJoZWFkZXJzIiwiYXV0aGNvZGVub25jZSIsImF1dGhDb2RlTm9uY2UiLCJzZXNzaW9uSWQiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib2NTZXNzaW9uSWQiLCJyZXF1ZXN0SWQiLCJjb3JyZWxhdGlvbklkIiwiX3R5cGVvZjIiLCJfaSIsIl9PYmplY3Qka2V5cyIsImtleSIsIl9pMiIsIl9PYmplY3Qka2V5czIiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsIkVycm9yIiwiY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfaXRlcmF0b3IiLCJDb25zdGFudHMiLCJyZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfc3RlcCIsImVyciIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJfY3JlYXRlQ2xhc3MyIiwiX2dldExjd0Zjc0RldGFpbHMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInRpbWVyIiwicmVxdWVzdFBhdGgiLCJtZXRob2QiLCJ1cmwiLCJheGlvc0luc3RhbmNlIiwicmVxdWVzdEhlYWRlcnMiLCJiYWNrZW5kVGltZXIiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQiLCJyZXNwb25zZSIsImh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsImRhdGEiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIl90Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMY3dGY3NEZXRhaWxzUGF0aCIsIm9yZ0lkIiwib3JnVXJsIiwiYXhpb3MiLCJjcmVhdGUiLCJheGlvc1JldHJ5SGFuZGxlciIsInJldHJpZXMiLCJtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzIiwid2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZyIsImdldENoYXRDb25maWciLCJhZGRPY1VzZXJBZ2VudEhlYWRlciIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsInNlbnQiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsImFicnVwdCIsIkVSUk9SIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsInN0b3AiLCJnZXRMY3dGY3NEZXRhaWxzIiwiX2dldENoYXRDb25maWciLCJfY2FsbGVlMiIsImJ5cGFzc0NhY2hlIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTIiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczIiLCJfYXJnczIiLCJfdDIiLCJfY29udGV4dDIiLCJHRVRDSEFUQ09ORklHRlNUQVJURUQiLCJ1dWlkdjQiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJ3aWRnZXRJZCIsImFkZERlZmF1bHRIZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCIsIkdFVENIQVRDT05GSUdGQUlMRUQiLCJQcm9taXNlIiwicmVqZWN0IiwiX3giLCJfZ2V0TFdJRGV0YWlscyIsIl9jYWxsZWU0IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMyIsIl90aGlzMiIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsInNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0iLCJwYXJhbXMiLCJvcHRpb25zIiwiX2FyZ3M0IiwiX2NvbnRleHQ0IiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZCIsImhlYWRlck92ZXJ3cml0ZXMiLCJnZXRMV0lEZXRhaWxzIiwiZGVmYXVsdEhlYWRlcnMiLCJMaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInNpZyIsIl9yZWYiLCJfY2FsbGVlMyIsInJlc29sdmUiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUzIiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMzIiwiX3QzIiwiX2NvbnRleHQzIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsImlzRXhwZWN0ZWRBeGlvc0Vycm9yIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UiLCJfeDMiLCJfeDQiLCJfeDIiLCJfZ2V0Q2hhdFRva2VuIiwiX2NhbGxlZTYiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQ0IiwiX3RoaXMzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJNc09jQm90QXBwbGljYXRpb25JZCIsIm11bHRpQm90IiwiZW5kcG9pbnQiLCJfYXJnczYiLCJfY29udGV4dDYiLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQiLCJnZXRDaGF0VG9rZW4iLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsIl9yZWYyIiwiX2NhbGxlZTUiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU0IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM0IiwiX3Q0IiwiX2NvbnRleHQ1IiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwiX3g2IiwiX3g3IiwiX3g1IiwiX2dldFJlY29ubmVjdGFibGVDaGF0cyIsIl9jYWxsZWU4IiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkNSIsIl90aGlzNCIsIl9jb250ZXh0OCIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJfcmVmMyIsIl9jYWxsZWU3IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lNSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzNSIsIl90NSIsIl9jb250ZXh0NyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUU0ZBSUxFRCIsIl94OSIsIl94MCIsIl94OCIsIl9nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJfY2FsbGVlMCIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDYiLCJfdGhpczUiLCJvcHRpb25hbFBhcmFtcyIsIl9hcmdzMCIsIl9jb250ZXh0MCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURUQiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJfcmVmNCIsIl9jYWxsZWU5IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lNiIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzNiIsIl90NiIsIl9jb250ZXh0OSIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIldBUk4iLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlGQUlMRUQiLCJfeDEwIiwiX3gxMSIsIl94MSIsIl9nZXRBZ2VudEF2YWlsYWJpbGl0eSIsIl9jYWxsZWUxMCIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDciLCJfdGhpczYiLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsInRlbXBBcnIiLCJfYXJnczEwIiwiX2NvbnRleHQxMCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImdldEFnZW50QXZhaWxhYmlsaXR5IiwiY3VzdG9tQ29udGV4dERhdGEiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsIlNIQTI1NiIsIkpTT04iLCJzdHJpbmdpZnkiLCJIZXgiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIl9yZWY1IiwiX2NhbGxlZTEiLCJfZGF0YSIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTciLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczciLCJfdDciLCJfY29udGV4dDEiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwiX3gxMyIsIl94MTQiLCJfeDEyIiwiX3Nlc3Npb25Jbml0IiwiX2NhbGxlZTEyIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkOCIsIl90aGlzNyIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJiYXNlUGF0aCIsIl9hcmdzMTIiLCJfY29udGV4dDEyIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2Vzc2lvbkluaXQiLCJzaG91bGRSZXRyeSIsImVycm9yIiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsInNldFJlcXVlc3RJZEhlYWRlciIsIl9yZWY2IiwiX2NhbGxlZTExIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lOCIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOCIsIl90OCIsIl9jb250ZXh0MTEiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwiX3gxNiIsIl94MTciLCJfeDE1IiwiX2NyZWF0ZUNvbnZlcnNhdGlvbiIsIl9jYWxsZWUxMyIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDkiLCJfZGF0YTIiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU5IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM5IiwiX2FyZ3MxMyIsIl90OSIsIl9jb250ZXh0MTMiLCJDUkVBVEVTRVNTSU9OU1RBUlRFRCIsIkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGgiLCJMaXZlQ2hhdENvbm5lY3RvclBhdGgiLCJDUkVBVEVTRVNTSU9OU1VDQ0VFREVEIiwiQ1JFQVRFU0VTU0lPTkZBSUxFRCIsImNyZWF0ZUNvbnZlcnNhdGlvbiIsIl94MTgiLCJfc2Vzc2lvbkNsb3NlIiwiX2NhbGxlZTE1IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMCIsIl90aGlzOCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIl9hcmdzMTUiLCJfY29udGV4dDE1IiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJfcmVmNyIsIl9jYWxsZWUxNCIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczAiLCJfdDAiLCJfY29udGV4dDE0IiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwiY29kZSIsIl94MjAiLCJfeDIxIiwiX3gxOSIsIl92YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwiX2NhbGxlZTE3IiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMSIsIl90aGlzOSIsIl9jb250ZXh0MTciLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJfcmVmOCIsIl9jYWxsZWUxNiIsIl9yZXNwb25zZSRkYXRhIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMSIsIl90MSIsIl9jb250ZXh0MTYiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJfeDI0IiwiX3gyNSIsIl94MjIiLCJfeDIzIiwiX3N1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJfY2FsbGVlMTkiLCJwb3N0Q2hhdFJlc3BvbnNlIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTAiLCJfdGhpczAiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJfYXJnczE5IiwiX2NvbnRleHQxOSIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIl9yZWY5IiwiX2NhbGxlZTE4IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczEwIiwiX3QxMCIsIl9jb250ZXh0MTgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwiX3gyOCIsIl94MjkiLCJfeDI2IiwiX3gyNyIsIl9nZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiX2NhbGxlZTIxIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTEiLCJfdGhpczEiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJfYXJnczIxIiwiX2NvbnRleHQyMSIsImxvZyIsIkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVEIiwiU3VydmV5T3duZXJJZCIsIkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsIl9yZWYwIiwiX2NhbGxlZTIwIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTEiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczExIiwiX3QxMSIsIl9jb250ZXh0MjAiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsIl94MzIiLCJfeDMzIiwiX3gzMCIsIl94MzEiLCJfZ2V0Q2hhdFRyYW5zY3JpcHRzIiwiX2NhbGxlZTIzIiwidG9rZW4iLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxMiIsIl90aGlzMTAiLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIl9hcmdzMjMiLCJfY29udGV4dDIzIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJfcmVmMSIsIl9jYWxsZWUyMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTEyIiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMxMiIsIl90MTIiLCJfY29udGV4dDIyIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsIl94MzciLCJfeDM4IiwiX3gzNCIsIl94MzUiLCJfeDM2IiwiX2dldFBlcnNpc3RlbnRDaGF0SGlzdG9yeSIsIl9jYWxsZWUyNSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDEzIiwiX3RoaXMxMSIsImdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zIiwicGFnZVNpemUiLCJwYWdlVG9rZW4iLCJlcnJvck1lc3NhZ2UiLCJfYXJnczI1IiwiX2NvbnRleHQyNSIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQiLCJHRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllGQUlMRUQiLCJMaXZlQ2hhdEF1dGhHZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlQYXRoIiwiZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5IiwiX3JlZjEwIiwiX2NhbGxlZTI0IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTMiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczEzIiwiX3QxMyIsIl9jb250ZXh0MjQiLCJHRVRQRVJTSVNURU5UQ0hBVEhJU1RPUllTVUNDRUVERUQiLCJfeDQwIiwiX3g0MSIsIl94MzkiLCJfZW1haWxUcmFuc2NyaXB0IiwiX2NhbGxlZTI3IiwiZW1haWxSZXF1ZXN0Qm9keSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDE0IiwiX3RoaXMxMiIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiX2FyZ3MyNyIsIl9jb250ZXh0MjciLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiX3JlZjExIiwiX2NhbGxlZTI2IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTQiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczE0IiwiX3QxNCIsIl9jb250ZXh0MjYiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJfeDQ1IiwiX3g0NiIsIl94NDIiLCJfeDQzIiwiX3g0NCIsIl9mZXRjaERhdGFNYXNraW5nSW5mbyIsIl9jYWxsZWUyOSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDE1IiwiX3RoaXMxMyIsIl9jb250ZXh0MjkiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiZmV0Y2hEYXRhTWFza2luZ0luZm8iLCJfcmVmMTIiLCJfY2FsbGVlMjgiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUxNSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMTUiLCJfdDE1IiwiX2NvbnRleHQyOCIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwiX3g0OCIsIl94NDkiLCJfeDQ3IiwiX21ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiX2NhbGxlZTMxIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxNiIsIl90aGlzMTQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIl9hcmdzMzEiLCJfY29udGV4dDMxIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiX3JlZjEzIiwiX2NhbGxlZTMwIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTYiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczE2IiwiX3QxNiIsIl9jb250ZXh0MzAiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsIl94NTIiLCJfeDUzIiwiX3g1MCIsIl94NTEiLCJfc2VuZFR5cGluZ0luZGljYXRvciIsIl9jYWxsZWUzMyIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDE3IiwiX3RoaXMxNSIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJfYXJnczMzIiwiX2NvbnRleHQzMyIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIl9yZWYxNCIsIl9jYWxsZWUzMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTE3IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMxNyIsIl90MTciLCJfY29udGV4dDMyIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJfeDU2IiwiX3g1NyIsIl94NTQiLCJfeDU1IiwiX21pZENvbnZlcnNhdGlvbkF1dGhlbnRpY2F0ZUNoYXQiLCJfY2FsbGVlMzUiLCJhdXRoZW50aWNhdGVDaGF0UGFyYW1zIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTgiLCJfdGhpczE2IiwiX2NvbnRleHQzNSIsIk1JREFVVEhFTlRJQ0FURUNIQVRTVEFSVEVEIiwiTUlEQVVUSEVOVElDQVRFQ0hBVEZBSUxFRCIsIkxpdmVDaGF0QXV0aE1pZENvbnZlcnNhdGlvblBhdGgiLCJtaWRDb252ZXJzYXRpb25BdXRoZW50aWNhdGVDaGF0IiwiX3JlZjE1IiwiX2NhbGxlZTM0IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTgiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczE4IiwiX3QxOCIsIl9jb250ZXh0MzQiLCJNSURBVVRIRU5USUNBVEVDSEFUU1VDQ0VFREVEIiwiX3g2MCIsIl94NjEiLCJfeDU4IiwiX3g1OSIsIl9nZXRVbnJlYWRNZXNzYWdlQ291bnQiLCJfY2FsbGVlMzciLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxOSIsIl90aGlzMTciLCJfY29udGV4dDM3IiwiR0VUVU5SRUFETUVTU0FHRUNPVU5UU1RBUlRFRCIsImdldFVucmVhZE1lc3NhZ2VDb3VudCIsIl9yZWYxNiIsIl9jYWxsZWUzNiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTE5IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMxOSIsIl90MTkiLCJfY29udGV4dDM2IiwiR0VUVU5SRUFETUVTU0FHRUNPVU5UU1VDQ0VFREVEIiwiR0VUVU5SRUFETUVTU0FHRUNPVU5URkFJTEVEIiwiX3g2MyIsIl94NjQiLCJfeDYyIiwiX3NlbmRSZWFkUmVjZWlwdCIsIl9jYWxsZWUzOSIsIm1lc3NhZ2VJZCIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDIwIiwiX3RoaXMxOCIsIl9jb250ZXh0MzkiLCJTRU5EUkVBRFJFQ0VJUFRTVEFSVEVEIiwic2VuZFJlYWRSZWNlaXB0IiwiX3JlZjE3IiwiX2NhbGxlZTM4IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMjAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczIwIiwiX3QyMCIsIl9jb250ZXh0MzgiLCJTRU5EUkVBRFJFQ0VJUFRTVUNDRUVERUQiLCJTRU5EUkVBRFJFQ0VJUFRGQUlMRUQiLCJfeDY4IiwiX3g2OSIsIl94NjUiLCJfeDY2IiwiX3g2NyIsImxvZ0xldmVsIiwidGVsZW1ldHJ5RXZlbnRUeXBlIiwiZGVzY3JpcHRpb24iLCJyZXF1ZXN0UGF5bG9hZCIsIl9yZXNwb25zZSIsIl9yZXNwb25zZTIiLCJfcmVzcG9uc2UzIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwic2FuaXRpemVkUmVxdWVzdEhlYWRlcnMiLCJhdXRoVG9rZW5EZXRhaWxzIiwic3RyaXBSZXF1ZXN0SGVhZGVyc1NlbnNpdGl2ZVByb3BlcnRpZXMiLCJhdG9iIiwicGF5bG9hZCIsInNwbGl0IiwianNvbkRhdGEiLCJwYXJzZSIsImx3aUNvbnRleHRzIiwic3ViIiwiZXhwIiwibHdpQ29udGV4dHNEYXRhIiwiX3VudXNlZCIsImN1c3RvbURhdGEiLCJSZXF1ZXN0SWQiLCJSZWdpb24iLCJFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwiSHR0cFJlcXVlc3RSZXNwb25zZVRpbWUiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RIZWFkZXJzIiwiUmVzcG9uc2VFcnJvcmNvZGUiLCJlcnJvcmNvZGUiLCJBdXRoVG9rZW5EZXRhaWxzIiwic2V0U2Vzc2lvbklkSGVhZGVyIiwic2V0Q29ycmVsYXRpb25JZEluSGVhZGVyIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIl0sInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbm5lbElkLCBMaXZlQ2hhdFZlcnNpb24sIE9DU0RLVGVsZW1ldHJ5RXZlbnQsIFNES0Vycm9yIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgYXhpb3NSZXRyeUhhbmRsZXIsIHsgYXhpb3NSZXRyeUhhbmRsZXJXaXRoTm90Rm91bmQgfSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5SGFuZGxlclwiO1xuXG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSGV4IGZyb20gXCJjcnlwdG8tanMvZW5jLWhleFwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgZnJvbSBcIi4vSW50ZXJmYWNlcy9PbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VGltZW91dENvbmZpZyB9IGZyb20gXCIuL0NvbW1vbi9SZXF1ZXN0VGltZW91dENvbmZpZ1wiO1xuaW1wb3J0IFNIQTI1NiBmcm9tIFwiY3J5cHRvLWpzL3NoYTI1NlwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgeyBhZGRPY1VzZXJBZ2VudEhlYWRlciB9IGZyb20gXCIuL1V0aWxzL2h0dHBIZWFkZXJzVXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50IH0gZnJvbSBcIi4vVXRpbHMvZW5kcG9pbnRzQ3JlYXRvcnNcIjtcbmltcG9ydCBpc0V4cGVjdGVkQXhpb3NFcnJvciBmcm9tIFwiLi9VdGlscy9pc0V4cGVjdGVkQXhpb3NFcnJvclwiO1xuaW1wb3J0IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyIGZyb20gXCIuL1V0aWxzL1Nlc3Npb25Jbml0UmV0cnlIYW5kbGVyXCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgeyB3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyB9IGZyb20gXCIuL1V0aWxzL3dhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNESyBpbXBsZW1lbnRzIElTREsge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWc6IFJlcXVlc3RUaW1lb3V0Q29uZmlnID0ge1xuICAgIGdldENoYXRDb25maWc6IDEyMDAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiAxNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDE1MDAwLFxuICAgIHNlc3Npb25Jbml0OiAxNTAwMCxcbiAgICBzZXNzaW9uQ2xvc2U6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxNTAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxNTAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogNTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTUwMDAsXG4gICAgZ2V0QWdlbnRBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDE1MDAwLFxuICAgIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeTogMTUwMDAsXG4gICAgbWlkQ29udmVyc2F0aW9uQXV0aGVudGljYXRlQ2hhdDogMTUwMDAsXG4gICAgZ2V0VW5yZWFkTWVzc2FnZUNvdW50OiAxNTAwMCxcbiAgICBzZW5kUmVhZFJlY2VpcHQ6IDUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcbiAgSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UgPSBgJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZX06ICR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2V9YDtcblxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub2NVc2VyQWdlbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ub2NVc2VyQWdlbnQ7XG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExjd0Zjc0RldGFpbHMoKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN1Y2NlZWRlZFwiLCBcIlwiLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBmYWlsZWRcIiwgXCJcIiwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRlNUQVJURUQsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5yZXF1ZXN0SGVhZGVycyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIC8vIEFkZCB0eXBlIGd1YXJkIHRvIHByZXZlbnQgVHlwZUVycm9yIHdoZW4gYmFja2VuZCByZXR1cm5zIG5vbi1vYmplY3QgKGUuZy4sIGVtcHR5IHN0cmluZywgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGQUlMRUQsIFwiR2V0IENoYXQgY29uZmlnIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBMV0kgRGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMV0lEZXRhaWxzKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZChheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRMV0lEZXRhaWxzLFxuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgLy8gdXBkYXRlZCBhdXRoIGVuZHBvaW50IGZvciBhdXRoZW50aWNhdGVkIGNoYXRzIGFuZCBhZGQgYXV0aCB0b2tlbiBpbiBoZWFkZXJcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgLy8gSWYgc2hvdWxkIG9ubHkgYmUgYXBwbGljYWJsZSBvbiB1bmF1dGggY2hhdCAmIHRoZSBmbGFnIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRVc2VTaWdRdWVyeVBhcmFtID0gIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gJiYgdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSA9PT0gdHJ1ZTtcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU0ZBSUxFRCwgXCJHZXQgTFdJIERldGFpbHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuLCBNc09jQm90QXBwbGljYXRpb25JZCB9ID0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgbXVsdGlCb3QgPSAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCk/IHRydWU6IGZhbHNlO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UsIG11bHRpQm90KTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7ZW5kcG9pbnR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgXG4gICAgLy8gSWYgc2hvdWxkIG9ubHkgYmUgYXBwbGljYWJsZSBvbiB1bmF1dGggY2hhdCAmIHRoZSBmbGFnIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRVc2VTaWdRdWVyeVBhcmFtID0gIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gJiYgdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSA9PT0gdHJ1ZTtcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH1cbiAgICBpZiAoTXNPY0JvdEFwcGxpY2F0aW9uSWQgJiYgTXNPY0JvdEFwcGxpY2F0aW9uSWQubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1zWydNcy1PYy1Cb3QtQXBwbGljYXRpb24tSWQnXSA9IE1zT2NCb3RBcHBsaWNhdGlvbklkO1xuICAgIH1cblxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHBhcmFtcy5yZWZyZXNoVG9rZW4gPSAndHJ1ZSdcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmIChzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogKGN1cnJlbnRSZXRyeUNvdW50ID4gdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlKSA/IGN1cnJlbnRSZXRyeUNvdW50IDogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjksXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaXMgZW1wdHksIGlmIHNvLCB0aGVuIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJFbXB0eSBkYXRhIHJlY2VpdmVkIGZyb20gZ2V0Q2hhdFRva2VuXCIpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsIFwiR2V0IENoYXQgVG9rZW4gc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgXCJHZXQgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcz8ucmVxdWVzdElkO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUU1NVQ0NFRURFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZywgb3B0aW9uYWxQYXJhbXM6IElSZWNvbm5lY3RBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxSZWNvbm5lY3RBdmFpbGFiaWxpdHkgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLldBUk4sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCBvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkIH0pO1xuICAgIH1cblxuICAgIC8vZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG4gICAgZGF0YS5jYWNoZUtleSA9IFNIQTI1NihKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkudG9TdHJpbmcoSGV4KTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKionXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIFwiU2Vzc2lvbiBJbml0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgY29uc3QgcmV0cnlPbjQyOSA9IHRydWU7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25Jbml0LFxuICAgICAgc2hvdWxkUmV0cnk6IChlcnJvcikgPT4gc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIoZXJyb3IsIHJldHJ5T240MjkpLFxuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV1cbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG5cbiAgICBjb25zdCBiYXNlUGF0aCA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5cbiAgICAgID8gT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoXG4gICAgICA6IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2Jhc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHsgICAgIFxuICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywge1xuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTogYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV06IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuXG4gICAgLy8gSWYgc2hvdWxkIG9ubHkgYmUgYXBwbGljYWJsZSBvbiB1bmF1dGggY2hhdCAmIHRoZSBmbGFnIGVuYWJsZWRcbiAgICBjb25zdCBzaG91bGRVc2VTaWdRdWVyeVBhcmFtID0gIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gJiYgdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSA9PT0gdHJ1ZTtcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGlmICghc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCAmJiBzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVEZBSUxFRCwgXCJTZXNzaW9uIEluaXQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlQ29udmVyc2F0aW9uKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05TVEFSVEVELCBcIkNyZWF0ZSBjb252ZXJzYXRpb24gY2FsbCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGhcbiAgICAgIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JQYXRoO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7YmFzZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9L3dpZGdldEFwcC8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS9jb252ZXJzYXRpb25gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHsgICAgIFxuICAgICAgT2JqZWN0LmFzc2lnbihyZXF1ZXN0SGVhZGVycywge1xuICAgICAgICBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXTogYXV0aGVudGljYXRlZFVzZXJUb2tlbixcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV06IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgZGF0YS5yZWNvbm5lY3RJZCA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGRhdGEuY2hhbm5lbElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldKSB7XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgIGlmIChPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW1wdHkgZGF0YSByZWNlaXZlZCBmcm9tIGdldENoYXRUb2tlblwiKTtcbiAgICAgIH1cblxuICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9OU1VDQ0VFREVELCBcIkNyZWF0ZSBjb3ZlcnNhdGlvbiBjYWxsIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTkZBSUxFRCwgXCJDcmVhdGUgY29udmVyc2F0aW9uIGNhbGwgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgZGF0YSwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgIFxuICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdGhlIGF1dGggY2hhdCByZWNvcmQgZXhpc3RzIGluIGRhdGFiYXNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkKHJlcXVlc3RJZDogc3RyaW5nLCB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVUNDRUVERUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYXQgdHJhbnNjcmlwdHMgZm9yIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRyYW5zY3JpcHRzKHJlcXVlc3RJZDogc3RyaW5nLCBjaGF0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG5cbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeSBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkocmVxdWVzdElkOiBzdHJpbmcsIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zOiBJR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcGFnZVNpemUsIHBhZ2VUb2tlbiB9ID0gZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBpZiAoIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IFwiQXV0aGVudGljYXRlZCB1c2VyIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeVwiO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkIC0gTWlzc2luZyBhdXRoZW50aWNhdGVkIHVzZXIgdG9rZW5cIiwgcmVxdWVzdElkKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0YXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L2NvbnZlcnNhdGlvbi9oaXN0b3J5YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge307XG4gICAgXG4gICAgaWYgKHBhZ2VTaXplKSB7XG4gICAgICBwYXJhbXMucGFnZVNpemUgPSBwYWdlU2l6ZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8vIGluIGNhc2UgcGFnZSB0b2tlbiBpcyBhc3NpZ25lZCBmcm9tIG11dGF0ZWQgaGVhZGVycywgd2Ugb3ZlcnJpZGUgd2l0aCB0aGUgYWN0dWFsIHZhbHVlIG9yIGVtcHR5XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5wYWdlVG9rZW5dID0gcGFnZVRva2VuIHx8IFwiXCI7XG4gICBcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1VDQ0VFREVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiRW1haWwgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlcyBhbiBvbmdvaW5nIChwcmV2aW91c2x5IHVuYXV0aGVudGljYXRlZCkgY2hhdCBzZXNzaW9uLlxuICAgKiBVcGdyYWRlcyBlbmdhZ2VtZW50IGNvbnRleHQgc28gc3Vic2VxdWVudCBjYWxscyB1c2UgYXV0aGVudGljYXRlZCBlbmRwb2ludHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgQ3VycmVudCByZXF1ZXN0L2NvcnJlbGF0aW9uIGlkXG4gICAqIEBwYXJhbSBhdXRoZW50aWNhdGVDaGF0UGFyYW1zIHsgY2hhdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuIH1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtaWRDb252ZXJzYXRpb25BdXRoZW50aWNhdGVDaGF0KHJlcXVlc3RJZDogc3RyaW5nLCBhdXRoZW50aWNhdGVDaGF0UGFyYW1zOiB7IGNoYXRJZDogc3RyaW5nOyBhdXRoZW50aWNhdGVkVXNlclRva2VuOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5NSURBVVRIRU5USUNBVEVDSEFUU1RBUlRFRCwgXCJNaWQtQXV0aGVudGljYXRlIENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBjaGF0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGF1dGhlbnRpY2F0ZUNoYXRQYXJhbXM7XG5cbiAgICBpZiAoIWNoYXRJZCB8fCAhYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50Lk1JREFVVEhFTlRJQ0FURUNIQVRGQUlMRUQsXG4gICAgICAgIFwiTWlkLUF1dGhlbnRpY2F0ZSBDaGF0IEZhaWxlZCAtIGNoYXRJZCBhbmQgYXV0aGVudGljYXRlZFVzZXJUb2tlbiBhcmUgcmVxdWlyZWRcIiwgcmVxdWVzdElkKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNoYXRJZCBhbmQgYXV0aGVudGljYXRlZFVzZXJUb2tlbiBhcmUgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoTWlkQ29udmVyc2F0aW9uUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWlkQ29udmVyc2F0aW9uQXV0aGVudGljYXRlQ2hhdFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldFJlcXVlc3RJZEhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5taWRDb252ZXJzYXRpb25BdXRoZW50aWNhdGVDaGF0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzICYmIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuTUlEQVVUSEVOVElDQVRFQ0hBVFNVQ0NFRURFRCwgXCJNaWQtQXV0aGVudGljYXRlIENoYXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50Lk1JREFVVEhFTlRJQ0FURUNIQVRGQUlMRUQsIFwiTWlkLUF1dGhlbnRpY2F0ZSBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB1bnJlYWQgbWVzc2FnZSBjb3VudCBmb3IgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICogQXV0aC1vbmx5IGVuZHBvaW50IOKAlCBkb2VzIG5vdCByZXF1aXJlIGFuIGFjdGl2ZSBjaGF0IHNlc3Npb24uXG4gICAqIEBwYXJhbSBhdXRoZW50aWNhdGVkVXNlclRva2VuIEF1dGggdG9rZW4gZm9yIHRoZSB1c2VyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFVucmVhZE1lc3NhZ2VDb3VudChhdXRoZW50aWNhdGVkVXNlclRva2VuOiBzdHJpbmcpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRVTlJFQURNRVNTQUdFQ09VTlRTVEFSVEVELCBcIkdldCBVbnJlYWQgTWVzc2FnZSBDb3VudCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvckF1dGhQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS93aWRnZXRhcHAvJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vdW5yZWFkbWVzc2FnZXNgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0VW5yZWFkTWVzc2FnZUNvdW50XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0VW5yZWFkTWVzc2FnZUNvdW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRVTlJFQURNRVNTQUdFQ09VTlRTVUNDRUVERUQsIFwiR2V0IFVucmVhZCBNZXNzYWdlIENvdW50IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUVU5SRUFETUVTU0FHRUNPVU5URkFJTEVELCBcIkdldCBVbnJlYWQgTWVzc2FnZSBDb3VudCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIHJlYWQgcmVjZWlwdCBmb3IgYSBzcGVjaWZpYyBtZXNzYWdlIGluIGFuIGF1dGhlbnRpY2F0ZWQgY29udmVyc2F0aW9uLlxuICAgKiBVcGRhdGVzIHRoZSB1bnJlYWQgbWVzc2FnZSBjb3VudGVyIG9uIHRoZSBzZXJ2ZXIgYW5kIGZvcndhcmRzIHRoZSByZWNlaXB0IHRvIEFDUy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgKGNvbnZlcnNhdGlvblRocmVhZElkKSBvZiB0aGUgY29udmVyc2F0aW9uLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBBQ1MgbWVzc2FnZSBJRCB0byBtYXJrIGFzIHJlYWQuXG4gICAqIEBwYXJhbSBhdXRoZW50aWNhdGVkVXNlclRva2VuIEF1dGggdG9rZW4gZm9yIHRoZSB1c2VyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRSZWFkUmVjZWlwdChyZXF1ZXN0SWQ6IHN0cmluZywgbWVzc2FnZUlkOiBzdHJpbmcsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EUkVBRFJFQ0VJUFRTVEFSVEVELCBcIlNlbmQgUmVhZCBSZWNlaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yQXV0aFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9L3dpZGdldGFwcC8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS9jb252ZXJzYXRpb25zLyR7cmVxdWVzdElkfS9yZWFkcmVjZWlwdGA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZW5kUmVhZFJlY2VpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZUlkIH0pLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kUmVhZFJlY2VpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRSRUFEUkVDRUlQVFNVQ0NFRURFRCwgXCJTZW5kIFJlYWQgUmVjZWlwdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFJFQURSRUNFSVBURkFJTEVELCBcIlNlbmQgUmVhZCBSZWNlaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55LCByZXF1ZXN0SGVhZGVycz86IGFueSwgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU/OiBudW1iZXIpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaWYgKCF0aGlzLmxvZ2dlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocmVxdWVzdFBheWxvYWQpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0geyAuLi5yZXF1ZXN0UGF5bG9hZCB9O1xuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBDdXN0b21Db250ZXh0RGF0YVZhbHVlcyhzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKSB7XG4gICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2Uoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBHZW9sb2NhdGlvbihzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCk7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0gdW5kZWZpbmVkO1xuICAgIGxldCBhdXRoVG9rZW5EZXRhaWxzOiBhbnkgPSB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmIChyZXF1ZXN0SGVhZGVycykge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMgPSB7IC4uLnJlcXVlc3RIZWFkZXJzIH07XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUmVxdWVzdEhlYWRlcnNTZW5zaXRpdmVQcm9wZXJ0aWVzKHNhbml0aXplZFJlcXVlc3RIZWFkZXJzKTtcblxuICAgICAgaWYgKHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0pIHtcbiAgICAgICAgaWYgKHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuYXRvYikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl07XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gdG9rZW4uc3BsaXQoXCIuXCIpWzFdO1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHdpbmRvdy5hdG9iKHBheWxvYWQpO1xuICAgICAgICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgY29uc3QgbHdpQ29udGV4dHMgPSBqc29uRGF0YVtcImx3aWNvbnRleHRzXCJdO1xuICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgc3ViOiBqc29uRGF0YVtcInN1YlwiXSxcbiAgICAgICAgICAgICAgZXhwOiBqc29uRGF0YVtcImV4cFwiXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGx3aUNvbnRleHRzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGx3aUNvbnRleHRzRGF0YSA9IEpTT04ucGFyc2UobHdpQ29udGV4dHMpO1xuICAgICAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMobHdpQ29udGV4dHNEYXRhKTtcbiAgICAgICAgICAgICAgYXV0aFRva2VuRGV0YWlscy5sd2lDb250ZXh0cyA9IGx3aUNvbnRleHRzRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBIdHRwUmVxdWVzdFJlc3BvbnNlVGltZTogaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIFxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uZGF0YSB8fCBlcnJvciA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWQsXG4gICAgICBSZXF1ZXN0SGVhZGVyczogc2FuaXRpemVkUmVxdWVzdEhlYWRlcnMsXG4gICAgICBSZXNwb25zZUVycm9yY29kZTogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uaGVhZGVycz8uZXJyb3Jjb2RlIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEF1dGhUb2tlbkRldGFpbHM6IGF1dGhUb2tlbkRldGFpbHNcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwKTogdm9pZCB7XG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFJlcXVlc3RJZEhlYWRlciA9IChyZXF1ZXN0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogU3RyaW5nTWFwKSA9PiB7XG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDb3JyZWxhdGlvbklkSW5IZWFkZXIgPSAoY29ycmVsYXRpb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBTdHJpbmdNYXApID0+IHtcbiAgICBpZiAoY29ycmVsYXRpb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmNvcnJlbGF0aW9uSWRdID0gY29ycmVsYXRpb25JZDtcbiAgICB9XG4gIH1cbn1cblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLGtCQUFBLEdBQUFDLHVCQUFBLENBQUFKLE9BQUE7QUFFQSxJQUFBSyxZQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxVQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxrQkFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBUixPQUFBO0FBRUEsSUFBQVMsT0FBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBcUJBLElBQUFVLFFBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtB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
|
|
2863
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfRW51bXMiLCJyZXF1aXJlIiwiX2F4aW9zIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9heGlvc1JldHJ5SGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0Jyb3dzZXJJbmZvIiwiX0NvbnN0YW50cyIsIl9DdXN0b21Db250ZXh0RGF0YSIsIl9EZXZpY2VJbmZvIiwiX2VuY0hleCIsIl9Mb2NhbGVzIiwiX0xvZ0xldmVsIiwiX0xvZ2dpbmdTYW5pdGl6ZXIiLCJfT1NJbmZvIiwiX09tbmljaGFubmVsRW5kcG9pbnRzIiwiX09tbmljaGFubmVsSFRUUEhlYWRlcnMiLCJfc2hhIiwiX1RpbWVyIiwiX2h0dHBIZWFkZXJzVXRpbHMiLCJfZW5kcG9pbnRzQ3JlYXRvcnMiLCJfaXNFeHBlY3RlZEF4aW9zRXJyb3IiLCJfU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJfdXVpZCIsIl93YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyIsIl9TREsiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJfdHlwZW9mMyIsImhhcyIsImdldCIsInNldCIsIl90MjIiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsIm93bktleXMiLCJrZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9uIiwiRiIsInMiLCJkb25lIiwidmFsdWUiLCJUeXBlRXJyb3IiLCJhIiwidSIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsIlNESyIsImV4cG9ydHMiLCJvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24iLCJfdGhpcyIsImNvbmZpZ3VyYXRpb24iLCJ1bmRlZmluZWQiLCJkZWZhdWx0Q29uZmlndXJhdGlvbiIsImxvZ2dlciIsIl9jbGFzc0NhbGxDaGVjazIiLCJjb25jYXQiLCJTREtFcnJvciIsIkNsaWVudEhUVFBUaW1lb3V0RXJyb3JOYW1lIiwiQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2UiLCJoZWFkZXJzIiwiYXV0aGNvZGVub25jZSIsImF1dGhDb2RlTm9uY2UiLCJzZXNzaW9uSWQiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib2NTZXNzaW9uSWQiLCJyZXF1ZXN0SWQiLCJjb3JyZWxhdGlvbklkIiwiX3R5cGVvZjIiLCJfaSIsIl9PYmplY3Qka2V5cyIsImtleSIsIl9pMiIsIl9PYmplY3Qka2V5czIiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsIkVycm9yIiwiY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfaXRlcmF0b3IiLCJDb25zdGFudHMiLCJyZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMiLCJfc3RlcCIsImVyciIsIm9jVXNlckFnZW50IiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJfY3JlYXRlQ2xhc3MyIiwiX2dldExjd0Zjc0RldGFpbHMiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInRpbWVyIiwicmVxdWVzdFBhdGgiLCJtZXRob2QiLCJ1cmwiLCJheGlvc0luc3RhbmNlIiwicmVxdWVzdEhlYWRlcnMiLCJiYWNrZW5kVGltZXIiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQiLCJyZXNwb25zZSIsImh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lIiwiZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsImRhdGEiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIl90Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMY3dGY3NEZXRhaWxzUGF0aCIsIm9yZ0lkIiwib3JnVXJsIiwiYXhpb3MiLCJjcmVhdGUiLCJheGlvc1JldHJ5SGFuZGxlciIsInJldHJpZXMiLCJtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSIsIndhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzIiwid2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZyIsImdldENoYXRDb25maWciLCJhZGRPY1VzZXJBZ2VudEhlYWRlciIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsInNlbnQiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCIsImFicnVwdCIsIkVSUk9SIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsInN0b3AiLCJnZXRMY3dGY3NEZXRhaWxzIiwiX2dldENoYXRDb25maWciLCJfY2FsbGVlMiIsImJ5cGFzc0NhY2hlIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTIiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczIiLCJyZXRyeUNvdW50IiwiX2FyZ3MyIiwiX3QyIiwiX2NvbnRleHQyIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwidXVpZHY0IiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdENvbmZpZ1JldHJ5T240MjkiLCJhZGREZWZhdWx0SGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsIkdFVENIQVRDT05GSUdTVUNDRUVERUQiLCJnZXRSZXRyeUNvdW50IiwiY29uZmlnIiwiR0VUQ0hBVENPTkZJR0ZBSUxFRCIsIlByb21pc2UiLCJyZWplY3QiLCJfeCIsIl9nZXRMV0lEZXRhaWxzIiwiX2NhbGxlZTQiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQzIiwiX3RoaXMyIiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiYXV0aGVudGljYXRlZFVzZXJUb2tlbiIsInJlY29ubmVjdElkIiwic2hvdWxkVXNlU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsIm9wdGlvbnMiLCJfYXJnczQiLCJfY29udGV4dDQiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kIiwiaGVhZGVyT3ZlcndyaXRlcyIsImdldExXSURldGFpbHMiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwidXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtIiwic2lnIiwiX3JlZiIsIl9jYWxsZWUzIiwicmVzb2x2ZSIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTMiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczMiLCJfdDMiLCJfY29udGV4dDMiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiaXNFeHBlY3RlZEF4aW9zRXJyb3IiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJIVFRQVGltZU91dEVycm9yTWVzc2FnZSIsIl94MyIsIl94NCIsIl94MiIsIl9nZXRDaGF0VG9rZW4iLCJfY2FsbGVlNiIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDQiLCJfdGhpczMiLCJnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyIsImN1cnJlbnRSZXRyeUNvdW50IiwiY3VycmVudExpdmVDaGF0VmVyc2lvbiIsInJlZnJlc2hUb2tlbiIsIk1zT2NCb3RBcHBsaWNhdGlvbklkIiwibXVsdGlCb3QiLCJlbmRwb2ludCIsIl9hcmdzNiIsIl9jb250ZXh0NiIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCIsImdldENoYXRUb2tlbiIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJfcmVmMiIsIl9jYWxsZWU1IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lNCIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzNCIsIl90NCIsIl9jb250ZXh0NSIsInRvTG93ZXJDYXNlIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsIl94NiIsIl94NyIsIl94NSIsIl9yZW5ld0NoYXRUb2tlbiIsIl9jYWxsZWU4IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkNSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kdyIsIl90aGlzJGNvbmZpZ3VyYXRpb24kdzIiLCJfdGhpczQiLCJyZW5ld0NoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIiwiX2FyZ3M4IiwiX2NvbnRleHQ4IiwiUkVORVdDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXR2MkF1dGhSZW5ld0NoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyUmVuZXdDaGF0VG9rZW5QYXRoIiwicmVuZXdDaGF0VG9rZW4iLCJ3YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlncyIsIl9yZWYzIiwiX2NhbGxlZTciLCJlcnJvciIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTUiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczUiLCJfdDUiLCJfY29udGV4dDciLCJUb2tlbiIsIlJFTkVXQ0hBVFRPS0VORkFJTEVEIiwiUkVORVdDSEFUVE9LRU5TVUNDRUVERUQiLCJfeDkiLCJfeDAiLCJfeDgiLCJfZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiX2NhbGxlZTAiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQ2IiwiX3RoaXM1IiwiX2NvbnRleHQwIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1RBUlRFRCIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIl9yZWY0IiwiX2NhbGxlZTkiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU2IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM2IiwiX3Q2IiwiX2NvbnRleHQ5IiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVEIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTRkFJTEVEIiwiX3gxMCIsIl94MTEiLCJfeDEiLCJfZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiX2NhbGxlZTEwIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkNyIsIl90aGlzNiIsIm9wdGlvbmFsUGFyYW1zIiwiX2FyZ3MxMCIsIl9jb250ZXh0MTAiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVEFSVEVEIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiX3JlZjUiLCJfY2FsbGVlMSIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTciLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczciLCJfdDciLCJfY29udGV4dDEiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJXQVJOIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVEIiwiX3gxMyIsIl94MTQiLCJfeDEyIiwiX2dldEFnZW50QXZhaWxhYmlsaXR5IiwiX2NhbGxlZTEyIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkOCIsIl90aGlzNyIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwidGVtcEFyciIsIl9hcmdzMTIiLCJfY29udGV4dDEyIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJjdXN0b21Db250ZXh0RGF0YSIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiU0hBMjU2IiwiSlNPTiIsInN0cmluZ2lmeSIsIkhleCIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiX3JlZjYiLCJfY2FsbGVlMTEiLCJfZGF0YSIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTgiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczgiLCJfdDgiLCJfY29udGV4dDExIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsIl94MTYiLCJfeDE3IiwiX3gxNSIsIl9zZXNzaW9uSW5pdCIsIl9jYWxsZWUxNCIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDkiLCJfdGhpczgiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiYmFzZVBhdGgiLCJfYXJnczE0IiwiX2NvbnRleHQxNCIsIlNFU1NJT05JTklUU1RBUlRFRCIsInNlc3Npb25Jbml0Iiwic2hvdWxkUmV0cnkiLCJzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwic2V0UmVxdWVzdElkSGVhZGVyIiwiX3JlZjciLCJfY2FsbGVlMTMiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWU5IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM5IiwiX3Q5IiwiX2NvbnRleHQxMyIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJfeDE5IiwiX3gyMCIsIl94MTgiLCJfY3JlYXRlQ29udmVyc2F0aW9uIiwiX2NhbGxlZTE1IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMCIsIl9kYXRhMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczAiLCJfYXJnczE1IiwiX3QwIiwiX2NvbnRleHQxNSIsIkNSRUFURVNFU1NJT05TVEFSVEVEIiwiTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aCIsIkxpdmVDaGF0Q29ubmVjdG9yUGF0aCIsIkNSRUFURVNFU1NJT05TVUNDRUVERUQiLCJDUkVBVEVTRVNTSU9ORkFJTEVEIiwiY3JlYXRlQ29udmVyc2F0aW9uIiwiX3gyMSIsIl9zZXNzaW9uQ2xvc2UiLCJfY2FsbGVlMTciLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxIiwiX3RoaXM5Iiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiX2FyZ3MxNyIsIl9jb250ZXh0MTciLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwic2Vzc2lvbkNsb3NlIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIl9yZWY4IiwiX2NhbGxlZTE2IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMSIsIl90MSIsIl9jb250ZXh0MTYiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJjb2RlIiwiX3gyMyIsIl94MjQiLCJfeDIyIiwiX3ZhbGlkYXRlQXV0aENoYXRSZWNvcmQiLCJfY2FsbGVlMTkiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxMCIsIl90aGlzMCIsIl9jb250ZXh0MTkiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQiLCJfcmVmOSIsIl9jYWxsZWUxOCIsIl9yZXNwb25zZSRkYXRhIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczEwIiwiX3QxMCIsIl9jb250ZXh0MTgiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJfeDI3IiwiX3gyOCIsIl94MjUiLCJfeDI2IiwiX3N1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJfY2FsbGVlMjEiLCJwb3N0Q2hhdFJlc3BvbnNlIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTEiLCJfdGhpczEiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJfYXJnczIxIiwiX2NvbnRleHQyMSIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIl9yZWYwIiwiX2NhbGxlZTIwIiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTEiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczExIiwiX3QxMSIsIl9jb250ZXh0MjAiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwiX3gzMSIsIl94MzIiLCJfeDI5IiwiX3gzMCIsIl9nZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiX2NhbGxlZTIzIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTIiLCJfdGhpczEwIiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiX2FyZ3MyMyIsIl9jb250ZXh0MjMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJfcmVmMSIsIl9jYWxsZWUyMiIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTEyIiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMxMiIsIl90MTIiLCJfY29udGV4dDIyIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJfeDM1IiwiX3gzNiIsIl94MzMiLCJfeDM0IiwiX2dldENoYXRUcmFuc2NyaXB0cyIsIl9jYWxsZWUyNSIsInRva2VuIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTMiLCJfdGhpczExIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJfYXJnczI1IiwiX2NvbnRleHQyNSIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiX3JlZjEwIiwiX2NhbGxlZTI0IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTMiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczEzIiwiX3QxMyIsIl9jb250ZXh0MjQiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiX3g0MCIsIl94NDEiLCJfeDM3IiwiX3gzOCIsIl94MzkiLCJfZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5IiwiX2NhbGxlZTI3IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTQiLCJfdGhpczEyIiwiZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMiLCJwYWdlU2l6ZSIsInBhZ2VUb2tlbiIsImVycm9yTWVzc2FnZSIsIl9hcmdzMjciLCJfY29udGV4dDI3IiwiR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1RBUlRFRCIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCIsIkxpdmVDaGF0QXV0aEdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeVBhdGgiLCJnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkiLCJfcmVmMTEiLCJfY2FsbGVlMjYiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUxNCIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMTQiLCJfdDE0IiwiX2NvbnRleHQyNiIsIkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNVQ0NFRURFRCIsIl94NDMiLCJfeDQ0IiwiX3g0MiIsIl9lbWFpbFRyYW5zY3JpcHQiLCJfY2FsbGVlMjkiLCJlbWFpbFJlcXVlc3RCb2R5IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTUiLCJfdGhpczEzIiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJfYXJnczI5IiwiX2NvbnRleHQyOSIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJfcmVmMTIiLCJfY2FsbGVlMjgiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUxNSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMTUiLCJfdDE1IiwiX2NvbnRleHQyOCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIl94NDgiLCJfeDQ5IiwiX3g0NSIsIl94NDYiLCJfeDQ3IiwiX2ZldGNoRGF0YU1hc2tpbmdJbmZvIiwiX2NhbGxlZTMxIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTYiLCJfdGhpczE0IiwiX2NvbnRleHQzMSIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIl9yZWYxMyIsIl9jYWxsZWUzMCIsIl9odHRwUmVxdWVzdFJlc3BvbnNlVGltZTE2IiwiX2VsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMxNiIsIl90MTYiLCJfY29udGV4dDMwIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJfeDUxIiwiX3g1MiIsIl94NTAiLCJfbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJfY2FsbGVlMzMiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDE3IiwiX3RoaXMxNSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiX2FyZ3MzMyIsIl9jb250ZXh0MzMiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCIsIkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJfcmVmMTQiLCJfY2FsbGVlMzIiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUxNyIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMTciLCJfdDE3IiwiX2NvbnRleHQzMiIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwiX3g1NSIsIl94NTYiLCJfeDUzIiwiX3g1NCIsIl9zZW5kVHlwaW5nSW5kaWNhdG9yIiwiX2NhbGxlZTM1IiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMTgiLCJfdGhpczE2Iiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIl9hcmdzMzUiLCJfY29udGV4dDM1IiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiX3JlZjE1IiwiX2NhbGxlZTM0IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMTgiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczE4IiwiX3QxOCIsIl9jb250ZXh0MzQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVEIiwiU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCIsIl94NTkiLCJfeDYwIiwiX3g1NyIsIl94NTgiLCJfbWlkQ29udmVyc2F0aW9uQXV0aGVudGljYXRlQ2hhdCIsIl9jYWxsZWUzNyIsImF1dGhlbnRpY2F0ZUNoYXRQYXJhbXMiLCJfdGhpcyRjb25maWd1cmF0aW9uJGQxOSIsIl90aGlzMTciLCJfY29udGV4dDM3IiwiTUlEQVVUSEVOVElDQVRFQ0hBVFNUQVJURUQiLCJNSURBVVRIRU5USUNBVEVDSEFURkFJTEVEIiwiTGl2ZUNoYXRBdXRoTWlkQ29udmVyc2F0aW9uUGF0aCIsIm1pZENvbnZlcnNhdGlvbkF1dGhlbnRpY2F0ZUNoYXQiLCJfcmVmMTYiLCJfY2FsbGVlMzYiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUxOSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMTkiLCJfdDE5IiwiX2NvbnRleHQzNiIsIk1JREFVVEhFTlRJQ0FURUNIQVRTVUNDRUVERUQiLCJfeDYzIiwiX3g2NCIsIl94NjEiLCJfeDYyIiwiX2dldFVucmVhZE1lc3NhZ2VDb3VudCIsIl9jYWxsZWUzOSIsIl90aGlzJGNvbmZpZ3VyYXRpb24kZDIwIiwiX3RoaXMxOCIsIl9jb250ZXh0MzkiLCJHRVRVTlJFQURNRVNTQUdFQ09VTlRTVEFSVEVEIiwiZ2V0VW5yZWFkTWVzc2FnZUNvdW50IiwiX3JlZjE3IiwiX2NhbGxlZTM4IiwiX2h0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lMjAiLCJfZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczIwIiwiX3QyMCIsIl9jb250ZXh0MzgiLCJHRVRVTlJFQURNRVNTQUdFQ09VTlRTVUNDRUVERUQiLCJHRVRVTlJFQURNRVNTQUdFQ09VTlRGQUlMRUQiLCJfeDY2IiwiX3g2NyIsIl94NjUiLCJfc2VuZFJlYWRSZWNlaXB0IiwiX2NhbGxlZTQxIiwibWVzc2FnZUlkIiwiX3RoaXMkY29uZmlndXJhdGlvbiRkMjEiLCJfdGhpczE5IiwiX2NvbnRleHQ0MSIsIlNFTkRSRUFEUkVDRUlQVFNUQVJURUQiLCJzZW5kUmVhZFJlY2VpcHQiLCJfcmVmMTgiLCJfY2FsbGVlNDAiLCJfaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUyMSIsIl9lbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzMjEiLCJfdDIxIiwiX2NvbnRleHQ0MCIsIlNFTkRSRUFEUkVDRUlQVFNVQ0NFRURFRCIsIlNFTkRSRUFEUkVDRUlQVEZBSUxFRCIsIl94NzEiLCJfeDcyIiwiX3g2OCIsIl94NjkiLCJfeDcwIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiX3Jlc3BvbnNlIiwiX3Jlc3BvbnNlMiIsIl9yZXNwb25zZTMiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyIsImF1dGhUb2tlbkRldGFpbHMiLCJzdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyIsImF0b2IiLCJwYXlsb2FkIiwic3BsaXQiLCJqc29uRGF0YSIsInBhcnNlIiwibHdpQ29udGV4dHMiLCJzdWIiLCJleHAiLCJsd2lDb250ZXh0c0RhdGEiLCJfdW51c2VkIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJIdHRwUmVxdWVzdFJlc3BvbnNlVGltZSIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiUmVxdWVzdEhlYWRlcnMiLCJSZXNwb25zZUVycm9yY29kZSIsImVycm9yY29kZSIsIkF1dGhUb2tlbkRldGFpbHMiLCJSZXRyeUNvdW50Iiwic2V0U2Vzc2lvbklkSGVhZGVyIiwic2V0Q29ycmVsYXRpb25JZEluSGVhZGVyIiwic3Vic3RyaW5nIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyJdLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlcyI6WyIuLi9zcmMvU0RLLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50LCBTREtFcnJvciB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zRXJyb3IsIEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IGF4aW9zUmV0cnlIYW5kbGVyLCB7IGF4aW9zUmV0cnlIYW5kbGVyV2l0aE5vdEZvdW5kLCBnZXRSZXRyeUNvdW50IH0gZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeUhhbmRsZXJcIjtcblxuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IEhleCBmcm9tIFwiY3J5cHRvLWpzL2VuYy1oZXhcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0QXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0QXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElSZW5ld0NoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlbmV3Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciBmcm9tIFwiLi9JbnRlcmZhY2VzL09tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXJcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCBSZW5ld0NoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL1JlbmV3Q2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgU0hBMjU2IGZyb20gXCJjcnlwdG8tanMvc2hhMjU2XCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCB7IGFkZE9jVXNlckFnZW50SGVhZGVyIH0gZnJvbSBcIi4vVXRpbHMvaHR0cEhlYWRlcnNVdGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMTIwMDAwLFxuICAgIGdldExXSURldGFpbHM6IDE1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTUwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDE1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDE1MDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDE1MDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiA1MDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiAxNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc2VuZFR5cGluZ0luZGljYXRvcjogNTAwMCxcbiAgICB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dDogMTUwMDAsXG4gICAgZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5OiAxNTAwMCxcbiAgICBtaWRDb252ZXJzYXRpb25BdXRoZW50aWNhdGVDaGF0OiAxNTAwMCxcbiAgICBnZXRVbnJlYWRNZXNzYWdlQ291bnQ6IDE1MDAwLFxuICAgIHNlbmRSZWFkUmVjZWlwdDogNTAwMCxcbiAgICByZW5ld0NoYXRUb2tlbjogMTUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgYXV0aENvZGVOb25jZTogdXVpZHY0KCkuc3Vic3RyaW5nKDAsIDgpLFxuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBnZXRDaGF0Q29uZmlnUmV0cnlPbjQyOTogdHJ1ZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogNSxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLFxuICAgIG9jVXNlckFnZW50OiBbXVxuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG9jVXNlckFnZW50OiBzdHJpbmdbXTtcbiAgSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UgPSBgJHtTREtFcnJvci5DbGllbnRIVFRQVGltZW91dEVycm9yTmFtZX06ICR7U0RLRXJyb3IuQ2xpZW50SFRUUFRpbWVvdXRFcnJvck1lc3NhZ2V9YDtcblxuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub2NVc2VyQWdlbnQgPSB0aGlzLmNvbmZpZ3VyYXRpb24ub2NVc2VyQWdlbnQ7XG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjI7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExjd0Zjc0RldGFpbHMoKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSB7fTtcbiAgICBhZGRPY1VzZXJBZ2VudEhlYWRlcih0aGlzLm9jVXNlckFnZW50LCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU1NVQ0NFRURFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIHN1Y2NlZWRlZFwiLCBcIlwiLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNGQUlMRUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBmYWlsZWRcIiwgXCJcIiwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRlNUQVJURUQsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRDb25maWdSZXRyeU9uNDI5LFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIGxldCByZXF1ZXN0SGVhZGVycyA9IHt9O1xuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5yZXF1ZXN0SGVhZGVycyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIC8vIEFkZCB0eXBlIGd1YXJkIHRvIHByZXZlbnQgVHlwZUVycm9yIHdoZW4gYmFja2VuZCByZXR1cm5zIG5vbi1vYmplY3QgKGUuZy4sIGVtcHR5IHN0cmluZywgbnVsbCwgdW5kZWZpbmVkKVxuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycyAmJiByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXSkge1xuICAgICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFRURFRCwgXCJHZXQgQ2hhdCBjb25maWcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUsIGdldFJldHJ5Q291bnQocmVzcG9uc2U/LmNvbmZpZykpO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgcmV0cnlDb3VudCA9IGdldFJldHJ5Q291bnQoKGVycm9yIGFzIEF4aW9zRXJyb3IpPy5jb25maWcpO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGQUlMRUQsIFwiR2V0IENoYXQgY29uZmlnIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLCByZXRyeUNvdW50KTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgTFdJIGRldGFpbHMuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBMV0kgRGV0YWlscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRMV0lEZXRhaWxzKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXM6IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NUQVJURUQsIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcldpdGhOb3RGb3VuZChheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRMV0lEZXRhaWxzLFxuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9O1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0TFdJRGV0YWlsc1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24sIHJlZnJlc2hUb2tlbiwgTXNPY0JvdEFwcGxpY2F0aW9uSWQgfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IG11bHRpQm90ID0gKE1zT2NCb3RBcHBsaWNhdGlvbklkICYmIE1zT2NCb3RBcHBsaWNhdGlvbklkLmxlbmd0aCA+IDApPyB0cnVlOiBmYWxzZTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIGFzIExpdmVDaGF0VmVyc2lvbiB8fCB0aGlzLmxpdmVDaGF0VmVyc2lvbiwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IHRydWUgOiBmYWxzZSwgbXVsdGlCb3QpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBcbiAgICAvLyBJZiBzaG91bGQgb25seSBiZSBhcHBsaWNhYmxlIG9uIHVuYXV0aCBjaGF0ICYgdGhlIGZsYWcgZW5hYmxlZFxuICAgIGNvbnN0IHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0gPSAhYXV0aGVudGljYXRlZFVzZXJUb2tlbiAmJiB0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtID09PSB0cnVlO1xuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKCFzaG91bGRVc2VTaWdRdWVyeVBhcmFtKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuICAgIGlmIChNc09jQm90QXBwbGljYXRpb25JZCAmJiBNc09jQm90QXBwbGljYXRpb25JZC5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbXNbJ01zLU9jLUJvdC1BcHBsaWNhdGlvbi1JZCddID0gTXNPY0JvdEFwcGxpY2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUb2tlbikge1xuICAgICAgcGFyYW1zLnJlZnJlc2hUb2tlbiA9ICd0cnVlJ1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgaWYgKHNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiAoY3VycmVudFJldHJ5Q291bnQgPiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUpID8gY3VycmVudFJldHJ5Q291bnQgOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gY2hlY2sgaWYgZGF0YSBpcyBlbXB0eSwgaWYgc28sIHRoZW4gcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIikpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmV3cyB0aGUgQUNTIGNoYXQgdG9rZW4gb2YgdGhlIHZpc2l0b3IgaW4gYW4gb3BlbiBjb252ZXJzYXRpb24sIHNvIHRoZSBjaGF0IGNhbiBjb250aW51ZSBhZnRlciB0aGUgdG9rZW5cbiAgICogZnJvbSBnZXRDaGF0VG9rZW4gZXhwaXJlcy4gUmVqZWN0cyB3aGVuIHRoZSBBUEkgaXMgbm90IGF2YWlsYWJsZSBvciB0aGUgY29udmVyc2F0aW9uIGNhbid0IGJlIHJlbmV3ZWQgKGUuZy4gNDA0KTtcbiAgICogY2FsbGVycyBzaG91bGQga2VlcCB0aGVpciBjdXJyZW50IHRva2VuIGluIHRoYXQgY2FzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIGNvbnZlcnNhdGlvbiwgb3IgdGhlIHJlY29ubmVjdCBpZCBmb3IgYSByZWNvbm5lY3RlZCBjaGF0LlxuICAgKiBAcGFyYW0gcmVuZXdDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciByZW5ldyBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlbmV3Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCByZW5ld0NoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJUmVuZXdDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxSZW5ld0NoYXRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVuZXdDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5SRU5FV0NIQVRUT0tFTlNUQVJURUQsIFwiUmVuZXcgQ2hhdCBUb2tlbiBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlcXVlc3RJZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbiA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoUmVuZXdDaGF0VG9rZW5QYXRoIDogT21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MlJlbmV3Q2hhdFRva2VuUGF0aDtcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtlbmRwb2ludH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5yZW5ld0NoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc/LnJlbmV3Q2hhdFRva2VuID8/IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzLnJlbmV3Q2hhdFRva2VuXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgIWRhdGEuVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihcIkludmFsaWQgZGF0YSByZWNlaXZlZCBmcm9tIHJlbmV3Q2hhdFRva2VuXCIpO1xuICAgICAgICAgIC8vIE5vdCBwYXNzaW5nIHJlc3BvbnNlOiBsb2dXaXRoTG9nZ2VyIHJlYWRzIHJlc3BvbnNlLmRhdGEuUmVnaW9uLCB3aGljaCB0aHJvd3Mgd2hlbiBkYXRhIGlzIG51bGxcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuUkVORVdDSEFUVE9LRU5GQUlMRUQsIFwiUmVuZXcgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuUkVORVdDSEFUVE9LRU5TVUNDRUVERUQsIFwiUmVuZXcgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlJFTkVXQ0hBVFRPS0VORkFJTEVELCBcIlJlbmV3IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNTVEFSVEVELCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM/LnJlcXVlc3RJZDtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIFN1Y2NlZWRlZCBhbmQgb2xkIHNlc3Npb24gcmV0dXJuZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFNGQUlMRUQsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eShyZWNvbm5lY3RJZDogc3RyaW5nLCBvcHRpb25hbFBhcmFtczogSVJlY29ubmVjdEF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgUmVjb25uZWN0YWJsZSBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLldBUk4sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIG9wdGlvbmFsUGFyYW1zPy5yZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCBvcHRpb25hbFBhcmFtcz8ucmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldEFnZW50QXZhaWxhYmlsaXR5XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICAvL2RhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuICAgIGRhdGEuY2FjaGVLZXkgPSBTSEEyNTYoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLnRvU3RyaW5nKEhleCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqJ1xuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGNvbnN0IHJldHJ5T240MjkgPSB0cnVlO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiAoZXJyb3IpID0+IHNlc3Npb25Jbml0UmV0cnlIYW5kbGVyKGVycm9yLCByZXRyeU9uNDI5KSxcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBhdXRoZW50aWNhdGVkVXNlclRva2VuXG4gICAgICA/IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aFxuICAgICAgOiBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aDtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtiYXNlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7ICAgICBcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIHtcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl06IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sXG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdOiB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cblxuICAgIC8vIElmIHNob3VsZCBvbmx5IGJlIGFwcGxpY2FibGUgb24gdW5hdXRoIGNoYXQgJiB0aGUgZmxhZyBlbmFibGVkXG4gICAgY29uc3Qgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSA9ICFhdXRoZW50aWNhdGVkVXNlclRva2VuICYmIHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0gPT09IHRydWU7XG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBpZiAoIXNob3VsZFVzZVNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0SWQgJiYgc2hvdWxkVXNlU2lnUXVlcnlQYXJhbSkge1xuICAgICAgcGFyYW1zLnNpZyA9IHJlY29ubmVjdElkO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZUNvbnZlcnNhdGlvbihyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5DUkVBVEVTRVNTSU9OU1RBUlRFRCwgXCJDcmVhdGUgY29udmVyc2F0aW9uIGNhbGwgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBjb25zdCByZXRyeU9uNDI5ID0gdHJ1ZTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogKGVycm9yKSA9PiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcihlcnJvciwgcmV0cnlPbjQyOSksXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gYXV0aGVudGljYXRlZFVzZXJUb2tlblxuICAgICAgPyBPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvckF1dGhQYXRoXG4gICAgICA6IE9tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29ubmVjdG9yUGF0aDtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke2Jhc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS93aWRnZXRBcHAvJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vY29udmVyc2F0aW9uYDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7ICAgICBcbiAgICAgIE9iamVjdC5hc3NpZ24ocmVxdWVzdEhlYWRlcnMsIHtcbiAgICAgICAgW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl06IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sXG4gICAgICAgIFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdOiB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGRhdGEucmVjb25uZWN0SWQgPSByZWNvbm5lY3RJZDtcbiAgICB9XG5cbiAgICBkYXRhLmNoYW5uZWxJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZDtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIGNoZWNrIGlmIGRhdGEgaXMgZW1wdHksIGlmIHNvLCB0aGVuIHRocm93IGFuIGVycm9yXG4gICAgICBpZiAoT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGRhdGEgcmVjZWl2ZWQgZnJvbSBnZXRDaGF0VG9rZW5cIik7XG4gICAgICB9XG5cbiAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuQ1JFQVRFU0VTU0lPTlNVQ0NFRURFRCwgXCJDcmVhdGUgY292ZXJzYXRpb24gY2FsbCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkNSRUFURVNFU1NJT05GQUlMRUQsIFwiQ3JlYXRlIGNvbnZlcnNhdGlvbiBjYWxsIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICBcbiAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCwgXCJTZXNzaW9uIGNsb3NlIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdXJ2ZXlJbnZpdGVMaW5rKHN1cnZleU93bmVySWQ6IHN0cmluZywgc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHk6IG9iamVjdCwgZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zOiBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVEFSVEVELFxuICAgICAgICB7IFN1cnZleU93bmVySWQ6IHN1cnZleU93bmVySWQgfSxcbiAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRTdXJ2ZXlJbnZpdGVMaW5rXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QoIG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUcmFuc2NyaXB0c1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG5cbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeSBmb3IgYXV0aGVudGljYXRlZCB1c2Vycy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnkocmVxdWVzdElkOiBzdHJpbmcsIGdldFBlcnNpc3RlbnRDaGF0SGlzdG9yeU9wdGlvbmFsUGFyYW1zOiBJR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWVNUQVJURUQsIFwiR2V0IFBlcnNpc3RlbnQgQ2hhdCBIaXN0b3J5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcGFnZVNpemUsIHBhZ2VUb2tlbiB9ID0gZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBpZiAoIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IFwiQXV0aGVudGljYXRlZCB1c2VyIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwZXJzaXN0ZW50IGNoYXQgaGlzdG9yeVwiO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkIC0gTWlzc2luZyBhdXRoZW50aWNhdGVkIHVzZXIgdG9rZW5cIiwgcmVxdWVzdElkKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0UGVyc2lzdGVudENoYXRIaXN0b3J5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0YXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L2NvbnZlcnNhdGlvbi9oaXN0b3J5YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0UGVyc2lzdGVudENoYXRIaXN0b3J5XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge307XG4gICAgXG4gICAgaWYgKHBhZ2VTaXplKSB7XG4gICAgICBwYXJhbXMucGFnZVNpemUgPSBwYWdlU2l6ZS50b1N0cmluZygpO1xuICAgIH1cblxuICAgIC8vIGluIGNhc2UgcGFnZSB0b2tlbiBpcyBhc3NpZ25lZCBmcm9tIG11dGF0ZWQgaGVhZGVycywgd2Ugb3ZlcnJpZGUgd2l0aCB0aGUgYWN0dWFsIHZhbHVlIG9yIGVtcHR5XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5wYWdlVG9rZW5dID0gcGFnZVRva2VuIHx8IFwiXCI7XG4gICBcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRQZXJzaXN0ZW50Q2hhdEhpc3RvcnlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUEVSU0lTVEVOVENIQVRISVNUT1JZU1VDQ0VFREVELCBcIkdldCBQZXJzaXN0ZW50IENoYXQgSGlzdG9yeSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFBFUlNJU1RFTlRDSEFUSElTVE9SWUZBSUxFRCwgXCJHZXQgUGVyc2lzdGVudCBDaGF0IEhpc3RvcnkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGJhY2tlbmRUaW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lID0gYmFja2VuZFRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5tYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KCBuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICByZXF1ZXN0SGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdCggbmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgYW4gb25nb2luZyAocHJldmlvdXNseSB1bmF1dGhlbnRpY2F0ZWQpIGNoYXQgc2Vzc2lvbi5cbiAgICogVXBncmFkZXMgZW5nYWdlbWVudCBjb250ZXh0IHNvIHN1YnNlcXVlbnQgY2FsbHMgdXNlIGF1dGhlbnRpY2F0ZWQgZW5kcG9pbnRzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIEN1cnJlbnQgcmVxdWVzdC9jb3JyZWxhdGlvbiBpZFxuICAgKiBAcGFyYW0gYXV0aGVudGljYXRlQ2hhdFBhcmFtcyB7IGNoYXRJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWlkQ29udmVyc2F0aW9uQXV0aGVudGljYXRlQ2hhdChyZXF1ZXN0SWQ6IHN0cmluZywgYXV0aGVudGljYXRlQ2hhdFBhcmFtczogeyBjaGF0SWQ6IHN0cmluZzsgYXV0aGVudGljYXRlZFVzZXJUb2tlbjogc3RyaW5nIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuTUlEQVVUSEVOVElDQVRFQ0hBVFNUQVJURUQsIFwiTWlkLUF1dGhlbnRpY2F0ZSBDaGF0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHsgY2hhdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBhdXRoZW50aWNhdGVDaGF0UGFyYW1zO1xuXG4gICAgaWYgKCFjaGF0SWQgfHwgIWF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5NSURBVVRIRU5USUNBVEVDSEFURkFJTEVELFxuICAgICAgICBcIk1pZC1BdXRoZW50aWNhdGUgQ2hhdCBGYWlsZWQgLSBjaGF0SWQgYW5kIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gYXJlIHJlcXVpcmVkXCIsIHJlcXVlc3RJZCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjaGF0SWQgYW5kIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gYXJlIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aE1pZENvbnZlcnNhdGlvblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnlIYW5kbGVyKGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1pZENvbnZlcnNhdGlvbkF1dGhlbnRpY2F0ZUNoYXRcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXAgPSB7IC4uLkNvbnN0YW50cy5kZWZhdWx0SGVhZGVycyB9O1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIHJlcXVlc3RIZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG4gICAgdGhpcy5zZXRSZXF1ZXN0SWRIZWFkZXIocmVxdWVzdElkLCByZXF1ZXN0SGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWlkQ29udmVyc2F0aW9uQXV0aGVudGljYXRlQ2hhdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycyAmJiBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50Lk1JREFVVEhFTlRJQ0FURUNIQVRTVUNDRUVERUQsIFwiTWlkLUF1dGhlbnRpY2F0ZSBDaGF0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgcmVxdWVzdEhlYWRlcnMsIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5NSURBVVRIRU5USUNBVEVDSEFURkFJTEVELCBcIk1pZC1BdXRoZW50aWNhdGUgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IodGhpcy5IVFRQVGltZU91dEVycm9yTWVzc2FnZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdW5yZWFkIG1lc3NhZ2UgY291bnQgZm9yIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqIEF1dGgtb25seSBlbmRwb2ludCDigJQgZG9lcyBub3QgcmVxdWlyZSBhbiBhY3RpdmUgY2hhdCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gYXV0aGVudGljYXRlZFVzZXJUb2tlbiBBdXRoIHRva2VuIGZvciB0aGUgdXNlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRVbnJlYWRNZXNzYWdlQ291bnQoYXV0aGVudGljYXRlZFVzZXJUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUVU5SRUFETUVTU0FHRUNPVU5UU1RBUlRFRCwgXCJHZXQgVW5yZWFkIE1lc3NhZ2UgQ291bnQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25uZWN0b3JBdXRoUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vd2lkZ2V0YXBwLyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9L3VucmVhZG1lc3NhZ2VzYDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeUhhbmRsZXIoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFVucmVhZE1lc3NhZ2VDb3VudFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlcnM6IFN0cmluZ01hcCA9IHsgLi4uQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzIH07XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgcmVxdWVzdEhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0SGVhZGVycyhyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzOiByZXF1ZXN0SGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFVucmVhZE1lc3NhZ2VDb3VudFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgYmFja2VuZFRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUgPSBiYWNrZW5kVGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUVU5SRUFETUVTU0FHRUNPVU5UU1VDQ0VFREVELCBcIkdldCBVbnJlYWQgTWVzc2FnZSBDb3VudCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFVOUkVBRE1FU1NBR0VDT1VOVEZBSUxFRCwgXCJHZXQgVW5yZWFkIE1lc3NhZ2UgQ291bnQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvciwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcih0aGlzLkhUVFBUaW1lT3V0RXJyb3JNZXNzYWdlKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSByZWFkIHJlY2VpcHQgZm9yIGEgc3BlY2lmaWMgbWVzc2FnZSBpbiBhbiBhdXRoZW50aWNhdGVkIGNvbnZlcnNhdGlvbi5cbiAgICogVXBkYXRlcyB0aGUgdW5yZWFkIG1lc3NhZ2UgY291bnRlciBvbiB0aGUgc2VydmVyIGFuZCBmb3J3YXJkcyB0aGUgcmVjZWlwdCB0byBBQ1MuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIChjb252ZXJzYXRpb25UaHJlYWRJZCkgb2YgdGhlIGNvbnZlcnNhdGlvbi5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgQUNTIG1lc3NhZ2UgSUQgdG8gbWFyayBhcyByZWFkLlxuICAgKiBAcGFyYW0gYXV0aGVudGljYXRlZFVzZXJUb2tlbiBBdXRoIHRva2VuIGZvciB0aGUgdXNlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kUmVhZFJlY2VpcHQocmVxdWVzdElkOiBzdHJpbmcsIG1lc3NhZ2VJZDogc3RyaW5nLCBhdXRoZW50aWNhdGVkVXNlclRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFJFQURSRUNFSVBUU1RBUlRFRCwgXCJTZW5kIFJlYWQgUmVjZWlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdENvbm5lY3RvckF1dGhQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS93aWRnZXRhcHAvJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vY29udmVyc2F0aW9ucy8ke3JlcXVlc3RJZH0vcmVhZHJlY2VpcHRgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5SGFuZGxlcihheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2VuZFJlYWRSZWNlaXB0XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXF1ZXN0SGVhZGVyczogU3RyaW5nTWFwID0geyAuLi5Db25zdGFudHMuZGVmYXVsdEhlYWRlcnMgfTtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG5cbiAgICB0aGlzLmFkZERlZmF1bHRIZWFkZXJzKHJlcXVlc3RJZCwgcmVxdWVzdEhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZCB9KSxcbiAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFJlYWRSZWNlaXB0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBiYWNrZW5kVGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EUkVBRFJFQ0VJUFRTVUNDRUVERUQsIFwiU2VuZCBSZWFkIFJlY2VpcHQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCByZXF1ZXN0SGVhZGVycywgaHR0cFJlcXVlc3RSZXNwb25zZVRpbWUpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSA9IGJhY2tlbmRUaW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRSRUFEUkVDRUlQVEZBSUxFRCwgXCJTZW5kIFJlYWQgUmVjZWlwdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzLCBodHRwUmVxdWVzdFJlc3BvbnNlVGltZSk7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKHRoaXMuSFRUUFRpbWVPdXRFcnJvck1lc3NhZ2UpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSwgcmVxdWVzdEhlYWRlcnM/OiBhbnksIGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lPzogbnVtYmVyLCByZXRyeUNvdW50PzogbnVtYmVyKTogdm9pZCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGxldCBzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyA9IHVuZGVmaW5lZDtcbiAgICBsZXQgYXV0aFRva2VuRGV0YWlsczogYW55ID0gdW5kZWZpbmVkOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAocmVxdWVzdEhlYWRlcnMpIHtcbiAgICAgIHNhbml0aXplZFJlcXVlc3RIZWFkZXJzID0geyAuLi5yZXF1ZXN0SGVhZGVycyB9O1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFJlcXVlc3RIZWFkZXJzU2Vuc2l0aXZlUHJvcGVydGllcyhzYW5pdGl6ZWRSZXF1ZXN0SGVhZGVycyk7XG5cbiAgICAgIGlmIChyZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dKSB7XG4gICAgICAgIGlmICh3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmF0b2IpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSByZXF1ZXN0SGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dO1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRva2VuLnNwbGl0KFwiLlwiKVsxXTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB3aW5kb3cuYXRvYihwYXlsb2FkKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgIGNvbnN0IGx3aUNvbnRleHRzID0ganNvbkRhdGFbXCJsd2ljb250ZXh0c1wiXTtcbiAgICAgICAgICAgIGF1dGhUb2tlbkRldGFpbHMgPSB7XG4gICAgICAgICAgICAgIHN1YjoganNvbkRhdGFbXCJzdWJcIl0sXG4gICAgICAgICAgICAgIGV4cDoganNvbkRhdGFbXCJleHBcIl1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChsd2lDb250ZXh0cykge1xuICAgICAgICAgICAgICBjb25zdCBsd2lDb250ZXh0c0RhdGEgPSBKU09OLnBhcnNlKGx3aUNvbnRleHRzKTtcbiAgICAgICAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKGx3aUNvbnRleHRzRGF0YSk7XG4gICAgICAgICAgICAgIGF1dGhUb2tlbkRldGFpbHMubHdpQ29udGV4dHMgPSBsd2lDb250ZXh0c0RhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgIFJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgUmVnaW9uOiByZXNwb25zZT8uZGF0YS5SZWdpb24sXG4gICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgSHR0cFJlcXVlc3RSZXNwb25zZVRpbWU6IGh0dHBSZXF1ZXN0UmVzcG9uc2VUaW1lLFxuICAgICAgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2U/LmhlYWRlcnNbQ29uc3RhbnRzLnRyYW5zYWN0aW9uaWRdLFxuICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgUmVxdWVzdE1ldGhvZDogbWV0aG9kLFxuICAgICAgUmVzcG9uc2VTdGF0dXNDb2RlOiByZXNwb25zZSA/IHJlc3BvbnNlLnN0YXR1cyA6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmRhdGEgfHwgZXJyb3IgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLFxuICAgICAgUmVxdWVzdEhlYWRlcnM6IHNhbml0aXplZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgUmVzcG9uc2VFcnJvcmNvZGU6IGVycm9yID8gKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LmhlYWRlcnM/LmVycm9yY29kZSA6IHVuZGVmaW5lZCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBBdXRoVG9rZW5EZXRhaWxzOiBhdXRoVG9rZW5EZXRhaWxzLFxuICAgICAgUmV0cnlDb3VudDogcmV0cnlDb3VudFxuICAgIH07XG4gICAgdGhpcy5sb2dnZXIubG9nKGxvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGUsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0QXV0aENvZGVOb25jZSA9IChoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoaGVhZGVycz8uYXV0aGNvZGVub25jZSkge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2UgPSBoZWFkZXJzPy5hdXRoY29kZW5vbmNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkRGVmYXVsdEhlYWRlcnMocmVxdWVzdElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIHJlcXVlc3RIZWFkZXJzOiBTdHJpbmdNYXApOiB2b2lkIHtcbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgcmVxdWVzdEhlYWRlcnMpO1xuICAgIGFkZE9jVXNlckFnZW50SGVhZGVyKHRoaXMub2NVc2VyQWdlbnQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgICB0aGlzLnNldENvcnJlbGF0aW9uSWRJbkhlYWRlcihyZXF1ZXN0SWQsIHJlcXVlc3RIZWFkZXJzKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgc2V0U2Vzc2lvbklkSGVhZGVyID0gKHNlc3Npb25JZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBhbnkpID0+IHtcbiAgICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWRdID0gc2Vzc2lvbklkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0UmVxdWVzdElkSGVhZGVyID0gKHJlcXVlc3RJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBoZWFkZXJzOiBTdHJpbmdNYXApID0+IHtcbiAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldENvcnJlbGF0aW9uSWRJbkhlYWRlciA9IChjb3JyZWxhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IFN0cmluZ01hcCkgPT4ge1xuICAgIGlmIChjb3JyZWxhdGlvbklkKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuY29ycmVsYXRpb25JZF0gPSBjb3JyZWxhdGlvbklkO1xuICAgIH1cbiAgfVxufVxuXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsa0JBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUVBLElBQUFLLFlBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQUosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFSLE9BQUE7QUFFQSxJQUFBUyxPQUFBLEdBQUFQLHNCQUFB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
|