botframework-directlinejs 0.15.3-master.fb239fe → 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.
- package/dist/directline.js +1 -1
- package/dist/stats.json +182 -37
- package/lib/createDeferred.d.ts +8 -0
- package/lib/createDeferred.js +19 -0
- package/lib/directLine.js +1 -1
- package/lib/directLineStreaming.d.ts +2 -1
- package/lib/directLineStreaming.js +202 -188
- package/package.json +15 -8
|
@@ -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
|
}();
|
|
@@ -187,68 +194,47 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
187
194
|
_this2.activitySubscriber = subscriber;
|
|
188
195
|
_this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
|
|
189
196
|
return _this2.queueActivities;
|
|
190
|
-
});
|
|
191
|
-
_context2.prev = 2;
|
|
192
|
-
_context2.next = 5;
|
|
193
|
-
return _this2.connectWithRetryAsync();
|
|
194
|
-
|
|
195
|
-
case 5:
|
|
196
|
-
_context2.next = 10;
|
|
197
|
-
break;
|
|
197
|
+
}); // Resolving connectDeferred will kick-off the connection.
|
|
198
198
|
|
|
199
|
-
|
|
200
|
-
_context2.prev = 7;
|
|
201
|
-
_context2.t0 = _context2["catch"](2);
|
|
199
|
+
_this2.connectDeferred.resolve();
|
|
202
200
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
case 10:
|
|
201
|
+
case 3:
|
|
206
202
|
case "end":
|
|
207
203
|
return _context2.stop();
|
|
208
204
|
}
|
|
209
205
|
}
|
|
210
|
-
}, _callee2
|
|
206
|
+
}, _callee2);
|
|
211
207
|
}));
|
|
212
208
|
|
|
213
209
|
return function (_x3) {
|
|
214
210
|
return _ref.apply(this, arguments);
|
|
215
211
|
};
|
|
216
|
-
}()).share();
|
|
212
|
+
}()).share(); // connectWithRetryAsync() will create the connectDeferred object required in activity$.
|
|
213
|
+
|
|
214
|
+
this.connectWithRetryAsync();
|
|
217
215
|
}
|
|
218
216
|
|
|
219
217
|
(0, _createClass2["default"])(DirectLineStreaming, [{
|
|
220
218
|
key: "reconnect",
|
|
221
|
-
value: function () {
|
|
222
|
-
var
|
|
223
|
-
|
|
224
|
-
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
225
|
-
while (1) {
|
|
226
|
-
switch (_context3.prev = _context3.next) {
|
|
227
|
-
case 0:
|
|
228
|
-
conversationId = _ref2.conversationId, token = _ref2.token;
|
|
229
|
-
this.conversationId = conversationId;
|
|
230
|
-
this.token = token;
|
|
231
|
-
_context3.next = 5;
|
|
232
|
-
return this.connectAsync();
|
|
219
|
+
value: function reconnect(_ref2) {
|
|
220
|
+
var conversationId = _ref2.conversationId,
|
|
221
|
+
token = _ref2.token;
|
|
233
222
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
return _context3.stop();
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}, _callee3, this);
|
|
240
|
-
}));
|
|
241
|
-
|
|
242
|
-
function reconnect(_x4) {
|
|
243
|
-
return _reconnect.apply(this, arguments);
|
|
223
|
+
if (this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended) {
|
|
224
|
+
throw new Error('Connection has ended.');
|
|
244
225
|
}
|
|
245
226
|
|
|
246
|
-
|
|
247
|
-
|
|
227
|
+
this.conversationId = conversationId;
|
|
228
|
+
this.token = token;
|
|
229
|
+
this.connectDeferred.resolve();
|
|
230
|
+
}
|
|
248
231
|
}, {
|
|
249
232
|
key: "end",
|
|
250
233
|
value: function end() {
|
|
234
|
+
// Once end() is called, no reconnection can be made.
|
|
235
|
+
this.activitySubscriber.complete();
|
|
251
236
|
this.connectionStatus$.next(_directLine.ConnectionStatus.Ended);
|
|
237
|
+
this.connectionStatus$.complete();
|
|
252
238
|
this.streamConnection.disconnect();
|
|
253
239
|
}
|
|
254
240
|
}, {
|
|
@@ -274,22 +260,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
274
260
|
}, {
|
|
275
261
|
key: "refreshToken",
|
|
276
262
|
value: function () {
|
|
277
|
-
var _refreshToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
263
|
+
var _refreshToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
278
264
|
var firstCall,
|
|
279
265
|
retryCount,
|
|
280
266
|
numberOfAttempts,
|
|
281
267
|
res,
|
|
282
268
|
_yield$res$json,
|
|
283
269
|
token,
|
|
284
|
-
|
|
270
|
+
_args3 = arguments;
|
|
285
271
|
|
|
286
|
-
return _regenerator["default"].wrap(function
|
|
272
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
287
273
|
while (1) {
|
|
288
|
-
switch (
|
|
274
|
+
switch (_context3.prev = _context3.next) {
|
|
289
275
|
case 0:
|
|
290
|
-
firstCall =
|
|
291
|
-
retryCount =
|
|
292
|
-
|
|
276
|
+
firstCall = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : true;
|
|
277
|
+
retryCount = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 0;
|
|
278
|
+
_context3.next = 4;
|
|
293
279
|
return this.waitUntilOnline();
|
|
294
280
|
|
|
295
281
|
case 4:
|
|
@@ -297,41 +283,41 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
297
283
|
|
|
298
284
|
case 5:
|
|
299
285
|
if (!(numberOfAttempts < MAX_RETRY_COUNT)) {
|
|
300
|
-
|
|
286
|
+
_context3.next = 30;
|
|
301
287
|
break;
|
|
302
288
|
}
|
|
303
289
|
|
|
304
290
|
numberOfAttempts++;
|
|
305
|
-
|
|
291
|
+
_context3.next = 9;
|
|
306
292
|
return new Promise(function (r) {
|
|
307
293
|
return setTimeout(r, refreshTokenInterval);
|
|
308
294
|
});
|
|
309
295
|
|
|
310
296
|
case 9:
|
|
311
|
-
|
|
312
|
-
|
|
297
|
+
_context3.prev = 9;
|
|
298
|
+
_context3.next = 12;
|
|
313
299
|
return (0, _crossFetch["default"])("".concat(this.domain, "/tokens/refresh"), {
|
|
314
300
|
method: "POST",
|
|
315
301
|
headers: this.commonHeaders()
|
|
316
302
|
});
|
|
317
303
|
|
|
318
304
|
case 12:
|
|
319
|
-
res =
|
|
305
|
+
res = _context3.sent;
|
|
320
306
|
|
|
321
307
|
if (!res.ok) {
|
|
322
|
-
|
|
308
|
+
_context3.next = 22;
|
|
323
309
|
break;
|
|
324
310
|
}
|
|
325
311
|
|
|
326
312
|
numberOfAttempts = 0;
|
|
327
|
-
|
|
313
|
+
_context3.next = 17;
|
|
328
314
|
return res.json();
|
|
329
315
|
|
|
330
316
|
case 17:
|
|
331
|
-
_yield$res$json =
|
|
317
|
+
_yield$res$json = _context3.sent;
|
|
332
318
|
token = _yield$res$json.token;
|
|
333
319
|
this.token = token;
|
|
334
|
-
|
|
320
|
+
_context3.next = 23;
|
|
335
321
|
break;
|
|
336
322
|
|
|
337
323
|
case 22:
|
|
@@ -343,16 +329,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
343
329
|
}
|
|
344
330
|
|
|
345
331
|
case 23:
|
|
346
|
-
|
|
332
|
+
_context3.next = 28;
|
|
347
333
|
break;
|
|
348
334
|
|
|
349
335
|
case 25:
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(
|
|
336
|
+
_context3.prev = 25;
|
|
337
|
+
_context3.t0 = _context3["catch"](9);
|
|
338
|
+
console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_context3.t0));
|
|
353
339
|
|
|
354
340
|
case 28:
|
|
355
|
-
|
|
341
|
+
_context3.next = 5;
|
|
356
342
|
break;
|
|
357
343
|
|
|
358
344
|
case 30:
|
|
@@ -361,10 +347,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
361
347
|
|
|
362
348
|
case 32:
|
|
363
349
|
case "end":
|
|
364
|
-
return
|
|
350
|
+
return _context3.stop();
|
|
365
351
|
}
|
|
366
352
|
}
|
|
367
|
-
},
|
|
353
|
+
}, _callee3, this, [[9, 25]]);
|
|
368
354
|
}));
|
|
369
355
|
|
|
370
356
|
function refreshToken() {
|
|
@@ -378,29 +364,33 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
378
364
|
value: function postActivity(activity) {
|
|
379
365
|
var _this3 = this;
|
|
380
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
|
+
|
|
381
371
|
if (activity.type === "message" && activity.attachments && activity.attachments.length > 0) {
|
|
382
372
|
return this.postMessageWithAttachments(activity);
|
|
383
373
|
}
|
|
384
374
|
|
|
385
375
|
var resp$ = _Observable.Observable.create( /*#__PURE__*/function () {
|
|
386
|
-
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
376
|
+
var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
|
|
387
377
|
var request, resp, numberOfStreams, idString, _JSON$parse, id;
|
|
388
378
|
|
|
389
|
-
return _regenerator["default"].wrap(function
|
|
379
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
390
380
|
while (1) {
|
|
391
|
-
switch (
|
|
381
|
+
switch (_context4.prev = _context4.next) {
|
|
392
382
|
case 0:
|
|
393
383
|
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations/' + _this3.conversationId + '/activities');
|
|
394
384
|
request.setBody(JSON.stringify(activity));
|
|
395
|
-
|
|
385
|
+
_context4.prev = 2;
|
|
386
|
+
_context4.next = 5;
|
|
396
387
|
return _this3.streamConnection.send(request);
|
|
397
388
|
|
|
398
|
-
case
|
|
399
|
-
resp =
|
|
400
|
-
_context5.prev = 5;
|
|
389
|
+
case 5:
|
|
390
|
+
resp = _context4.sent;
|
|
401
391
|
|
|
402
392
|
if (!(resp.statusCode !== 200)) {
|
|
403
|
-
|
|
393
|
+
_context4.next = 8;
|
|
404
394
|
break;
|
|
405
395
|
}
|
|
406
396
|
|
|
@@ -410,42 +400,43 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
410
400
|
numberOfStreams = resp.streams.length;
|
|
411
401
|
|
|
412
402
|
if (!(numberOfStreams !== 1)) {
|
|
413
|
-
|
|
403
|
+
_context4.next = 11;
|
|
414
404
|
break;
|
|
415
405
|
}
|
|
416
406
|
|
|
417
407
|
throw new Error("Expected one stream but got " + numberOfStreams);
|
|
418
408
|
|
|
419
409
|
case 11:
|
|
420
|
-
|
|
410
|
+
_context4.next = 13;
|
|
421
411
|
return resp.streams[0].readAsString();
|
|
422
412
|
|
|
423
413
|
case 13:
|
|
424
|
-
idString =
|
|
414
|
+
idString = _context4.sent;
|
|
425
415
|
_JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
|
|
426
|
-
|
|
416
|
+
subscriber.next(id);
|
|
417
|
+
return _context4.abrupt("return", subscriber.complete());
|
|
427
418
|
|
|
428
|
-
case
|
|
429
|
-
|
|
430
|
-
|
|
419
|
+
case 19:
|
|
420
|
+
_context4.prev = 19;
|
|
421
|
+
_context4.t0 = _context4["catch"](2);
|
|
431
422
|
// If there is a network issue then its handled by
|
|
432
423
|
// the disconnectionHandler. Everything else can
|
|
433
424
|
// be retried
|
|
434
|
-
console.warn(
|
|
425
|
+
console.warn(_context4.t0);
|
|
435
426
|
|
|
436
427
|
_this3.streamConnection.disconnect();
|
|
437
428
|
|
|
438
|
-
return
|
|
429
|
+
return _context4.abrupt("return", subscriber.error(_context4.t0));
|
|
439
430
|
|
|
440
|
-
case
|
|
431
|
+
case 24:
|
|
441
432
|
case "end":
|
|
442
|
-
return
|
|
433
|
+
return _context4.stop();
|
|
443
434
|
}
|
|
444
435
|
}
|
|
445
|
-
},
|
|
436
|
+
}, _callee4, null, [[2, 19]]);
|
|
446
437
|
}));
|
|
447
438
|
|
|
448
|
-
return function (
|
|
439
|
+
return function (_x4) {
|
|
449
440
|
return _ref3.apply(this, arguments);
|
|
450
441
|
};
|
|
451
442
|
}());
|
|
@@ -461,43 +452,43 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
461
452
|
messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(message, _excluded);
|
|
462
453
|
return _Observable.Observable.create(function (subscriber) {
|
|
463
454
|
var httpContentList = [];
|
|
464
|
-
(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
455
|
+
(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
|
|
465
456
|
var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id;
|
|
466
457
|
|
|
467
|
-
return _regenerator["default"].wrap(function
|
|
458
|
+
return _regenerator["default"].wrap(function _callee6$(_context6) {
|
|
468
459
|
while (1) {
|
|
469
|
-
switch (
|
|
460
|
+
switch (_context6.prev = _context6.next) {
|
|
470
461
|
case 0:
|
|
471
|
-
|
|
472
|
-
|
|
462
|
+
_context6.prev = 0;
|
|
463
|
+
_context6.next = 3;
|
|
473
464
|
return Promise.all(attachments.map( /*#__PURE__*/function () {
|
|
474
|
-
var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
465
|
+
var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
|
|
475
466
|
var media, res;
|
|
476
|
-
return _regenerator["default"].wrap(function
|
|
467
|
+
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
477
468
|
while (1) {
|
|
478
|
-
switch (
|
|
469
|
+
switch (_context5.prev = _context5.next) {
|
|
479
470
|
case 0:
|
|
480
471
|
media = attachment;
|
|
481
|
-
|
|
472
|
+
_context5.next = 3;
|
|
482
473
|
return (0, _crossFetch["default"])(media.contentUrl);
|
|
483
474
|
|
|
484
475
|
case 3:
|
|
485
|
-
res =
|
|
476
|
+
res = _context5.sent;
|
|
486
477
|
|
|
487
478
|
if (!res.ok) {
|
|
488
|
-
|
|
479
|
+
_context5.next = 12;
|
|
489
480
|
break;
|
|
490
481
|
}
|
|
491
482
|
|
|
492
|
-
|
|
483
|
+
_context5.next = 7;
|
|
493
484
|
return res.arrayBuffer();
|
|
494
485
|
|
|
495
486
|
case 7:
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
return
|
|
499
|
-
arrayBuffer:
|
|
500
|
-
media:
|
|
487
|
+
_context5.t0 = _context5.sent;
|
|
488
|
+
_context5.t1 = media;
|
|
489
|
+
return _context5.abrupt("return", {
|
|
490
|
+
arrayBuffer: _context5.t0,
|
|
491
|
+
media: _context5.t1
|
|
501
492
|
});
|
|
502
493
|
|
|
503
494
|
case 12:
|
|
@@ -505,26 +496,25 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
505
496
|
|
|
506
497
|
case 13:
|
|
507
498
|
case "end":
|
|
508
|
-
return
|
|
499
|
+
return _context5.stop();
|
|
509
500
|
}
|
|
510
501
|
}
|
|
511
|
-
},
|
|
502
|
+
}, _callee5);
|
|
512
503
|
}));
|
|
513
504
|
|
|
514
|
-
return function (
|
|
505
|
+
return function (_x5) {
|
|
515
506
|
return _ref5.apply(this, arguments);
|
|
516
507
|
};
|
|
517
508
|
}()));
|
|
518
509
|
|
|
519
510
|
case 3:
|
|
520
|
-
arrayBuffers =
|
|
511
|
+
arrayBuffers = _context6.sent;
|
|
521
512
|
arrayBuffers.forEach(function (_ref6) {
|
|
522
513
|
var arrayBuffer = _ref6.arrayBuffer,
|
|
523
514
|
media = _ref6.media;
|
|
524
515
|
|
|
525
516
|
var buffer = _buffer.Buffer.from(arrayBuffer);
|
|
526
517
|
|
|
527
|
-
console.log(buffer);
|
|
528
518
|
var stream = new BFSE.SubscribableStream();
|
|
529
519
|
stream.write(buffer);
|
|
530
520
|
var httpContent = new BFSE.HttpContent({
|
|
@@ -544,59 +534,60 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
544
534
|
httpContentList.forEach(function (e) {
|
|
545
535
|
return request.addStream(e);
|
|
546
536
|
});
|
|
547
|
-
|
|
537
|
+
_context6.next = 13;
|
|
548
538
|
return _this4.streamConnection.send(request);
|
|
549
539
|
|
|
550
540
|
case 13:
|
|
551
|
-
resp =
|
|
541
|
+
resp = _context6.sent;
|
|
552
542
|
|
|
553
543
|
if (!(resp.streams && resp.streams.length !== 1)) {
|
|
554
|
-
|
|
544
|
+
_context6.next = 18;
|
|
555
545
|
break;
|
|
556
546
|
}
|
|
557
547
|
|
|
558
548
|
subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
|
|
559
|
-
|
|
549
|
+
_context6.next = 24;
|
|
560
550
|
break;
|
|
561
551
|
|
|
562
552
|
case 18:
|
|
563
|
-
|
|
553
|
+
_context6.next = 20;
|
|
564
554
|
return resp.streams[0].readAsJson();
|
|
565
555
|
|
|
566
556
|
case 20:
|
|
567
|
-
_yield$resp$streams$ =
|
|
557
|
+
_yield$resp$streams$ = _context6.sent;
|
|
568
558
|
id = _yield$resp$streams$.Id;
|
|
569
559
|
subscriber.next(id);
|
|
560
|
+
subscriber.complete();
|
|
570
561
|
|
|
571
|
-
case
|
|
572
|
-
|
|
562
|
+
case 24:
|
|
563
|
+
_context6.next = 29;
|
|
573
564
|
break;
|
|
574
565
|
|
|
575
|
-
case
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
subscriber.error(
|
|
566
|
+
case 26:
|
|
567
|
+
_context6.prev = 26;
|
|
568
|
+
_context6.t0 = _context6["catch"](0);
|
|
569
|
+
subscriber.error(_context6.t0);
|
|
579
570
|
|
|
580
|
-
case
|
|
571
|
+
case 29:
|
|
581
572
|
case "end":
|
|
582
|
-
return
|
|
573
|
+
return _context6.stop();
|
|
583
574
|
}
|
|
584
575
|
}
|
|
585
|
-
},
|
|
576
|
+
}, _callee6, null, [[0, 26]]);
|
|
586
577
|
}))();
|
|
587
578
|
});
|
|
588
579
|
}
|
|
589
580
|
}, {
|
|
590
581
|
key: "waitUntilOnline",
|
|
591
582
|
value: function () {
|
|
592
|
-
var _waitUntilOnline = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
583
|
+
var _waitUntilOnline = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
|
|
593
584
|
var _this5 = this;
|
|
594
585
|
|
|
595
|
-
return _regenerator["default"].wrap(function
|
|
586
|
+
return _regenerator["default"].wrap(function _callee7$(_context7) {
|
|
596
587
|
while (1) {
|
|
597
|
-
switch (
|
|
588
|
+
switch (_context7.prev = _context7.next) {
|
|
598
589
|
case 0:
|
|
599
|
-
return
|
|
590
|
+
return _context7.abrupt("return", new Promise(function (resolve, reject) {
|
|
600
591
|
_this5.connectionStatus$.subscribe(function (cs) {
|
|
601
592
|
if (cs === _directLine.ConnectionStatus.Online) return resolve();
|
|
602
593
|
}, function (e) {
|
|
@@ -606,10 +597,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
606
597
|
|
|
607
598
|
case 1:
|
|
608
599
|
case "end":
|
|
609
|
-
return
|
|
600
|
+
return _context7.stop();
|
|
610
601
|
}
|
|
611
602
|
}
|
|
612
|
-
},
|
|
603
|
+
}, _callee7);
|
|
613
604
|
}));
|
|
614
605
|
|
|
615
606
|
function waitUntilOnline() {
|
|
@@ -621,18 +612,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
621
612
|
}, {
|
|
622
613
|
key: "connectAsync",
|
|
623
614
|
value: function () {
|
|
624
|
-
var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
615
|
+
var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
|
|
625
616
|
var _this6 = this;
|
|
626
617
|
|
|
627
618
|
var re, params, urlSearchParams, wsUrl;
|
|
628
|
-
return _regenerator["default"].wrap(function
|
|
619
|
+
return _regenerator["default"].wrap(function _callee9$(_context9) {
|
|
629
620
|
while (1) {
|
|
630
|
-
switch (
|
|
621
|
+
switch (_context9.prev = _context9.next) {
|
|
631
622
|
case 0:
|
|
632
623
|
re = new RegExp('^http(s?)');
|
|
633
624
|
|
|
634
625
|
if (re.test(this.domain)) {
|
|
635
|
-
|
|
626
|
+
_context9.next = 3;
|
|
636
627
|
break;
|
|
637
628
|
}
|
|
638
629
|
|
|
@@ -644,15 +635,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
644
635
|
};
|
|
645
636
|
if (this.conversationId) params['conversationId'] = this.conversationId;
|
|
646
637
|
urlSearchParams = new URLSearchParams(params).toString();
|
|
647
|
-
wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams);
|
|
648
|
-
|
|
649
|
-
|
|
638
|
+
wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
|
|
639
|
+
|
|
640
|
+
return _context9.abrupt("return", new Promise( /*#__PURE__*/function () {
|
|
641
|
+
var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
|
|
650
642
|
var request, response, responseString, conversation;
|
|
651
|
-
return _regenerator["default"].wrap(function
|
|
643
|
+
return _regenerator["default"].wrap(function _callee8$(_context8) {
|
|
652
644
|
while (1) {
|
|
653
|
-
switch (
|
|
645
|
+
switch (_context8.prev = _context8.next) {
|
|
654
646
|
case 0:
|
|
655
|
-
|
|
647
|
+
_context8.prev = 0;
|
|
656
648
|
_this6.streamConnection = new BFSE.WebSocketClient({
|
|
657
649
|
url: wsUrl,
|
|
658
650
|
requestHandler: _this6.theStreamHandler,
|
|
@@ -661,19 +653,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
661
653
|
}
|
|
662
654
|
});
|
|
663
655
|
_this6.queueActivities = true;
|
|
664
|
-
|
|
656
|
+
_context8.next = 5;
|
|
665
657
|
return _this6.streamConnection.connect();
|
|
666
658
|
|
|
667
659
|
case 5:
|
|
668
660
|
request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
|
|
669
|
-
|
|
661
|
+
_context8.next = 8;
|
|
670
662
|
return _this6.streamConnection.send(request);
|
|
671
663
|
|
|
672
664
|
case 8:
|
|
673
|
-
response =
|
|
665
|
+
response = _context8.sent;
|
|
674
666
|
|
|
675
667
|
if (!(response.statusCode !== 200)) {
|
|
676
|
-
|
|
668
|
+
_context8.next = 11;
|
|
677
669
|
break;
|
|
678
670
|
}
|
|
679
671
|
|
|
@@ -681,18 +673,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
681
673
|
|
|
682
674
|
case 11:
|
|
683
675
|
if (!(response.streams.length !== 1)) {
|
|
684
|
-
|
|
676
|
+
_context8.next = 13;
|
|
685
677
|
break;
|
|
686
678
|
}
|
|
687
679
|
|
|
688
680
|
throw new Error("Expected 1 stream but got " + response.streams.length);
|
|
689
681
|
|
|
690
682
|
case 13:
|
|
691
|
-
|
|
683
|
+
_context8.next = 15;
|
|
692
684
|
return response.streams[0].readAsString();
|
|
693
685
|
|
|
694
686
|
case 15:
|
|
695
|
-
responseString =
|
|
687
|
+
responseString = _context8.sent;
|
|
696
688
|
conversation = JSON.parse(responseString);
|
|
697
689
|
_this6.conversationId = conversation.conversationId;
|
|
698
690
|
|
|
@@ -700,40 +692,40 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
700
692
|
// of the connection status change.
|
|
701
693
|
|
|
702
694
|
|
|
703
|
-
|
|
695
|
+
_context8.next = 21;
|
|
704
696
|
return _this6.waitUntilOnline();
|
|
705
697
|
|
|
706
698
|
case 21:
|
|
707
699
|
_this6.theStreamHandler.flush();
|
|
708
700
|
|
|
709
701
|
_this6.queueActivities = false;
|
|
710
|
-
|
|
702
|
+
_context8.next = 28;
|
|
711
703
|
break;
|
|
712
704
|
|
|
713
705
|
case 25:
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
reject(
|
|
706
|
+
_context8.prev = 25;
|
|
707
|
+
_context8.t0 = _context8["catch"](0);
|
|
708
|
+
reject(_context8.t0);
|
|
717
709
|
|
|
718
710
|
case 28:
|
|
719
711
|
case "end":
|
|
720
|
-
return
|
|
712
|
+
return _context8.stop();
|
|
721
713
|
}
|
|
722
714
|
}
|
|
723
|
-
},
|
|
715
|
+
}, _callee8, null, [[0, 25]]);
|
|
724
716
|
}));
|
|
725
717
|
|
|
726
|
-
return function (
|
|
718
|
+
return function (_x6, _x7) {
|
|
727
719
|
return _ref7.apply(this, arguments);
|
|
728
720
|
};
|
|
729
721
|
}()));
|
|
730
722
|
|
|
731
723
|
case 8:
|
|
732
724
|
case "end":
|
|
733
|
-
return
|
|
725
|
+
return _context9.stop();
|
|
734
726
|
}
|
|
735
727
|
}
|
|
736
|
-
},
|
|
728
|
+
}, _callee9, this);
|
|
737
729
|
}));
|
|
738
730
|
|
|
739
731
|
function connectAsync() {
|
|
@@ -745,79 +737,101 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
745
737
|
}, {
|
|
746
738
|
key: "connectWithRetryAsync",
|
|
747
739
|
value: function () {
|
|
748
|
-
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
|
740
|
+
var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
|
|
749
741
|
var _this7 = this;
|
|
750
742
|
|
|
751
|
-
var numRetries, start
|
|
752
|
-
return _regenerator["default"].wrap(function
|
|
743
|
+
var numRetries, start;
|
|
744
|
+
return _regenerator["default"].wrap(function _callee10$(_context10) {
|
|
753
745
|
while (1) {
|
|
754
|
-
switch (
|
|
746
|
+
switch (_context10.prev = _context10.next) {
|
|
755
747
|
case 0:
|
|
748
|
+
_context10.next = 2;
|
|
749
|
+
return (this.connectDeferred = (0, _createDeferred["default"])()).promise;
|
|
750
|
+
|
|
751
|
+
case 2:
|
|
756
752
|
numRetries = MAX_RETRY_COUNT;
|
|
753
|
+
this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
|
|
757
754
|
|
|
758
|
-
case
|
|
755
|
+
case 4:
|
|
759
756
|
if (!(numRetries > 0)) {
|
|
760
|
-
|
|
757
|
+
_context10.next = 26;
|
|
761
758
|
break;
|
|
762
759
|
}
|
|
763
760
|
|
|
764
761
|
numRetries--;
|
|
765
762
|
start = Date.now();
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
_context11.next = 8;
|
|
763
|
+
_context10.prev = 7;
|
|
764
|
+
_context10.next = 10;
|
|
769
765
|
return this.connectAsync();
|
|
770
766
|
|
|
771
|
-
case
|
|
772
|
-
|
|
767
|
+
case 10:
|
|
768
|
+
_context10.next = 14;
|
|
769
|
+
break;
|
|
773
770
|
|
|
771
|
+
case 12:
|
|
772
|
+
_context10.prev = 12;
|
|
773
|
+
_context10.t0 = _context10["catch"](7);
|
|
774
|
+
|
|
775
|
+
case 14:
|
|
774
776
|
if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
|
|
775
|
-
|
|
777
|
+
_context10.next = 16;
|
|
776
778
|
break;
|
|
777
779
|
}
|
|
778
780
|
|
|
779
|
-
|
|
780
|
-
|
|
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.
|
|
781
791
|
|
|
782
|
-
case 12:
|
|
783
|
-
console.warn("Retrying connection ".concat(res));
|
|
784
792
|
|
|
785
793
|
if (!(60000 < Date.now() - start)) {
|
|
786
|
-
|
|
794
|
+
_context10.next = 21;
|
|
787
795
|
break;
|
|
788
796
|
}
|
|
789
797
|
|
|
790
|
-
// reset the retry counter and retry immediately
|
|
791
|
-
// if the connection lasted for more than a minute
|
|
792
798
|
numRetries = MAX_RETRY_COUNT;
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
case 16:
|
|
796
|
-
_context11.next = 22;
|
|
799
|
+
_context10.next = 24;
|
|
797
800
|
break;
|
|
798
801
|
|
|
799
|
-
case
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
802
|
+
case 21:
|
|
803
|
+
if (!(numRetries > 0)) {
|
|
804
|
+
_context10.next = 24;
|
|
805
|
+
break;
|
|
806
|
+
}
|
|
804
807
|
|
|
805
|
-
|
|
806
|
-
_context11.next = 24;
|
|
808
|
+
_context10.next = 24;
|
|
807
809
|
return new Promise(function (r) {
|
|
808
810
|
return setTimeout(r, _this7.getRetryDelay());
|
|
809
811
|
});
|
|
810
812
|
|
|
811
813
|
case 24:
|
|
812
|
-
|
|
814
|
+
_context10.next = 4;
|
|
813
815
|
break;
|
|
814
816
|
|
|
815
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:
|
|
816
830
|
case "end":
|
|
817
|
-
return
|
|
831
|
+
return _context10.stop();
|
|
818
832
|
}
|
|
819
833
|
}
|
|
820
|
-
},
|
|
834
|
+
}, _callee10, this, [[7, 12]]);
|
|
821
835
|
}));
|
|
822
836
|
|
|
823
837
|
function connectWithRetryAsync() {
|
|
@@ -837,4 +851,4 @@ var DirectLineStreaming = /*#__PURE__*/function () {
|
|
|
837
851
|
}();
|
|
838
852
|
|
|
839
853
|
exports.DirectLineStreaming = DirectLineStreaming;
|
|
840
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsIkRpcmVjdExpbmVTdHJlYW1pbmciLCJvcHRpb25zIiwiQmVoYXZpb3JTdWJqZWN0IiwiQ29ubmVjdGlvblN0YXR1cyIsIlVuaW5pdGlhbGl6ZWQiLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsIkV4cGlyZWRUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwiRmFpbGVkVG9Db25uZWN0Iiwic2hhcmUiLCJjb25uZWN0QXN5bmMiLCJFbmRlZCIsInN0cmVhbUNvbm5lY3Rpb24iLCJkaXNjb25uZWN0IiwiY3VzdG9tQWdlbnQiLCJjbGllbnRBZ2VudCIsImZpcnN0Q2FsbCIsInJldHJ5Q291bnQiLCJ3YWl0VW50aWxPbmxpbmUiLCJudW1iZXJPZkF0dGVtcHRzIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0IiwibWV0aG9kIiwiaGVhZGVycyIsImNvbW1vbkhlYWRlcnMiLCJyZXMiLCJvayIsImpzb24iLCJzdGF0dXMiLCJjb25zb2xlIiwic3RhdHVzVGV4dCIsIndhcm4iLCJ0eXBlIiwicG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMiLCJyZXNwJCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInJlc3AiLCJzdGF0dXNDb2RlIiwibnVtYmVyT2ZTdHJlYW1zIiwiaWRTdHJpbmciLCJpZCIsIklkIiwibWVzc2FnZSIsIm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMiLCJodHRwQ29udGVudExpc3QiLCJhbGwiLCJtYXAiLCJtZWRpYSIsImFycmF5QnVmZmVyIiwiYXJyYXlCdWZmZXJzIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsImxvZyIsIlN1YnNjcmliYWJsZVN0cmVhbSIsIndyaXRlIiwiaHR0cENvbnRlbnQiLCJIdHRwQ29udGVudCIsImNvbnRlbnRMZW5ndGgiLCJ1cmwiLCJhY3Rpdml0eVN0cmVhbSIsImFkZFN0cmVhbSIsImUiLCJyZWFkQXNKc29uIiwicmVzb2x2ZSIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJudW1SZXRyaWVzIiwic3RhcnQiLCJEYXRlIiwibm93IiwiQ29ubmVjdGluZyIsImdldFZhbHVlIiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOzs7Ozs7OztBQVNBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTs7QUFDQSxJQUFNQyxPQUFPLEdBQUcsS0FBSyxJQUFyQjtBQUNBLElBQU1DLG9CQUFvQixHQUFHRixvQkFBb0IsR0FBRyxDQUFwRDs7SUFVTUcsYTtBQU1KLHlCQUFZQyxDQUFaLEVBQXFDQyxFQUFyQyxFQUF1RUMsRUFBdkUsRUFBMEY7QUFBQTtBQUFBLDREQUZqRCxFQUVpRDtBQUN4RixTQUFLQyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNBLFNBQUtJLGlCQUFMLEdBQXlCSCxFQUF6QjtBQUNBLFNBQUtJLFdBQUwsR0FBbUJILEVBQW5CO0FBQ0Q7Ozs7V0FFRCx1QkFBcUJGLENBQXJCLEVBQThDO0FBQzVDLFdBQUtHLFVBQUwsR0FBa0JILENBQWxCO0FBQ0Q7Ozs7MEdBRUQsaUJBQXFCTSxPQUFyQixFQUFvREMsTUFBcEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FDLGdCQUFBQSxPQURSLHVDQUNzQkYsT0FBTyxDQUFDRSxPQUQ5QjtBQUVRQyxnQkFBQUEsT0FGUixHQUVrQkQsT0FBTyxDQUFDRSxLQUFSLEVBRmxCO0FBQUE7QUFBQSx1QkFHZ0NELE9BQU8sQ0FBQ0UsWUFBUixFQUhoQzs7QUFBQTtBQUdRQyxnQkFBQUEsZUFIUjtBQUlRQyxnQkFBQUEsV0FKUixHQUlzQkMsSUFBSSxDQUFDQyxLQUFMLENBQVdILGVBQVgsQ0FKdEI7O0FBQUEsc0JBTU1DLFdBQVcsQ0FBQ0cs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QUMsQ0FBQztBQUFBLHlCQUFJQyxVQUFVLENBQUNELENBQUQsRUFBSSxNQUFJLENBQUN5RSxhQUFMLEVBQUosQ0FBZDtBQUFBLGlCQUFiLENBeEJWOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7O1FBNEJBOzs7O1dBQ0EseUJBQXdCO0FBQ3RCLGFBQU9DLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE9BQU9ELElBQUksQ0FBQ0UsTUFBTCxLQUFnQixLQUFsQyxDQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBrZWVwIGZpbGUgc2l6ZSBkb3duLCBvbmx5IGltcG9ydCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgICB9XG4gICAgfSkuc2hhcmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfSA6IENvbnZlcnNhdGlvbikge1xuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG5cbiAgICBhd2FpdCB0aGlzLmNvbm5lY3RBc3luYygpO1xuICB9XG5cbiAgZW5kKCkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkVuZGVkKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21tb25IZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBcIkF1dGhvcml6YXRpb25cIjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgIFwieC1tcy1ib3QtYWdlbnRcIjogdGhpcy5fYm90QWdlbnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3RBZ2VudChjdXN0b21BZ2VudDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBjbGllbnRBZ2VudCA9ICdkaXJlY3RsaW5lU3RyZWFtaW5nJ1xuXG4gICAgaWYgKGN1c3RvbUFnZW50KSB7XG4gICAgICBjbGllbnRBZ2VudCArPSBgOyAke2N1c3RvbUFnZW50fWBcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7RElSRUNUX0xJTkVfVkVSU0lPTn0gKCR7Y2xpZW50QWdlbnR9KWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbihmaXJzdENhbGwgPSB0cnVlLCByZXRyeUNvdW50ID0gMCkge1xuICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICBsZXQgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgd2hpbGUobnVtYmVyT2ZBdHRlbXB0cyA8IE1BWF9SRVRSWV9DT1VOVCkge1xuICAgICAgbnVtYmVyT2ZBdHRlbXB0cysrO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHJlZnJlc2hUb2tlbkludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmRvbWFpbn0vdG9rZW5zL3JlZnJlc2hgLCB7bWV0aG9kOiBcIlBPU1RcIiwgaGVhZGVyczogdGhpcy5jb21tb25IZWFkZXJzKCl9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgICAgICAgIGNvbnN0IHt0b2tlbn0gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAzIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmF0YWwgZXJyb3Igd2hpbGUgcmVmcmVzaGluZyB0aGUgdG9rZW46ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IGZhaWxlZDogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IHRocmV3IGFuIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoXCJSZXRyaWVzIGV4aGF1c3RlZFwiKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcG9zdEFjdGl2aXR5KGFjdGl2aXR5OiBBY3Rpdml0eSkge1xuICAgIGlmIChhY3Rpdml0eS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBhY3Rpdml0eS5hdHRhY2htZW50cyAmJiBhY3Rpdml0eS5hdHRhY2htZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5wb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcCQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyBzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQT1NUJywgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJyArIHRoaXMuY29udmVyc2F0aW9uSWQgKyAnL2FjdGl2aXRpZXMnKTtcbiAgICAgIHJlcXVlc3Quc2V0Qm9keShKU09OLnN0cmluZ2lmeShhY3Rpdml0eSkpO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIlBvc3RBY3Rpdml0eSByZXR1cm5lZCBcIiArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCBcIiArIG51bWJlck9mU3RyZWFtcylcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHtJZCA6IGlkfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV0d29yayBpc3N1ZSB0aGVuIGl0cyBoYW5kbGVkIGJ5XG4gICAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3Rpb25IYW5kbGVyLiBFdmVyeXRoaW5nIGVsc2UgY2FuXG4gICAgICAgICAgLy8gYmUgcmV0cmllZFxuICAgICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmVycm9yKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXNwJDtcbiAgfVxuXG4gIHByaXZhdGUgcG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGNvbnN0IHsgYXR0YWNobWVudHMsIC4uLm1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMgfSA9IG1lc3NhZ2U7XG5cbiAgICByZXR1cm4gT2JzZXJ2YWJsZS5jcmVhdGUoIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgaHR0cENvbnRlbnRMaXN0ID0gW107XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVycyA9IGF3YWl0IFByb21pc2UuYWxsKGF0dGFjaG1lbnRzLm1hcChhc3luYyBhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhID0gYXR0YWNobWVudCBhcyBNZWRpYTtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1lZGlhLmNvbnRlbnRVcmwpO1xuICAgICAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgICByZXR1cm4geyBhcnJheUJ1ZmZlcjogYXdhaXQgcmVzLmFycmF5QnVmZmVyKCksIG1lZGlhIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKTtcblxuICAgICAgICAgIGFycmF5QnVmZmVycy5mb3JFYWNoKCh7IGFycmF5QnVmZmVyLCBtZWRpYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhidWZmZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBDb250ZW50ID0gbmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBtZWRpYS5jb250ZW50VHlwZSwgY29udGVudExlbmd0aDogYnVmZmVyLmxlbmd0aCB9LCBzdHJlYW0pO1xuICAgICAgICAgICAgaHR0cENvbnRlbnRMaXN0LnB1c2goaHR0cENvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gYC92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91c2Vycy8ke21lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMuZnJvbS5pZH0vdXBsb2FkYDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUFVUJywgdXJsKTtcbiAgICAgICAgICBjb25zdCBhY3Rpdml0eVN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgIGFjdGl2aXR5U3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMpLCAndXRmLTgnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZFN0cmVhbShuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1pY3Jvc29mdC5hY3Rpdml0eVwiLCBjb250ZW50TGVuZ3RoOiBhY3Rpdml0eVN0cmVhbS5sZW5ndGggfSwgYWN0aXZpdHlTdHJlYW0pKTtcbiAgICAgICAgICBodHRwQ29udGVudExpc3QuZm9yRWFjaChlID0+IHJlcXVlc3QuYWRkU3RyZWFtKGUpKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICBpZiAocmVzcC5zdHJlYW1zICYmIHJlc3Auc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKGBJbnZhbGlkIHN0cmVhbSBjb3VudCAke3Jlc3Auc3RyZWFtcy5sZW5ndGh9YCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7SWQ6IGlkfSA9IGF3YWl0IHJlc3Auc3RyZWFtc1swXS5yZWFkQXNKc29uKCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoY3MpID0+IHtcbiAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sXG4gICAgICAgIChlKSA9PiByZWplY3QoZSkpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHRocm93IChcIkRvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwc1wiKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7dG9rZW46IHRoaXMudG9rZW59O1xuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uID0gbmV3IEJGU0UuV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgICAgICB1cmw6IHdzVXJsLFxuICAgICAgICAgIHJlcXVlc3RIYW5kbGVyOiB0aGlzLnRoZVN0cmVhbUhhbmRsZXIsXG4gICAgICAgICAgZGlzY29ubmVjdGlvbkhhbmRsZXI6IChlKSA9PiByZXNvbHZlKGUpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmNvbm5lY3QoKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucycpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uIHJlc3BvbnNlIGNvZGUgXCIgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCAxIHN0cmVhbSBidXQgZ290IFwiICsgcmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCByZXNwb25zZVN0cmluZyA9IGF3YWl0IHJlc3BvbnNlLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHJpbmcpO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuXG4gICAgICAgIC8vIFdhaXQgdW50aWwgREwgY29uc3VtZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgIC8vIG9mIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG4gICAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlci5mbHVzaCgpO1xuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IGZhbHNlO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkge1xuICAgIGxldCBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgbnVtUmV0cmllcy0tO1xuICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpe1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ29ubmVjdGlvbiBlbmQnKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oYFJldHJ5aW5nIGNvbm5lY3Rpb24gJHtyZXN9YCk7XG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIC8vIHJlc2V0IHRoZSByZXRyeSBjb3VudGVyIGFuZCByZXRyeSBpbW1lZGlhdGVseVxuICAgICAgICAgIC8vIGlmIHRoZSBjb25uZWN0aW9uIGxhc3RlZCBmb3IgbW9yZSB0aGFuIGEgbWludXRlXG4gICAgICAgICAgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjb25uZWN0ICR7ZXJyfWApO1xuICAgICAgICB0aHJvdyhlcnIpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgdGhpcy5nZXRSZXRyeURlbGF5KCkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXX0=
|
|
854
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInRpbWVvdXQiLCJyZWZyZXNoVG9rZW5JbnRlcnZhbCIsIlN0cmVhbUhhbmRsZXIiLCJzIiwiYyQiLCJzcSIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwic2hpZnQiLCJyZWFkQXNTdHJpbmciLCJhY3Rpdml0eVNldEpzb24iLCJhY3Rpdml0eVNldCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiQkZTRSIsIlN0cmVhbWluZ1Jlc3BvbnNlIiwiY3JlYXRlIiwiYWN0aXZpdHkiLCJhdHRhY2htZW50cyIsInN0cmVhbSIsImF0dGFjaG1lbnQiLCJkYXRhVXJpIiwicHVzaCIsImNvbnRlbnRUeXBlIiwiY29udGVudFVybCIsImFjdGl2aXR5UXVldWUiLCJuZXh0Iiwic3Vic2NyaWJlIiwiY3MiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsInRva2VuIiwicmVmcmVzaFRva2VuIiwiRXhwaXJlZFRva2VuIiwiZG9tYWluIiwiY29udmVyc2F0aW9uSWQiLCJfYm90QWdlbnQiLCJnZXRCb3RBZ2VudCIsImJvdEFnZW50IiwicXVldWVBY3Rpdml0aWVzIiwiYWN0aXZpdHkkIiwiT2JzZXJ2YWJsZSIsImFjdGl2aXR5U3Vic2NyaWJlciIsInRoZVN0cmVhbUhhbmRsZXIiLCJjb25uZWN0RGVmZXJyZWQiLCJyZXNvbHZlIiwic2hhcmUiLCJjb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsImNvbnNvbGUiLCJzdGF0dXNUZXh0Iiwid2FybiIsInZhbHVlIiwiRmFpbGVkVG9Db25uZWN0IiwidHlwZSIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsIk9ubGluZSIsInJlIiwiUmVnRXhwIiwidGVzdCIsInBhcmFtcyIsInVybFNlYXJjaFBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInRvU3RyaW5nIiwid3NVcmwiLCJyZXBsYWNlIiwiV2ViU29ja2V0Q2xpZW50IiwicmVxdWVzdEhhbmRsZXIiLCJkaXNjb25uZWN0aW9uSGFuZGxlciIsImNvbm5lY3QiLCJyZXNwb25zZSIsInJlc3BvbnNlU3RyaW5nIiwiY29udmVyc2F0aW9uIiwiZmx1c2giLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBSUE7Ozs7Ozs7O0FBU0EsSUFBTUEsbUJBQW1CLEdBQUcsZ0JBQTVCO0FBQ0EsSUFBTUMsZUFBZSxHQUFHLENBQXhCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsS0FBSyxFQUFMLEdBQVUsSUFBdkMsQyxDQUNBOztBQUNBLElBQU1DLE9BQU8sR0FBRyxLQUFLLElBQXJCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUdGLG9CQUFvQixHQUFHLENBQXBEOztJQVVNRyxhO0FBTUoseUJBQVlDLENBQVosRUFBcUNDLEVBQXJDLEVBQXVFQyxFQUF2RSxFQUEwRjtBQUFBO0FBQUEsNERBRmpELEVBRWlEO0FBQ3hGLFNBQUtDLFVBQUwsR0FBa0JILENBQWxCO0FBQ0EsU0FBS0ksaUJBQUwsR0FBeUJILEVBQXpCO0FBQ0EsU0FBS0ksV0FBTCxHQUFtQkgsRUFBbkI7QUFDRDs7OztXQUVELHVCQUFxQkYsQ0FBckIsRUFBOEM7QUFDNUMsV0FBS0csVUFBTCxHQUFrQkgsQ0FBbEI7QUFDRDs7OzswR0FFRCxpQkFBcUJNLE9BQXJCLEVBQW9EQyxNQUFwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUMsZ0JBQUFBLE9BRFIsdUNBQ3NCRixPQUFPLENBQUNFLE9BRDlCO0FBRVFDLGdCQUFBQSxPQUZSLEdBRWtCRCxPQUFPLENBQUNFLEtBQVIsRUFGbEI7QUFBQTtBQUFBLHVCQUdnQ0QsT0FBTyxDQUFDRSxZQUFSLEVBSGhDOztBQUFBO0FBR1FDLGdCQUFBQSxlQUhSO0FBSVFDLGdCQUFBQSxXQUpSLEdBSXNCQyxJQUFJLENBQUNDLEtBQUwsQ0FBV0gsZUFBWCxDQUp0Qjs7QUFBQSxzQkFNTUMsV0FBVyxDQUFDRyxVQUFaLENBQXVCQyxNQUF2QixLQUFrQyxDQU54QztBQUFBO0FBQUE7QUFBQTs7QUFPSTtBQUNBLHFCQUFLZCxVQUFMLENBQWdCZSxLQUFoQixDQUFzQixJQUFJQyxLQUFKLENBQVUsc0NBQVYsQ0FBdEI7QUFSSixpREFTV0MsSUFBSSxDQUFDQyxpQkFBTCxDQUF1QkMsTUFBdkIsQ0FBOEIsR0FBOUIsQ0FUWDs7QUFBQTtBQVlRQyxnQkFBQUEsUUFaUixHQVltQlYsV0FBVyxDQUFDRyxVQUFaLENBQXVCLENBQXZCLENBWm5COztBQUFBLHNCQWNNUixPQUFPLENBQUNTLE1BQVIsR0FBaUIsQ0FkdkI7QUFBQTtBQUFBO0FBQUE7O0FBZVVPLGdCQUFBQSxXQWZWLHVDQWU0QkQsUUFBUSxDQUFDQyxXQWZyQzs7QUFBQTtBQUFBLHNCQWtCV0MsTUFBTSxHQUFHakIsT0FBTyxDQUFDRSxLQUFSLEVBbEJwQjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVCQW1CK0JlLE1BQU0sQ0FBQ2QsWUFBUCxFQW5CL0I7O0FBQUE7QUFtQlllLGdCQUFBQSxVQW5CWjtBQW9CWUMsZ0JBQUFBLE9BcEJaLEdBb0JzQiw0QkFBNEJELFVBcEJsRDtBQXFCTUYsZ0JBQUFBLFdBQVcsQ0FBQ0ksSUFBWixDQUFpQjtBQUFFQyxrQkFBQUEsV0FBVyxFQUFFSixNQUFNLENBQUNJLFdBQXRCO0FBQW1DQyxrQkFBQUEsVUFBVSxFQUFFSDtBQUEvQyxpQkFBakI7QUFyQk47QUFBQTs7QUFBQTtBQXdCSUosZ0JBQUFBLFFBQVEsQ0FBQ0MsV0FBVCxHQUF1QkEsV0FBdkI7O0FBeEJKO0FBMkJFLG9CQUFJLEtBQUtuQixXQUFMLEVBQUosRUFBd0I7QUFDdEIsdUJBQUswQixhQUFMLENBQW1CSCxJQUFuQixDQUF3QkwsUUFBeEI7QUFDRCxpQkFGRCxNQUVPO0FBQ0wsdUJBQUtwQixVQUFMLENBQWdCNkIsSUFBaEIsQ0FBcUJULFFBQXJCO0FBQ0Q7O0FBL0JILGlEQWlDU0gsSUFBSSxDQUFDQyxpQkFBTCxDQUF1QkMsTUFBdkIsQ0FBOEIsR0FBOUIsQ0FqQ1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7OztXQW9DQSxpQkFBZTtBQUFBOztBQUNiLFdBQUtsQixpQkFBTCxDQUF1QjZCLFNBQXZCLENBQWlDLFVBQUFDLEVBQUUsRUFBSSxDQUFHLENBQTFDO0FBQ0EsV0FBS0gsYUFBTCxDQUFtQkksT0FBbkIsQ0FBMkIsVUFBQ0MsQ0FBRDtBQUFBLGVBQU8sS0FBSSxDQUFDakMsVUFBTCxDQUFnQjZCLElBQWhCLENBQXFCSSxDQUFyQixDQUFQO0FBQUEsT0FBM0I7QUFDQSxXQUFLTCxhQUFMLEdBQXFCLEVBQXJCO0FBQ0Q7OztXQUVELGVBQWE7QUFDWCxXQUFLNUIsVUFBTCxDQUFnQmtDLFFBQWhCO0FBQ0Q7Ozs7O0lBR1VDLG1CO0FBaUJYLCtCQUFZQyxPQUFaLEVBQWlEO0FBQUE7O0FBQUE7QUFBQSxnRUFoQnRCLElBQUlDLGdDQUFKLENBQW9CQyw2QkFBaUJDLGFBQXJDLENBZ0JzQjtBQUFBLHdEQUY3QixFQUU2QjtBQUMvQyxTQUFLQyxLQUFMLEdBQWFKLE9BQU8sQ0FBQ0ksS0FBckI7QUFFQSxTQUFLQyxZQUFMLFlBQTBCLFlBQU07QUFDOUIsTUFBQSxNQUFJLENBQUN4QyxpQkFBTCxDQUF1QjRCLElBQXZCLENBQTRCUyw2QkFBaUJJLFlBQTdDO0FBQ0QsS0FGRDtBQUlBLFNBQUtDLE1BQUwsR0FBY1AsT0FBTyxDQUFDTyxNQUF0Qjs7QUFFQSxRQUFJUCxPQUFPLENBQUNRLGNBQVosRUFBNEI7QUFDMUIsV0FBS0EsY0FBTCxHQUFzQlIsT0FBTyxDQUFDUSxjQUE5QjtBQUNEOztBQUVELFNBQUtDLFNBQUwsR0FBaUIsS0FBS0MsV0FBTCxDQUFpQlYsT0FBTyxDQUFDVyxRQUF6QixDQUFqQjtBQUVBLFNBQUtDLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxTQUFLQyxTQUFMLEdBQWlCQyx1QkFBVy9CLE1BQVg7QUFBQSwrRkFBa0Isa0JBQU9uQixVQUFQO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDakMsZ0JBQUEsTUFBSSxDQUFDbUQsa0JBQUwsR0FBMEJuRCxVQUExQjtBQUNBLGdCQUFBLE1BQUksQ0FBQ29ELGdCQUFMLEdBQXdCLElBQUl4RCxhQUFKLENBQWtCSSxVQUFsQixFQUE4QixNQUFJLENBQUNDLGlCQUFuQyxFQUFzRDtBQUFBLHlCQUFNLE1BQUksQ0FBQytDLGVBQVg7QUFBQSxpQkFBdEQsQ0FBeEIsQ0FGaUMsQ0FJakM7O0FBQ0EsZ0JBQUEsTUFBSSxDQUFDSyxlQUFMLENBQXFCQyxPQUFyQjs7QUFMaUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBbEI7O0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FNZEMsS0FOYyxFQUFqQixDQWhCK0MsQ0F3Qi9DOztBQUNBLFNBQUtDLHFCQUFMO0FBQ0Q7Ozs7V0FFRCwwQkFBMkQ7QUFBQSxVQUF4Q1osY0FBd0MsU0FBeENBLGNBQXdDO0FBQUEsVUFBeEJKLEtBQXdCLFNBQXhCQSxLQUF3Qjs7QUFDekQsVUFBSSxLQUFLdkMsaUJBQUwsQ0FBdUJ3RCxRQUF2QixPQUFzQ25CLDZCQUFpQm9CLEtBQTNELEVBQWtFO0FBQ2hFLGNBQU0sSUFBSTFDLEtBQUosQ0FBVSx1QkFBVixDQUFOO0FBQ0Q7O0FBRUQsV0FBSzRCLGNBQUwsR0FBc0JBLGNBQXRCO0FBQ0EsV0FBS0osS0FBTCxHQUFhQSxLQUFiO0FBRUEsV0FBS2EsZUFBTCxDQUFxQkMsT0FBckI7QUFDRDs7O1dBRUQsZUFBTTtBQUNKO0FBQ0EsV0FBS0gsa0JBQUwsQ0FBd0JqQixRQUF4QjtBQUVBLFdBQUtqQyxpQkFBTCxDQUF1QjRCLElBQXZCLENBQTRCUyw2QkFBaUJvQixLQUE3QztBQUNBLFdBQUt6RCxpQkFBTCxDQUF1QmlDLFFBQXZCO0FBRUEsV0FBS3lCLGdCQUFMLENBQXNCQyxVQUF0QjtBQUNEOzs7V0FFRCx5QkFBd0I7QUFDdEIsYUFBTztBQUNMLDBDQUEyQixLQUFLcEIsS0FBaEMsQ0FESztBQUVMLDBCQUFrQixLQUFLSztBQUZsQixPQUFQO0FBSUQ7OztXQUVELHVCQUFzRDtBQUFBLFVBQWxDZ0IsV0FBa0MsdUVBQVosRUFBWTtBQUNwRCxVQUFJQyxXQUFXLEdBQUcscUJBQWxCOztBQUVBLFVBQUlELFdBQUosRUFBaUI7QUFDZkMsUUFBQUEsV0FBVyxnQkFBU0QsV0FBVCxDQUFYO0FBQ0Q7O0FBRUQsdUJBQVV0RSxtQkFBVixlQUFrQ3VFLFdBQWxDO0FBQ0Q7Ozs7d0dBRUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUEyQkMsZ0JBQUFBLFNBQTNCLDhEQUF1QyxJQUF2QztBQUE2Q0MsZ0JBQUFBLFVBQTdDLDhEQUEwRCxDQUExRDtBQUFBO0FBQUEsdUJBQ1EsS0FBS0MsZUFBTCxFQURSOztBQUFBO0FBR01DLGdCQUFBQSxnQkFITixHQUd5QixDQUh6Qjs7QUFBQTtBQUFBLHNCQUlRQSxnQkFBZ0IsR0FBRzFFLGVBSjNCO0FBQUE7QUFBQTtBQUFBOztBQUtJMEUsZ0JBQUFBLGdCQUFnQjtBQUxwQjtBQUFBLHVCQU1VLElBQUlDLE9BQUosQ0FBWSxVQUFBQyxDQUFDO0FBQUEseUJBQUlDLFVBQVUsQ0FBQ0QsQ0FBRCxFQUFJekUsb0JBQUosQ0FBZDtBQUFBLGlCQUFiLENBTlY7O0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBUXdCLHNDQUFTLEtBQUtnRCxNQUFkLHNCQUF1QztBQUFDMkIsa0JBQUFBLE1BQU0sRUFBRSxNQUFUO0FBQWlCQyxrQkFBQUEsT0FBTyxFQUFFLEtBQUtDLGFBQUw7QUFBMUIsaUJBQXZDLENBUnhCOztBQUFBO0FBUVlDLGdCQUFBQSxHQVJaOztBQUFBLHFCQVNVQSxHQUFHLENBQUNDLEVBVGQ7QUFBQTtBQUFBO0FBQUE7O0FBVVFSLGdCQUFBQSxnQkFBZ0IsR0FBRyxDQUFuQjtBQVZSO0FBQUEsdUJBVzhCTyxHQUFHLENBQUNFLElBQUosRUFYOUI7O0FBQUE7QUFBQTtBQVdlbkMsZ0JBQUFBLEtBWGYsbUJBV2VBLEtBWGY7QUFZUSxxQkFBS0EsS0FBTCxHQUFhQSxLQUFiO0FBWlI7QUFBQTs7QUFBQTtBQWNRLG9CQUFJaUMsR0FBRyxDQUFDRyxNQUFKLEtBQWUsR0FBZixJQUFzQkgsR0FBRyxDQUFDRyxNQUFKLEtBQWUsR0FBekMsRUFBOEM7QUFDNUNDLGtCQUFBQSxPQUFPLENBQUM5RCxLQUFSLG1EQUF5RDBELEdBQUcsQ0FBQ0csTUFBN0QsY0FBdUVILEdBQUcsQ0FBQ0ssVUFBM0U7QUFDQSx1QkFBS25CLGdCQUFMLENBQXNCQyxVQUF0QjtBQUNELGlCQUhELE1BR087QUFDTGlCLGtCQUFBQSxPQUFPLENBQUNFLElBQVIsNEJBQWlDYixnQkFBakMsc0JBQTZETyxHQUFHLENBQUNHLE1BQWpFLGNBQTJFSCxHQUFHLENBQUNLLFVBQS9FO0FBQ0Q7O0FBbkJUO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFzQk1ELGdCQUFBQSxPQUFPLENBQUNFLElBQVIsNEJBQWlDYixnQkFBakM7O0FBdEJOO0FBQUE7QUFBQTs7QUFBQTtBQTBCRVcsZ0JBQUFBLE9BQU8sQ0FBQzlELEtBQVIsQ0FBYyxtQkFBZDtBQUNBLHFCQUFLNEMsZ0JBQUwsQ0FBc0JDLFVBQXRCOztBQTNCRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7Ozs7O1dBOEJBLHNCQUFheEMsUUFBYixFQUFpQztBQUFBOztBQUMvQixVQUFJLEtBQUtuQixpQkFBTCxDQUF1QitFLEtBQXZCLEtBQWlDMUMsNkJBQWlCb0IsS0FBbEQsSUFBMkQsS0FBS3pELGlCQUFMLENBQXVCK0UsS0FBdkIsS0FBaUMxQyw2QkFBaUIyQyxlQUFqSCxFQUFrSTtBQUNoSSxlQUFPL0IsZ0NBQWlCLElBQUlsQyxLQUFKLENBQVUsc0JBQVYsQ0FBakIsQ0FBUDtBQUNEOztBQUVELFVBQUlJLFFBQVEsQ0FBQzhELElBQVQsS0FBa0IsU0FBbEIsSUFBK0I5RCxRQUFRLENBQUNDLFdBQXhDLElBQXVERCxRQUFRLENBQUNDLFdBQVQsQ0FBcUJQLE1BQXJCLEdBQThCLENBQXpGLEVBQTRGO0FBQzFGLGVBQU8sS0FBS3FFLDBCQUFMLENBQWdDL0QsUUFBaEMsQ0FBUDtBQUNEOztBQUVELFVBQU1nRSxLQUFLLEdBQUdsQyx1QkFBVy9CLE1BQVg7QUFBQSxrR0FBa0Isa0JBQU1uQixVQUFOO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDeEJHLGtCQUFBQSxPQUR3QixHQUNkYyxJQUFJLENBQUNvRSxnQkFBTCxDQUFzQmxFLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDLGtDQUFrQyxNQUFJLENBQUN5QixjQUF2QyxHQUF3RCxhQUE3RixDQURjO0FBRTlCekMsa0JBQUFBLE9BQU8sQ0FBQ21GLE9BQVIsQ0FBZ0IzRSxJQUFJLENBQUM0RSxTQUFMLENBQWVuRSxRQUFmLENBQWhCO0FBRjhCO0FBQUE7QUFBQSx5QkFLVCxNQUFJLENBQUN1QyxnQkFBTCxDQUFzQjZCLElBQXRCLENBQTJCckYsT0FBM0IsQ0FMUzs7QUFBQTtBQUt0QnNGLGtCQUFBQSxJQUxzQjs7QUFBQSx3QkFNeEJBLElBQUksQ0FBQ0MsVUFBTCxLQUFvQixHQU5JO0FBQUE7QUFBQTtBQUFBOztBQUFBLHdCQU1PLElBQUkxRSxLQUFKLENBQVUsMkJBQTJCeUUsSUFBSSxDQUFDQyxVQUExQyxDQU5QOztBQUFBO0FBT3RCQyxrQkFBQUEsZUFQc0IsR0FPSkYsSUFBSSxDQUFDcEYsT0FBTCxDQUFhUyxNQVBUOztBQUFBLHdCQVF4QjZFLGVBQWUsS0FBSyxDQVJJO0FBQUE7QUFBQTtBQUFBOztBQUFBLHdCQVFLLElBQUkzRSxLQUFKLENBQVUsaUNBQWlDMkUsZUFBM0MsQ0FSTDs7QUFBQTtBQUFBO0FBQUEseUJBU0xGLElBQUksQ0FBQ3BGLE9BQUwsQ0FBYSxDQUFiLEVBQWdCRyxZQUFoQixFQVRLOztBQUFBO0FBU3RCb0Ysa0JBQUFBLFFBVHNCO0FBQUEsZ0NBVVZqRixJQUFJLENBQUNDLEtBQUwsQ0FBV2dGLFFBQVgsQ0FWVSxFQVVoQkMsRUFWZ0IsZUFVckJDLEVBVnFCO0FBVzVCOUYsa0JBQUFBLFVBQVUsQ0FBQzZCLElBQVgsQ0FBZ0JnRSxFQUFoQjtBQVg0QixvREFZckI3RixVQUFVLENBQUNrQyxRQUFYLEVBWnFCOztBQUFBO0FBQUE7QUFBQTtBQWMxQjtBQUNBO0FBQ0E7QUFDQTJDLGtCQUFBQSxPQUFPLENBQUNFLElBQVI7O0FBQ0Esa0JBQUEsTUFBSSxDQUFDcEIsZ0JBQUwsQ0FBc0JDLFVBQXRCOztBQWxCMEIsb0RBbUJuQjVELFVBQVUsQ0FBQ2UsS0FBWCxjQW5CbUI7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBbEI7O0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFBZDs7QUFzQkEsYUFBT3FFLEtBQVA7QUFDRDs7O1dBRUQsb0NBQW1DVyxPQUFuQyxFQUFxRDtBQUFBOztBQUNuRCxVQUFRMUUsV0FBUixHQUFzRDBFLE9BQXRELENBQVExRSxXQUFSO0FBQUEsVUFBd0IyRSx5QkFBeEIsNkNBQXNERCxPQUF0RDtBQUVBLGFBQU83Qyx1QkFBVy9CLE1BQVgsQ0FBbUIsVUFBQW5CLFVBQVUsRUFBSTtBQUN0QyxZQUFNaUcsZUFBZSxHQUFHLEVBQXhCO0FBQ0Esc0ZBQUM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx5QkFFOEI5QixPQUFPLENBQUMrQixHQUFSLENBQVk3RSxXQUFXLENBQUM4RSxHQUFaO0FBQUEsOEdBQWdCLGtCQUFNNUUsVUFBTjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDL0M2RSw4QkFBQUEsS0FEK0MsR0FDdkM3RSxVQUR1QztBQUFBO0FBQUEscUNBRW5DLDRCQUFNNkUsS0FBSyxDQUFDekUsVUFBWixDQUZtQzs7QUFBQTtBQUUvQzhDLDhCQUFBQSxHQUYrQzs7QUFBQSxtQ0FHakRBLEdBQUcsQ0FBQ0MsRUFINkM7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQ0FJdkJELEdBQUcsQ0FBQzRCLFdBQUosRUFKdUI7O0FBQUE7QUFBQTtBQUFBLDZDQUlKRCxLQUpJO0FBQUE7QUFJMUNDLGdDQUFBQSxXQUowQztBQUlKRCxnQ0FBQUEsS0FKSTtBQUFBOztBQUFBO0FBQUEsb0NBTTdDLElBQUlwRixLQUFKLENBQVUsS0FBVixDQU42Qzs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxxQkFBaEI7O0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBQVosQ0FGOUI7O0FBQUE7QUFFU3NGLGtCQUFBQSxZQUZUO0FBWUdBLGtCQUFBQSxZQUFZLENBQUN0RSxPQUFiLENBQXFCLGlCQUE0QjtBQUFBLHdCQUF6QnFFLFdBQXlCLFNBQXpCQSxXQUF5QjtBQUFBLHdCQUFaRCxLQUFZLFNBQVpBLEtBQVk7O0FBQy9DLHdCQUFNRyxNQUFNLEdBQUdDLGVBQU9DLElBQVAsQ0FBWUosV0FBWixDQUFmOztBQUNBLHdCQUFNL0UsTUFBTSxHQUFHLElBQUlMLElBQUksQ0FBQ3lGLGtCQUFULEVBQWY7QUFDQXBGLG9CQUFBQSxNQUFNLENBQUNxRixLQUFQLENBQWFKLE1BQWI7QUFDQSx3QkFBTUssV0FBVyxHQUFHLElBQUkzRixJQUFJLENBQUM0RixXQUFULENBQXFCO0FBQUUzQixzQkFBQUEsSUFBSSxFQUFFa0IsS0FBSyxDQUFDMUUsV0FBZDtBQUEyQm9GLHNCQUFBQSxhQUFhLEVBQUVQLE1BQU0sQ0FBQ3pGO0FBQWpELHFCQUFyQixFQUFnRlEsTUFBaEYsQ0FBcEI7QUFDQTJFLG9CQUFBQSxlQUFlLENBQUN4RSxJQUFoQixDQUFxQm1GLFdBQXJCO0FBQ0QsbUJBTkQ7QUFRTUcsa0JBQUFBLEdBcEJULDBDQW9CK0MsTUFBSSxDQUFDbkUsY0FwQnBELG9CQW9CNEVvRCx5QkFBeUIsQ0FBQ1MsSUFBMUIsQ0FBK0JaLEVBcEIzRztBQXFCUzFGLGtCQUFBQSxPQXJCVCxHQXFCbUJjLElBQUksQ0FBQ29FLGdCQUFMLENBQXNCbEUsTUFBdEIsQ0FBNkIsS0FBN0IsRUFBb0M0RixHQUFwQyxDQXJCbkI7QUFzQlNDLGtCQUFBQSxjQXRCVCxHQXNCMEIsSUFBSS9GLElBQUksQ0FBQ3lGLGtCQUFULEVBdEIxQjtBQXVCR00sa0JBQUFBLGNBQWMsQ0FBQ0wsS0FBZixDQUFxQmhHLElBQUksQ0FBQzRFLFNBQUwsQ0FBZVMseUJBQWYsQ0FBckIsRUFBZ0UsT0FBaEU7QUFDQTdGLGtCQUFBQSxPQUFPLENBQUM4RyxTQUFSLENBQWtCLElBQUloRyxJQUFJLENBQUM0RixXQUFULENBQXFCO0FBQUUzQixvQkFBQUEsSUFBSSxFQUFFLG9DQUFSO0FBQThDNEIsb0JBQUFBLGFBQWEsRUFBRUUsY0FBYyxDQUFDbEc7QUFBNUUsbUJBQXJCLEVBQTJHa0csY0FBM0csQ0FBbEI7QUFDQWYsa0JBQUFBLGVBQWUsQ0FBQ2pFLE9BQWhCLENBQXdCLFVBQUFrRixDQUFDO0FBQUEsMkJBQUkvRyxPQUFPLENBQUM4RyxTQUFSLENBQWtCQyxDQUFsQixDQUFKO0FBQUEsbUJBQXpCO0FBekJIO0FBQUEseUJBMkJzQixNQUFJLENBQUN2RCxnQkFBTCxDQUFzQjZCLElBQXRCLENBQTJCckYsT0FBM0IsQ0EzQnRCOztBQUFBO0FBMkJTc0Ysa0JBQUFBLElBM0JUOztBQUFBLHdCQTRCT0EsSUFBSSxDQUFDcEYsT0FBTCxJQUFnQm9GLElBQUksQ0FBQ3BGLE9BQUwsQ0FBYVMsTUFBYixLQUF3QixDQTVCL0M7QUFBQTtBQUFBO0FBQUE7O0FBNkJLZCxrQkFBQUEsVUFBVSxDQUFDZSxLQUFYLENBQWlCLElBQUlDLEtBQUosZ0NBQWtDeUUsSUFBSSxDQUFDcEYsT0FBTCxDQUFhUyxNQUEvQyxFQUFqQjtBQTdCTDtBQUFBOztBQUFBO0FBQUE7QUFBQSx5QkErQjRCMkUsSUFBSSxDQUFDcEYsT0FBTCxDQUFhLENBQWIsRUFBZ0I4RyxVQUFoQixFQS9CNUI7O0FBQUE7QUFBQTtBQStCZ0J0QixrQkFBQUEsRUEvQmhCLHdCQStCWUMsRUEvQlo7QUFnQ0s5RixrQkFBQUEsVUFBVSxDQUFDNkIsSUFBWCxDQUFnQmdFLEVBQWhCO0FBQ0E3RixrQkFBQUEsVUFBVSxDQUFDa0MsUUFBWDs7QUFqQ0w7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQW9DR2xDLGtCQUFBQSxVQUFVLENBQUNlLEtBQVg7O0FBcENIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQUQ7QUF1Q0QsT0F6Q00sQ0FBUDtBQTBDRDs7OzsyR0FFRDtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0RBQ1MsSUFBSW9ELE9BQUosQ0FBa0IsVUFBQ2IsT0FBRCxFQUFVOEQsTUFBVixFQUFxQjtBQUM1QyxrQkFBQSxNQUFJLENBQUNuSCxpQkFBTCxDQUF1QjZCLFNBQXZCLENBQWlDLFVBQUNDLEVBQUQsRUFBUTtBQUN2Qyx3QkFBSUEsRUFBRSxLQUFLTyw2QkFBaUIrRSxNQUE1QixFQUFvQyxPQUFPL0QsT0FBTyxFQUFkO0FBQ3JDLG1CQUZELEVBR0UsVUFBQzRELENBQUQ7QUFBQSwyQkFBT0UsTUFBTSxDQUFDRixDQUFELENBQWI7QUFBQSxtQkFIRjtBQUlELGlCQUxNLENBRFQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7Ozs7d0dBU0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1FJLGdCQUFBQSxFQURSLEdBQ2EsSUFBSUMsTUFBSixDQUFXLFdBQVgsQ0FEYjs7QUFBQSxvQkFFT0QsRUFBRSxDQUFDRSxJQUFILENBQVEsS0FBSzdFLE1BQWIsQ0FGUDtBQUFBO0FBQUE7QUFBQTs7QUFBQSxzQkFFb0Msc0NBRnBDOztBQUFBO0FBR1E4RSxnQkFBQUEsTUFIUixHQUdpQjtBQUFDakYsa0JBQUFBLEtBQUssRUFBRSxLQUFLQTtBQUFiLGlCQUhqQjtBQUlFLG9CQUFJLEtBQUtJLGNBQVQsRUFBeUI2RSxNQUFNLENBQUMsZ0JBQUQsQ0FBTixHQUEyQixLQUFLN0UsY0FBaEM7QUFDbkI4RSxnQkFBQUEsZUFMUixHQUswQixJQUFJQyxlQUFKLENBQW9CRixNQUFwQixFQUE0QkcsUUFBNUIsRUFMMUI7QUFNUUMsZ0JBQUFBLEtBTlIsYUFNbUIsS0FBS2xGLE1BQUwsQ0FBWW1GLE9BQVosQ0FBb0JSLEVBQXBCLEVBQXdCLE1BQXhCLENBTm5CLG9DQU00RUksZUFONUUsR0FRRTs7QUFSRixrREFTUyxJQUFJdkQsT0FBSjtBQUFBLDRHQUFZLGtCQUFPYixPQUFQLEVBQWdCOEQsTUFBaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFZiw0QkFBQSxNQUFJLENBQUN6RCxnQkFBTCxHQUF3QixJQUFJMUMsSUFBSSxDQUFDOEcsZUFBVCxDQUF5QjtBQUMvQ2hCLDhCQUFBQSxHQUFHLEVBQUVjLEtBRDBDO0FBRS9DRyw4QkFBQUEsY0FBYyxFQUFFLE1BQUksQ0FBQzVFLGdCQUYwQjtBQUcvQzZFLDhCQUFBQSxvQkFBb0IsRUFBRSw4QkFBQ2YsQ0FBRDtBQUFBLHVDQUFPNUQsT0FBTyxDQUFDNEQsQ0FBRCxDQUFkO0FBQUE7QUFIeUIsNkJBQXpCLENBQXhCO0FBTUEsNEJBQUEsTUFBSSxDQUFDbEUsZUFBTCxHQUF1QixJQUF2QjtBQVJlO0FBQUEsbUNBU1QsTUFBSSxDQUFDVyxnQkFBTCxDQUFzQnVFLE9BQXRCLEVBVFM7O0FBQUE7QUFVVC9ILDRCQUFBQSxPQVZTLEdBVUNjLElBQUksQ0FBQ29FLGdCQUFMLENBQXNCbEUsTUFBdEIsQ0FBNkIsTUFBN0IsRUFBcUMsOEJBQXJDLENBVkQ7QUFBQTtBQUFBLG1DQVdRLE1BQUksQ0FBQ3dDLGdCQUFMLENBQXNCNkIsSUFBdEIsQ0FBMkJyRixPQUEzQixDQVhSOztBQUFBO0FBV1RnSSw0QkFBQUEsUUFYUzs7QUFBQSxrQ0FZWEEsUUFBUSxDQUFDekMsVUFBVCxLQUF3QixHQVpiO0FBQUE7QUFBQTtBQUFBOztBQUFBLGtDQVl3QixJQUFJMUUsS0FBSixDQUFVLDhCQUE4Qm1ILFFBQVEsQ0FBQ3pDLFVBQWpELENBWnhCOztBQUFBO0FBQUEsa0NBYVh5QyxRQUFRLENBQUM5SCxPQUFULENBQWlCUyxNQUFqQixLQUE0QixDQWJqQjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxrQ0FhMEIsSUFBSUUsS0FBSixDQUFVLCtCQUErQm1ILFFBQVEsQ0FBQzlILE9BQVQsQ0FBaUJTLE1BQTFELENBYjFCOztBQUFBO0FBQUE7QUFBQSxtQ0FjY3FILFFBQVEsQ0FBQzlILE9BQVQsQ0FBaUIsQ0FBakIsRUFBb0JHLFlBQXBCLEVBZGQ7O0FBQUE7QUFjVDRILDRCQUFBQSxjQWRTO0FBZVRDLDRCQUFBQSxZQWZTLEdBZU0xSCxJQUFJLENBQUNDLEtBQUwsQ0FBV3dILGNBQVgsQ0FmTjtBQWdCZiw0QkFBQSxNQUFJLENBQUN4RixjQUFMLEdBQXNCeUYsWUFBWSxDQUFDekYsY0FBbkM7O0FBQ0EsNEJBQUEsTUFBSSxDQUFDM0MsaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlMsNkJBQWlCK0UsTUFBN0MsRUFqQmUsQ0FtQmY7QUFDQTs7O0FBcEJlO0FBQUEsbUNBcUJULE1BQUksQ0FBQ3BELGVBQUwsRUFyQlM7O0FBQUE7QUFzQmYsNEJBQUEsTUFBSSxDQUFDYixnQkFBTCxDQUFzQmtGLEtBQXRCOztBQUNBLDRCQUFBLE1BQUksQ0FBQ3RGLGVBQUwsR0FBdUIsS0FBdkI7QUF2QmU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUF5QmZvRSw0QkFBQUEsTUFBTSxjQUFOOztBQXpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkFUVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7Ozs7OztpSEF1Q0E7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSx1QkFNVSxDQUFDLEtBQUsvRCxlQUFMLEdBQXVCLGlDQUF4QixFQUEwQ2tGLE9BTnBEOztBQUFBO0FBUVFDLGdCQUFBQSxVQVJSLEdBUXFCaEosZUFSckI7QUFVSSxxQkFBS1MsaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlMsNkJBQWlCbUcsVUFBN0M7O0FBVko7QUFBQSxzQkFZV0QsVUFBVSxHQUFHLENBWnhCO0FBQUE7QUFBQTtBQUFBOztBQWFNQSxnQkFBQUEsVUFBVTtBQUVKRSxnQkFBQUEsS0FmWixHQWVvQkMsSUFBSSxDQUFDQyxHQUFMLEVBZnBCO0FBQUE7QUFBQTtBQUFBLHVCQW1CYyxLQUFLQyxZQUFMLEVBbkJkOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxzQkF1QlUsS0FBSzVJLGlCQUFMLENBQXVCd0QsUUFBdkIsT0FBc0NuQiw2QkFBaUJvQixLQXZCakU7QUFBQTtBQUFBO0FBQUE7O0FBQUE7O0FBQUE7QUEyQk07QUFDQTtBQUNBLG9CQUFJLEtBQUt6RCxpQkFBTCxDQUF1QndELFFBQXZCLE9BQXNDbkIsNkJBQWlCbUcsVUFBM0QsRUFBdUU7QUFDckUsdUJBQUt4SSxpQkFBTCxDQUF1QjRCLElBQXZCLENBQTRCUyw2QkFBaUJtRyxVQUE3QztBQUNELGlCQS9CUCxDQWlDTTtBQUNBO0FBQ0E7OztBQW5DTixzQkFvQ1UsUUFBUUUsSUFBSSxDQUFDQyxHQUFMLEtBQWFGLEtBcEMvQjtBQUFBO0FBQUE7QUFBQTs7QUFxQ1FGLGdCQUFBQSxVQUFVLEdBQUdoSixlQUFiO0FBckNSO0FBQUE7O0FBQUE7QUFBQSxzQkFzQ2lCZ0osVUFBVSxHQUFHLENBdEM5QjtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHVCQXdDYyxJQUFJckUsT0FBSixDQUFZLFVBQUFDLENBQUM7QUFBQSx5QkFBSUMsVUFBVSxDQUFDRCxDQUFELEVBQUksTUFBSSxDQUFDMEUsYUFBTCxFQUFKLENBQWQ7QUFBQSxpQkFBYixDQXhDZDs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUE0Q0k7QUFDQTtBQUNBLHFCQUFLN0ksaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlMsNkJBQWlCMkMsZUFBN0M7O0FBOUNKO0FBQUE7QUFBQTs7QUFBQTtBQUFBLHNCQWlEUyxJQUFJakUsS0FBSixtQ0FBcUN4QixlQUFyQyxlQWpEVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7O1FBb0RBOzs7O1dBQ0EseUJBQXdCO0FBQ3RCLGFBQU91SixJQUFJLENBQUNDLEtBQUwsQ0FBVyxPQUFPRCxJQUFJLENBQUNFLE1BQUwsS0FBZ0IsS0FBbEMsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW4gb3JkZXIgdG8ga2VlcCBmaWxlIHNpemUgZG93biwgb25seSBpbXBvcnQgdGhlIHBhcnRzIG9mIHJ4anMgdGhhdCB3ZSB1c2VcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcy9CZWhhdmlvclN1YmplY3QnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzL09ic2VydmFibGUnO1xuaW1wb3J0IHsgU3Vic2NyaWJlciB9IGZyb20gJ3J4anMvU3Vic2NyaWJlcic7XG5pbXBvcnQgKiBhcyBCRlNFIGZyb20gJ2JvdGZyYW1ld29yay1zdHJlYW1pbmcnO1xuaW1wb3J0IGNyZWF0ZURlZmVycmVkIGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuaW1wb3J0IGZldGNoIGZyb20gJ2Nyb3NzLWZldGNoJztcblxuaW1wb3J0IHR5cGUgeyBEZWZlcnJlZCB9IGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuXG5pbXBvcnQge1xuICBBY3Rpdml0eSxcbiAgQ29ubmVjdGlvblN0YXR1cyxcbiAgQ29udmVyc2F0aW9uLFxuICBJQm90Q29ubmVjdGlvbixcbiAgTWVkaWEsXG4gIE1lc3NhZ2Vcbn0gZnJvbSAnLi9kaXJlY3RMaW5lJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nLFxuICBjb252ZXJzYXRpb25JZD86IHN0cmluZyxcbiAgZG9tYWluOiBzdHJpbmcsXG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZ1xufVxuXG5jbGFzcyBTdHJlYW1IYW5kbGVyIGltcGxlbWVudHMgQkZTRS5SZXF1ZXN0SGFuZGxlciB7XG4gIHByaXZhdGUgY29ubmVjdGlvblN0YXR1cyQ7XG4gIHByaXZhdGUgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT47XG4gIHByaXZhdGUgc2hvdWxkUXVldWU6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgYWN0aXZpdHlRdWV1ZTogQXJyYXk8QWN0aXZpdHk+ID0gW107XG5cbiAgY29uc3RydWN0b3IoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4sIGMkOiBPYnNlcnZhYmxlPENvbm5lY3Rpb25TdGF0dXM+LCBzcTogKCkgPT4gYm9vbGVhbikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCA9IGMkO1xuICAgIHRoaXMuc2hvdWxkUXVldWUgPSBzcTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdWJzY3JpYmVyKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+KSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IEJGU0UuSVJlY2VpdmVSZXF1ZXN0LCBsb2dnZXI/OiBhbnkpOiBQcm9taXNlPEJGU0UuU3RyZWFtaW5nUmVzcG9uc2U+IHtcbiAgICBjb25zdCBzdHJlYW1zID0gWy4uLnJlcXVlc3Quc3RyZWFtc107XG4gICAgY29uc3Qgc3RyZWFtMCA9IHN0cmVhbXMuc2hpZnQoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldEpzb24gPSBhd2FpdCBzdHJlYW0wLnJlYWRBc1N0cmluZygpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0ID0gSlNPTi5wYXJzZShhY3Rpdml0eVNldEpzb24pO1xuXG4gICAgaWYgKGFjdGl2aXR5U2V0LmFjdGl2aXRpZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAvLyBPbmx5IG9uZSBhY3Rpdml0eSBpcyBleHBlY3RlZCBpbiBhIHNldCBpbiBzdHJlYW1pbmdcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ3RoZXJlIHNob3VsZCBiZSBleGFjdGx5IG9uZSBhY3Rpdml0eScpKTtcbiAgICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSg1MDApO1xuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdHlTZXQuYWN0aXZpdGllc1swXTtcblxuICAgIGlmIChzdHJlYW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gWy4uLmFjdGl2aXR5LmF0dGFjaG1lbnRzXTtcblxuICAgICAgbGV0IHN0cmVhbTogQkZTRS5Db250ZW50U3RyZWFtO1xuICAgICAgd2hpbGUgKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gXCJkYXRhOnRleHQvcGxhaW47YmFzZTY0LFwiICsgYXR0YWNobWVudDtcbiAgICAgICAgYXR0YWNobWVudHMucHVzaCh7IGNvbnRlbnRUeXBlOiBzdHJlYW0uY29udGVudFR5cGUsIGNvbnRlbnRVcmw6IGRhdGFVcmkgfSk7XG4gICAgICB9XG5cbiAgICAgIGFjdGl2aXR5LmF0dGFjaG1lbnRzID0gYXR0YWNobWVudHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvdWxkUXVldWUoKSkge1xuICAgICAgdGhpcy5hY3Rpdml0eVF1ZXVlLnB1c2goYWN0aXZpdHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN1YnNjcmliZXIubmV4dChhY3Rpdml0eSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDIwMCk7XG4gIH1cblxuICBwdWJsaWMgZmx1c2goKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoY3MgPT4geyB9KVxuICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5mb3JFYWNoKChhKSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfSA6IENvbnZlcnNhdGlvbikge1xuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmdldFZhbHVlKCkgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBoYXMgZW5kZWQuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcblxuICAgIHRoaXMuY29ubmVjdERlZmVycmVkLnJlc29sdmUoKTtcbiAgfVxuXG4gIGVuZCgpIHtcbiAgICAvLyBPbmNlIGVuZCgpIGlzIGNhbGxlZCwgbm8gcmVjb25uZWN0aW9uIGNhbiBiZSBtYWRlLlxuICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FbmRlZCk7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tbW9uSGVhZGVycygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICBcIngtbXMtYm90LWFnZW50XCI6IHRoaXMuX2JvdEFnZW50XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Qm90QWdlbnQoY3VzdG9tQWdlbnQ6IHN0cmluZyA9ICcnKTogc3RyaW5nIHtcbiAgICBsZXQgY2xpZW50QWdlbnQgPSAnZGlyZWN0bGluZVN0cmVhbWluZydcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gXG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlKG51bWJlck9mQXR0ZW1wdHMgPCBNQVhfUkVUUllfQ09VTlQpIHtcbiAgICAgIG51bWJlck9mQXR0ZW1wdHMrKztcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCByZWZyZXNoVG9rZW5JbnRlcnZhbCkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5kb21haW59L3Rva2Vucy9yZWZyZXNoYCwge21ldGhvZDogXCJQT1NUXCIsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpfSk7XG4gICAgICAgIGlmIChyZXMub2spIHtcbiAgICAgICAgICBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICAgICAgICBjb25zdCB7dG9rZW59ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSB0aHJldyBhbiBleGNlcHRpb246ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKFwiUmV0cmllcyBleGhhdXN0ZWRcIik7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC52YWx1ZSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCB8fCB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gXCJtZXNzYWdlXCIgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLycgKyB0aGlzLmNvbnZlcnNhdGlvbklkICsgJy9hY3Rpdml0aWVzJyk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIlBvc3RBY3Rpdml0eSByZXR1cm5lZCBcIiArIHJlc3Auc3RhdHVzQ29kZSk7XG4gICAgICAgIGNvbnN0IG51bWJlck9mU3RyZWFtcyA9IHJlc3Auc3RyZWFtcy5sZW5ndGg7XG4gICAgICAgIGlmIChudW1iZXJPZlN0cmVhbXMgIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCBcIiArIG51bWJlck9mU3RyZWFtcylcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHtJZCA6IGlkfSA9IEpTT04ucGFyc2UoaWRTdHJpbmcpO1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgICAvLyB0aGUgZGlzY29ubmVjdGlvbkhhbmRsZXIuIEV2ZXJ5dGhpbmcgZWxzZSBjYW5cbiAgICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZSggc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCBodHRwQ29udGVudExpc3QgPSBbXTtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXJzID0gYXdhaXQgUHJvbWlzZS5hbGwoYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2gobWVkaWEuY29udGVudFVybCk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgYXJyYXlCdWZmZXJzLmZvckVhY2goKHsgYXJyYXlCdWZmZXIsIG1lZGlhIH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBodHRwQ29udGVudCA9IG5ldyBCRlNFLkh0dHBDb250ZW50KHsgdHlwZTogbWVkaWEuY29udGVudFR5cGUsIGNvbnRlbnRMZW5ndGg6IGJ1ZmZlci5sZW5ndGggfSwgc3RyZWFtKTtcbiAgICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5wdXNoKGh0dHBDb250ZW50KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHVybCA9IGAvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zLyR7dGhpcy5jb252ZXJzYXRpb25JZH0vdXNlcnMvJHttZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzLmZyb20uaWR9L3VwbG9hZGA7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BVVCcsIHVybCk7XG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlTdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICBhY3Rpdml0eVN0cmVhbS53cml0ZShKU09OLnN0cmluZ2lmeShtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzKSwgJ3V0Zi04Jyk7XG4gICAgICAgICAgcmVxdWVzdC5hZGRTdHJlYW0obmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBcImFwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHlcIiwgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sIGFjdGl2aXR5U3RyZWFtKSk7XG4gICAgICAgICAgaHR0cENvbnRlbnRMaXN0LmZvckVhY2goZSA9PiByZXF1ZXN0LmFkZFN0cmVhbShlKSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgICAgaWYgKHJlc3Auc3RyZWFtcyAmJiByZXNwLnN0cmVhbXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcihgSW52YWxpZCBzdHJlYW0gY291bnQgJHtyZXNwLnN0cmVhbXMubGVuZ3RofWApKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qge0lkOiBpZH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7SWQ6IHN0cmluZ30+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoY3MpID0+IHtcbiAgICAgICAgaWYgKGNzID09PSBDb25uZWN0aW9uU3RhdHVzLk9ubGluZSkgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH0sXG4gICAgICAgIChlKSA9PiByZWplY3QoZSkpO1xuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuICAgIGlmICghcmUudGVzdCh0aGlzLmRvbWFpbikpIHRocm93IChcIkRvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwc1wiKTtcbiAgICBjb25zdCBwYXJhbXMgPSB7dG9rZW46IHRoaXMudG9rZW59O1xuICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbklkKSBwYXJhbXNbJ2NvbnZlcnNhdGlvbklkJ10gPSB0aGlzLmNvbnZlcnNhdGlvbklkO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgQkZTRS5XZWJTb2NrZXRDbGllbnQoe1xuICAgICAgICAgIHVybDogd3NVcmwsXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHRoaXMudGhlU3RyZWFtSGFuZGxlcixcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogKGUpID0+IHJlc29sdmUoZSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uY29ubmVjdCgpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihcIkNvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1c0NvZGUpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgXCIgKyByZXNwb25zZS5zdHJlYW1zLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uSWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLk9ubGluZSk7XG5cbiAgICAgICAgLy8gV2FpdCB1bnRpbCBETCBjb25zdW1lcnMgaGF2ZSBoYWQgYSBjaGFuY2UgdG8gYmUgbm90aWZpZWRcbiAgICAgICAgLy8gb2YgdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGNoYW5nZS5cbiAgICAgICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB7XG4gICAgLy8gVGhpcyBmb3ItbG9vcCB3aWxsIGJyZWFrIHdoZW4gc29tZW9uZSBjYWxsIGVuZCgpIGFuZCBpdCB3aWxsIHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkVuZGVkLlxuICAgIGZvciAoOzspIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBzaWduYWwgYW5kIHdhaXQgZm9yIHNvbWVvbmUga2lja2luZyBvZmYgdGhlIGNvbm5lY3Rpb246XG4gICAgICAvLyAtIHN1YnNjcmliZSB0byBhY3Rpdml0eSQsIG9yO1xuICAgICAgLy8gLSByZXRyaWVzIGV4aGF1c3RlZCAoRmFpbGVkVG9Db25uZWN0KSwgdGhlbiwgc29tZW9uZSBjYWxsIHJlY29ubmVjdCgpXG4gICAgICBhd2FpdCAodGhpcy5jb25uZWN0RGVmZXJyZWQgPSBjcmVhdGVEZWZlcnJlZCgpKS5wcm9taXNlO1xuXG4gICAgICBsZXQgbnVtUmV0cmllcyA9IE1BWF9SRVRSWV9DT1VOVDtcblxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG5cbiAgICAgIHdoaWxlIChudW1SZXRyaWVzID4gMCkge1xuICAgICAgICBudW1SZXRyaWVzLS07XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVGhpcyBwcm9taXNlIHdpbGwgcmVqZWN0L3Jlc29sdmUgd2hlbiBkaXNjb25uZWN0ZWQuXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0QXN5bmMoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICB0aHJvdyAobmV3IEVycm9yKGBGYWlsZWQgdG8gY29ubmVjdCBhZnRlciAke01BWF9SRVRSWV9DT1VOVH0gYXR0ZW1wdHNgKSk7XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXX0=
|