@microsoft/ocsdk 0.3.1-main.eb900d8 → 0.3.1-main.f65f37d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/SDK.js CHANGED
@@ -805,7 +805,7 @@ var SDK = /*#__PURE__*/function () {
805
805
  return getReconnectAvailability;
806
806
  }()
807
807
  /**
808
- *
808
+ *
809
809
  * @param requestId: RequestId to use for session init.
810
810
  * @param queueAvailabilityOptionalParams: Optional parameters for session init.
811
811
  */
@@ -1001,32 +1001,47 @@ var SDK = /*#__PURE__*/function () {
1001
1001
  }, {
1002
1002
  key: "sessionInit",
1003
1003
  value: function () {
1004
- var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(requestId) {
1005
- var _this6 = this;
1006
-
1004
+ var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
1007
1005
  var sessionInitOptionalParams,
1008
1006
  timer,
1007
+ description,
1008
+ customData,
1009
1009
  axiosInstance,
1010
1010
  reconnectId,
1011
1011
  authenticatedUserToken,
1012
1012
  initContext,
1013
1013
  getContext,
1014
1014
  headers,
1015
- endpoint,
1015
+ requestPath,
1016
+ queryParams,
1017
+ url,
1016
1018
  data,
1019
+ method,
1017
1020
  options,
1018
- _args13 = arguments;
1019
- return _regenerator["default"].wrap(function _callee13$(_context13) {
1021
+ response,
1022
+ elapsedTimeInMilliseconds,
1023
+ requestPayload,
1024
+ _customData,
1025
+ _description,
1026
+ _elapsedTimeInMilliseconds6,
1027
+ _requestPayload,
1028
+ _customData2,
1029
+ _description2,
1030
+ _args12 = arguments;
1031
+
1032
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
1020
1033
  while (1) {
1021
- switch (_context13.prev = _context13.next) {
1034
+ switch (_context12.prev = _context12.next) {
1022
1035
  case 0:
1023
- sessionInitOptionalParams = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : {};
1036
+ sessionInitOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
1024
1037
  timer = _Timer.Timer.TIMER();
1025
1038
 
1026
1039
  if (this.logger) {
1027
- this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, {
1040
+ description = "Session Init Started";
1041
+ customData = {
1028
1042
  RequestId: requestId
1029
- }, "Session Init Started");
1043
+ };
1044
+ this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, customData, description);
1030
1045
  }
1031
1046
 
1032
1047
  axiosInstance = _axios["default"].create();
@@ -1035,28 +1050,30 @@ var SDK = /*#__PURE__*/function () {
1035
1050
  });
1036
1051
  reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
1037
1052
  headers = _Constants["default"].defaultHeaders;
1038
- endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].LiveChatSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1053
+ requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1039
1054
 
1040
1055
  if (authenticatedUserToken) {
1041
- endpoint = "".concat(this.omnichannelConfiguration.orgUrl, "/").concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1056
+ requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthSessionInitPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
1042
1057
  headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
1043
1058
  }
1044
1059
 
1045
1060
  if (reconnectId) {
1046
- endpoint += "/".concat(reconnectId);
1061
+ requestPath += "/".concat(reconnectId);
1047
1062
  }
1048
1063
 
1049
- endpoint += "?channelId=".concat(this.omnichannelConfiguration.channelId);
1064
+ queryParams = "channelId=".concat(this.omnichannelConfiguration.channelId);
1065
+ requestPath += "?".concat(queryParams);
1066
+ url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
1050
1067
  data = initContext || {};
1051
1068
 
1052
1069
  if (!(getContext && !window.document)) {
1053
- _context13.next = 14;
1070
+ _context12.next = 16;
1054
1071
  break;
1055
1072
  }
1056
1073
 
1057
- return _context13.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1074
+ return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1058
1075
 
1059
- case 14:
1076
+ case 16:
1060
1077
  if (getContext) {
1061
1078
  data.browser = _BrowserInfo.BrowserInfo.getBrowserName();
1062
1079
  data.device = _DeviceInfo.DeviceInfo.getDeviceType();
@@ -1071,90 +1088,102 @@ var SDK = /*#__PURE__*/function () {
1071
1088
 
1072
1089
 
1073
1090
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
1074
- _context13.next = 18;
1091
+ _context12.next = 20;
1075
1092
  break;
1076
1093
  }
1077
1094
 
1078
- return _context13.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1095
+ return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1079
1096
 
1080
- case 18:
1097
+ case 20:
1098
+ method = "POST";
1081
1099
  options = {
1082
1100
  data: data,
1083
1101
  headers: headers,
1084
- method: "POST",
1085
- url: endpoint
1102
+ method: method,
1103
+ url: url
1086
1104
  };
1087
- return _context13.abrupt("return", new Promise( /*#__PURE__*/function () {
1088
- var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(resolve, reject) {
1089
- var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds6;
1105
+ _context12.prev = 22;
1106
+ _context12.next = 25;
1107
+ return axiosInstance(options);
1090
1108
 
1091
- return _regenerator["default"].wrap(function _callee12$(_context12) {
1092
- while (1) {
1093
- switch (_context12.prev = _context12.next) {
1094
- case 0:
1095
- _context12.prev = 0;
1096
- _context12.next = 3;
1097
- return axiosInstance(options);
1109
+ case 25:
1110
+ response = _context12.sent;
1098
1111
 
1099
- case 3:
1100
- response = _context12.sent;
1101
- elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1112
+ if (this.logger) {
1113
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1114
+ requestPayload = _objectSpread({}, data);
1102
1115
 
1103
- if (_this6.logger) {
1104
- _this6.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, {
1105
- RequestId: requestId,
1106
- Region: response.data.Region,
1107
- ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
1108
- TransactionId: response.headers["transaction-id"]
1109
- }, "Session Init Succeeded");
1110
- }
1116
+ if (requestPayload.customContextData) {
1117
+ _LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(requestPayload.customContextData);
1118
+ }
1111
1119
 
1112
- resolve();
1113
- _context12.next = 17;
1114
- break;
1120
+ if (requestPayload.preChatResponse) {
1121
+ _LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(requestPayload.preChatResponse);
1122
+ }
1115
1123
 
1116
- case 9:
1117
- _context12.prev = 9;
1118
- _context12.t0 = _context12["catch"](0);
1119
- _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1124
+ _customData = {
1125
+ RequestId: requestId,
1126
+ Region: response.data.Region,
1127
+ ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
1128
+ TransactionId: response.headers["transaction-id"],
1129
+ RequestPayload: requestPayload,
1130
+ RequestPath: requestPath,
1131
+ RequestMethod: method,
1132
+ ResponseStatusCode: response.status
1133
+ };
1134
+ _description = "Session Init Succeeded";
1135
+ this.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, _customData, _description);
1136
+ }
1120
1137
 
1121
- if (!_this6.logger) {
1122
- _context12.next = 16;
1123
- break;
1124
- }
1138
+ _context12.next = 42;
1139
+ break;
1125
1140
 
1126
- _context12.next = 15;
1127
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context12.t0);
1141
+ case 29:
1142
+ _context12.prev = 29;
1143
+ _context12.t0 = _context12["catch"](22);
1144
+ _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1128
1145
 
1129
- case 15:
1130
- _this6.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, {
1131
- RequestId: requestId,
1132
- ExceptionDetails: _context12.t0,
1133
- ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6
1134
- }, "Session Init Failed");
1146
+ if (!this.logger) {
1147
+ _context12.next = 41;
1148
+ break;
1149
+ }
1135
1150
 
1136
- case 16:
1137
- reject(_context12.t0);
1151
+ _requestPayload = _objectSpread({}, data);
1138
1152
 
1139
- case 17:
1140
- case "end":
1141
- return _context12.stop();
1142
- }
1143
- }
1144
- }, _callee12, null, [[0, 9]]);
1145
- }));
1153
+ if (_requestPayload.customContextData) {
1154
+ _LoggingSanitizer.LoggingSanitizer.stripCustomContextDataValues(_requestPayload.customContextData);
1155
+ }
1146
1156
 
1147
- return function (_x18, _x19) {
1148
- return _ref6.apply(this, arguments);
1149
- };
1150
- }()));
1157
+ if (_requestPayload.preChatResponse) {
1158
+ _LoggingSanitizer.LoggingSanitizer.stripPreChatResponse(_requestPayload.preChatResponse);
1159
+ }
1151
1160
 
1152
- case 20:
1161
+ _context12.next = 38;
1162
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context12.t0);
1163
+
1164
+ case 38:
1165
+ _customData2 = {
1166
+ RequestId: requestId,
1167
+ ExceptionDetails: _context12.t0,
1168
+ ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds6,
1169
+ RequestPayload: _requestPayload,
1170
+ RequestPath: requestPath,
1171
+ RequestMethod: method,
1172
+ ResponseStatusCode: _context12.t0.response.status // eslint-disable-line @typescript-eslint/no-explicit-any
1173
+
1174
+ };
1175
+ _description2 = "Session Init Failed";
1176
+ this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, _customData2, _description2);
1177
+
1178
+ case 41:
1179
+ throw _context12.t0;
1180
+
1181
+ case 42:
1153
1182
  case "end":
1154
- return _context13.stop();
1183
+ return _context12.stop();
1155
1184
  }
1156
1185
  }
1157
- }, _callee13, this);
1186
+ }, _callee12, this, [[22, 29]]);
1158
1187
  }));
1159
1188
 
1160
1189
  function sessionInit(_x17) {
@@ -1172,8 +1201,8 @@ var SDK = /*#__PURE__*/function () {
1172
1201
  }, {
1173
1202
  key: "sessionClose",
1174
1203
  value: function () {
1175
- var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId) {
1176
- var _this7 = this;
1204
+ var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
1205
+ var _this6 = this;
1177
1206
 
1178
1207
  var sessionCloseOptionalParams,
1179
1208
  timer,
@@ -1186,12 +1215,12 @@ var SDK = /*#__PURE__*/function () {
1186
1215
  headers,
1187
1216
  data,
1188
1217
  options,
1189
- _args15 = arguments;
1190
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1218
+ _args14 = arguments;
1219
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
1191
1220
  while (1) {
1192
- switch (_context15.prev = _context15.next) {
1221
+ switch (_context14.prev = _context14.next) {
1193
1222
  case 0:
1194
- sessionCloseOptionalParams = _args15.length > 1 && _args15[1] !== undefined ? _args15[1] : {};
1223
+ sessionCloseOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
1195
1224
  timer = _Timer.Timer.TIMER();
1196
1225
 
1197
1226
  if (this.logger) {
@@ -1230,24 +1259,24 @@ var SDK = /*#__PURE__*/function () {
1230
1259
  method: "POST",
1231
1260
  url: endpoint
1232
1261
  };
1233
- return _context15.abrupt("return", new Promise( /*#__PURE__*/function () {
1234
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(resolve, reject) {
1262
+ return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
1263
+ var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
1235
1264
  var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds7;
1236
1265
 
1237
- return _regenerator["default"].wrap(function _callee14$(_context14) {
1266
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
1238
1267
  while (1) {
1239
- switch (_context14.prev = _context14.next) {
1268
+ switch (_context13.prev = _context13.next) {
1240
1269
  case 0:
1241
- _context14.prev = 0;
1242
- _context14.next = 3;
1270
+ _context13.prev = 0;
1271
+ _context13.next = 3;
1243
1272
  return axiosInstance(options);
1244
1273
 
1245
1274
  case 3:
1246
- response = _context14.sent;
1275
+ response = _context13.sent;
1247
1276
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1248
1277
 
1249
- if (_this7.logger) {
1250
- _this7.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, {
1278
+ if (_this6.logger) {
1279
+ _this6.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, {
1251
1280
  RequestId: requestId,
1252
1281
  Region: response.data.Region,
1253
1282
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -1256,26 +1285,26 @@ var SDK = /*#__PURE__*/function () {
1256
1285
  }
1257
1286
 
1258
1287
  resolve();
1259
- _context14.next = 17;
1288
+ _context13.next = 17;
1260
1289
  break;
1261
1290
 
1262
1291
  case 9:
1263
- _context14.prev = 9;
1264
- _context14.t0 = _context14["catch"](0);
1292
+ _context13.prev = 9;
1293
+ _context13.t0 = _context13["catch"](0);
1265
1294
  _elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
1266
1295
 
1267
- if (!_this7.logger) {
1268
- _context14.next = 16;
1296
+ if (!_this6.logger) {
1297
+ _context13.next = 16;
1269
1298
  break;
1270
1299
  }
1271
1300
 
1272
- _context14.next = 15;
1273
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context14.t0);
1301
+ _context13.next = 15;
1302
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context13.t0);
1274
1303
 
1275
1304
  case 15:
1276
- _this7.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, {
1305
+ _this6.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, {
1277
1306
  RequestId: requestId,
1278
- ExceptionDetails: _context14.t0,
1307
+ ExceptionDetails: _context13.t0,
1279
1308
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds7
1280
1309
  }, "Session Close Failed");
1281
1310
 
@@ -1284,26 +1313,26 @@ var SDK = /*#__PURE__*/function () {
1284
1313
 
1285
1314
  case 17:
1286
1315
  case "end":
1287
- return _context14.stop();
1316
+ return _context13.stop();
1288
1317
  }
1289
1318
  }
1290
- }, _callee14, null, [[0, 9]]);
1319
+ }, _callee13, null, [[0, 9]]);
1291
1320
  }));
1292
1321
 
1293
- return function (_x21, _x22) {
1294
- return _ref7.apply(this, arguments);
1322
+ return function (_x19, _x20) {
1323
+ return _ref6.apply(this, arguments);
1295
1324
  };
1296
1325
  }()));
1297
1326
 
1298
1327
  case 15:
1299
1328
  case "end":
1300
- return _context15.stop();
1329
+ return _context14.stop();
1301
1330
  }
1302
1331
  }
1303
- }, _callee15, this);
1332
+ }, _callee14, this);
1304
1333
  }));
1305
1334
 
1306
- function sessionClose(_x20) {
1335
+ function sessionClose(_x18) {
1307
1336
  return _sessionClose.apply(this, arguments);
1308
1337
  }
1309
1338
 
@@ -1318,12 +1347,12 @@ var SDK = /*#__PURE__*/function () {
1318
1347
  }, {
1319
1348
  key: "validateAuthChatRecord",
1320
1349
  value: function () {
1321
- var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(requestId, validateAuthChatRecordOptionalParams) {
1350
+ var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId, validateAuthChatRecordOptionalParams) {
1322
1351
  var timer, authenticatedUserToken, chatId, endpoint, axiosInstance, headers, options, _response$data, response, elapsedTimeInMilliseconds, _this$logger, _this$logger2, _this$logger3, _elapsedTimeInMilliseconds8;
1323
1352
 
1324
- return _regenerator["default"].wrap(function _callee16$(_context16) {
1353
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
1325
1354
  while (1) {
1326
- switch (_context16.prev = _context16.next) {
1355
+ switch (_context15.prev = _context15.next) {
1327
1356
  case 0:
1328
1357
  timer = _Timer.Timer.TIMER();
1329
1358
 
@@ -1350,16 +1379,16 @@ var SDK = /*#__PURE__*/function () {
1350
1379
  method: "GET",
1351
1380
  url: endpoint
1352
1381
  };
1353
- _context16.prev = 9;
1354
- _context16.next = 12;
1382
+ _context15.prev = 9;
1383
+ _context15.next = 12;
1355
1384
  return axiosInstance(options);
1356
1385
 
1357
1386
  case 12:
1358
- response = _context16.sent;
1387
+ response = _context15.sent;
1359
1388
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1360
1389
 
1361
1390
  if (!(((_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.authChatExist) === true)) {
1362
- _context16.next = 19;
1391
+ _context15.next = 19;
1363
1392
  break;
1364
1393
  }
1365
1394
 
@@ -1369,7 +1398,7 @@ var SDK = /*#__PURE__*/function () {
1369
1398
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
1370
1399
  TransactionId: response.headers["transaction-id"]
1371
1400
  }, "Validate Auth Chat Record Succeeded");
1372
- return _context16.abrupt("return", Promise.resolve(response.data));
1401
+ return _context15.abrupt("return", Promise.resolve(response.data));
1373
1402
 
1374
1403
  case 19:
1375
1404
  (_this$logger2 = this.logger) === null || _this$logger2 === void 0 ? void 0 : _this$logger2.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
@@ -1379,45 +1408,45 @@ var SDK = /*#__PURE__*/function () {
1379
1408
  TransactionId: response.headers["transaction-id"],
1380
1409
  ErrorCode: response.status
1381
1410
  }, "Validate Auth Chat Record Failed. Record is not found or request is not authorized");
1382
- return _context16.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
1411
+ return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
1383
1412
 
1384
1413
  case 21:
1385
- _context16.next = 34;
1414
+ _context15.next = 34;
1386
1415
  break;
1387
1416
 
1388
1417
  case 23:
1389
- _context16.prev = 23;
1390
- _context16.t0 = _context16["catch"](9);
1418
+ _context15.prev = 23;
1419
+ _context15.t0 = _context15["catch"](9);
1391
1420
  _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1392
- _context16.next = 28;
1393
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context16.t0);
1421
+ _context15.next = 28;
1422
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context15.t0);
1394
1423
 
1395
1424
  case 28:
1396
1425
  (_this$logger3 = this.logger) === null || _this$logger3 === void 0 ? void 0 : _this$logger3.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, {
1397
1426
  RequestId: requestId,
1398
- ExceptionDetails: _context16.t0,
1427
+ ExceptionDetails: _context15.t0,
1399
1428
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds8
1400
1429
  }, "Validate Auth Chat Record Failed");
1401
1430
 
1402
- if (!(_context16.t0.toString() === "Error: Request failed with status code 404")) {
1403
- _context16.next = 33;
1431
+ if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
1432
+ _context15.next = 33;
1404
1433
  break;
1405
1434
  }
1406
1435
 
1407
- return _context16.abrupt("return", Promise.resolve({}));
1436
+ return _context15.abrupt("return", Promise.resolve({}));
1408
1437
 
1409
1438
  case 33:
1410
- return _context16.abrupt("return", Promise.reject());
1439
+ return _context15.abrupt("return", Promise.reject());
1411
1440
 
1412
1441
  case 34:
1413
1442
  case "end":
1414
- return _context16.stop();
1443
+ return _context15.stop();
1415
1444
  }
1416
1445
  }
1417
- }, _callee16, this, [[9, 23]]);
1446
+ }, _callee15, this, [[9, 23]]);
1418
1447
  }));
1419
1448
 
1420
- function validateAuthChatRecord(_x23, _x24) {
1449
+ function validateAuthChatRecord(_x21, _x22) {
1421
1450
  return _validateAuthChatRecord.apply(this, arguments);
1422
1451
  }
1423
1452
 
@@ -1433,8 +1462,8 @@ var SDK = /*#__PURE__*/function () {
1433
1462
  }, {
1434
1463
  key: "submitPostChatResponse",
1435
1464
  value: function () {
1436
- var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(requestId, postChatResponse) {
1437
- var _this8 = this;
1465
+ var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, postChatResponse) {
1466
+ var _this7 = this;
1438
1467
 
1439
1468
  var submitPostChatResponseOptionalParams,
1440
1469
  timer,
@@ -1443,12 +1472,12 @@ var SDK = /*#__PURE__*/function () {
1443
1472
  authenticatedUserToken,
1444
1473
  headers,
1445
1474
  options,
1446
- _args18 = arguments;
1447
- return _regenerator["default"].wrap(function _callee18$(_context18) {
1475
+ _args17 = arguments;
1476
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
1448
1477
  while (1) {
1449
- switch (_context18.prev = _context18.next) {
1478
+ switch (_context17.prev = _context17.next) {
1450
1479
  case 0:
1451
- submitPostChatResponseOptionalParams = _args18.length > 2 && _args18[2] !== undefined ? _args18[2] : {};
1480
+ submitPostChatResponseOptionalParams = _args17.length > 2 && _args17[2] !== undefined ? _args17[2] : {};
1452
1481
  timer = _Timer.Timer.TIMER();
1453
1482
 
1454
1483
  if (this.logger) {
@@ -1476,24 +1505,24 @@ var SDK = /*#__PURE__*/function () {
1476
1505
  method: "POST",
1477
1506
  url: endpoint
1478
1507
  };
1479
- return _context18.abrupt("return", new Promise( /*#__PURE__*/function () {
1480
- var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(resolve, reject) {
1508
+ return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
1509
+ var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
1481
1510
  var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1482
1511
 
1483
- return _regenerator["default"].wrap(function _callee17$(_context17) {
1512
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
1484
1513
  while (1) {
1485
- switch (_context17.prev = _context17.next) {
1514
+ switch (_context16.prev = _context16.next) {
1486
1515
  case 0:
1487
- _context17.prev = 0;
1488
- _context17.next = 3;
1516
+ _context16.prev = 0;
1517
+ _context16.next = 3;
1489
1518
  return axiosInstance(options);
1490
1519
 
1491
1520
  case 3:
1492
- response = _context17.sent;
1521
+ response = _context16.sent;
1493
1522
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1494
1523
 
1495
- if (_this8.logger) {
1496
- _this8.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, {
1524
+ if (_this7.logger) {
1525
+ _this7.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, {
1497
1526
  RequestId: requestId,
1498
1527
  Region: response.data.Region,
1499
1528
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -1502,26 +1531,26 @@ var SDK = /*#__PURE__*/function () {
1502
1531
  }
1503
1532
 
1504
1533
  resolve();
1505
- _context17.next = 17;
1534
+ _context16.next = 17;
1506
1535
  break;
1507
1536
 
1508
1537
  case 9:
1509
- _context17.prev = 9;
1510
- _context17.t0 = _context17["catch"](0);
1538
+ _context16.prev = 9;
1539
+ _context16.t0 = _context16["catch"](0);
1511
1540
  _elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
1512
1541
 
1513
- if (!_this8.logger) {
1514
- _context17.next = 16;
1542
+ if (!_this7.logger) {
1543
+ _context16.next = 16;
1515
1544
  break;
1516
1545
  }
1517
1546
 
1518
- _context17.next = 15;
1519
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context17.t0);
1547
+ _context16.next = 15;
1548
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context16.t0);
1520
1549
 
1521
1550
  case 15:
1522
- _this8.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, {
1551
+ _this7.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, {
1523
1552
  RequestId: requestId,
1524
- ExceptionDetails: _context17.t0,
1553
+ ExceptionDetails: _context16.t0,
1525
1554
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds9
1526
1555
  }, "Submit Post Chat Failed");
1527
1556
 
@@ -1530,26 +1559,26 @@ var SDK = /*#__PURE__*/function () {
1530
1559
 
1531
1560
  case 17:
1532
1561
  case "end":
1533
- return _context17.stop();
1562
+ return _context16.stop();
1534
1563
  }
1535
1564
  }
1536
- }, _callee17, null, [[0, 9]]);
1565
+ }, _callee16, null, [[0, 9]]);
1537
1566
  }));
1538
1567
 
1539
- return function (_x27, _x28) {
1540
- return _ref8.apply(this, arguments);
1568
+ return function (_x25, _x26) {
1569
+ return _ref7.apply(this, arguments);
1541
1570
  };
1542
1571
  }()));
1543
1572
 
1544
1573
  case 11:
1545
1574
  case "end":
1546
- return _context18.stop();
1575
+ return _context17.stop();
1547
1576
  }
1548
1577
  }
1549
- }, _callee18, this);
1578
+ }, _callee17, this);
1550
1579
  }));
1551
1580
 
1552
- function submitPostChatResponse(_x25, _x26) {
1581
+ function submitPostChatResponse(_x23, _x24) {
1553
1582
  return _submitPostChatResponse.apply(this, arguments);
1554
1583
  }
1555
1584
 
@@ -1565,8 +1594,8 @@ var SDK = /*#__PURE__*/function () {
1565
1594
  }, {
1566
1595
  key: "getSurveyInviteLink",
1567
1596
  value: function () {
1568
- var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(surveyOwnerId, surveyInviteAPIRequestBody) {
1569
- var _this9 = this;
1597
+ var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(surveyOwnerId, surveyInviteAPIRequestBody) {
1598
+ var _this8 = this;
1570
1599
 
1571
1600
  var getsurveyInviteLinkOptionalParams,
1572
1601
  timer,
@@ -1576,12 +1605,12 @@ var SDK = /*#__PURE__*/function () {
1576
1605
  requestId,
1577
1606
  headers,
1578
1607
  options,
1579
- _args20 = arguments;
1580
- return _regenerator["default"].wrap(function _callee20$(_context20) {
1608
+ _args19 = arguments;
1609
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
1581
1610
  while (1) {
1582
- switch (_context20.prev = _context20.next) {
1611
+ switch (_context19.prev = _context19.next) {
1583
1612
  case 0:
1584
- getsurveyInviteLinkOptionalParams = _args20.length > 2 && _args20[2] !== undefined ? _args20[2] : {};
1613
+ getsurveyInviteLinkOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
1585
1614
  timer = _Timer.Timer.TIMER();
1586
1615
 
1587
1616
  if (this.logger) {
@@ -1614,25 +1643,25 @@ var SDK = /*#__PURE__*/function () {
1614
1643
  method: "POST",
1615
1644
  url: endpoint
1616
1645
  };
1617
- return _context20.abrupt("return", new Promise( /*#__PURE__*/function () {
1618
- var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(resolve, reject) {
1646
+ return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
1647
+ var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
1619
1648
  var response, data, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1620
1649
 
1621
- return _regenerator["default"].wrap(function _callee19$(_context19) {
1650
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
1622
1651
  while (1) {
1623
- switch (_context19.prev = _context19.next) {
1652
+ switch (_context18.prev = _context18.next) {
1624
1653
  case 0:
1625
- _context19.prev = 0;
1626
- _context19.next = 3;
1654
+ _context18.prev = 0;
1655
+ _context18.next = 3;
1627
1656
  return axiosInstance(options);
1628
1657
 
1629
1658
  case 3:
1630
- response = _context19.sent;
1659
+ response = _context18.sent;
1631
1660
  data = response.data;
1632
1661
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1633
1662
 
1634
- if (_this9.logger) {
1635
- _this9.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, {
1663
+ if (_this8.logger) {
1664
+ _this8.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, {
1636
1665
  Region: response.data.Region,
1637
1666
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
1638
1667
  TransactionId: response.headers["transaction-id"]
@@ -1640,25 +1669,25 @@ var SDK = /*#__PURE__*/function () {
1640
1669
  }
1641
1670
 
1642
1671
  resolve(data);
1643
- _context19.next = 18;
1672
+ _context18.next = 18;
1644
1673
  break;
1645
1674
 
1646
1675
  case 10:
1647
- _context19.prev = 10;
1648
- _context19.t0 = _context19["catch"](0);
1676
+ _context18.prev = 10;
1677
+ _context18.t0 = _context18["catch"](0);
1649
1678
  _elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
1650
1679
 
1651
- if (!_this9.logger) {
1652
- _context19.next = 17;
1680
+ if (!_this8.logger) {
1681
+ _context18.next = 17;
1653
1682
  break;
1654
1683
  }
1655
1684
 
1656
- _context19.next = 16;
1657
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context19.t0);
1685
+ _context18.next = 16;
1686
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context18.t0);
1658
1687
 
1659
1688
  case 16:
1660
- _this9.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, {
1661
- ExceptionDetails: _context19.t0,
1689
+ _this8.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, {
1690
+ ExceptionDetails: _context18.t0,
1662
1691
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds10
1663
1692
  }, "Get Survey Invite Link Failed");
1664
1693
 
@@ -1667,26 +1696,26 @@ var SDK = /*#__PURE__*/function () {
1667
1696
 
1668
1697
  case 18:
1669
1698
  case "end":
1670
- return _context19.stop();
1699
+ return _context18.stop();
1671
1700
  }
1672
1701
  }
1673
- }, _callee19, null, [[0, 10]]);
1702
+ }, _callee18, null, [[0, 10]]);
1674
1703
  }));
1675
1704
 
1676
- return function (_x31, _x32) {
1677
- return _ref9.apply(this, arguments);
1705
+ return function (_x29, _x30) {
1706
+ return _ref8.apply(this, arguments);
1678
1707
  };
1679
1708
  }()));
1680
1709
 
1681
1710
  case 12:
1682
1711
  case "end":
1683
- return _context20.stop();
1712
+ return _context19.stop();
1684
1713
  }
1685
1714
  }
1686
- }, _callee20, this);
1715
+ }, _callee19, this);
1687
1716
  }));
1688
1717
 
1689
- function getSurveyInviteLink(_x29, _x30) {
1718
+ function getSurveyInviteLink(_x27, _x28) {
1690
1719
  return _getSurveyInviteLink.apply(this, arguments);
1691
1720
  }
1692
1721
 
@@ -1703,8 +1732,8 @@ var SDK = /*#__PURE__*/function () {
1703
1732
  }, {
1704
1733
  key: "getChatTranscripts",
1705
1734
  value: function () {
1706
- var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(requestId, chatId, token) {
1707
- var _this10 = this;
1735
+ var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(requestId, chatId, token) {
1736
+ var _this9 = this;
1708
1737
 
1709
1738
  var getChatTranscriptsOptionalParams,
1710
1739
  timer,
@@ -1714,12 +1743,12 @@ var SDK = /*#__PURE__*/function () {
1714
1743
  currentLiveChatVersion,
1715
1744
  headers,
1716
1745
  options,
1717
- _args22 = arguments;
1718
- return _regenerator["default"].wrap(function _callee22$(_context22) {
1746
+ _args21 = arguments;
1747
+ return _regenerator["default"].wrap(function _callee21$(_context21) {
1719
1748
  while (1) {
1720
- switch (_context22.prev = _context22.next) {
1749
+ switch (_context21.prev = _context21.next) {
1721
1750
  case 0:
1722
- getChatTranscriptsOptionalParams = _args22.length > 3 && _args22[3] !== undefined ? _args22[3] : {};
1751
+ getChatTranscriptsOptionalParams = _args21.length > 3 && _args21[3] !== undefined ? _args21[3] : {};
1723
1752
  timer = _Timer.Timer.TIMER();
1724
1753
 
1725
1754
  if (this.logger) {
@@ -1754,25 +1783,25 @@ var SDK = /*#__PURE__*/function () {
1754
1783
  method: "GET",
1755
1784
  url: endpoint
1756
1785
  };
1757
- return _context22.abrupt("return", new Promise( /*#__PURE__*/function () {
1758
- var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(resolve, reject) {
1786
+ return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
1787
+ var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
1759
1788
  var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds11;
1760
1789
 
1761
- return _regenerator["default"].wrap(function _callee21$(_context21) {
1790
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
1762
1791
  while (1) {
1763
- switch (_context21.prev = _context21.next) {
1792
+ switch (_context20.prev = _context20.next) {
1764
1793
  case 0:
1765
- _context21.prev = 0;
1766
- _context21.next = 3;
1794
+ _context20.prev = 0;
1795
+ _context20.next = 3;
1767
1796
  return axiosInstance(options);
1768
1797
 
1769
1798
  case 3:
1770
- response = _context21.sent;
1799
+ response = _context20.sent;
1771
1800
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1772
1801
  data = response.data;
1773
1802
 
1774
- if (_this10.logger) {
1775
- _this10.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, {
1803
+ if (_this9.logger) {
1804
+ _this9.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, {
1776
1805
  RequestId: requestId,
1777
1806
  Region: response.data.Region,
1778
1807
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -1781,54 +1810,54 @@ var SDK = /*#__PURE__*/function () {
1781
1810
  }
1782
1811
 
1783
1812
  resolve(data);
1784
- _context21.next = 18;
1813
+ _context20.next = 18;
1785
1814
  break;
1786
1815
 
1787
1816
  case 10:
1788
- _context21.prev = 10;
1789
- _context21.t0 = _context21["catch"](0);
1817
+ _context20.prev = 10;
1818
+ _context20.t0 = _context20["catch"](0);
1790
1819
  _elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
1791
1820
 
1792
- if (!_this10.logger) {
1793
- _context21.next = 17;
1821
+ if (!_this9.logger) {
1822
+ _context20.next = 17;
1794
1823
  break;
1795
1824
  }
1796
1825
 
1797
- _context21.next = 16;
1798
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context21.t0);
1826
+ _context20.next = 16;
1827
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context20.t0);
1799
1828
 
1800
1829
  case 16:
1801
- _this10.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, {
1830
+ _this9.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, {
1802
1831
  RequestId: requestId,
1803
- ExceptionDetails: _context21.t0,
1832
+ ExceptionDetails: _context20.t0,
1804
1833
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds11
1805
1834
  }, "Get Chat Transcript Failed");
1806
1835
 
1807
1836
  case 17:
1808
- reject(_context21.t0);
1837
+ reject(_context20.t0);
1809
1838
 
1810
1839
  case 18:
1811
1840
  case "end":
1812
- return _context21.stop();
1841
+ return _context20.stop();
1813
1842
  }
1814
1843
  }
1815
- }, _callee21, null, [[0, 10]]);
1844
+ }, _callee20, null, [[0, 10]]);
1816
1845
  }));
1817
1846
 
1818
- return function (_x36, _x37) {
1819
- return _ref10.apply(this, arguments);
1847
+ return function (_x34, _x35) {
1848
+ return _ref9.apply(this, arguments);
1820
1849
  };
1821
1850
  }()));
1822
1851
 
1823
1852
  case 14:
1824
1853
  case "end":
1825
- return _context22.stop();
1854
+ return _context21.stop();
1826
1855
  }
1827
1856
  }
1828
- }, _callee22, this);
1857
+ }, _callee21, this);
1829
1858
  }));
1830
1859
 
1831
- function getChatTranscripts(_x33, _x34, _x35) {
1860
+ function getChatTranscripts(_x31, _x32, _x33) {
1832
1861
  return _getChatTranscripts.apply(this, arguments);
1833
1862
  }
1834
1863
 
@@ -1845,8 +1874,8 @@ var SDK = /*#__PURE__*/function () {
1845
1874
  }, {
1846
1875
  key: "emailTranscript",
1847
1876
  value: function () {
1848
- var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(requestId, token, emailRequestBody) {
1849
- var _this11 = this;
1877
+ var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, token, emailRequestBody) {
1878
+ var _this10 = this;
1850
1879
 
1851
1880
  var emailTranscriptOptionalParams,
1852
1881
  timer,
@@ -1855,12 +1884,12 @@ var SDK = /*#__PURE__*/function () {
1855
1884
  authenticatedUserToken,
1856
1885
  headers,
1857
1886
  options,
1858
- _args24 = arguments;
1859
- return _regenerator["default"].wrap(function _callee24$(_context24) {
1887
+ _args23 = arguments;
1888
+ return _regenerator["default"].wrap(function _callee23$(_context23) {
1860
1889
  while (1) {
1861
- switch (_context24.prev = _context24.next) {
1890
+ switch (_context23.prev = _context23.next) {
1862
1891
  case 0:
1863
- emailTranscriptOptionalParams = _args24.length > 3 && _args24[3] !== undefined ? _args24[3] : {};
1892
+ emailTranscriptOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
1864
1893
  timer = _Timer.Timer.TIMER();
1865
1894
 
1866
1895
  if (this.logger) {
@@ -1890,24 +1919,24 @@ var SDK = /*#__PURE__*/function () {
1890
1919
  method: "POST",
1891
1920
  url: endpoint
1892
1921
  };
1893
- return _context24.abrupt("return", new Promise( /*#__PURE__*/function () {
1894
- var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(resolve, reject) {
1922
+ return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
1923
+ var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
1895
1924
  var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1896
1925
 
1897
- return _regenerator["default"].wrap(function _callee23$(_context23) {
1926
+ return _regenerator["default"].wrap(function _callee22$(_context22) {
1898
1927
  while (1) {
1899
- switch (_context23.prev = _context23.next) {
1928
+ switch (_context22.prev = _context22.next) {
1900
1929
  case 0:
1901
- _context23.prev = 0;
1902
- _context23.next = 3;
1930
+ _context22.prev = 0;
1931
+ _context22.next = 3;
1903
1932
  return axiosInstance(options);
1904
1933
 
1905
1934
  case 3:
1906
- response = _context23.sent;
1935
+ response = _context22.sent;
1907
1936
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1908
1937
 
1909
- if (_this11.logger) {
1910
- _this11.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, {
1938
+ if (_this10.logger) {
1939
+ _this10.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, {
1911
1940
  RequestId: requestId,
1912
1941
  Region: response.data.Region,
1913
1942
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -1916,26 +1945,26 @@ var SDK = /*#__PURE__*/function () {
1916
1945
  }
1917
1946
 
1918
1947
  resolve();
1919
- _context23.next = 17;
1948
+ _context22.next = 17;
1920
1949
  break;
1921
1950
 
1922
1951
  case 9:
1923
- _context23.prev = 9;
1924
- _context23.t0 = _context23["catch"](0);
1952
+ _context22.prev = 9;
1953
+ _context22.t0 = _context22["catch"](0);
1925
1954
  _elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
1926
1955
 
1927
- if (!_this11.logger) {
1928
- _context23.next = 16;
1956
+ if (!_this10.logger) {
1957
+ _context22.next = 16;
1929
1958
  break;
1930
1959
  }
1931
1960
 
1932
- _context23.next = 15;
1933
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context23.t0);
1961
+ _context22.next = 15;
1962
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context22.t0);
1934
1963
 
1935
1964
  case 15:
1936
- _this11.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, {
1965
+ _this10.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, {
1937
1966
  RequestId: requestId,
1938
- ExceptionDetails: _context23.t0,
1967
+ ExceptionDetails: _context22.t0,
1939
1968
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds12
1940
1969
  }, "Email Transcript Failed");
1941
1970
 
@@ -1944,26 +1973,26 @@ var SDK = /*#__PURE__*/function () {
1944
1973
 
1945
1974
  case 17:
1946
1975
  case "end":
1947
- return _context23.stop();
1976
+ return _context22.stop();
1948
1977
  }
1949
1978
  }
1950
- }, _callee23, null, [[0, 9]]);
1979
+ }, _callee22, null, [[0, 9]]);
1951
1980
  }));
1952
1981
 
1953
- return function (_x41, _x42) {
1954
- return _ref11.apply(this, arguments);
1982
+ return function (_x39, _x40) {
1983
+ return _ref10.apply(this, arguments);
1955
1984
  };
1956
1985
  }()));
1957
1986
 
1958
1987
  case 14:
1959
1988
  case "end":
1960
- return _context24.stop();
1989
+ return _context23.stop();
1961
1990
  }
1962
1991
  }
1963
- }, _callee24, this);
1992
+ }, _callee23, this);
1964
1993
  }));
1965
1994
 
1966
- function emailTranscript(_x38, _x39, _x40) {
1995
+ function emailTranscript(_x36, _x37, _x38) {
1967
1996
  return _emailTranscript.apply(this, arguments);
1968
1997
  }
1969
1998
 
@@ -1977,13 +2006,13 @@ var SDK = /*#__PURE__*/function () {
1977
2006
  }, {
1978
2007
  key: "fetchDataMaskingInfo",
1979
2008
  value: function () {
1980
- var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId) {
1981
- var _this12 = this;
2009
+ var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId) {
2010
+ var _this11 = this;
1982
2011
 
1983
2012
  var timer, endpoint, axiosInstance, headers, options;
1984
- return _regenerator["default"].wrap(function _callee26$(_context26) {
2013
+ return _regenerator["default"].wrap(function _callee25$(_context25) {
1985
2014
  while (1) {
1986
- switch (_context26.prev = _context26.next) {
2015
+ switch (_context25.prev = _context25.next) {
1987
2016
  case 0:
1988
2017
  timer = _Timer.Timer.TIMER();
1989
2018
 
@@ -2010,25 +2039,25 @@ var SDK = /*#__PURE__*/function () {
2010
2039
  method: "GET",
2011
2040
  url: endpoint
2012
2041
  };
2013
- return _context26.abrupt("return", new Promise( /*#__PURE__*/function () {
2014
- var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(resolve, reject) {
2042
+ return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
2043
+ var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
2015
2044
  var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds13;
2016
2045
 
2017
- return _regenerator["default"].wrap(function _callee25$(_context25) {
2046
+ return _regenerator["default"].wrap(function _callee24$(_context24) {
2018
2047
  while (1) {
2019
- switch (_context25.prev = _context25.next) {
2048
+ switch (_context24.prev = _context24.next) {
2020
2049
  case 0:
2021
- _context25.prev = 0;
2022
- _context25.next = 3;
2050
+ _context24.prev = 0;
2051
+ _context24.next = 3;
2023
2052
  return axiosInstance(options);
2024
2053
 
2025
2054
  case 3:
2026
- response = _context25.sent;
2055
+ response = _context24.sent;
2027
2056
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2028
2057
  data = response.data;
2029
2058
 
2030
- if (_this12.logger) {
2031
- _this12.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, {
2059
+ if (_this11.logger) {
2060
+ _this11.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, {
2032
2061
  RequestId: requestId,
2033
2062
  Region: response.data.Region,
2034
2063
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -2037,26 +2066,26 @@ var SDK = /*#__PURE__*/function () {
2037
2066
  }
2038
2067
 
2039
2068
  resolve(data);
2040
- _context25.next = 18;
2069
+ _context24.next = 18;
2041
2070
  break;
2042
2071
 
2043
2072
  case 10:
2044
- _context25.prev = 10;
2045
- _context25.t0 = _context25["catch"](0);
2073
+ _context24.prev = 10;
2074
+ _context24.t0 = _context24["catch"](0);
2046
2075
  _elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
2047
2076
 
2048
- if (!_this12.logger) {
2049
- _context25.next = 17;
2077
+ if (!_this11.logger) {
2078
+ _context24.next = 17;
2050
2079
  break;
2051
2080
  }
2052
2081
 
2053
- _context25.next = 16;
2054
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context25.t0);
2082
+ _context24.next = 16;
2083
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context24.t0);
2055
2084
 
2056
2085
  case 16:
2057
- _this12.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, {
2086
+ _this11.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, {
2058
2087
  RequestId: requestId,
2059
- ExceptionDetails: _context25.t0,
2088
+ ExceptionDetails: _context24.t0,
2060
2089
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds13
2061
2090
  }, "Fetch Data Masking Failed");
2062
2091
 
@@ -2065,26 +2094,26 @@ var SDK = /*#__PURE__*/function () {
2065
2094
 
2066
2095
  case 18:
2067
2096
  case "end":
2068
- return _context25.stop();
2097
+ return _context24.stop();
2069
2098
  }
2070
2099
  }
2071
- }, _callee25, null, [[0, 10]]);
2100
+ }, _callee24, null, [[0, 10]]);
2072
2101
  }));
2073
2102
 
2074
- return function (_x44, _x45) {
2075
- return _ref12.apply(this, arguments);
2103
+ return function (_x42, _x43) {
2104
+ return _ref11.apply(this, arguments);
2076
2105
  };
2077
2106
  }()));
2078
2107
 
2079
2108
  case 11:
2080
2109
  case "end":
2081
- return _context26.stop();
2110
+ return _context25.stop();
2082
2111
  }
2083
2112
  }
2084
- }, _callee26, this);
2113
+ }, _callee25, this);
2085
2114
  }));
2086
2115
 
2087
- function fetchDataMaskingInfo(_x43) {
2116
+ function fetchDataMaskingInfo(_x41) {
2088
2117
  return _fetchDataMaskingInfo.apply(this, arguments);
2089
2118
  }
2090
2119
 
@@ -2100,7 +2129,7 @@ var SDK = /*#__PURE__*/function () {
2100
2129
  }, {
2101
2130
  key: "makeSecondaryChannelEventRequest",
2102
2131
  value: function () {
2103
- var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId, secondaryChannelEventRequestBody) {
2132
+ var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, secondaryChannelEventRequestBody) {
2104
2133
  var secondaryChannelEventOptionalParams,
2105
2134
  timer,
2106
2135
  endpoint,
@@ -2112,13 +2141,13 @@ var SDK = /*#__PURE__*/function () {
2112
2141
  elapsedTimeInMilliseconds,
2113
2142
  data,
2114
2143
  _elapsedTimeInMilliseconds14,
2115
- _args27 = arguments;
2144
+ _args26 = arguments;
2116
2145
 
2117
- return _regenerator["default"].wrap(function _callee27$(_context27) {
2146
+ return _regenerator["default"].wrap(function _callee26$(_context26) {
2118
2147
  while (1) {
2119
- switch (_context27.prev = _context27.next) {
2148
+ switch (_context26.prev = _context26.next) {
2120
2149
  case 0:
2121
- secondaryChannelEventOptionalParams = _args27.length > 2 && _args27[2] !== undefined ? _args27[2] : {};
2150
+ secondaryChannelEventOptionalParams = _args26.length > 2 && _args26[2] !== undefined ? _args26[2] : {};
2122
2151
  timer = _Timer.Timer.TIMER();
2123
2152
 
2124
2153
  if (this.logger) {
@@ -2148,12 +2177,12 @@ var SDK = /*#__PURE__*/function () {
2148
2177
  method: "POST",
2149
2178
  url: endpoint
2150
2179
  };
2151
- _context27.prev = 12;
2152
- _context27.next = 15;
2180
+ _context26.prev = 12;
2181
+ _context26.next = 15;
2153
2182
  return axiosInstance(options);
2154
2183
 
2155
2184
  case 15:
2156
- response = _context27.sent;
2185
+ response = _context26.sent;
2157
2186
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2158
2187
  data = response.data;
2159
2188
 
@@ -2166,41 +2195,41 @@ var SDK = /*#__PURE__*/function () {
2166
2195
  }, "Secondary Channel Event Request Succeeded");
2167
2196
  }
2168
2197
 
2169
- _context27.next = 29;
2198
+ _context26.next = 29;
2170
2199
  break;
2171
2200
 
2172
2201
  case 21:
2173
- _context27.prev = 21;
2174
- _context27.t0 = _context27["catch"](12);
2202
+ _context26.prev = 21;
2203
+ _context26.t0 = _context26["catch"](12);
2175
2204
  _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
2176
2205
 
2177
2206
  if (!this.logger) {
2178
- _context27.next = 28;
2207
+ _context26.next = 28;
2179
2208
  break;
2180
2209
  }
2181
2210
 
2182
- _context27.next = 27;
2183
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context27.t0);
2211
+ _context26.next = 27;
2212
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context26.t0);
2184
2213
 
2185
2214
  case 27:
2186
2215
  this.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, {
2187
2216
  RequestId: requestId,
2188
- ExceptionDetails: _context27.t0,
2217
+ ExceptionDetails: _context26.t0,
2189
2218
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds14
2190
2219
  }, "Secondary Channel Event Request Failed");
2191
2220
 
2192
2221
  case 28:
2193
- throw _context27.t0;
2222
+ throw _context26.t0;
2194
2223
 
2195
2224
  case 29:
2196
2225
  case "end":
2197
- return _context27.stop();
2226
+ return _context26.stop();
2198
2227
  }
2199
2228
  }
2200
- }, _callee27, this, [[12, 21]]);
2229
+ }, _callee26, this, [[12, 21]]);
2201
2230
  }));
2202
2231
 
2203
- function makeSecondaryChannelEventRequest(_x46, _x47) {
2232
+ function makeSecondaryChannelEventRequest(_x44, _x45) {
2204
2233
  return _makeSecondaryChannelEventRequest.apply(this, arguments);
2205
2234
  }
2206
2235
 
@@ -2213,8 +2242,8 @@ var SDK = /*#__PURE__*/function () {
2213
2242
  }, {
2214
2243
  key: "sendTypingIndicator",
2215
2244
  value: function () {
2216
- var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, currentLiveChatVersion) {
2217
- var _this13 = this;
2245
+ var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId, currentLiveChatVersion) {
2246
+ var _this12 = this;
2218
2247
 
2219
2248
  var sendTypingIndicatorOptionalParams,
2220
2249
  timer,
@@ -2223,26 +2252,26 @@ var SDK = /*#__PURE__*/function () {
2223
2252
  axiosInstance,
2224
2253
  headers,
2225
2254
  options,
2226
- _args29 = arguments;
2227
- return _regenerator["default"].wrap(function _callee29$(_context29) {
2255
+ _args28 = arguments;
2256
+ return _regenerator["default"].wrap(function _callee28$(_context28) {
2228
2257
  while (1) {
2229
- switch (_context29.prev = _context29.next) {
2258
+ switch (_context28.prev = _context28.next) {
2230
2259
  case 0:
2231
- sendTypingIndicatorOptionalParams = _args29.length > 2 && _args29[2] !== undefined ? _args29[2] : {};
2260
+ sendTypingIndicatorOptionalParams = _args28.length > 2 && _args28[2] !== undefined ? _args28[2] : {};
2232
2261
 
2233
2262
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2234
- _context29.next = 3;
2263
+ _context28.next = 3;
2235
2264
  break;
2236
2265
  }
2237
2266
 
2238
- return _context29.abrupt("return", Promise.resolve());
2267
+ return _context28.abrupt("return", Promise.resolve());
2239
2268
 
2240
2269
  case 3:
2241
2270
  timer = _Timer.Timer.TIMER();
2242
2271
  customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
2243
2272
 
2244
2273
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2245
- _context29.next = 7;
2274
+ _context28.next = 7;
2246
2275
  break;
2247
2276
  }
2248
2277
 
@@ -2263,25 +2292,25 @@ var SDK = /*#__PURE__*/function () {
2263
2292
  method: "POST",
2264
2293
  url: endpoint
2265
2294
  };
2266
- return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
2267
- var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
2295
+ return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
2296
+ var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
2268
2297
  var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds15;
2269
2298
 
2270
- return _regenerator["default"].wrap(function _callee28$(_context28) {
2299
+ return _regenerator["default"].wrap(function _callee27$(_context27) {
2271
2300
  while (1) {
2272
- switch (_context28.prev = _context28.next) {
2301
+ switch (_context27.prev = _context27.next) {
2273
2302
  case 0:
2274
- _context28.prev = 0;
2275
- _context28.next = 3;
2303
+ _context27.prev = 0;
2304
+ _context27.next = 3;
2276
2305
  return axiosInstance(options);
2277
2306
 
2278
2307
  case 3:
2279
- response = _context28.sent;
2308
+ response = _context27.sent;
2280
2309
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2281
2310
  data = response.data;
2282
2311
 
2283
- if (_this13.logger) {
2284
- _this13.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, {
2312
+ if (_this12.logger) {
2313
+ _this12.logger.log(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, {
2285
2314
  RequestId: requestId,
2286
2315
  Region: data.Region,
2287
2316
  ElapsedTimeInMilliseconds: elapsedTimeInMilliseconds,
@@ -2290,54 +2319,54 @@ var SDK = /*#__PURE__*/function () {
2290
2319
  }
2291
2320
 
2292
2321
  resolve();
2293
- _context28.next = 18;
2322
+ _context27.next = 18;
2294
2323
  break;
2295
2324
 
2296
2325
  case 10:
2297
- _context28.prev = 10;
2298
- _context28.t0 = _context28["catch"](0);
2326
+ _context27.prev = 10;
2327
+ _context27.t0 = _context27["catch"](0);
2299
2328
  _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2300
2329
 
2301
- if (!_this13.logger) {
2302
- _context28.next = 17;
2330
+ if (!_this12.logger) {
2331
+ _context27.next = 17;
2303
2332
  break;
2304
2333
  }
2305
2334
 
2306
- _context28.next = 16;
2307
- return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context28.t0);
2335
+ _context27.next = 16;
2336
+ return _LoggingSanitizer.LoggingSanitizer.stripErrorSensitiveProperties(_context27.t0);
2308
2337
 
2309
2338
  case 16:
2310
- _this13.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, {
2339
+ _this12.logger.log(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, {
2311
2340
  RequestId: requestId,
2312
- ExceptionDetails: _context28.t0,
2341
+ ExceptionDetails: _context27.t0,
2313
2342
  ElapsedTimeInMilliseconds: _elapsedTimeInMilliseconds15
2314
2343
  }, "Send Typing Indicator Failed");
2315
2344
 
2316
2345
  case 17:
2317
- reject(_context28.t0);
2346
+ reject(_context27.t0);
2318
2347
 
2319
2348
  case 18:
2320
2349
  case "end":
2321
- return _context28.stop();
2350
+ return _context27.stop();
2322
2351
  }
2323
2352
  }
2324
- }, _callee28, null, [[0, 10]]);
2353
+ }, _callee27, null, [[0, 10]]);
2325
2354
  }));
2326
2355
 
2327
- return function (_x50, _x51) {
2328
- return _ref13.apply(this, arguments);
2356
+ return function (_x48, _x49) {
2357
+ return _ref12.apply(this, arguments);
2329
2358
  };
2330
2359
  }()));
2331
2360
 
2332
2361
  case 14:
2333
2362
  case "end":
2334
- return _context29.stop();
2363
+ return _context28.stop();
2335
2364
  }
2336
2365
  }
2337
- }, _callee29, this);
2366
+ }, _callee28, this);
2338
2367
  }));
2339
2368
 
2340
- function sendTypingIndicator(_x48, _x49) {
2369
+ function sendTypingIndicator(_x46, _x47) {
2341
2370
  return _sendTypingIndicator.apply(this, arguments);
2342
2371
  }
2343
2372
 
@@ -2353,4 +2382,4 @@ exports["default"] = SDK;
2353
2382
  getChatTokenTimeBetweenRetriesOnFailure: 10000,
2354
2383
  maxRequestRetriesOnFailure: 3
2355
2384
  });
2356
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJhdXRoQ2hhdEV4aXN0IiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQiLCJFcnJvckNvZGUiLCJwb3N0Q2hhdFJlc3BvbnNlIiwic3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIiwiU1VCTUlUUE9TVENIQVRTVEFSVEVEIiwiTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGgiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aCIsImRlZmF1bHRDaGFubmVsSWQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVEIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCIsInNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyIsImN1c3RvbWVyRGlzcGxheU5hbWUiLCJTZW5kVHlwaW5nSW5kaWNhdG9yUGF0aCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7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NkNDLGdDQUFBQSx5QkFBeUIsRUFBRU4seUJBQXhFO0FBQW1HTyxnQ0FBQUEsYUFBYSxFQUFFUixRQUFRLENBQUNILE9BQVQsQ0FBaUIsZ0JBQWpCO0FBQWxILCtCQUZGLEVBR0UsaUNBSEY7QUFJRDs7QUFDRHdCLDRCQUFBQSxPQUFPO0FBWFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVHBCLDRCQUFBQSw0QkFiUyxHQWFtQnhCLEtBQUssQ0FBQ3lCLG1CQWJ6Qjs7QUFBQSxpQ0FjWCxPQUFJLENBQUM1QyxNQWRNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUNBZVBrRSxtQ0FBaUJDLDZCQUFqQixlQWZPOztBQUFBO0FBZ0JiLDRCQUFBLE9BQUksQ0FBQ25FLE1BQUwsQ0FBWXNCLEdBQVosQ0FBZ0JDLG1CQUFTNkMsS0FBekIsRUFDRTNDLDJCQUFvQndMLHlCQUR0QixFQUVFO0FBQUV0TCw4QkFBQUEsU0FBUyxFQUFFVixTQUFiO0FBQXdCcUQsOEJBQUFBLGdCQUFnQixlQUF4QztBQUFpRHJCLDhCQUFBQSx5QkFBeUIsRUFBRU47QUFBNUUsNkJBRkYsRUFHRSw4QkFIRjs7QUFoQmE7QUFxQmZxQiw0QkFBQUEsTUFBTSxlQUFOOztBQXJCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkF0QlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7Ozs7OztpQ0E5aENtQnBFLEcsMEJBQ3NDO0FBQ3ZEdUYsRUFBQUEsc0JBQXNCLEVBQUUsRUFEK0I7QUFFdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBRmM7QUFHdkRsRCxFQUFBQSwwQkFBMEIsRUFBRTtBQUgyQixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDM1LFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDNcbiAgfTtcbiAgXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gU0RLQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBDb25maWcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQoZW5kcG9pbnQsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24gJiYgZGF0YS5MaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICB9XG4gICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VTUyxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVyczsgIFxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBlbmRwb2ludCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG4gICAgZW5kcG9pbnQgKz0gYD9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLldBUk4sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IHN0YXJ0ZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7YXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgY29uc3QgY2FjaE9iaiA9IHtcbiAgICAgIFwib3JnSWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQsXG4gICAgICBcIndpZGdldElkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkXG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgY29uc3QgdGVtcEFyciA9IEN1c3RvbUNvbnRleHREYXRhLnNvcnQoZGF0YS5jdXN0b21Db250ZXh0RGF0YSk7XG4gICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHtcImN1c3RvbUNvbnRleHRcIjogdGVtcEFycn0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgICBPYmplY3QuYXNzaWduKGNhY2hPYmosIHtcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7ZGF0YX0gPSByZXNwb25zZTtcbiAgICAgICAgaWYoZGF0YSkge1xuICAgICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3VjY2VlZGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBmYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTZXNzaW9uIEluaXQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWR9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKGlzUmVjb25uZWN0Q2hhdCkge1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1JlY29ubmVjdENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgaWYgKGlzUGVyc2lzdGVudENoYXQpe1xuICAgICAgZW5kcG9pbnQgKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3VjY2VlZGVkXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dnZXI/LmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0sIEVycm9yQ29kZTogcmVzcG9uc2Uuc3RhdHVzfSxcbiAgICAgICAgICBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZFwiKTtcbiAgICAgICAgaWYgKGVycm9yLnRvU3RyaW5nKCkgPT09IFwiRXJyb3I6IFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgNDA0XCIpIHsgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbiApIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyB9LFxuICAgICAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSl7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDsgICAgICBcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoZW1haWxSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgfVxuXG4gICAgZW5kcG9pbnQgKz0gXCI/Y2hhbm5lbElkPVwiICsgQ29uc3RhbnRzLmRlZmF1bHRDaGFubmVsSWQ7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4geyAgIFxuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSJdfQ==
2385
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiRXJyb3IiLCJjaGFubmVsSWQiLCJ2YWx1ZXMiLCJDaGFubmVsSWQiLCJpbmNsdWRlcyIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZyIsIkxvZ0xldmVsIiwiSU5GTyIsIk9DU0RLVGVsZW1ldHJ5RXZlbnQiLCJHRVRDSEFUQ09ORklHIiwiUmVxdWVzdElkIiwiZW5kcG9pbnQiLCJvcmdVcmwiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJoZWFkZXJzIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJWMiIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsIm1ldGhvZCIsInVybCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJFeGNlcHRpb25EZXRhaWxzIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwiR0VUQ0hBVFRPS0VOU1VDQ0VFREVEIiwic3RhdHVzIiwibm9Db250ZW50U3RhdHVzQ29kZSIsIkdFVENIQVRUT0tFTkZBSUxFRCIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJzZXRUaW1lb3V0IiwiZ2V0Q2hhdFRva2VuIiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwidHJhbnNhY3Rpb25pZCIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiaW5pdENvbnRleHQiLCJnZXRDb250ZXh0IiwiY2FjaE9iaiIsImN1c3RvbUNvbnRleHREYXRhIiwidGVtcEFyciIsIkN1c3RvbUNvbnRleHREYXRhIiwic29ydCIsImFzc2lnbiIsInBvcnRhbGNvbnRhY3RpZCIsImNhY2hlS2V5IiwiaGFzaCIsImNyZWF0ZUhhc2giLCJ1cGRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlnZXN0IiwidG9TdHJpbmciLCJ3aW5kb3ciLCJkb2N1bWVudCIsImJyb3dzZXIiLCJCcm93c2VySW5mbyIsImdldEJyb3dzZXJOYW1lIiwiZGV2aWNlIiwiRGV2aWNlSW5mbyIsImdldERldmljZVR5cGUiLCJvcmlnaW51cmwiLCJsb2NhdGlvbiIsImhyZWYiLCJvcyIsIk9TSW5mbyIsImdldE9zVHlwZSIsImxvY2FsZSIsImRlZmF1bHRMb2NhbGUiLCJMb2NhbGVzIiwic3VwcG9ydGVkTG9jYWxlcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiZGVzY3JpcHRpb24iLCJjdXN0b21EYXRhIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsInF1ZXJ5UGFyYW1zIiwicmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJSZXF1ZXN0UGF5bG9hZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsIkVycm9yQ29kZSIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsIkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVEIiwidG9rZW4iLCJnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyIsIkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwib3JnYW5pemF0aW9uSWQiLCJhdXRob3JpemF0aW9uIiwiTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJHRVRDSEFUVFJBTlNDUklQVEZBSUxFRCIsImVtYWlsUmVxdWVzdEJvZHkiLCJlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyIsIkVNQUlMVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJFTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQiLCJFTUFJTFRSQU5TQ1JJUFRGQUlMRUQiLCJGRVRDSERBVEFNQVNLSU5HU1RBUlRFRCIsIkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRoIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRXFCQSxHO0FBU25CLGVBQTJCQyx3QkFBM0IsRUFBbUw7QUFBQSxRQUEzRkMsYUFBMkYsdUVBQXhERixHQUFHLENBQUNHLG9CQUFvRDtBQUFBLFFBQXRCQyxNQUFzQjtBQUFBO0FBQUEsU0FBeEpILHdCQUF3SixHQUF4SkEsd0JBQXdKO0FBQUEsU0FBM0ZDLGFBQTJGLEdBQTNGQSxhQUEyRjtBQUFBLFNBQXRCRSxNQUFzQixHQUF0QkEsTUFBc0I7QUFBQTs7QUFDakw7QUFDQSxRQUFJLENBQUNDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLEtBQUtKLGFBQWpCLEVBQWdDSyxNQUFqQyxJQUEyQyx5QkFBUUwsYUFBUixNQUEyQixRQUExRSxFQUFvRjtBQUNsRixXQUFLQSxhQUFMLEdBQXFCRixHQUFHLENBQUNHLG9CQUF6QjtBQUNELEtBSmdMLENBTWpMOzs7QUFDQSxvQ0FBa0JFLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZTixHQUFHLENBQUNHLG9CQUFoQixDQUFsQixrQ0FBeUQ7QUFBcEQsVUFBTUssR0FBRyxtQkFBVDs7QUFDSCxVQUFJLENBQUMsS0FBS04sYUFBTCxDQUFtQk8sY0FBbkIsQ0FBa0NELEdBQWxDLENBQUwsRUFBNkM7QUFBRTtBQUM3QyxjQUFNLElBQUlFLEtBQUosb0JBQXNCRixHQUF0QiwyQkFBTjtBQUNEO0FBQ0YsS0FYZ0wsQ0Fhakw7OztBQUNBLFFBQVFHLFNBQVIsR0FBc0JWLHdCQUF0QixDQUFR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K0I7QUFFdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBRmM7QUFHdkRsRCxFQUFBQSwwQkFBMEIsRUFBRTtBQUgyQixDIiwic291cmNlUm9vdCI6Im9jc2RrOi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uIH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnIH0gZnJvbSBcImF4aW9zXCI7XG5pbXBvcnQgeyBCcm93c2VySW5mbyB9IGZyb20gXCIuL1V0aWxzL0Jyb3dzZXJJbmZvXCI7XG5pbXBvcnQgQ29uc3RhbnRzIGZyb20gXCIuL0NvbW1vbi9Db25zdGFudHNcIjtcbmltcG9ydCB7IERldmljZUluZm8gfSBmcm9tIFwiLi9VdGlscy9EZXZpY2VJbmZvXCI7XG5pbXBvcnQgRmV0Y2hDaGF0VG9rZW5SZXNwb25zZSBmcm9tIFwiLi9Nb2RlbC9GZXRjaENoYXRUb2tlblJlc3BvbnNlXCI7XG5pbXBvcnQgSURhdGFNYXNraW5nSW5mbyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lEYXRhTWFza2luZ0luZm9cIjtcbmltcG9ydCBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JT21uaWNoYW5uZWxDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXNcIjtcbmltcG9ydCBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtc1wiXG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJbml0Q29udGV4dCBmcm9tIFwiLi9Nb2RlbC9Jbml0Q29udGV4dFwiO1xuaW1wb3J0IExvY2FsZXMgZnJvbSBcIi4vQ29tbW9uL0xvY2FsZXNcIjtcbmltcG9ydCB7IExvZ2dpbmdTYW5pdGl6ZXIgfSBmcm9tIFwiLi9VdGlscy9Mb2dnaW5nU2FuaXRpemVyXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgT0NTREtMb2dnZXIgZnJvbSBcIi4vQ29tbW9uL09DU0RLTG9nZ2VyXCI7XG5pbXBvcnQgeyBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgeyBPU0luZm8gfSBmcm9tIFwiLi9VdGlscy9PU0luZm9cIjtcbmltcG9ydCBPbW5pY2hhbm5lbEVuZHBvaW50cyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxFbmRwb2ludHNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEhUVFBIZWFkZXJzXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBTdHJpbmdNYXAgfSBmcm9tIFwiLi9Db21tb24vTWFwcGluZ3NcIjtcbmltcG9ydCB7IFRpbWVyIH0gZnJvbSBcIi4vVXRpbHMvVGltZXJcIjtcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gXCIuL1V0aWxzL2F4aW9zUmV0cnlcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCAqIGFzIGhhc2ggZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDM1LFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDNcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIFNES0NvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjaGFubmVsSWRcbiAgICBjb25zdCB7IGNoYW5uZWxJZCB9ID0gb21uaWNoYW5uZWxDb25maWd1cmF0aW9uO1xuICAgIGlmICghT2JqZWN0LnZhbHVlcyhDaGFubmVsSWQpLmluY2x1ZGVzKGNoYW5uZWxJZCBhcyBDaGFubmVsSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhbm5lbElkYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgT0MgY29uZmlnXG4gICAgY29uc3QgY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMgPSBPYmplY3Qua2V5cyhvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24pO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIENvbnN0YW50cy5yZXF1aXJlZE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMpIHtcbiAgICAgIGlmICghY3VycmVudE9tbmljaGFubmVsQ29uZmlndXJhdGlvblBhcmFtZXRlcnMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgJyR7a2V5fScgaW4gT21uaWNoYW5uZWxDb25maWd1cmF0aW9uYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBMaXZlQ2hhdFZlcnNpb24uVjE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBjaGF0IGNvbmZpZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0Q29uZmlnKHJlcXVlc3RJZDogc3RyaW5nLCBieXBhc3NDYWNoZSA9IGZhbHNlKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBDb25maWcgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQoZW5kcG9pbnQsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICBpZiAoZGF0YS5MaXZlQ2hhdFZlcnNpb24gJiYgZGF0YS5MaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgdGhpcy5saXZlQ2hhdFZlcnNpb24gPSBkYXRhLkxpdmVDaGF0VmVyc2lvbjtcbiAgICB9XG4gICAgZGF0YS5oZWFkZXJzID0ge307XG4gICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHU1VDQ0VTUyxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICAvLyBjb25zdHJ1Y3QgYSBlbmRwb2ludCBmb3IgYW5vbnltb3VzIGNoYXRzIHRvIGdldCBMV0kgRGV0YWlsc1xuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgIH1cbiAgICBlbmRwb2ludCArPSBgP2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBSZWdpb246IHJlc3BvbnNlLmRhdGEuUmVnaW9uLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCBUcmFuc2FjdGlvbklkOiByZXNwb25zZS5oZWFkZXJzW1widHJhbnNhY3Rpb24taWRcIl0gfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUb2tlbiBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY3VycmVudFJldHJ5Q291bnRgKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldENoYXRUb2tlblBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICBlbmRwb2ludCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG4gICAgZW5kcG9pbnQgKz0gYD9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVUNDRUVERUQsXG4gICAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRva2VuIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyByZWNvbm5lY3RhYmxlIGNoYXRzIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIGluIHRoZSBvbGQgc2Vzc2lvbnMgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsXG4gICAgICAgICAgICB7IEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICAgKiBAcGFyYW0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIE1hbmRhdGUgcGFyYW1ldGVycyBmb3IgZ2V0IHJlY29ubmVjdGFibGUgY2hhdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdGFydGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZWNvbm5lY3RJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksXG4gICAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgICAgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLldBUk4sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSxcbiAgICAgICAgICAgIHsgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0gfSxcbiAgICAgICAgICAgIFwiR2V0IFJlY29ubmVjdCBhdmFpbGFiaWxpdHkgZGlkbid0IHNlbmQgYW55IHZhbGlkIGRhdGEuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLFxuICAgICAgICAgICAgeyBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3RhcnRlZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHthdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyfSk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEucG9ydGFsY29udGFjdGlkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwge1wicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkfSk7XG4gICAgfVxuXG4gICAgZGF0YS5jYWNoZUtleSA9IGhhc2guY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKEpTT04uc3RyaW5naWZ5KGNhY2hPYmopKS5kaWdlc3QoJ2hleCcpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHtkYXRhfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCxcbiAgICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICAgIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdWNjZWVkZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgU3RhcnRlZFwiO1xuICAgICAgY29uc3QgY3VzdG9tRGF0YSA9IHtcbiAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG5cbiAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsuLi5kYXRhfTtcblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbixcbiAgICAgICAgICBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSxcbiAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCI7XG5cbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9IHsuLi5kYXRhfTtcblxuICAgICAgICBpZiAocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMocmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICAgIExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBQcmVDaGF0UmVzcG9uc2UocmVxdWVzdFBheWxvYWQucHJlQ2hhdFJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuXG4gICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBSZXF1ZXN0UGF5bG9hZDogcmVxdWVzdFBheWxvYWQsXG4gICAgICAgICAgUmVxdWVzdFBhdGg6IHJlcXVlc3RQYXRoLFxuICAgICAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlLnN0YXR1cyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IFwiU2Vzc2lvbiBJbml0IEZhaWxlZFwiO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIGN1c3RvbURhdGEsIGRlc2NyaXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIGVuZHBvaW50ICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KXtcbiAgICAgIGVuZHBvaW50ICs9IGAmaXNQZXJzaXN0ZW50Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gQ2xvc2UgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRUZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgICAgICBcIlNlc3Npb24gQ2xvc2UgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY2hhdElkIH0gPSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9nZ2VyPy5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsXG4gICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdLCBFcnJvckNvZGU6IHJlc3BvbnNlLnN0YXR1c30sXG4gICAgICAgICAgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICB0aGlzLmxvZ2dlcj8ubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIH0sXG4gICAgICAgIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWRcIik7XG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VibWl0UG9zdENoYXRSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgcG9zdENoYXRSZXNwb25zZTogb2JqZWN0LCBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IElTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJTdWJtaXQgUG9zdCBDaGF0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsXG4gICAgICAgICAgICB7IFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCxcbiAgICAgICAgICAgIHsgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgfSxcbiAgICAgICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYXQgdHJhbnNjcmlwdHMgZm9yIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRyYW5zY3JpcHRzKHJlcXVlc3RJZDogc3RyaW5nLCBjaGF0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsXG4gICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQgfSxcbiAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGxldCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpe1xuICAgICAgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIHVybDogZW5kcG9pbnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN1Y2NlZWRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQsXG4gICAgICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkLCBFeGNlcHRpb25EZXRhaWxzOiBlcnJvciwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kc30sXG4gICAgICAgICAgICBcIkdldCBDaGF0IFRyYW5zY3JpcHQgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiByZXNwb25zZS5kYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIkVtYWlsIFRyYW5zY3JpcHQgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICBhd2FpdCBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiRW1haWwgVHJhbnNjcmlwdCBGYWlsZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELFxuICAgICAgICB7IFJlcXVlc3RJZDogcmVxdWVzdElkIH0sXG4gICAgICAgIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIik7XG4gICAgfVxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogcmVzcG9uc2UuZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3VjY2VlZGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLkVSUk9SLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHN9LFxuICAgICAgICAgICAgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCxcbiAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCB9LFxuICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IGVuZHBvaW50ID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfS8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBlbmRwb2ludCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0vJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIGVuZHBvaW50ICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICB1cmw6IGVuZHBvaW50XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICBpZiAodGhpcy5sb2dnZXIpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIFJlZ2lvbjogZGF0YS5SZWdpb24sIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlLmhlYWRlcnNbXCJ0cmFuc2FjdGlvbi1pZFwiXSB9LFxuICAgICAgICAgIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELFxuICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9LyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgdXJsOiBlbmRwb2ludFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5JTkZPLFxuICAgICAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELFxuICAgICAgICAgICAgeyBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCwgUmVnaW9uOiBkYXRhLlJlZ2lvbiwgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgVHJhbnNhY3Rpb25JZDogcmVzcG9uc2UuaGVhZGVyc1tcInRyYW5zYWN0aW9uLWlkXCJdIH0sXG4gICAgICAgICAgICBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgICAgIGF3YWl0IExvZ2dpbmdTYW5pdGl6ZXIuc3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMoZXJyb3IpO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmxvZyhMb2dMZXZlbC5FUlJPUixcbiAgICAgICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUkZBSUxFRCxcbiAgICAgICAgICAgIHsgUmVxdWVzdElkOiByZXF1ZXN0SWQsIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLCBFbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzOiBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzfSxcbiAgICAgICAgICAgIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=