botframework-directlinejs 0.15.3-master.dbb4063 → 0.15.3

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.
@@ -31,6 +31,8 @@ var _Observable = require("rxjs/Observable");
31
31
 
32
32
  var BFSE = _interopRequireWildcard(require("botframework-streaming"));
33
33
 
34
+ var _createDeferred = _interopRequireDefault(require("./createDeferred"));
35
+
34
36
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
35
37
 
36
38
  var _directLine = require("./directLine");
@@ -155,6 +157,11 @@ var StreamHandler = /*#__PURE__*/function () {
155
157
  });
156
158
  this.activityQueue = [];
157
159
  }
160
+ }, {
161
+ key: "end",
162
+ value: function end() {
163
+ this.subscriber.complete();
164
+ }
158
165
  }]);
159
166
  return StreamHandler;
160
167
  }();
@@ -167,7 +174,9 @@ var DirectLineStreaming = /*#__PURE__*/function () {
167
174
  (0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
168
175
  (0, _defineProperty2["default"])(this, "_botAgent", '');
169
176
  this.token = options.token;
170
- this.refreshToken();
177
+ this.refreshToken()["catch"](function () {
178
+ _this2.connectionStatus$.next(_directLine.ConnectionStatus.ExpiredToken);
179
+ });
171
180
  this.domain = options.domain;
172
181
 
173
182
  if (options.conversationId) {
@@ -185,9 +194,9 @@ var DirectLineStreaming = /*#__PURE__*/function () {
185
194
  _this2.activitySubscriber = subscriber;
186
195
  _this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
187
196
  return _this2.queueActivities;
188
- });
197
+ }); // Resolving connectDeferred will kick-off the connection.
189
198
 
190
- _this2.connectWithRetryAsync();
199
+ _this2.connectDeferred.resolve();
191
200
 
192
201
  case 3:
193
202
  case "end":
@@ -200,7 +209,9 @@ var DirectLineStreaming = /*#__PURE__*/function () {
200
209
  return function (_x3) {
201
210
  return _ref.apply(this, arguments);
202
211
  };
203
- }()).share();
212
+ }()).share(); // connectWithRetryAsync() will create the connectDeferred object required in activity$.
213
+
214
+ this.connectWithRetryAsync();
204
215
  }
205
216
 
206
217
  (0, _createClass2["default"])(DirectLineStreaming, [{
@@ -208,14 +219,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
208
219
  value: function reconnect(_ref2) {
209
220
  var conversationId = _ref2.conversationId,
210
221
  token = _ref2.token;
222
+
223
+ if (this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended) {
224
+ throw new Error('Connection has ended.');
225
+ }
226
+
211
227
  this.conversationId = conversationId;
212
228
  this.token = token;
213
- this.connectAsync();
229
+ this.connectDeferred.resolve();
214
230
  }
215
231
  }, {
216
232
  key: "end",
217
233
  value: function end() {
234
+ // Once end() is called, no reconnection can be made.
235
+ this.activitySubscriber.complete();
218
236
  this.connectionStatus$.next(_directLine.ConnectionStatus.Ended);
237
+ this.connectionStatus$.complete();
219
238
  this.streamConnection.disconnect();
220
239
  }
221
240
  }, {
@@ -345,6 +364,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
345
364
  value: function postActivity(activity) {
346
365
  var _this3 = this;
347
366
 
367
+ if (this.connectionStatus$.value === _directLine.ConnectionStatus.Ended || this.connectionStatus$.value === _directLine.ConnectionStatus.FailedToConnect) {
368
+ return _Observable.Observable["throw"](new Error('Connection is closed'));
369
+ }
370
+
348
371
  if (activity.type === "message" && activity.attachments && activity.attachments.length > 0) {
349
372
  return this.postMessageWithAttachments(activity);
350
373
  }
@@ -359,12 +382,12 @@ var DirectLineStreaming = /*#__PURE__*/function () {
359
382
  case 0:
360
383
  request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations/' + _this3.conversationId + '/activities');
361
384
  request.setBody(JSON.stringify(activity));
362
- _context4.next = 4;
385
+ _context4.prev = 2;
386
+ _context4.next = 5;
363
387
  return _this3.streamConnection.send(request);
364
388
 
365
- case 4:
389
+ case 5:
366
390
  resp = _context4.sent;
367
- _context4.prev = 5;
368
391
 
369
392
  if (!(resp.statusCode !== 200)) {
370
393
  _context4.next = 8;
@@ -390,11 +413,12 @@ var DirectLineStreaming = /*#__PURE__*/function () {
390
413
  case 13:
391
414
  idString = _context4.sent;
392
415
  _JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
393
- return _context4.abrupt("return", subscriber.next(id));
416
+ subscriber.next(id);
417
+ return _context4.abrupt("return", subscriber.complete());
394
418
 
395
- case 18:
396
- _context4.prev = 18;
397
- _context4.t0 = _context4["catch"](5);
419
+ case 19:
420
+ _context4.prev = 19;
421
+ _context4.t0 = _context4["catch"](2);
398
422
  // If there is a network issue then its handled by
399
423
  // the disconnectionHandler. Everything else can
400
424
  // be retried
@@ -404,12 +428,12 @@ var DirectLineStreaming = /*#__PURE__*/function () {
404
428
 
405
429
  return _context4.abrupt("return", subscriber.error(_context4.t0));
406
430
 
407
- case 23:
431
+ case 24:
408
432
  case "end":
409
433
  return _context4.stop();
410
434
  }
411
435
  }
412
- }, _callee4, null, [[5, 18]]);
436
+ }, _callee4, null, [[2, 19]]);
413
437
  }));
414
438
 
415
439
  return function (_x4) {
@@ -491,7 +515,6 @@ var DirectLineStreaming = /*#__PURE__*/function () {
491
515
 
492
516
  var buffer = _buffer.Buffer.from(arrayBuffer);
493
517
 
494
- console.log(buffer);
495
518
  var stream = new BFSE.SubscribableStream();
496
519
  stream.write(buffer);
497
520
  var httpContent = new BFSE.HttpContent({
@@ -523,7 +546,7 @@ var DirectLineStreaming = /*#__PURE__*/function () {
523
546
  }
524
547
 
525
548
  subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
526
- _context6.next = 23;
549
+ _context6.next = 24;
527
550
  break;
528
551
 
529
552
  case 18:
@@ -534,22 +557,23 @@ var DirectLineStreaming = /*#__PURE__*/function () {
534
557
  _yield$resp$streams$ = _context6.sent;
535
558
  id = _yield$resp$streams$.Id;
536
559
  subscriber.next(id);
560
+ subscriber.complete();
537
561
 
538
- case 23:
539
- _context6.next = 28;
562
+ case 24:
563
+ _context6.next = 29;
540
564
  break;
541
565
 
542
- case 25:
543
- _context6.prev = 25;
566
+ case 26:
567
+ _context6.prev = 26;
544
568
  _context6.t0 = _context6["catch"](0);
545
569
  subscriber.error(_context6.t0);
546
570
 
547
- case 28:
571
+ case 29:
548
572
  case "end":
549
573
  return _context6.stop();
550
574
  }
551
575
  }
552
- }, _callee6, null, [[0, 25]]);
576
+ }, _callee6, null, [[0, 26]]);
553
577
  }))();
554
578
  });
555
579
  }
@@ -611,7 +635,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
611
635
  };
612
636
  if (this.conversationId) params['conversationId'] = this.conversationId;
613
637
  urlSearchParams = new URLSearchParams(params).toString();
614
- wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams);
638
+ wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
639
+
615
640
  return _context9.abrupt("return", new Promise( /*#__PURE__*/function () {
616
641
  var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
617
642
  var request, response, responseString, conversation;
@@ -715,14 +740,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
715
740
  var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
716
741
  var _this7 = this;
717
742
 
718
- var numRetries, start, res;
743
+ var numRetries, start;
719
744
  return _regenerator["default"].wrap(function _callee10$(_context10) {
720
745
  while (1) {
721
746
  switch (_context10.prev = _context10.next) {
722
747
  case 0:
748
+ _context10.next = 2;
749
+ return (this.connectDeferred = (0, _createDeferred["default"])()).promise;
750
+
751
+ case 2:
723
752
  numRetries = MAX_RETRY_COUNT;
753
+ this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
724
754
 
725
- case 1:
755
+ case 4:
726
756
  if (!(numRetries > 0)) {
727
757
  _context10.next = 26;
728
758
  break;
@@ -730,61 +760,78 @@ var DirectLineStreaming = /*#__PURE__*/function () {
730
760
 
731
761
  numRetries--;
732
762
  start = Date.now();
733
- _context10.prev = 4;
734
- this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
735
- _context10.next = 8;
763
+ _context10.prev = 7;
764
+ _context10.next = 10;
736
765
  return this.connectAsync();
737
766
 
738
- case 8:
739
- res = _context10.sent;
767
+ case 10:
768
+ _context10.next = 14;
769
+ break;
770
+
771
+ case 12:
772
+ _context10.prev = 12;
773
+ _context10.t0 = _context10["catch"](7);
740
774
 
775
+ case 14:
741
776
  if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
742
- _context10.next = 12;
777
+ _context10.next = 16;
743
778
  break;
744
779
  }
745
780
 
746
- console.warn('Connection end');
747
- return _context10.abrupt("break", 26);
781
+ return _context10.abrupt("return");
782
+
783
+ case 16:
784
+ // Make sure we don't signal ConnectionStatus.Connecting twice or more without an actual connection.
785
+ // Subsequent retries should be transparent.
786
+ if (this.connectionStatus$.getValue() !== _directLine.ConnectionStatus.Connecting) {
787
+ this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
788
+ } // If the current connection lasted for more than a minute, the previous connection is good, which means:
789
+ // - we should reset the retry counter, and;
790
+ // - we should reconnect immediately.
748
791
 
749
- case 12:
750
- console.warn("Retrying connection ".concat(res));
751
792
 
752
793
  if (!(60000 < Date.now() - start)) {
753
- _context10.next = 16;
794
+ _context10.next = 21;
754
795
  break;
755
796
  }
756
797
 
757
- // reset the retry counter and retry immediately
758
- // if the connection lasted for more than a minute
759
798
  numRetries = MAX_RETRY_COUNT;
760
- return _context10.abrupt("continue", 1);
761
-
762
- case 16:
763
- _context10.next = 22;
799
+ _context10.next = 24;
764
800
  break;
765
801
 
766
- case 18:
767
- _context10.prev = 18;
768
- _context10.t0 = _context10["catch"](4);
769
- console.error("Failed to connect ".concat(_context10.t0));
770
- throw _context10.t0;
802
+ case 21:
803
+ if (!(numRetries > 0)) {
804
+ _context10.next = 24;
805
+ break;
806
+ }
771
807
 
772
- case 22:
773
808
  _context10.next = 24;
774
809
  return new Promise(function (r) {
775
810
  return setTimeout(r, _this7.getRetryDelay());
776
811
  });
777
812
 
778
813
  case 24:
779
- _context10.next = 1;
814
+ _context10.next = 4;
780
815
  break;
781
816
 
782
817
  case 26:
818
+ // TODO: [TEST] Make sure FailedToConnect is reported immediately after last disconnection, should be no getRetryDelay().
819
+ // Failed to reconnect after multiple retries.
820
+ this.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
821
+
822
+ case 27:
823
+ _context10.next = 0;
824
+ break;
825
+
826
+ case 29:
827
+ throw new Error("Failed to connect after ".concat(MAX_RETRY_COUNT, " attempts"));
828
+
829
+ case 30:
783
830
  case "end":
784
831
  return _context10.stop();
785
832
  }
786
833
  }
787
- }, _callee10, this, [[4, 18]]);
834
+ }, _callee10, this, [[7, 12]]);
788
835
  }));
789
836
 
790
837
  function connectWithRetryAsync() {
@@ -804,4 +851,4 @@ var DirectLineStreaming = /*#__PURE__*/function () {
804
851
  }();
805
852
 
806
853
  exports.DirectLineStreaming = DirectLineStreaming;
807
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsIkRpcmVjdExpbmVTdHJlYW1pbmciLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiQ29ubmVjdGlvblN0YXR1cyIsIlVuaW5pdGlhbGl6ZWQiLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwic2hhcmUiLCJjb25uZWN0QXN5bmMiLCJFbmRlZCIsInN0cmVhbUNvbm5lY3Rpb24iLCJkaXNjb25uZWN0IiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCIsImZpcnN0Q2FsbCIsInJldHJ5Q291bnQiLCJ3YWl0VW50aWxPbmxpbmUiLCJudW1iZXJPZkF0dGVtcHRzIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0IiwibWV0aG9kIiwiaGVhZGVycyIsImNvbW1vbkhlYWRlcnMiLCJyZXMiLCJvayIsImpzb24iLCJzdGF0dXMiLCJjb25zb2xlIiwic3RhdHVzVGV4dCIsIndhcm4iLCJ0eXBlIiwicG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMiLCJyZXNwJCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInJlc3AiLCJzdGF0dXNDb2RlIiwibnVtYmVyT2ZTdHJlYW1zIiwiaWRTdHJpbmciLCJpZCIsIklkIiwibWVzc2FnZSIsIm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMiLCJodHRwQ29udGVudExpc3QiLCJhbGwiLCJtYXAiLCJtZWRpYSIsImFycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJzIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImxvZyIsIlN1YnNjcmliYWJsZVN0cmVhbSIsIndyaXRlIiwiaHR0cENvbnRlbnQiLCJIdHRwQ29udGVudCIsImNvbnRlbnRMZW5ndGgiLCJ1cmwiLCJhY3Rpdml0eVN0cmVhbSIsImFkZFN0cmVhbSIsImUiLCJyZWFkQXNKc29uIiwicmVzb2x2ZSIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJudW1SZXRyaWVzIiwic3RhcnQiLCJEYXRlIiwibm93IiwiQ29ubmVjdGluZyIsImdldFZhbHVlIiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOzs7Ozs7OztBQVNBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTs7QUFDQSxJQUFNQyxPQUFPLEdBQUcsS0FBSyxJQUFyQjtBQUNBLElBQU1DLG9CQUFvQixHQUFHRixvQkFBb0IsR0FBRyxDQUFwRDs7SUFVTUcsYTtBQU1KLHlCQUFZQyxDQUFaLEVBQXFDQyxFQUFyQyxFQUF1RUMsRUFBdkUsRUFBMEY7QUFBQTtBQUFBLDREQUZqRCxFQUVpRDtBQUN4RixTQUFLQyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNBLFNBQUtJLGlCQUFMLEdBQXlCSCxFQUF6QjtBQUNBLFNBQUtJLFdBQUwsR0FBbUJILEVBQW5CO0FBQ0Q7Ozs7V0FFRCx1QkFBcUJGLENBQXJCLEVBQThDO0FBQzVDLFdBQUtHLFVBQUwsR0FBa0JILENBQWxCO0FBQ0Q7Ozs7MEdBRUQsaUJBQXFCTSxPQUFyQixFQUFvREMsTUFBcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FDLGdCQUFBQSxPQURSLHVDQUNzQkYsT0FBTyxDQUFDRSxPQUQ5QjtBQUVRQyxnQkFBQUEsT0FGUixHQUVrQkQsT0FBTyxDQUFDRSxLQUFSLEVBRmxCO0FBQUE7QUFBQSx1QkFHZ0NELE9BQU8sQ0FBQ0UsWUFBUixFQUhoQzs7QUFBQTtBQUdRQyxnQkFBQUEsZUFIUjtBQUlRQyxnQkFBQUEsV0FKUixHQUlzQkMsSUFBSSxDQUFDQyxLQUFMLENBQVdILGVBQVgsQ0FKdEI7O0FBQUEsc0JBTU1DLFdBQVcsQ0FBQ0csVUFBWixDQUF1QkMsTUFBdkIsS0FBa0MsQ0FOeEM7QUFB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dCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcblxuICAgIHRoaXMuZG9tYWluID0gb3B0aW9ucy5kb21haW47XG5cbiAgICBpZiAob3B0aW9ucy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IG9wdGlvbnMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgdGhpcy5fYm90QWdlbnQgPSB0aGlzLmdldEJvdEFnZW50KG9wdGlvbnMuYm90QWdlbnQpO1xuXG4gICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZpdHkkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgKHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSA9PiB7XG4gICAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gICAgICB0aGlzLnRoZVN0cmVhbUhhbmRsZXIgPSBuZXcgU3RyZWFtSGFuZGxlcihzdWJzY3JpYmVyLCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLCAoKSA9PiB0aGlzLnF1ZXVlQWN0aXZpdGllcyk7XG4gICAgICB0aGlzLmNvbm5lY3RXaXRoUmV0cnlBc3luYygpO1xuICAgIH0pLnNoYXJlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVjb25uZWN0KHsgY29udmVyc2F0aW9uSWQsIHRva2VuIH0gOiBDb252ZXJzYXRpb24pIHtcbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgIHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gIH1cblxuICBlbmQoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpO1xuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1vbkhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwiQXV0aG9yaXphdGlvblwiOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgXCJ4LW1zLWJvdC1hZ2VudFwiOiB0aGlzLl9ib3RBZ2VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJvdEFnZW50KGN1c3RvbUFnZW50OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVTdHJlYW1pbmcnXG5cbiAgICBpZiAoY3VzdG9tQWdlbnQpIHtcbiAgICAgIGNsaWVudEFnZW50ICs9IGA7ICR7Y3VzdG9tQWdlbnR9YFxuICAgIH1cblxuICAgIHJldHVybiBgJHtESVJFQ1RfTElORV9WRVJTSU9OfSAoJHtjbGllbnRBZ2VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRva2VuKGZpcnN0Q2FsbCA9IHRydWUsIHJldHJ5Q291bnQgPSAwKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgIGxldCBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICB3aGlsZShudW1iZXJPZkF0dGVtcHRzIDwgTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICBudW1iZXJPZkF0dGVtcHRzKys7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgcmVmcmVzaFRva2VuSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsIHttZXRob2Q6IFwiUE9TVFwiLCBoZWFkZXJzOiB0aGlzLmNvbW1vbkhlYWRlcnMoKX0pO1xuICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgY29uc3Qge3Rva2VufSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDMgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYXRhbCBlcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0b2tlbjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gZmFpbGVkOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gdGhyZXcgYW4gZXhjZXB0aW9uOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihcIlJldHJpZXMgZXhoYXVzdGVkXCIpO1xuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwb3N0QWN0aXZpdHkoYWN0aXZpdHk6IEFjdGl2aXR5KSB7XG4gICAgaWYgKGFjdGl2aXR5LnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwJCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8nICsgdGhpcy5jb252ZXJzYXRpb25JZCArICcvYWN0aXZpdGllcycpO1xuICAgICAgcmVxdWVzdC5zZXRCb2R5KEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5KSk7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChyZXNwLnN0YXR1c0NvZGUgIT09IDIwMCkgdGhyb3cgbmV3IEVycm9yKFwiUG9zdEFjdGl2aXR5IHJldHVybmVkIFwiICsgcmVzcC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZTdHJlYW1zID0gcmVzcC5zdHJlYW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bWJlck9mU3RyZWFtcyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgb25lIHN0cmVhbSBidXQgZ290IFwiICsgbnVtYmVyT2ZTdHJlYW1zKVxuICAgICAgICBjb25zdCBpZFN0cmluZyA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3Qge0lkIDogaWR9ID0gSlNPTi5wYXJzZShpZFN0cmluZyk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSggc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgaHR0cENvbnRlbnQgPSBuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IG1lZGlhLmNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoOiBidWZmZXIubGVuZ3RoIH0sIHN0cmVhbSk7XG4gICAgICAgICAgICBodHRwQ29udGVudExpc3QucHVzaChodHRwQ29udGVudCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBgL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uSWR9L3VzZXJzLyR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfS91cGxvYWRgO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQVVQnLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2aXR5U3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgYWN0aXZpdHlTdHJlYW0ud3JpdGUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyksICd1dGYtOCcpO1xuICAgICAgICAgIHJlcXVlc3QuYWRkU3RyZWFtKG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogXCJhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5XCIsIGNvbnRlbnRMZW5ndGg6IGFjdGl2aXR5U3RyZWFtLmxlbmd0aCB9LCBhY3Rpdml0eVN0cmVhbSkpO1xuICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5mb3JFYWNoKGUgPT4gcmVxdWVzdC5hZGRTdHJlYW0oZSkpO1xuXG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICAgIGlmIChyZXNwLnN0cmVhbXMgJiYgcmVzcC5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoYEludmFsaWQgc3RyZWFtIGNvdW50ICR7cmVzcC5zdHJlYW1zLmxlbmd0aH1gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHtJZDogaWR9ID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc0pzb24oKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0VW50aWxPbmxpbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKChjcykgPT4ge1xuICAgICAgICBpZiAoY3MgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSxcbiAgICAgICAgKGUpID0+IHJlamVjdChlKSk7XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdEFzeW5jKCkge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXmh0dHAocz8pJyk7XG4gICAgaWYgKCFyZS50ZXN0KHRoaXMuZG9tYWluKSkgdGhyb3cgKFwiRG9tYWluIG11c3QgYmVnaW4gd2l0aCBodHRwIG9yIGh0dHBzXCIpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHt0b2tlbjogdGhpcy50b2tlbn07XG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHBhcmFtc1snY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgY29uc3QgdXJsU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHt0aGlzLmRvbWFpbi5yZXBsYWNlKHJlLCAnd3MkMScpfS9jb252ZXJzYXRpb25zL2Nvbm5lY3Q/JHt1cmxTZWFyY2hQYXJhbXN9YDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgQkZTRS5XZWJTb2NrZXRDbGllbnQoe1xuICAgICAgICAgIHVybDogd3NVcmwsXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHRoaXMudGhlU3RyZWFtSGFuZGxlcixcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogKGUpID0+IHJlc29sdmUoZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgXCIgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgbGV0IG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgd2hpbGUgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICBudW1SZXRyaWVzLS07XG4gICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCl7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdDb25uZWN0aW9uIGVuZCcpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihgUmV0cnlpbmcgY29ubmVjdGlvbiAke3Jlc31gKTtcbiAgICAgICAgaWYgKDYwMDAwIDwgRGF0ZS5ub3coKSAtIHN0YXJ0KSB7XG4gICAgICAgICAgLy8gcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIgYW5kIHJldHJ5IGltbWVkaWF0ZWx5XG4gICAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGVcbiAgICAgICAgICBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNvbm5lY3QgJHtlcnJ9YCk7XG4gICAgICAgIHRocm93KGVycik7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCB0aGlzLmdldFJldHJ5RGVsYXkoKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGRlbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICBwcml2YXRlIGdldFJldHJ5RGVsYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMzAwMCArIE1hdGgucmFuZG9tKCkgKiAxMjAwMCk7XG4gIH1cbn1cbiJdfQ==
854
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsInRva2VuIiwicmVmcmVzaFRva2VuIiwiRXhwaXJlZFRva2VuIiwiZG9tYWluIiwiY29udmVyc2F0aW9uSWQiLCJfYm90QWdlbnQiLCJnZXRCb3RBZ2VudCIsImJvdEFnZW50IiwicXVldWVBY3Rpdml0aWVzIiwiYWN0aXZpdHkkIiwiT2JzZXJ2YWJsZSIsImFjdGl2aXR5U3Vic2NyaWJlciIsInRoZVN0cmVhbUhhbmRsZXIiLCJjb25uZWN0RGVmZXJyZWQiLCJyZXNvbHZlIiwic2hhcmUiLCJjb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsImNvbnNvbGUiLCJzdGF0dXNUZXh0Iiwid2FybiIsInZhbHVlIiwiRmFpbGVkVG9Db25uZWN0IiwidHlwZSIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7Ozs7O0FBU0EsSUFBTUEsbUJBQW1CLEdBQUcsZ0JBQTVCO0FBQ0EsSUFBTUMsZUFBZSxHQUFHLENBQXhCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFMLEdBQVUsSUFBdkMsQyxDQUNBOztBQUNBLElBQU1DLE9BQU8sR0FBRyxLQUFLLElBQXJCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUdGLG9CQUFvQixHQUFHLENBQXBEOztJQVVNRyxhO0FBTUoseUJBQVlDLENBQVosRUFBcUNDLEVBQXJDLEVBQXVFQyxFQUF2RSxFQUEwRjtBQUFBO0FBQUEsNERBRmpELEVBRWlEO0FBQ3hGLFNBQUtDLFVBQUwsR0FBa0JILENBQWxCO0FBQ0EsU0FBS0ksaUJBQUwsR0FBeUJILEVBQXpCO0FBQ0EsU0FBS0ksV0FBTCxHQUFtQkgsRUFBbkI7QUFDRDs7OztXQUVELHVCQUFxQkYsQ0FBckIsRUFBOEM7QUFDNUMsV0FBS0csVUFBTCxHQUFrQkgsQ0FBbEI7QUFDRDs7OzswR0FFRCxpQkFBcUJNLE9BQXJCLEVBQW9EQyxNQUFwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUMsZ0JBQUFBLE9BRFIsdUNBQ3NCRixPQUFPLENBQUNFLE9BRDlCO0FBRVFDLGdCQUFBQSxPQUZSLEdBRWtCRCxPQUFPLENBQUNFLEtBQVIsRUFGbEI7QUFBQTtBQUFBLHVCQUdnQ0QsT0FBTyxDQUFDRSxZQUFSLEVBSGhDOztBQUFBO0FBR1FDLGdCQUFBQSxlQUhSO0FBSVFDLGdCQUFBQSxXQUpSLEdBSXNCQyxJQUFJLENBQUND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bnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJ3J4anMvU3Vic2NyaWJlcic7XG5pbXBvcnQgKiBhcyBCRlNFIGZyb20gJ2JvdGZyYW1ld29yay1zdHJlYW1pbmcnO1xuaW1wb3J0IGNyZWF0ZURlZmVycmVkIGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuaW1wb3J0IGZldGNoIGZyb20gJ2Nyb3NzLWZldGNoJztcblxuaW1wb3J0IHR5cGUgeyBEZWZlcnJlZCB9IGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfSA6IENvbnZlcnNhdGlvbikge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBoYXMgZW5kZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcblxuICAgIHRoaXMuY29ubmVjdERlZmVycmVkLnJlc29sdmUoKTtcbiAgfVxuXG4gIGVuZCgpIHtcbiAgICAvLyBPbmNlIGVuZCgpIGlzIGNhbGxlZCwgbm8gcmVjb25uZWN0aW9uIGNhbiBiZSBtYWRlLlxuICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICBcIngtbXMtYm90LWFnZW50XCI6IHRoaXMuX2JvdEFnZW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgY2xpZW50QWdlbnQgPSAnZGlyZWN0bGluZVN0cmVhbWluZydcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlKG51bWJlck9mQXR0ZW1wdHMgPCBNQVhfUkVUUllfQ09VTlQpIHtcbiAgICAgIG51bWJlck9mQXR0ZW1wdHMrKztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCByZWZyZXNoVG9rZW5JbnRlcnZhbCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5kb21haW59L3Rva2Vucy9yZWZyZXNoYCwge21ldGhvZDogXCJQT1NUXCIsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpfSk7XG4gICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICAgICAgICBjb25zdCB7dG9rZW59ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSB0aHJldyBhbiBleGNlcHRpb246ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKFwiUmV0cmllcyBleGhhdXN0ZWRcIik7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC52YWx1ZSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCB8fCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLycgKyB0aGlzLmNvbnZlcnNhdGlvbklkICsgJy9hY3Rpdml0aWVzJyk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIlBvc3RBY3Rpdml0eSByZXR1cm5lZCBcIiArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCBcIiArIG51bWJlck9mU3RyZWFtcylcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHtJZCA6IGlkfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSggc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBodHRwQ29udGVudCA9IG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUsIGNvbnRlbnRMZW5ndGg6IGJ1ZmZlci5sZW5ndGggfSwgc3RyZWFtKTtcbiAgICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5wdXNoKGh0dHBDb250ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHVybCA9IGAvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0vdXNlcnMvJHttZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzLmZyb20uaWR9L3VwbG9hZGA7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BVVCcsIHVybCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlTdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICBhY3Rpdml0eVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeShtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzKSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgcmVxdWVzdC5hZGRTdHJlYW0obmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHlcIiwgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sIGFjdGl2aXR5U3RyZWFtKSk7XG4gICAgICAgICAgaHR0cENvbnRlbnRMaXN0LmZvckVhY2goZSA9PiByZXF1ZXN0LmFkZFN0cmVhbShlKSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgICAgaWYgKHJlc3Auc3RyZWFtcyAmJiByZXNwLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcihgSW52YWxpZCBzdHJlYW0gY291bnQgJHtyZXNwLnN0cmVhbXMubGVuZ3RofWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge0lkOiBpZH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7SWQ6IHN0cmluZ30+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoY3MpID0+IHtcbiAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sXG4gICAgICAgIChlKSA9PiByZWplY3QoZSkpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHRocm93IChcIkRvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwc1wiKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7dG9rZW46IHRoaXMudG9rZW59O1xuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgQkZTRS5XZWJTb2NrZXRDbGllbnQoe1xuICAgICAgICAgIHVybDogd3NVcmwsXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHRoaXMudGhlU3RyZWFtSGFuZGxlcixcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogKGUpID0+IHJlc29sdmUoZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgXCIgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgLy8gVGhpcyBmb3ItbG9vcCB3aWxsIGJyZWFrIHdoZW4gc29tZW9uZSBjYWxsIGVuZCgpIGFuZCBpdCB3aWxsIHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkVuZGVkLlxuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzaWduYWwgYW5kIHdhaXQgZm9yIHNvbWVvbmUga2lja2luZyBvZmYgdGhlIGNvbm5lY3Rpb246XG4gICAgICAvLyAtIHN1YnNjcmliZSB0byBhY3Rpdml0eSQsIG9yO1xuICAgICAgLy8gLSByZXRyaWVzIGV4aGF1c3RlZCAoRmFpbGVkVG9Db25uZWN0KSwgdGhlbiwgc29tZW9uZSBjYWxsIHJlY29ubmVjdCgpXG4gICAgICBhd2FpdCAodGhpcy5jb25uZWN0RGVmZXJyZWQgPSBjcmVhdGVEZWZlcnJlZCgpKS5wcm9taXNlO1xuXG4gICAgICBsZXQgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgICBudW1SZXRyaWVzLS07XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9taXNlIHdpbGwgcmVqZWN0L3Jlc29sdmUgd2hlbiBkaXNjb25uZWN0ZWQuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICB0aHJvdyAobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCBhZnRlciAke01BWF9SRVRSWV9DT1VOVH0gYXR0ZW1wdHNgKSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botframework-directlinejs",
3
- "version": "0.15.3-master.dbb4063",
3
+ "version": "0.15.3",
4
4
  "description": "Client library for the Microsoft Bot Framework Direct Line 3.0 protocol",
5
5
  "files": [
6
6
  "dist/**/*",
@@ -27,7 +27,7 @@
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
29
  "@babel/runtime": "7.14.8",
30
- "botframework-streaming": "4.19.3",
30
+ "botframework-streaming": "4.20.0-ww.20230425",
31
31
  "buffer": "6.0.3",
32
32
  "core-js": "3.15.2",
33
33
  "cross-fetch": "^3.1.5",
@@ -41,33 +41,40 @@
41
41
  "@babel/plugin-transform-runtime": "^7.14.5",
42
42
  "@babel/preset-env": "^7.14.8",
43
43
  "@babel/preset-typescript": "^7.14.5",
44
- "@types/jest": "^26.0.24",
44
+ "@testing-library/dom": "^9.2.0",
45
+ "@types/express": "^4.17.17",
46
+ "@types/jest": "^29.5.1",
45
47
  "@types/jsonwebtoken": "^8.5.4",
46
- "@types/node": "^16.4.0",
48
+ "@types/node": "^18.15.11",
47
49
  "@types/p-defer": "^2.0.0",
48
- "babel-jest": "^27.0.6",
50
+ "@types/ws": "^8.5.4",
51
+ "babel-jest": "^29.5.0",
49
52
  "babel-loader": "^8.2.2",
50
53
  "babel-plugin-istanbul": "^6.0.0",
51
54
  "babel-plugin-transform-inline-environment-variables": "^0.4.3",
52
55
  "concurrently": "^6.2.0",
53
56
  "dotenv": "^10.0.0",
54
57
  "event-target-shim": "^6.0.2",
58
+ "express": "^4.18.2",
55
59
  "get-port": "^5.1.1",
56
60
  "global-agent": "^2.2.0",
57
61
  "has-resolved": "^1.1.0",
58
62
  "http-proxy": "^1.18.1",
59
- "jest": "^27.0.6",
60
- "jest-environment-jsdom": "^27.0.6",
63
+ "http-proxy-middleware": "^2.0.6",
64
+ "jest": "^29.5.0",
65
+ "jest-environment-jsdom": "^29.5.0",
61
66
  "jsdom": "^16.6.0",
62
67
  "nock": "^13.1.1",
63
68
  "node-fetch": "^2.6.7",
64
69
  "on-error-resume-next": "^1.1.0",
70
+ "path-to-regexp": "^6.2.1",
65
71
  "restify": "^11.0.0",
66
72
  "rimraf": "^3.0.2",
67
73
  "simple-update-in": "^2.2.0",
68
74
  "typescript": "^4.3.5",
69
75
  "webpack": "^5.76.2",
70
76
  "webpack-cli": "^4.7.2",
71
- "webpack-stats-plugin": "^1.0.3"
77
+ "webpack-stats-plugin": "^1.0.3",
78
+ "ws": "^8.13.0"
72
79
  }
73
80
  }