@coolon/angular-ui-powerups 0.0.101 → 0.0.102

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.
Files changed (53) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +896 -620
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.metadata.json +1 -1
  6. package/esm2015/coolon-angular-ui-powerups.js +2 -2
  7. package/esm2015/index.js +2 -2
  8. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +2 -1
  9. package/esm2015/lib/interaction/interaction-context-base.js +21 -8
  10. package/esm2015/lib/interaction/interaction-context.js +56 -3
  11. package/esm2015/lib/interaction/services/interaction.service.js +11 -7
  12. package/esm2015/lib/place/guards/navigation-state.js +216 -135
  13. package/esm2015/lib/place/guards/place-component-deactivation-handler.js +63 -28
  14. package/esm2015/lib/place/guards/place.guard.js +215 -0
  15. package/esm2015/lib/place/index.js +2 -3
  16. package/esm2015/lib/place/place-router.js +34 -36
  17. package/esm2015/lib/place/url-snapshot.js +69 -53
  18. package/esm2015/public_api.js +2 -2
  19. package/esm5/coolon-angular-ui-powerups.js +2 -2
  20. package/esm5/index.js +2 -2
  21. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +2 -1
  22. package/esm5/lib/interaction/interaction-context-base.js +25 -8
  23. package/esm5/lib/interaction/interaction-context.js +88 -10
  24. package/esm5/lib/interaction/services/interaction.service.js +17 -8
  25. package/esm5/lib/place/guards/navigation-state.js +280 -162
  26. package/esm5/lib/place/guards/place-component-deactivation-handler.js +73 -27
  27. package/esm5/lib/place/guards/place.guard.js +300 -0
  28. package/esm5/lib/place/index.js +2 -3
  29. package/esm5/lib/place/place-router.js +52 -39
  30. package/esm5/lib/place/url-snapshot.js +85 -58
  31. package/esm5/public_api.js +2 -2
  32. package/fesm2015/coolon-angular-ui-powerups.js +661 -519
  33. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  34. package/fesm5/coolon-angular-ui-powerups.js +896 -619
  35. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  36. package/lib/interaction/interaction-context-base.d.ts +3 -1
  37. package/lib/interaction/interaction-context.d.ts +9 -2
  38. package/lib/interaction/services/interaction.service.d.ts +2 -2
  39. package/lib/place/guards/navigation-state.d.ts +44 -38
  40. package/lib/place/guards/place-component-deactivation-handler.d.ts +7 -4
  41. package/lib/place/guards/{abstract-place.guard.d.ts → place.guard.d.ts} +8 -3
  42. package/lib/place/index.d.ts +1 -2
  43. package/lib/place/place-router.d.ts +2 -0
  44. package/lib/place/url-snapshot.d.ts +14 -9
  45. package/package.json +1 -1
  46. package/schematics/place-routes/place-def.js +1 -0
  47. package/schematics/place-routes/place-def.js.map +1 -1
  48. package/schematics/place-routes/templates/place-routes.ts.template +10 -11
  49. package/esm2015/lib/place/guards/abstract-place.guard.js +0 -166
  50. package/esm2015/lib/place/guards/interaction.guard.js +0 -121
  51. package/esm5/lib/place/guards/abstract-place.guard.js +0 -213
  52. package/esm5/lib/place/guards/interaction.guard.js +0 -133
  53. package/lib/place/guards/interaction.guard.d.ts +0 -17
@@ -3,7 +3,8 @@
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
5
  import * as tslib_1 from "tslib";
6
- import { Dsl, GarbageCollector, lang, Logger } from '@coolon/pectin';
6
+ import { NavigationCancel, NavigationStart } from '@angular/router';
7
+ import { Dsl, GarbageCollector, lang, Logger, Trace } from '@coolon/pectin';
7
8
  import { PlaceComponentDeactivationHandler } from './place-component-deactivation-handler';
8
9
  /**
9
10
  * @abstract
@@ -19,6 +20,16 @@ NavigationState = /** @class */ (function (_super) {
19
20
  _this._visits = new Map();
20
21
  return _this;
21
22
  }
23
+ Object.defineProperty(NavigationState.prototype, "name", {
24
+ get: /**
25
+ * @return {?}
26
+ */
27
+ function () {
28
+ return this.constructor.name;
29
+ },
30
+ enumerable: true,
31
+ configurable: true
32
+ });
22
33
  Object.defineProperty(NavigationState.prototype, "idle", {
23
34
  get: /**
24
35
  * @return {?}
@@ -81,6 +92,19 @@ NavigationState = /** @class */ (function (_super) {
81
92
  function (placeDef) {
82
93
  return this._visits.get(placeDef);
83
94
  };
95
+ /**
96
+ * @param {?} visit
97
+ * @param {?} initialUrl
98
+ * @return {?}
99
+ */
100
+ NavigationState.prototype.onPlaceNavigationStart = /**
101
+ * @param {?} visit
102
+ * @param {?} initialUrl
103
+ * @return {?}
104
+ */
105
+ function (visit, initialUrl) {
106
+ return this.illegalTransition('onPlaceNavigationStart');
107
+ };
84
108
  /**
85
109
  * @param {?} event
86
110
  * @return {?}
@@ -96,7 +120,7 @@ NavigationState = /** @class */ (function (_super) {
96
120
  * @param {?} event
97
121
  * @return {?}
98
122
  */
99
- NavigationState.prototype.onStart = /**
123
+ NavigationState.prototype.onRouterStarted = /**
100
124
  * @param {?} event
101
125
  * @return {?}
102
126
  */
@@ -107,7 +131,7 @@ NavigationState = /** @class */ (function (_super) {
107
131
  * @param {?} event
108
132
  * @return {?}
109
133
  */
110
- NavigationState.prototype.onCancel = /**
134
+ NavigationState.prototype.onRouterCancelled = /**
111
135
  * @param {?} event
112
136
  * @return {?}
113
137
  */
@@ -118,7 +142,7 @@ NavigationState = /** @class */ (function (_super) {
118
142
  * @param {?} event
119
143
  * @return {?}
120
144
  */
121
- NavigationState.prototype.onError = /**
145
+ NavigationState.prototype.onRouterError = /**
122
146
  * @param {?} event
123
147
  * @return {?}
124
148
  */
@@ -129,7 +153,7 @@ NavigationState = /** @class */ (function (_super) {
129
153
  * @param {?} event
130
154
  * @return {?}
131
155
  */
132
- NavigationState.prototype.onEnd = /**
156
+ NavigationState.prototype.onRouterEnd = /**
133
157
  * @param {?} event
134
158
  * @return {?}
135
159
  */
@@ -149,15 +173,17 @@ NavigationState = /** @class */ (function (_super) {
149
173
  };
150
174
  /**
151
175
  * @param {?} component
152
- * @param {?} nextState
176
+ * @param {?} currentUrl
177
+ * @param {?} nextUrl
153
178
  * @return {?}
154
179
  */
155
180
  NavigationState.prototype.canDeactivatePlace = /**
156
181
  * @param {?} component
157
- * @param {?} nextState
182
+ * @param {?} currentUrl
183
+ * @param {?} nextUrl
158
184
  * @return {?}
159
185
  */
160
- function (component, nextState) {
186
+ function (component, currentUrl, nextUrl) {
161
187
  return tslib_1.__awaiter(this, void 0, void 0, function () {
162
188
  return tslib_1.__generator(this, function (_a) {
163
189
  return [2 /*return*/, this.illegalTransition('canDeactivatePlace')];
@@ -210,12 +236,29 @@ NavigationState = /** @class */ (function (_super) {
210
236
  * @return {?}
211
237
  */
212
238
  function (event) {
213
- // TODO: check if the event is purely for interaction context changes.
214
239
  /** @type {?} */
215
240
  var popstate = event.navigationTrigger === 'popstate';
216
241
  return popstate ?
217
- new NavigationState.NavigationBackTransition(this.context, popstate, this.currentRouterUrl()) :
218
- new NavigationState.NavigationTransition(this.context, popstate, this.currentRouterUrl());
242
+ this.interactionService.isActive() ?
243
+ new NavigationState.InteractionPopStateTransition(this.context, this.currentRouterUrl()) :
244
+ new NavigationState.PopStateTransition(this.context, this.currentRouterUrl())
245
+ :
246
+ this.interactionService.isActive() ?
247
+ new NavigationState.InteractionTransition(this.context, this.currentRouterUrl()) :
248
+ new NavigationState.NavigationTransition(this.context, this.currentRouterUrl());
249
+ };
250
+ /**
251
+ * @protected
252
+ * @return {?}
253
+ */
254
+ NavigationState.prototype.createIdleState = /**
255
+ * @protected
256
+ * @return {?}
257
+ */
258
+ function () {
259
+ return this.interactionService.isActive() ?
260
+ new NavigationState.IdleDuringInteraction(this.context, this.currentRouterUrl()) :
261
+ new NavigationState.Idle(this.context);
219
262
  };
220
263
  /**
221
264
  * @param {?} url
@@ -226,12 +269,7 @@ NavigationState = /** @class */ (function (_super) {
226
269
  * @return {?}
227
270
  */
228
271
  function (url) {
229
- var _this = this;
230
- // TODO: Should this be a navigate operation to avoid confusing the router...??
231
- setTimeout((/**
232
- * @return {?}
233
- */
234
- function () { return _this.placeRouter.resetBrowserLocation(url); }));
272
+ this.placeRouter.resetBrowserLocation(url);
235
273
  };
236
274
  /**
237
275
  * @return {?}
@@ -293,11 +331,27 @@ if (false) {
293
331
  _this.isPopState = false;
294
332
  return _this;
295
333
  }
334
+ /**
335
+ * @param {?} visit
336
+ * @param {?} initialUrl
337
+ * @return {?}
338
+ */
339
+ Idle.prototype.onPlaceNavigationStart = /**
340
+ * @param {?} visit
341
+ * @param {?} initialUrl
342
+ * @return {?}
343
+ */
344
+ function (visit, initialUrl) {
345
+ /** @type {?} */
346
+ var navigationTransition = new NavigationTransition(this.context, initialUrl);
347
+ navigationTransition.storeVisit(visit);
348
+ return navigationTransition;
349
+ };
296
350
  /**
297
351
  * @param {?} event
298
352
  * @return {?}
299
353
  */
300
- Idle.prototype.onStart = /**
354
+ Idle.prototype.onRouterStarted = /**
301
355
  * @param {?} event
302
356
  * @return {?}
303
357
  */
@@ -345,9 +399,8 @@ if (false) {
345
399
  */
346
400
  AbstractNavigationTransition = /** @class */ (function (_super) {
347
401
  tslib_1.__extends(AbstractNavigationTransition, _super);
348
- function AbstractNavigationTransition(context, isPopState, startingUrl) {
402
+ function AbstractNavigationTransition(context, startingUrl) {
349
403
  var _this = _super.call(this, context) || this;
350
- _this.isPopState = isPopState;
351
404
  _this.startingUrl = startingUrl;
352
405
  _this.isTransitional = true;
353
406
  _this.componentDeactivationHandlers = new Map();
@@ -380,7 +433,7 @@ if (false) {
380
433
  * @param {?} event
381
434
  * @return {?}
382
435
  */
383
- AbstractNavigationTransition.prototype.onStart = /**
436
+ AbstractNavigationTransition.prototype.onRouterStarted = /**
384
437
  * @param {?} event
385
438
  * @return {?}
386
439
  */
@@ -393,7 +446,7 @@ if (false) {
393
446
  * @param {?} event
394
447
  * @return {?}
395
448
  */
396
- AbstractNavigationTransition.prototype.onEnd = /**
449
+ AbstractNavigationTransition.prototype.onRouterEnd = /**
397
450
  * @param {?} event
398
451
  * @return {?}
399
452
  */
@@ -411,37 +464,38 @@ if (false) {
411
464
  * @return {?}
412
465
  */
413
466
  function (locationTriggerUrl) {
414
- // detach the interactoin from the session so it doesn't get disposed until the activity
415
- // has completed.
467
+ Logger.get(this).info("back button pressed during navigation session interaction promise");
468
+ // detach the interaction from the session so it doesn't get disposed until the activity has completed.
416
469
  /** @type {?} */
417
- var context = this.detachInteractionContext();
418
- var when = Dsl.disposeWith(context).when;
470
+ var navigationInteraction = this.detachInteractionContext();
471
+ var when = Dsl.disposeWith(navigationInteraction).when;
419
472
  // TODO: I need to make the exclusive interaction context disallow nested activities or
420
- // that would mess things up entirely.
421
- context.getCurrentActivity().then((/**
422
- * @param {?} activity
473
+ // that would mess things up entirely. Or, can I do a context.abortAll().then(..)
474
+ navigationInteraction.cancelCurrentActivity().then((/**
423
475
  * @return {?}
424
476
  */
425
- function (activity) {
426
- when.valueOf(context.active).becomesFalsey((/**
427
- * @return {?}
428
- */
429
- function () { return context.dispose(); }), { once: true });
430
- activity.cancel(null);
477
+ function () {
478
+ navigationInteraction.dispose();
431
479
  }));
432
- return new CancelledDuringNavigationInteraction(this.context, this.startingUrl, locationTriggerUrl);
480
+ return new CancelledDuringNavigationInteraction(this.context, this.startingUrl, this.isPopState, locationTriggerUrl);
433
481
  };
482
+ // @Trace()
483
+ // @Trace()
434
484
  /**
435
485
  * @param {?} component
436
- * @param {?} nextState
486
+ * @param {?} currentUrl
487
+ * @param {?} nextUrl
437
488
  * @return {?}
438
489
  */
439
- AbstractNavigationTransition.prototype.canDeactivatePlace = /**
490
+ AbstractNavigationTransition.prototype.canDeactivatePlace =
491
+ // @Trace()
492
+ /**
440
493
  * @param {?} component
441
- * @param {?} nextState
494
+ * @param {?} currentUrl
495
+ * @param {?} nextUrl
442
496
  * @return {?}
443
497
  */
444
- function (component, nextState) {
498
+ function (component, currentUrl, nextUrl) {
445
499
  return tslib_1.__awaiter(this, void 0, void 0, function () {
446
500
  var handler, isPrimaryHandler;
447
501
  return tslib_1.__generator(this, function (_a) {
@@ -449,10 +503,10 @@ if (false) {
449
503
  handler = this.componentDeactivationHandlers.get(component);
450
504
  if (!handler) {
451
505
  isPrimaryHandler = this.componentDeactivationHandlers.size === 0;
452
- handler = new PlaceComponentDeactivationHandler(component, this);
506
+ handler = new PlaceComponentDeactivationHandler(component, this, isPrimaryHandler);
453
507
  this.componentDeactivationHandlers.set(component, handler);
454
508
  }
455
- return [2 /*return*/, handler.canDeactivate(nextState)];
509
+ return [2 /*return*/, handler.canDeactivate(currentUrl, nextUrl)];
456
510
  });
457
511
  });
458
512
  };
@@ -487,8 +541,6 @@ if (false) {
487
541
  */
488
542
  AbstractNavigationTransition.prototype._interactionContext;
489
543
  /** @type {?} */
490
- AbstractNavigationTransition.prototype.isPopState;
491
- /** @type {?} */
492
544
  AbstractNavigationTransition.prototype.startingUrl;
493
545
  }
494
546
  var NavigationTransition = /** @class */ (function (_super) {
@@ -502,44 +554,18 @@ if (false) {
502
554
  * @param {?} event
503
555
  * @return {?}
504
556
  */
505
- NavigationTransition.prototype.onStart = /**
557
+ NavigationTransition.prototype.onRouterCancelled = /**
506
558
  * @param {?} event
507
559
  * @return {?}
508
560
  */
509
561
  function (event) {
510
- // active sessions can have many cancel start cycles due
511
- // to place guard redirects
512
562
  return this;
513
563
  };
514
564
  /**
515
565
  * @param {?} event
516
566
  * @return {?}
517
567
  */
518
- NavigationTransition.prototype.onEnd = /**
519
- * @param {?} event
520
- * @return {?}
521
- */
522
- function (event) {
523
- // navigation succeeded
524
- this.context.notifySuccess(this);
525
- return new Idle(this.context);
526
- };
527
- /**
528
- * @param {?} event
529
- * @return {?}
530
- */
531
- NavigationTransition.prototype.onCancel = /**
532
- * @param {?} event
533
- * @return {?}
534
- */
535
- function (event) {
536
- return new Idle(this.context);
537
- };
538
- /**
539
- * @param {?} event
540
- * @return {?}
541
- */
542
- NavigationTransition.prototype.onError = /**
568
+ NavigationTransition.prototype.onRouterError = /**
543
569
  * @param {?} event
544
570
  * @return {?}
545
571
  */
@@ -563,9 +589,9 @@ if (false) {
563
589
  /** @type {?} */
564
590
  NavigationTransition.prototype.isPopState;
565
591
  }
566
- var NavigationBackTransition = /** @class */ (function (_super) {
567
- tslib_1.__extends(NavigationBackTransition, _super);
568
- function NavigationBackTransition() {
592
+ var PopStateTransition = /** @class */ (function (_super) {
593
+ tslib_1.__extends(PopStateTransition, _super);
594
+ function PopStateTransition() {
569
595
  var _this = _super !== null && _super.apply(this, arguments) || this;
570
596
  _this.isPopState = true;
571
597
  return _this;
@@ -574,7 +600,7 @@ if (false) {
574
600
  * @param {?} event
575
601
  * @return {?}
576
602
  */
577
- NavigationBackTransition.prototype.onCancel = /**
603
+ PopStateTransition.prototype.onRouterCancelled = /**
578
604
  * @param {?} event
579
605
  * @return {?}
580
606
  */
@@ -589,7 +615,7 @@ if (false) {
589
615
  * @param {?} event
590
616
  * @return {?}
591
617
  */
592
- NavigationBackTransition.prototype.onError = /**
618
+ PopStateTransition.prototype.onRouterError = /**
593
619
  * @param {?} event
594
620
  * @return {?}
595
621
  */
@@ -603,12 +629,82 @@ if (false) {
603
629
  }
604
630
  return new Idle(this.context);
605
631
  };
606
- return NavigationBackTransition;
632
+ return PopStateTransition;
607
633
  }(AbstractNavigationTransition));
608
- NavigationState.NavigationBackTransition = NavigationBackTransition;
634
+ NavigationState.PopStateTransition = PopStateTransition;
635
+ if (false) {
636
+ /** @type {?} */
637
+ PopStateTransition.prototype.isPopState;
638
+ }
639
+ var IdleDuringInteraction = /** @class */ (function (_super) {
640
+ tslib_1.__extends(IdleDuringInteraction, _super);
641
+ function IdleDuringInteraction(context, startingUrl) {
642
+ var _this = _super.call(this, context) || this;
643
+ _this.startingUrl = startingUrl;
644
+ _this.isTransitional = false;
645
+ _this.isPopState = false;
646
+ return _this;
647
+ }
648
+ /**
649
+ * @param {?} visit
650
+ * @param {?} initialUrl
651
+ * @return {?}
652
+ */
653
+ IdleDuringInteraction.prototype.onPlaceNavigationStart = /**
654
+ * @param {?} visit
655
+ * @param {?} initialUrl
656
+ * @return {?}
657
+ */
658
+ function (visit, initialUrl) {
659
+ /** @type {?} */
660
+ var navigationTransition = new InteractionTransition(this.context, initialUrl);
661
+ navigationTransition.storeVisit(visit);
662
+ return navigationTransition;
663
+ };
664
+ /**
665
+ * @param {?} event
666
+ * @return {?}
667
+ */
668
+ IdleDuringInteraction.prototype.onRouterStarted = /**
669
+ * @param {?} event
670
+ * @return {?}
671
+ */
672
+ function (event) {
673
+ return new InteractionTransition(this.context, event.url);
674
+ };
675
+ /**
676
+ * @param {?} event
677
+ * @return {?}
678
+ */
679
+ IdleDuringInteraction.prototype.onPopState = /**
680
+ * @param {?} event
681
+ * @return {?}
682
+ */
683
+ function (event) {
684
+ return new InteractionPopStateTransition(this.context, event.url);
685
+ };
686
+ tslib_1.__decorate([
687
+ Trace(),
688
+ tslib_1.__metadata("design:type", Function),
689
+ tslib_1.__metadata("design:paramtypes", [NavigationStart]),
690
+ tslib_1.__metadata("design:returntype", NavigationState)
691
+ ], IdleDuringInteraction.prototype, "onRouterStarted", null);
692
+ tslib_1.__decorate([
693
+ Trace(),
694
+ tslib_1.__metadata("design:type", Function),
695
+ tslib_1.__metadata("design:paramtypes", [NavigationStart]),
696
+ tslib_1.__metadata("design:returntype", NavigationState)
697
+ ], IdleDuringInteraction.prototype, "onPopState", null);
698
+ return IdleDuringInteraction;
699
+ }(NavigationState));
700
+ NavigationState.IdleDuringInteraction = IdleDuringInteraction;
609
701
  if (false) {
610
702
  /** @type {?} */
611
- NavigationBackTransition.prototype.isPopState;
703
+ IdleDuringInteraction.prototype.isTransitional;
704
+ /** @type {?} */
705
+ IdleDuringInteraction.prototype.isPopState;
706
+ /** @type {?} */
707
+ IdleDuringInteraction.prototype.startingUrl;
612
708
  }
613
709
  /**
614
710
  * @abstract
@@ -619,29 +715,13 @@ if (false) {
619
715
  AbstractInteractionTransition = /** @class */ (function (_super) {
620
716
  tslib_1.__extends(AbstractInteractionTransition, _super);
621
717
  function AbstractInteractionTransition(context, startingUrl) {
622
- var _this = _super.call(this, context) || this;
718
+ var _this = _super.call(this, context, startingUrl) || this;
623
719
  _this.startingUrl = startingUrl;
624
720
  _this.isTransitional = true;
625
721
  return _this;
626
722
  }
627
- /**
628
- * @protected
629
- * @return {?}
630
- */
631
- AbstractInteractionTransition.prototype.reinstateInteractionRoute = /**
632
- * @protected
633
- * @return {?}
634
- */
635
- function () {
636
- var _this = this;
637
- console.log(this.startingUrl);
638
- setTimeout((/**
639
- * @return {?}
640
- */
641
- function () { return _this.placeRouter.syncInteractionIdsWithRouter(); }));
642
- };
643
723
  return AbstractInteractionTransition;
644
- }(NavigationState));
724
+ }(AbstractNavigationTransition));
645
725
  NavigationState.AbstractInteractionTransition = AbstractInteractionTransition;
646
726
  if (false) {
647
727
  /** @type {?} */
@@ -668,13 +748,43 @@ if (false) {
668
748
  * @param {?} event
669
749
  * @return {?}
670
750
  */
671
- InteractionTransition.prototype.onEnd = /**
751
+ InteractionTransition.prototype.onRouterCancelled = /**
752
+ * @param {?} event
753
+ * @return {?}
754
+ */
755
+ function (event) {
756
+ if (this.context.interactionService.isActive()) {
757
+ /** @type {?} */
758
+ var interactionIds = this.interactionService.activeInteractionContextIds.value;
759
+ this.resetBrowserLocation(this.placeRouter.parseUrl(this.startingUrl).updateInteractionIds(interactionIds).url);
760
+ return new IdleDuringInteraction(this.context, this.startingUrl);
761
+ }
762
+ else {
763
+ return new Idle(this.context);
764
+ }
765
+ };
766
+ /**
767
+ * @param {?} event
768
+ * @return {?}
769
+ */
770
+ InteractionTransition.prototype.onRouterError = /**
771
+ * @param {?} event
772
+ * @return {?}
773
+ */
774
+ function (event) {
775
+ // navigation was aborted.
776
+ return new IdleDuringInteraction(this.context, this.startingUrl);
777
+ };
778
+ /**
779
+ * @param {?} event
780
+ * @return {?}
781
+ */
782
+ InteractionTransition.prototype.onRouterEnd = /**
672
783
  * @param {?} event
673
784
  * @return {?}
674
785
  */
675
786
  function (event) {
676
787
  if (this.context.interactionService.isActive()) {
677
- this.reinstateInteractionRoute();
678
788
  return new IdleDuringInteraction(this.context, this.startingUrl);
679
789
  }
680
790
  else {
@@ -696,9 +806,9 @@ if (false) {
696
806
  * This state exists to handle all events while any kind of navigation is in progress. That way all other states can
697
807
  * happily ignore interaction contexts.
698
808
  */
699
- InteractionBackTransition = /** @class */ (function (_super) {
700
- tslib_1.__extends(InteractionBackTransition, _super);
701
- function InteractionBackTransition() {
809
+ InteractionPopStateTransition = /** @class */ (function (_super) {
810
+ tslib_1.__extends(InteractionPopStateTransition, _super);
811
+ function InteractionPopStateTransition() {
702
812
  var _this = _super !== null && _super.apply(this, arguments) || this;
703
813
  _this.isPopState = true;
704
814
  return _this;
@@ -707,76 +817,53 @@ if (false) {
707
817
  * @param {?} event
708
818
  * @return {?}
709
819
  */
710
- InteractionBackTransition.prototype.onEnd = /**
820
+ InteractionPopStateTransition.prototype.onRouterCancelled = /**
711
821
  * @param {?} event
712
822
  * @return {?}
713
823
  */
714
824
  function (event) {
715
825
  if (this.interactionService.isActive()) {
716
- this.reinstateInteractionRoute();
826
+ /** @type {?} */
827
+ var interactionIds = this.interactionService.activeInteractionContextIds.value;
828
+ this.resetBrowserLocation(this.placeRouter.parseUrl(this.startingUrl).updateInteractionIds(interactionIds).url);
717
829
  return new IdleDuringInteraction(this.context, this.startingUrl);
718
830
  }
719
831
  else {
720
832
  return new Idle(this.context);
721
833
  }
722
834
  };
723
- return InteractionBackTransition;
724
- }(AbstractInteractionTransition));
725
- NavigationState.InteractionBackTransition = InteractionBackTransition;
726
- if (false) {
727
- /** @type {?} */
728
- InteractionBackTransition.prototype.isPopState;
729
- }
730
- var IdleDuringInteraction = /** @class */ (function (_super) {
731
- tslib_1.__extends(IdleDuringInteraction, _super);
732
- function IdleDuringInteraction(context, startingUrl) {
733
- var _this = _super.call(this, context) || this;
734
- _this.startingUrl = startingUrl;
735
- _this.isTransitional = false;
736
- _this.isPopState = false;
737
- return _this;
738
- }
739
- /**
740
- * @param {?} event
741
- * @return {?}
742
- */
743
- IdleDuringInteraction.prototype.onStart = /**
744
- * @param {?} event
745
- * @return {?}
746
- */
747
- function (event) {
748
- return new InteractionTransition(this.context, event.url);
749
- };
750
835
  /**
751
836
  * @param {?} event
752
837
  * @return {?}
753
838
  */
754
- IdleDuringInteraction.prototype.onPopState = /**
839
+ InteractionPopStateTransition.prototype.onRouterEnd = /**
755
840
  * @param {?} event
756
841
  * @return {?}
757
842
  */
758
843
  function (event) {
759
- return new InteractionBackTransition(this.context, event.url);
844
+ if (this.context.interactionService.isActive()) {
845
+ return new IdleDuringInteraction(this.context, this.startingUrl);
846
+ }
847
+ else {
848
+ return new Idle(this.context);
849
+ }
760
850
  };
761
- return IdleDuringInteraction;
762
- }(NavigationState));
763
- NavigationState.IdleDuringInteraction = IdleDuringInteraction;
851
+ return InteractionPopStateTransition;
852
+ }(AbstractInteractionTransition));
853
+ NavigationState.InteractionPopStateTransition = InteractionPopStateTransition;
764
854
  if (false) {
765
855
  /** @type {?} */
766
- IdleDuringInteraction.prototype.isTransitional;
767
- /** @type {?} */
768
- IdleDuringInteraction.prototype.isPopState;
769
- /** @type {?} */
770
- IdleDuringInteraction.prototype.startingUrl;
856
+ InteractionPopStateTransition.prototype.isPopState;
771
857
  }
772
858
  var CancelledDuringNavigationInteraction = /** @class */ (function (_super) {
773
859
  tslib_1.__extends(CancelledDuringNavigationInteraction, _super);
774
- function CancelledDuringNavigationInteraction(context, startingUrl, locationChangeTriggerUrl) {
860
+ function CancelledDuringNavigationInteraction(context, startingUrl, startingEventWasAPopState, locationChangeTriggerUrl) {
775
861
  var _this = _super.call(this, context) || this;
776
862
  _this.startingUrl = startingUrl;
863
+ _this.startingEventWasAPopState = startingEventWasAPopState;
777
864
  _this.locationChangeTriggerUrl = locationChangeTriggerUrl;
778
865
  _this.isPopState = false;
779
- _this.capturedFauxRouterStart = false;
866
+ _this.gotPopStateWithLeavingUrl = false;
780
867
  return _this;
781
868
  }
782
869
  Object.defineProperty(CancelledDuringNavigationInteraction.prototype, "isTransitional", {
@@ -784,7 +871,7 @@ if (false) {
784
871
  * @return {?}
785
872
  */
786
873
  function () {
787
- return !this.capturedFauxRouterStart;
874
+ return true;
788
875
  },
789
876
  enumerable: true,
790
877
  configurable: true
@@ -793,35 +880,34 @@ if (false) {
793
880
  * @param {?} event
794
881
  * @return {?}
795
882
  */
796
- CancelledDuringNavigationInteraction.prototype.onStart = /**
883
+ CancelledDuringNavigationInteraction.prototype.onRouterStarted = /**
797
884
  * @param {?} event
798
885
  * @return {?}
799
886
  */
800
887
  function (event) {
801
- if (event.url === this.locationChangeTriggerUrl && !this.capturedFauxRouterStart) {
802
- this.capturedFauxRouterStart = true;
803
- return this.ignore(event, 'url matched back button location change');
804
- }
805
- else {
806
- return this.createTransitionStateFor(event);
807
- }
888
+ return this.ignore(event);
808
889
  };
809
890
  /**
810
891
  * @param {?} event
811
892
  * @return {?}
812
893
  */
813
- CancelledDuringNavigationInteraction.prototype.onCancel = /**
894
+ CancelledDuringNavigationInteraction.prototype.onRouterCancelled = /**
814
895
  * @param {?} event
815
896
  * @return {?}
816
897
  */
817
898
  function (event) {
818
- return this.ignore(event);
899
+ // Depending on the state of the router and what was done we get a different
900
+ // sequence of events. I.e. If they just clicked a link we'll get a cancel
901
+ // with the locationChangeTriggerUrl as the final event. However the user
902
+ // started the initial navigation with a pop state then we'll get one of
903
+ // those with the locationChangeTriggerUrl but no cancel event with it.
904
+ return this.gotPopStateWithLeavingUrl || this.locationChangeTriggerUrl === event.url ? this.createIdleState() : this.ignore(event);
819
905
  };
820
906
  /**
821
907
  * @param {?} event
822
908
  * @return {?}
823
909
  */
824
- CancelledDuringNavigationInteraction.prototype.onEnd = /**
910
+ CancelledDuringNavigationInteraction.prototype.onRouterEnd = /**
825
911
  * @param {?} event
826
912
  * @return {?}
827
913
  */
@@ -832,7 +918,7 @@ if (false) {
832
918
  * @param {?} event
833
919
  * @return {?}
834
920
  */
835
- CancelledDuringNavigationInteraction.prototype.onError = /**
921
+ CancelledDuringNavigationInteraction.prototype.onRouterError = /**
836
922
  * @param {?} event
837
923
  * @return {?}
838
924
  */
@@ -848,7 +934,31 @@ if (false) {
848
934
  * @return {?}
849
935
  */
850
936
  function (event) {
851
- return this.createTransitionStateFor(event);
937
+ this.gotPopStateWithLeavingUrl = this.gotPopStateWithLeavingUrl || event.url === this.locationChangeTriggerUrl;
938
+ return this.ignore(event);
939
+ };
940
+ // @Trace()
941
+ // @Trace()
942
+ /**
943
+ * @param {?} component
944
+ * @param {?} currentUrl
945
+ * @param {?} nextUrl
946
+ * @return {?}
947
+ */
948
+ CancelledDuringNavigationInteraction.prototype.canDeactivatePlace =
949
+ // @Trace()
950
+ /**
951
+ * @param {?} component
952
+ * @param {?} currentUrl
953
+ * @param {?} nextUrl
954
+ * @return {?}
955
+ */
956
+ function (component, currentUrl, nextUrl) {
957
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
958
+ return tslib_1.__generator(this, function (_a) {
959
+ return [2 /*return*/, false];
960
+ });
961
+ });
852
962
  };
853
963
  /**
854
964
  * @param {?} event
@@ -861,7 +971,7 @@ if (false) {
861
971
  * @return {?}
862
972
  */
863
973
  function (event, reason) {
864
- reason = reason ? " (" + reason + ")" : '';
974
+ reason = reason ? " -> " + reason : '';
865
975
  Logger.get(this).info("ignoring router event" + reason + ": " + event.constructor.name + " -> " + event.url);
866
976
  return this;
867
977
  };
@@ -872,8 +982,14 @@ if (false) {
872
982
  * @return {?}
873
983
  */
874
984
  function () {
875
- return this.constructor.name + "(startingUrl: " + this.startingUrl + ", locationChangeTriggerUrl:" + this.locationChangeTriggerUrl + ")";
985
+ return this.constructor.name + "(isIdl: " + this.idle + ", startingUrl: " + this.startingUrl + ", locationChangeTriggerUrl:" + this.locationChangeTriggerUrl + ")";
876
986
  };
987
+ tslib_1.__decorate([
988
+ Trace(),
989
+ tslib_1.__metadata("design:type", Function),
990
+ tslib_1.__metadata("design:paramtypes", [NavigationCancel]),
991
+ tslib_1.__metadata("design:returntype", NavigationState)
992
+ ], CancelledDuringNavigationInteraction.prototype, "onRouterCancelled", null);
877
993
  return CancelledDuringNavigationInteraction;
878
994
  }(NavigationState));
879
995
  NavigationState.CancelledDuringNavigationInteraction = CancelledDuringNavigationInteraction;
@@ -884,11 +1000,13 @@ if (false) {
884
1000
  * @type {?}
885
1001
  * @private
886
1002
  */
887
- CancelledDuringNavigationInteraction.prototype.capturedFauxRouterStart;
1003
+ CancelledDuringNavigationInteraction.prototype.gotPopStateWithLeavingUrl;
888
1004
  /** @type {?} */
889
1005
  CancelledDuringNavigationInteraction.prototype.startingUrl;
890
1006
  /** @type {?} */
1007
+ CancelledDuringNavigationInteraction.prototype.startingEventWasAPopState;
1008
+ /** @type {?} */
891
1009
  CancelledDuringNavigationInteraction.prototype.locationChangeTriggerUrl;
892
1010
  }
893
1011
  })(NavigationState || (NavigationState = {}));
894
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9ndWFyZHMvbmF2aWdhdGlvbi1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXJFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7O0FBRTNGOzs7O0lBQThDLDJDQUFnQjtJQVE1RCx5QkFBK0IsT0FBZ0M7UUFBL0QsWUFDRSxpQkFBTyxTQUNSO1FBRjhCLGFBQU8sR0FBUCxPQUFPLENBQXlCO1FBTnZELGFBQU8sR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQzs7SUFRcEQsQ0FBQztJQUVELHNCQUFJLGlDQUFJOzs7O1FBQVI7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM5QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFXOzs7O1FBQWY7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2xDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQWtCOzs7O1FBQXRCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQWtCOzs7O1FBQXRCO1lBQ0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOzs7T0FBQTs7Ozs7SUFFRCxvQ0FBVTs7OztJQUFWLFVBQVcsS0FBWTtRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7Ozs7O0lBRUQscUNBQVc7Ozs7SUFBWCxVQUFZLFFBQXlCO1FBQ25DLE9B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Ozs7UUFBVixVQUFXLEtBQXNCO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7Ozs7OztRQUVELHFEQUFNOzs7OztRQUFOLFVBQU8sS0FBa0IsRUFBRSxNQUFlO1lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQUssTUFBTSxNQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBd0IsTUFBTSxVQUFLLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxZQUFPLEtBQUssQ0FBQyxHQUFLLENBQUMsQ0FBQztZQUNuRyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7Ozs7UUFFRCx1REFBUTs7O1FBQVI7WUFDRSxPQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxzQkFBaUIsSUFBSSxDQUFDLFdBQVcsbUNBQThCLElBQUksQ0FBQyx3QkFBd0IsTUFBRyxDQUFDO1FBQ2pJLENBQUM7UUFFSCwyQ0FBQztJQUFELENBQUMsQUFsREQsQ0FBMEQsZUFBZSxHQWtEeEU7SUFsRFksb0RBQW9DLHVDQWtEaEQsQ0FBQTs7O1FBaERDLDBEQUE0Qjs7Ozs7UUFDNUIsdUVBQXdDOztRQUc1QiwyREFBNEI7O1FBQzVCLHdFQUF5Qzs7QUE0Q3pELENBQUMsRUF2UmdCLGVBQWUsS0FBZixlQUFlLFFBdVIvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXJFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEc2wsIEdhcmJhZ2VDb2xsZWN0b3IsIGxhbmcsIExvZ2dlciB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJhY3Rpb24vc2VydmljZXMvaW50ZXJhY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4uL3BsYWNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuLi9wbGFjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7IFBsYWNlUm91dGVyIH0gZnJvbSAnLi4vcGxhY2Utcm91dGVyJztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi4vdXJsLXNuYXBzaG90JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi4vdmlzaXQnO1xuaW1wb3J0IHsgUGxhY2VDb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVyIH0gZnJvbSAnLi9wbGFjZS1jb21wb25lbnQtZGVhY3RpdmF0aW9uLWhhbmRsZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF2aWdhdGlvblN0YXRlIGV4dGVuZHMgR2FyYmFnZUNvbGxlY3RvciB7XG5cbiAgcHJpdmF0ZSBfdmlzaXRzID0gbmV3IE1hcDxQbGFjZURlZmluaXRpb24sIFZpc2l0PigpO1xuXG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsOiBib29sZWFuO1xuICBhYnN0cmFjdCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjb250ZXh0OiBOYXZpZ2F0aW9uU3RhdGUuQ29udGV4dCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgaWRsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNUcmFuc2l0aW9uYWw7XG4gIH1cblxuICBnZXQgcGxhY2VSb3V0ZXIoKTogUGxhY2VSb3V0ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxhY2VSb3V0ZXI7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25TZXJ2aWNlKCk6IEludGVyYWN0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5pbnRlcmFjdGlvblNlcnZpY2U7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25Db250ZXh0KCk6IEludGVyYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdG9yZVZpc2l0KHZpc2l0OiBWaXNpdCkge1xuICAgIHRoaXMuX3Zpc2l0cy5zZXQodmlzaXQucGxhY2VEZWZpbml0aW9uLCB2aXNpdCk7XG4gIH1cblxuICBnZXRWaXNpdEZvcihwbGFjZURlZjogUGxhY2VEZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2l0cy5nZXQocGxhY2VEZWYpO1xuICB9XG5cbiAgb25Qb3BTdGF0ZShldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKG5ld1VybDogc3RyaW5nKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbignb25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbicpO1xuICB9XG5cbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIG5leHRTdGF0ZTogVXJsU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbignY2FuRGVhY3RpdmF0ZVBsYWNlJyk7XG4gIH1cblxuICBnZXRWaXNpdHMoKTogVmlzaXRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fdmlzaXRzLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbGxlZ2FsVHJhbnNpdGlvbjxSPihtZXNzYWdlOiBzdHJpbmcgfCBSb3V0ZXJFdmVudCk6IFIge1xuICAgIHJldHVybiBsYW5nLmlsbGVnYWxTdGF0ZShgJHttZXNzYWdlLnRvU3RyaW5nKCl9IG5vdCBzdXBwb3J0ZWQgYnkgJHt0aGlzLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3VycmVudFJvdXRlclVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsYWNlUm91dGVyLmdldEN1cnJlbnRSb3V0ZXJVcmwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2l0aW9uU3RhdGVGb3IoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkge1xuICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoZSBldmVudCBpcyBwdXJlbHkgZm9yIGludGVyYWN0aW9uIGNvbnRleHQgY2hhbmdlcy5cbiAgICBjb25zdCBwb3BzdGF0ZSA9IGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnO1xuICAgIHJldHVybiBwb3BzdGF0ZSA/XG4gICAgICBuZXcgTmF2aWdhdGlvblN0YXRlLk5hdmlnYXRpb25CYWNrVHJhbnNpdGlvbih0aGlzLmNvbnRleHQsIHBvcHN0YXRlLCB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSkgOlxuICAgICAgbmV3IE5hdmlnYXRpb25TdGF0ZS5OYXZpZ2F0aW9uVHJhbnNpdGlvbih0aGlzLmNvbnRleHQsIHBvcHN0YXRlLCB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSk7XG4gIH1cblxuICByZXNldEJyb3dzZXJMb2NhdGlvbih1cmwpIHtcbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhIG5hdmlnYXRlIG9wZXJhdGlvbiB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHJvdXRlci4uLj8/XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBsYWNlUm91dGVyLnJlc2V0QnJvd3NlckxvY2F0aW9uKHVybCkpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gIGV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlYWRvbmx5IHBsYWNlUm91dGVyOiBQbGFjZVJvdXRlcixcbiAgICAgIHJlYWRvbmx5IGludGVyYWN0aW9uU2VydmljZTogSW50ZXJhY3Rpb25TZXJ2aWNlLFxuICAgICAgcmVhZG9ubHkgbm90aWZ5U3VjY2VzczogKHN1Y2Nlc3M6IE5hdmlnYXRpb25TdGF0ZSkgPT4gdm9pZCkge1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlIGV4dGVuZHMgTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZWFkb25seSBpc1RyYW5zaXRpb25hbCA9IGZhbHNlO1xuICAgIHJlYWRvbmx5IHN0YXJ0aW5nVXJsID0gbnVsbDtcbiAgICByZWFkb25seSBpc1BvcFN0YXRlID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gICAgICAvLyBjYWxsaW5nIGFuZ3VsYXJMb2NhdGlvbi5nbygpIHRvIGNsZWFyIGJhY2sgc3RhdGUgY2FuIHRyaWdnZXIgcm91dGVyIGN5Y2xlcyB0byB0aGUgY3VycmVudCB1cmwgaWYgd2UgZG9uJ3QgaWdub3JlIHRoZW1cbiAgICAgIGlmIChldmVudC51cmwgPT09IHRoaXMuY3VycmVudFJvdXRlclVybCgpKSB7XG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgbmF2aWdhdGlvbiBzdGFydGVkIHRvIHNhbWUgdXJsIC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGxhY2VSb3V0ZXIuaGFzQWN0aXZlSW50ZXJhY3Rpb25JZHMoZXZlbnQudXJsKSkge1xuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYG5hdmlnYXRpb24gc3RhcnRlZCB3aXRoIGludGVyYWN0aW9uIG91dGxldCAtPiAke2V2ZW50LnVybH1gKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBldmVudC51cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiBleHRlbmRzIE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmVhZG9ubHkgaXNUcmFuc2l0aW9uYWwgPSB0cnVlO1xuICAgIHByaXZhdGUgY29tcG9uZW50RGVhY3RpdmF0aW9uSGFuZGxlcnMgPSBuZXcgTWFwPFBsYWNlQ29tcG9uZW50LCBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXI+KCk7XG4gICAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25Db250ZXh0OiBJbnRlcmFjdGlvbkNvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuLCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nKSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCA9IHRoaXMuaW50ZXJhY3Rpb25TZXJ2aWNlLl9jcmVhdGVFeGNsdXNpdmVNb2RhbEludGVyYWN0aW9uQ29udGV4dCgpO1xuICAgICAgdGhpcy5vbkRpc3Bvc2UoKCkgPT4ge1xuICAgICAgICAvLyB0aGUgaW50ZXJhY3Rpb24gY29udGV4dCBjYW4gYmUgZGV0YWNoZWQgZHVyaW5nIHRoZSBiYWNrIGJ1dHRvbiBjYW5jZWxsYXRpb24gc3RhdGUgdHJhbnNpdGlvblxuICAgICAgICAvLyBhcyB0aGUgdHJhbnNpdGlvbiBpcyBzeW5jaHJvbm91cyBhbmQgYWN0aXZpdHlDYW5jZWxsYXRpb24gaXNuJ3QuICBPdGhlcndpc2UgZGlzcG9zZSB3aWxsIGJlXG4gICAgICAgIC8vIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRleHQgaGFzIGJlZW4gY2FuY2VsbGVkLiAgSXQgbWlnaHQgYmUgd29yayBoYXZpbmcgdGhlIGludGVyYWN0aW9uIGNvbnRleHRcbiAgICAgICAgLy8gYXV0b21hdGljYWxseSBjYW5jZWwgaWYgdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQgc28gd2UgZG9uJ3QgaGF2ZSB3b3JyeSBhYm91dCBkZXRhY2hpbmcgZXRjLlxuICAgICAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25Db250ZXh0KSB7XG4gICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb25Db250ZXh0LmRpc3Bvc2UoKTsgLy8gb3IgZG8gc29tZXRoaW5nIGxpa2UgY2FuY2VsQW5kRGlzcG9zZT9cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dDtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcyBkdWVcbiAgICAgIC8vIHRvIHBsYWNlIGd1YXJkIHJlZGlyZWN0c1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG5cbiAgICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKGxvY2F0aW9uVHJpZ2dlclVybDogc3RyaW5nKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIC8vIGRldGFjaCB0aGUgaW50ZXJhY3RvaW4gZnJvbSB0aGUgc2Vzc2lvbiBzbyBpdCBkb2Vzbid0IGdldCBkaXNwb3NlZCB1bnRpbCB0aGUgYWN0aXZpdHlcbiAgICAgIC8vIGhhcyBjb21wbGV0ZWQuXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5kZXRhY2hJbnRlcmFjdGlvbkNvbnRleHQoKTtcbiAgICAgIGNvbnN0IHsgd2hlbiB9ID0gRHNsLmRpc3Bvc2VXaXRoKGNvbnRleHQpO1xuICAgICAgLy8gVE9ETzogSSBuZWVkIHRvIG1ha2UgdGhlIGV4Y2x1c2l2ZSBpbnRlcmFjdGlvbiBjb250ZXh0IGRpc2FsbG93IG5lc3RlZCBhY3Rpdml0aWVzIG9yXG4gICAgICAvLyAgICAgICB0aGF0IHdvdWxkIG1lc3MgdGhpbmdzIHVwIGVudGlyZWx5LlxuICAgICAgY29udGV4dC5nZXRDdXJyZW50QWN0aXZpdHkoKS50aGVuKGFjdGl2aXR5ID0+IHtcbiAgICAgICAgd2hlbi52YWx1ZU9mKGNvbnRleHQuYWN0aXZlKS5iZWNvbWVzRmFsc2V5KCgpID0+IGNvbnRleHQuZGlzcG9zZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIGFjdGl2aXR5LmNhbmNlbChudWxsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LFxuICAgICAgICB0aGlzLnN0YXJ0aW5nVXJsLFxuICAgICAgICBsb2NhdGlvblRyaWdnZXJVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIGNhbkRlYWN0aXZhdGVQbGFjZShjb21wb25lbnQ6IFBsYWNlQ29tcG9uZW50LCBuZXh0U3RhdGU6IFVybFNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAvLyBsb29rdXAgdGhlIGhhbmRsZXIgYW5kIGNyZWF0ZSBpdCBpZiB3ZSd2ZSBub3Qgc2VlbiBpdCB5ZXRcbiAgICAgIGxldCBoYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5nZXQoY29tcG9uZW50KTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBjb25zdCBpc1ByaW1hcnlIYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zaXplID09PSAwOyAvLyBvbmx5IHByaW1hcnkgaGFuZGxlciBjYW5jZWxlIHRoZSBhcHAgbW9kZWwgaW50ZXJhdGlvbnNcbiAgICAgICAgaGFuZGxlciA9IG5ldyBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXIoY29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zZXQoY29tcG9uZW50LCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyLmNhbkRlYWN0aXZhdGUobmV4dFN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGFjaEludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dDtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCA9IG51bGw7XG4gICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgTmF2aWdhdGlvblRyYW5zaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE5hdmlnYXRpb25UcmFuc2l0aW9uIHtcbiAgICByZWFkb25seSBpc1BvcFN0YXRlID0gZmFsc2U7XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcyBkdWVcbiAgICAgIC8vIHRvIHBsYWNlIGd1YXJkIHJlZGlyZWN0c1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25FcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIC8vIG5hdmlnYXRpb24gd2FzIGFib3J0ZWQuXG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0oc3RhcnRpbmdVcmw6ICR7dGhpcy5zdGFydGluZ1VybH0pYDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgTmF2aWdhdGlvbkJhY2tUcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IHRydWU7XG5cbiAgICBvbkNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKCdXT1JLLUFST1VORDogVXBkYXRpbmcgYnJvd3NlciBsb2NhdGlvbiBhZnRlciBwb3Agc3RhdGUgLSBzZWUgYW5ndWxhciBpc3N1ZSAjMTM1ODYnKTtcbiAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiB3YXMgYWJvcnRlZC5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSAhPT0gdGhpcy5zdGFydGluZ1VybCkge1xuICAgICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzU4NiNpc3N1ZWNvbW1lbnQtNDMyNzk1NzIwXG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbygnV09SSy1BUk9VTkQ6IFVwZGF0aW5nIGJyb3dzZXIgbG9jYXRpb24gYWZ0ZXIgcG9wIHN0YXRlIC0gc2VlIGFuZ3VsYXIgaXNzdWUgIzEzNTg2Jyk7XG4gICAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEludGVyYWN0aW9uVHJhbnNpdGlvbiBleHRlbmRzIE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmVhZG9ubHkgaXNUcmFuc2l0aW9uYWwgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlaW5zdGF0ZUludGVyYWN0aW9uUm91dGUoKSB7XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wbGFjZVJvdXRlci5zeW5jSW50ZXJhY3Rpb25JZHNXaXRoUm91dGVyKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHN0YXRlIGV4aXN0cyB0byBoYW5kbGUgYWxsIGV2ZW50cyB3aGlsZSBhbnkga2luZCBvZiBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAgVGhhdCB3YXkgYWxsIG90aGVyIHN0YXRlcyBjYW5cbiAgICogaGFwcGlseSBpZ25vcmUgaW50ZXJhY3Rpb24gY29udGV4dHMuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgSW50ZXJhY3Rpb25UcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbnRlcmFjdGlvblRyYW5zaXRpb24ge1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcblxuICAgIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaW50ZXJhY3Rpb25TZXJ2aWNlLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5yZWluc3RhdGVJbnRlcmFjdGlvblJvdXRlKCk7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZUR1cmluZ0ludGVyYWN0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBzdGF0ZSBleGlzdHMgdG8gaGFuZGxlIGFsbCBldmVudHMgd2hpbGUgYW55IGtpbmQgb2YgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzcy4gIFRoYXQgd2F5IGFsbCBvdGhlciBzdGF0ZXMgY2FuXG4gICAqIGhhcHBpbHkgaWdub3JlIGludGVyYWN0aW9uIGNvbnRleHRzLlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uQmFja1RyYW5zaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEludGVyYWN0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IHRydWU7XG5cbiAgICBvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGlvblNlcnZpY2UuaXNBY3RpdmUoKSkge1xuICAgICAgICB0aGlzLnJlaW5zdGF0ZUludGVyYWN0aW9uUm91dGUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb25UcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvbkJhY2tUcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICB9XG4gIH1cblxuXG4gIGV4cG9ydCBjbGFzcyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FwdHVyZWRGYXV4Um91dGVyU3RhcnQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByZWFkb25seSBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzVHJhbnNpdGlvbmFsKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmNhcHR1cmVkRmF1eFJvdXRlclN0YXJ0O1xuICAgIH1cblxuICAgIG9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBpZiAoZXZlbnQudXJsID09PSB0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybCAmJiAhdGhpcy5jYXB0dXJlZEZhdXhSb3V0ZXJTdGFydCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVkRmF1eFJvdXRlclN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50LCAndXJsIG1hdGNoZWQgYmFjayBidXR0b24gbG9jYXRpb24gY2hhbmdlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2l0aW9uU3RhdGVGb3IoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCk7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZ25vcmUoZXZlbnQ6IFJvdXRlckV2ZW50LCByZWFzb24/OiBzdHJpbmcpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmVhc29uID0gcmVhc29uID8gYCAoJHtyZWFzb259KWAgOiAnJztcbiAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgaWdub3Jpbmcgcm91dGVyIGV2ZW50JHtyZWFzb259OiAke2V2ZW50LmNvbnN0cnVjdG9yLm5hbWV9IC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9KHN0YXJ0aW5nVXJsOiAke3RoaXMuc3RhcnRpbmdVcmx9LCBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmw6JHt0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybH0pYDtcbiAgICB9XG5cbiAgfVxufVxuIl19
1012
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9ndWFyZHMvbmF2aWdhdGlvbi1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBa0MsZUFBZSxFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDakgsT0FBTyxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUTVFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7O0FBRTNGOzs7O0lBQThDLDJDQUFnQjtJQVE1RCx5QkFBK0IsT0FBZ0M7UUFBL0QsWUFDRSxpQkFBTyxTQUNSO1FBRjhCLGFBQU8sR0FBUCxPQUFPLENBQXlCO1FBTnZELGFBQU8sR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQzs7SUFRcEQsQ0FBQztJQUVELHNCQUFJLGlDQUFJOzs7O1FBQVI7WUFDRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUM7OztPQUFBO0lBRUQsc0JBQUksaUNBQUk7Ozs7UUFBUjtZQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzlCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksd0NBQVc7Ozs7UUFBZjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDbEMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwrQ0FBa0I7Ozs7UUFBdEI7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDekMsQ0FBQzs7O09BQUE7SUFFRCxzQkFBSSwrQ0FBa0I7Ozs7UUFBdEI7WUFDRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7OztPQUFBOzs7OztJQUVE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Ozs7OztRQUNMLGlFQUFrQjs7Ozs7Ozs7UUFBeEIsVUFBeUIsU0FBeUIsRUFBRSxVQUF1QixFQUFFLE9BQW9COzs7b0JBQy9GLHNCQUFPLEtBQUssRUFBQzs7O1NBQ2Q7Ozs7OztRQUVELHFEQUFNOzs7OztRQUFOLFVBQU8sS0FBa0IsRUFBRSxNQUFlO1lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQU8sTUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsMEJBQXdCLE1BQU0sVUFBSyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksWUFBTyxLQUFLLENBQUMsR0FBSyxDQUFDLENBQUM7WUFDbkcsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOzs7O1FBRUQsdURBQVE7OztRQUFSO1lBQ0UsT0FBVSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksZ0JBQVcsSUFBSSxDQUFDLElBQUksdUJBQWtCLElBQUksQ0FBQyxXQUFXLG1DQUE4QixJQUFJLENBQUMsd0JBQXdCLE1BQUcsQ0FBQztRQUN0SixDQUFDO1FBbkNEO1lBREMsS0FBSyxFQUFFOztxREFDaUIsZ0JBQWdCO29EQUFHLGVBQWU7cUZBTzFEO1FBOEJILDJDQUFDO0tBQUEsQUExREQsQ0FBMEQsZUFBZSxHQTBEeEU7SUExRFksb0RBQW9DLHVDQTBEaEQsQ0FBQTs7O1FBeERDLDBEQUE0Qjs7Ozs7UUFDNUIseUVBQTBDOztRQUc5QiwyREFBNEI7O1FBQzVCLHlFQUEyQzs7UUFDM0Msd0VBQXlDOztBQW1EekQsQ0FBQyxFQXJUZ0IsZUFBZSxLQUFmLGVBQWUsUUFxVC9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmF2aWdhdGlvbkNhbmNlbCwgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlckV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IERzbCwgR2FyYmFnZUNvbGxlY3RvciwgbGFuZywgTG9nZ2VyLCBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJhY3Rpb24vc2VydmljZXMvaW50ZXJhY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4uL3BsYWNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuLi9wbGFjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7IFBsYWNlUm91dGVyIH0gZnJvbSAnLi4vcGxhY2Utcm91dGVyJztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi4vdXJsLXNuYXBzaG90JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi4vdmlzaXQnO1xuaW1wb3J0IHsgUGxhY2VDb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVyIH0gZnJvbSAnLi9wbGFjZS1jb21wb25lbnQtZGVhY3RpdmF0aW9uLWhhbmRsZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF2aWdhdGlvblN0YXRlIGV4dGVuZHMgR2FyYmFnZUNvbGxlY3RvciB7XG5cbiAgcHJpdmF0ZSBfdmlzaXRzID0gbmV3IE1hcDxQbGFjZURlZmluaXRpb24sIFZpc2l0PigpO1xuXG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsOiBib29sZWFuO1xuICBhYnN0cmFjdCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjb250ZXh0OiBOYXZpZ2F0aW9uU3RhdGUuQ29udGV4dCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBnZXQgaWRsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNUcmFuc2l0aW9uYWw7XG4gIH1cblxuICBnZXQgcGxhY2VSb3V0ZXIoKTogUGxhY2VSb3V0ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxhY2VSb3V0ZXI7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25TZXJ2aWNlKCk6IEludGVyYWN0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5pbnRlcmFjdGlvblNlcnZpY2U7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25Db250ZXh0KCk6IEludGVyYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdG9yZVZpc2l0KHZpc2l0OiBWaXNpdCkge1xuICAgIHRoaXMuX3Zpc2l0cy5zZXQodmlzaXQucGxhY2VEZWZpbml0aW9uLCB2aXNpdCk7XG4gIH1cblxuICBnZXRWaXNpdEZvcihwbGFjZURlZjogUGxhY2VEZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2l0cy5nZXQocGxhY2VEZWYpO1xuICB9XG5cbiAgb25QbGFjZU5hdmlnYXRpb25TdGFydCh2aXNpdDogVmlzaXQsIGluaXRpYWxVcmw6IHN0cmluZyk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuaWxsZWdhbFRyYW5zaXRpb24oJ29uUGxhY2VOYXZpZ2F0aW9uU3RhcnQnKTtcbiAgfVxuXG4gIG9uUG9wU3RhdGUoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuaWxsZWdhbFRyYW5zaXRpb24oZXZlbnQpO1xuICB9XG5cbiAgb25Sb3V0ZXJTdGFydGVkKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uUm91dGVyQ2FuY2VsbGVkKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvblJvdXRlckVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uUm91dGVyRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKG5ld1VybDogc3RyaW5nKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbignb25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbicpO1xuICB9XG5cbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIGN1cnJlbnRVcmw6IFVybFNuYXBzaG90LCBuZXh0VXJsOiBVcmxTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbiB8IFVybFNuYXBzaG90PiB7XG4gICAgcmV0dXJuIHRoaXMuaWxsZWdhbFRyYW5zaXRpb24oJ2NhbkRlYWN0aXZhdGVQbGFjZScpO1xuICB9XG5cbiAgZ2V0VmlzaXRzKCk6IFZpc2l0W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX3Zpc2l0cy52YWx1ZXMoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaWxsZWdhbFRyYW5zaXRpb248Uj4obWVzc2FnZTogc3RyaW5nIHwgUm91dGVyRXZlbnQpOiBSIHtcbiAgICByZXR1cm4gbGFuZy5pbGxlZ2FsU3RhdGUoYCR7bWVzc2FnZS50b1N0cmluZygpfSBub3Qgc3VwcG9ydGVkIGJ5ICR7dGhpcy50b1N0cmluZygpfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGN1cnJlbnRSb3V0ZXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbGFjZVJvdXRlci5nZXRDdXJyZW50Um91dGVyVXJsKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgICBjb25zdCBwb3BzdGF0ZSA9IGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnO1xuICAgIHJldHVybiBwb3BzdGF0ZSA/XG4gICAgICB0aGlzLmludGVyYWN0aW9uU2VydmljZS5pc0FjdGl2ZSgpID9cbiAgICAgICAgbmV3IE5hdmlnYXRpb25TdGF0ZS5JbnRlcmFjdGlvblBvcFN0YXRlVHJhbnNpdGlvbih0aGlzLmNvbnRleHQsIHRoaXMuY3VycmVudFJvdXRlclVybCgpKSA6XG4gICAgICAgIG5ldyBOYXZpZ2F0aW9uU3RhdGUuUG9wU3RhdGVUcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5jdXJyZW50Um91dGVyVXJsKCkpXG4gICAgICA6XG4gICAgICB0aGlzLmludGVyYWN0aW9uU2VydmljZS5pc0FjdGl2ZSgpID9cbiAgICAgICAgbmV3IE5hdmlnYXRpb25TdGF0ZS5JbnRlcmFjdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSkgOlxuICAgICAgICBuZXcgTmF2aWdhdGlvblN0YXRlLk5hdmlnYXRpb25UcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5jdXJyZW50Um91dGVyVXJsKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZUlkbGVTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvblNlcnZpY2UuaXNBY3RpdmUoKSA/XG4gICAgICBuZXcgTmF2aWdhdGlvblN0YXRlLklkbGVEdXJpbmdJbnRlcmFjdGlvbih0aGlzLmNvbnRleHQsIHRoaXMuY3VycmVudFJvdXRlclVybCgpKSA6XG4gICAgICBuZXcgTmF2aWdhdGlvblN0YXRlLklkbGUodGhpcy5jb250ZXh0KTtcbiAgfVxuXG4gIHJlc2V0QnJvd3NlckxvY2F0aW9uKHVybCkge1xuICAgIHRoaXMucGxhY2VSb3V0ZXIucmVzZXRCcm93c2VyTG9jYXRpb24odXJsKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxufVxuXG5leHBvcnQgbmFtZXNwYWNlIE5hdmlnYXRpb25TdGF0ZSB7XG5cbiAgZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgcmVhZG9ubHkgcGxhY2VSb3V0ZXI6IFBsYWNlUm91dGVyLFxuICAgICAgcmVhZG9ubHkgaW50ZXJhY3Rpb25TZXJ2aWNlOiBJbnRlcmFjdGlvblNlcnZpY2UsXG4gICAgICByZWFkb25seSBub3RpZnlTdWNjZXNzOiAoc3VjY2VzczogTmF2aWdhdGlvblN0YXRlKSA9PiB2b2lkKSB7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIElkbGUgZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgc3RhcnRpbmdVcmwgPSBudWxsO1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQpIHtcbiAgICAgIHN1cGVyKGNvbnRleHQpO1xuICAgIH1cblxuICAgIG9uUGxhY2VOYXZpZ2F0aW9uU3RhcnQodmlzaXQ6IFZpc2l0LCBpbml0aWFsVXJsOiBzdHJpbmcpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgY29uc3QgbmF2aWdhdGlvblRyYW5zaXRpb24gPSBuZXcgTmF2aWdhdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBpbml0aWFsVXJsKTtcbiAgICAgIG5hdmlnYXRpb25UcmFuc2l0aW9uLnN0b3JlVmlzaXQodmlzaXQpO1xuICAgICAgcmV0dXJuIG5hdmlnYXRpb25UcmFuc2l0aW9uO1xuICAgIH1cblxuICAgIG9uUm91dGVyU3RhcnRlZChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcblxuICAgICAgLy8gY2FsbGluZyBhbmd1bGFyTG9jYXRpb24uZ28oKSB0byBjbGVhciBiYWNrIHN0YXRlIGNhbiB0cmlnZ2VyIHJvdXRlciBjeWNsZXMgdG8gdGhlIGN1cnJlbnQgdXJsIGlmIHdlIGRvbid0IGlnbm9yZSB0aGVtXG4gICAgICBpZiAoZXZlbnQudXJsID09PSB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSkge1xuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYG5hdmlnYXRpb24gc3RhcnRlZCB0byBzYW1lIHVybCAtPiAke2V2ZW50LnVybH1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnBsYWNlUm91dGVyLmhhc0FjdGl2ZUludGVyYWN0aW9uSWRzKGV2ZW50LnVybCkpIHtcbiAgICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBuYXZpZ2F0aW9uIHN0YXJ0ZWQgd2l0aCBpbnRlcmFjdGlvbiBvdXRsZXQgLT4gJHtldmVudC51cmx9YCk7XG4gICAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb25UcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zaXRpb25TdGF0ZUZvcihldmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25Qb3BTdGF0ZShldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zaXRpb25TdGF0ZUZvcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmF2aWdhdGlvblRyYW5zaXRpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gdHJ1ZTtcbiAgICBwcml2YXRlIGNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXJzID0gbmV3IE1hcDxQbGFjZUNvbXBvbmVudCwgUGxhY2VDb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVyPigpO1xuICAgIHByaXZhdGUgX2ludGVyYWN0aW9uQ29udGV4dDogSW50ZXJhY3Rpb25Db250ZXh0O1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgICB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQgPSB0aGlzLmludGVyYWN0aW9uU2VydmljZS5fY3JlYXRlRXhjbHVzaXZlTW9kYWxJbnRlcmFjdGlvbkNvbnRleHQoKTtcbiAgICAgIHRoaXMub25EaXNwb3NlKCgpID0+IHtcbiAgICAgICAgLy8gdGhlIGludGVyYWN0aW9uIGNvbnRleHQgY2FuIGJlIGRldGFjaGVkIGR1cmluZyB0aGUgYmFjayBidXR0b24gY2FuY2VsbGF0aW9uIHN0YXRlIHRyYW5zaXRpb25cbiAgICAgICAgLy8gYXMgdGhlIHRyYW5zaXRpb24gaXMgc3luY2hyb25vdXMgYW5kIGFjdGl2aXR5Q2FuY2VsbGF0aW9uIGlzbid0LiAgT3RoZXJ3aXNlIGRpc3Bvc2Ugd2lsbCBiZVxuICAgICAgICAvLyBjYWxsZWQgYmVmb3JlIHRoZSBjb250ZXh0IGhhcyBiZWVuIGNhbmNlbGxlZC4gIEl0IG1pZ2h0IGJlIHdvcmsgaGF2aW5nIHRoZSBpbnRlcmFjdGlvbiBjb250ZXh0XG4gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgY2FuY2VsIGlmIHRoZSBjb250ZXh0IGlzIGRpc3Bvc2VkIHNvIHdlIGRvbid0IGhhdmUgd29ycnkgYWJvdXQgZGV0YWNoaW5nIGV0Yy5cbiAgICAgICAgaWYgKHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCkge1xuICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dC5kaXNwb3NlKCk7IC8vIG9yIGRvIHNvbWV0aGluZyBsaWtlIGNhbmNlbEFuZERpc3Bvc2U/XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnRlcmFjdGlvbkNvbnRleHQoKTogSW50ZXJhY3Rpb25Db250ZXh0IHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgb25Sb3V0ZXJTdGFydGVkKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcyBkdWVcbiAgICAgIC8vIHRvIHBsYWNlIGd1YXJkIHJlZGlyZWN0c1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25Sb3V0ZXJFbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbihsb2NhdGlvblRyaWdnZXJVcmw6IHN0cmluZyk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYGJhY2sgYnV0dG9uIHByZXNzZWQgZHVyaW5nIG5hdmlnYXRpb24gc2Vzc2lvbiBpbnRlcmFjdGlvbiBwcm9taXNlYCk7XG4gICAgICAvLyBkZXRhY2ggdGhlIGludGVyYWN0aW9uIGZyb20gdGhlIHNlc3Npb24gc28gaXQgZG9lc24ndCBnZXQgZGlzcG9zZWQgdW50aWwgdGhlIGFjdGl2aXR5IGhhcyBjb21wbGV0ZWQuXG4gICAgICBjb25zdCBuYXZpZ2F0aW9uSW50ZXJhY3Rpb24gPSB0aGlzLmRldGFjaEludGVyYWN0aW9uQ29udGV4dCgpO1xuICAgICAgY29uc3QgeyB3aGVuIH0gPSBEc2wuZGlzcG9zZVdpdGgobmF2aWdhdGlvbkludGVyYWN0aW9uKTtcbiAgICAgIC8vIFRPRE86IEkgbmVlZCB0byBtYWtlIHRoZSBleGNsdXNpdmUgaW50ZXJhY3Rpb24gY29udGV4dCBkaXNhbGxvdyBuZXN0ZWQgYWN0aXZpdGllcyBvclxuICAgICAgLy8gICAgICAgdGhhdCB3b3VsZCBtZXNzIHRoaW5ncyB1cCBlbnRpcmVseS4gT3IsIGNhbiBJIGRvIGEgY29udGV4dC5hYm9ydEFsbCgpLnRoZW4oLi4pXG4gICAgICBuYXZpZ2F0aW9uSW50ZXJhY3Rpb24uY2FuY2VsQ3VycmVudEFjdGl2aXR5KCkudGhlbigoKSA9PiB7XG4gICAgICAgIG5hdmlnYXRpb25JbnRlcmFjdGlvbi5kaXNwb3NlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgQ2FuY2VsbGVkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKHRoaXMuY29udGV4dCxcbiAgICAgICAgdGhpcy5zdGFydGluZ1VybCxcbiAgICAgICAgdGhpcy5pc1BvcFN0YXRlLFxuICAgICAgICBsb2NhdGlvblRyaWdnZXJVcmwpO1xuICAgIH1cblxuICAgIC8vIEBUcmFjZSgpXG4gICAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIGN1cnJlbnRVcmw6IFVybFNuYXBzaG90LCBuZXh0VXJsOiBVcmxTbmFwc2hvdCk6IFByb21pc2U8Ym9vbGVhbiB8IFVybFNuYXBzaG90PiB7XG4gICAgICAvLyBsb29rdXAgdGhlIGhhbmRsZXIgYW5kIGNyZWF0ZSBpdCBpZiB3ZSd2ZSBub3Qgc2VlbiBpdCB5ZXRcbiAgICAgIGxldCBoYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5nZXQoY29tcG9uZW50KTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBjb25zdCBpc1ByaW1hcnlIYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zaXplID09PSAwOyAvLyBvbmx5IHByaW1hcnkgaGFuZGxlciBjYW5jZWxzIHRoZSBhcHAgbW9kZWwgaW50ZXJhdGlvbnNcbiAgICAgICAgaGFuZGxlciA9IG5ldyBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXIoY29tcG9uZW50LCB0aGlzLCBpc1ByaW1hcnlIYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zZXQoY29tcG9uZW50LCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyLmNhbkRlYWN0aXZhdGUoY3VycmVudFVybCwgbmV4dFVybCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXRhY2hJbnRlcmFjdGlvbkNvbnRleHQoKTogSW50ZXJhY3Rpb25Db250ZXh0IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQ7XG4gICAgICB0aGlzLl9pbnRlcmFjdGlvbkNvbnRleHQgPSBudWxsO1xuICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25UcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuXG4gICAgb25Sb3V0ZXJDYW5jZWxsZWQoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25Sb3V0ZXJFcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIC8vIG5hdmlnYXRpb24gd2FzIGFib3J0ZWQuXG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0oc3RhcnRpbmdVcmw6ICR7dGhpcy5zdGFydGluZ1VybH0pYDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgUG9wU3RhdGVUcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IHRydWU7XG5cbiAgICBvblJvdXRlckNhbmNlbGxlZChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKCdXT1JLLUFST1VORDogVXBkYXRpbmcgYnJvd3NlciBsb2NhdGlvbiBhZnRlciBwb3Agc3RhdGUgLSBzZWUgYW5ndWxhciBpc3N1ZSAjMTM1ODYnKTtcbiAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBvblJvdXRlckVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiB3YXMgYWJvcnRlZC5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSAhPT0gdGhpcy5zdGFydGluZ1VybCkge1xuICAgICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzU4NiNpc3N1ZWNvbW1lbnQtNDMyNzk1NzIwXG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbygnV09SSy1BUk9VTkQ6IFVwZGF0aW5nIGJyb3dzZXIgbG9jYXRpb24gYWZ0ZXIgcG9wIHN0YXRlIC0gc2VlIGFuZ3VsYXIgaXNzdWUgIzEzNTg2Jyk7XG4gICAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25QbGFjZU5hdmlnYXRpb25TdGFydCh2aXNpdDogVmlzaXQsIGluaXRpYWxVcmw6IHN0cmluZyk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBjb25zdCBuYXZpZ2F0aW9uVHJhbnNpdGlvbiA9IG5ldyBJbnRlcmFjdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBpbml0aWFsVXJsKTtcbiAgICAgIG5hdmlnYXRpb25UcmFuc2l0aW9uLnN0b3JlVmlzaXQodmlzaXQpO1xuICAgICAgcmV0dXJuIG5hdmlnYXRpb25UcmFuc2l0aW9uO1xuICAgIH1cblxuICAgIEBUcmFjZSgpXG4gICAgb25Sb3V0ZXJTdGFydGVkKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBldmVudC51cmwpO1xuICAgIH1cblxuICAgIEBUcmFjZSgpXG4gICAgb25Qb3BTdGF0ZShldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb25Qb3BTdGF0ZVRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBldmVudC51cmwpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEludGVyYWN0aW9uVHJhbnNpdGlvbiBleHRlbmRzIEFic3RyYWN0TmF2aWdhdGlvblRyYW5zaXRpb24ge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsIHJlYWRvbmx5IHN0YXJ0aW5nVXJsOiBzdHJpbmcpIHtcbiAgICAgIHN1cGVyKGNvbnRleHQsIHN0YXJ0aW5nVXJsKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHN0YXRlIGV4aXN0cyB0byBoYW5kbGUgYWxsIGV2ZW50cyB3aGlsZSBhbnkga2luZCBvZiBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAgVGhhdCB3YXkgYWxsIG90aGVyIHN0YXRlcyBjYW5cbiAgICogaGFwcGlseSBpZ25vcmUgaW50ZXJhY3Rpb24gY29udGV4dHMuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgSW50ZXJhY3Rpb25UcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbnRlcmFjdGlvblRyYW5zaXRpb24ge1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcblxuICAgIG9uUm91dGVyQ2FuY2VsbGVkKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaW50ZXJhY3Rpb25TZXJ2aWNlLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25JZHMgPSB0aGlzLmludGVyYWN0aW9uU2VydmljZS5hY3RpdmVJbnRlcmFjdGlvbkNvbnRleHRJZHMudmFsdWU7XG4gICAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5wbGFjZVJvdXRlci5wYXJzZVVybCh0aGlzLnN0YXJ0aW5nVXJsKS51cGRhdGVJbnRlcmFjdGlvbklkcyhpbnRlcmFjdGlvbklkcykudXJsKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uUm91dGVyRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICAvLyBuYXZpZ2F0aW9uIHdhcyBhYm9ydGVkLlxuICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICB9XG5cbiAgICBvblJvdXRlckVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBpZiAodGhpcy5jb250ZXh0LmludGVyYWN0aW9uU2VydmljZS5pc0FjdGl2ZSgpKSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZUR1cmluZ0ludGVyYWN0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBzdGF0ZSBleGlzdHMgdG8gaGFuZGxlIGFsbCBldmVudHMgd2hpbGUgYW55IGtpbmQgb2YgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzcy4gIFRoYXQgd2F5IGFsbCBvdGhlciBzdGF0ZXMgY2FuXG4gICAqIGhhcHBpbHkgaWdub3JlIGludGVyYWN0aW9uIGNvbnRleHRzLlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uUG9wU3RhdGVUcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbnRlcmFjdGlvblRyYW5zaXRpb24ge1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSB0cnVlO1xuXG4gICAgb25Sb3V0ZXJDYW5jZWxsZWQoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25TZXJ2aWNlLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgY29uc3QgaW50ZXJhY3Rpb25JZHMgPSB0aGlzLmludGVyYWN0aW9uU2VydmljZS5hY3RpdmVJbnRlcmFjdGlvbkNvbnRleHRJZHMudmFsdWU7XG4gICAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5wbGFjZVJvdXRlci5wYXJzZVVybCh0aGlzLnN0YXJ0aW5nVXJsKS51cGRhdGVJbnRlcmFjdGlvbklkcyhpbnRlcmFjdGlvbklkcykudXJsKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uUm91dGVyRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaW50ZXJhY3Rpb25TZXJ2aWNlLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cblxuICBleHBvcnQgY2xhc3MgQ2FuY2VsbGVkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uIGV4dGVuZHMgTmF2aWdhdGlvblN0YXRlIHtcblxuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIGdvdFBvcFN0YXRlV2l0aExlYXZpbmdVcmwgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByZWFkb25seSBzdGFydGluZ0V2ZW50V2FzQVBvcFN0YXRlOiBib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlYWRvbmx5IGxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybDogc3RyaW5nKSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICBnZXQgaXNUcmFuc2l0aW9uYWwoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBvblJvdXRlclN0YXJ0ZWQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pZ25vcmUoZXZlbnQpO1xuICAgIH1cblxuICAgIEBUcmFjZSgpXG4gICAgb25Sb3V0ZXJDYW5jZWxsZWQoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcm91dGVyIGFuZCB3aGF0IHdhcyBkb25lIHdlIGdldCBhIGRpZmZlcmVudFxuICAgICAgLy8gc2VxdWVuY2Ugb2YgZXZlbnRzLiAgSS5lLiAgSWYgdGhleSBqdXN0IGNsaWNrZWQgYSBsaW5rIHdlJ2xsIGdldCBhIGNhbmNlbFxuICAgICAgLy8gd2l0aCB0aGUgbG9jYXRpb25DaGFuZ2VUcmlnZ2VyVXJsIGFzIHRoZSBmaW5hbCBldmVudC4gSG93ZXZlciB0aGUgdXNlclxuICAgICAgLy8gc3RhcnRlZCB0aGUgaW5pdGlhbCBuYXZpZ2F0aW9uIHdpdGggYSBwb3Agc3RhdGUgdGhlbiB3ZSdsbCBnZXQgb25lIG9mXG4gICAgICAvLyB0aG9zZSB3aXRoIHRoZSBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmwgYnV0IG5vIGNhbmNlbCBldmVudCB3aXRoIGl0LlxuICAgICAgcmV0dXJuIHRoaXMuZ290UG9wU3RhdGVXaXRoTGVhdmluZ1VybCB8fCB0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybCA9PT0gZXZlbnQudXJsID8gdGhpcy5jcmVhdGVJZGxlU3RhdGUoKSA6IHRoaXMuaWdub3JlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblJvdXRlckVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pZ25vcmUoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uUm91dGVyRXJyb3IoZXZlbnQ6IE5hdmlnYXRpb25FcnJvcik6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICByZXR1cm4gdGhpcy5pZ25vcmUoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uUG9wU3RhdGUoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICB0aGlzLmdvdFBvcFN0YXRlV2l0aExlYXZpbmdVcmwgPSB0aGlzLmdvdFBvcFN0YXRlV2l0aExlYXZpbmdVcmwgfHwgZXZlbnQudXJsID09PSB0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybDtcbiAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCk7XG4gICAgfVxuXG4gICAgLy8gQFRyYWNlKClcbiAgICBhc3luYyBjYW5EZWFjdGl2YXRlUGxhY2UoY29tcG9uZW50OiBQbGFjZUNvbXBvbmVudCwgY3VycmVudFVybDogVXJsU25hcHNob3QsIG5leHRVcmw6IFVybFNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuIHwgVXJsU25hcHNob3Q+IHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZ25vcmUoZXZlbnQ6IFJvdXRlckV2ZW50LCByZWFzb24/OiBzdHJpbmcpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmVhc29uID0gcmVhc29uID8gYCAtPiAke3JlYXNvbn1gIDogJyc7XG4gICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYGlnbm9yaW5nIHJvdXRlciBldmVudCR7cmVhc29ufTogJHtldmVudC5jb25zdHJ1Y3Rvci5uYW1lfSAtPiAke2V2ZW50LnVybH1gKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfShpc0lkbDogJHt0aGlzLmlkbGV9LCBzdGFydGluZ1VybDogJHt0aGlzLnN0YXJ0aW5nVXJsfSwgbG9jYXRpb25DaGFuZ2VUcmlnZ2VyVXJsOiR7dGhpcy5sb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmx9KWA7XG4gICAgfVxuXG4gIH1cbn1cbiJdfQ==